Files
ict/client/ewsc/net/netlib/cmd_srv_d5k.cpp
2026-01-23 08:57:55 +08:00

287 lines
6.3 KiB
C++

#ifdef TH_WITH_D5K
#if defined(_UNIX_)
#include <string.h>
#include <sys/socket.h>
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
#include <netinet/tcp.h>
#endif
#include "netapi_d5k.h"
#include "XByteArray.h"
CD5KServicesProxy::CD5KServicesProxy(int sock)
{
m_nRecvLen = 0;
m_pRecvBuf = NULL;
m_pSendLen = NULL;
m_pSendBuf = NULL;
}
void CD5KServicesProxy::InitServicesData(int nRecvLen,char * pRecvBuf, int **pSendLen,char **pSendBuf)
{
printf("begin InitServicesData: %d\n",nRecvLen);
m_nRecvLen = nRecvLen;
m_pRecvBuf = pRecvBuf;
m_pSendLen = pSendLen;
m_pSendBuf = pSendBuf;
printf("end InitServicesData: %d\n",nRecvLen);
}
CD5KServicesProxy::~CD5KServicesProxy()
{
m_pSendLen = NULL;
m_pSendBuf = NULL;
}
int CD5KServicesProxy::RxData(void *buf, int size)
{
printf("begin RxData: %d\n",size);
int nHeaderLen = sizeof(NET_HEAD);
if(m_nRecvLen < nHeaderLen)
{
return 0;
}
if(nHeaderLen + size != m_nRecvLen)
{
return 0;
}
memcpy(buf,m_pRecvBuf + nHeaderLen,size);
return 1;
}
int CD5KServicesProxy::RxData(XByteArray *pb, int size)
{
printf("begin RxData: %d\n",size);
int nHeaderLen = sizeof(NET_HEAD);
if(m_nRecvLen < nHeaderLen)
{
return 0;
}
if(nHeaderLen + size != m_nRecvLen)
{
return 0;
}
ASSERT(pb->m_nMaxLength>=size);
memcpy(pb->m_pData + pb->m_nLength,m_pRecvBuf + nHeaderLen,size);
pb->m_nLength += size;
return 1;
}
int CD5KServicesProxy::TxData(void *buf,int size,bool beWithHeader)
{
printf("begin TxData: %d\n",size);
// Add your code here [5/27/2010]
if(beWithHeader)
{
int nHeadLen = sizeof(NET_HEAD);
**m_pSendLen = nHeadLen + size;
*m_pSendBuf = (char*)malloc(nHeadLen + size);
memcpy(*m_pSendBuf,&m_oHeader,nHeadLen);
memcpy(*m_pSendBuf+nHeadLen,buf,size);
}
else
{
**m_pSendLen = size;
*m_pSendBuf = (char*)malloc(size);
memcpy(*m_pSendBuf,buf,size);
}
return 1;
}
int CD5KServicesProxy::TxData(XByteArray *pb,int size,bool beWithHeader)
{
ASSERT(pb->m_nLength==size);
return TxData(pb->m_pData,size,beWithHeader);
/*
// Add your code here [5/27/2010]
if(beWithHeader)
{
int nHeadLen = sizeof(NET_HEAD);
**m_pSendLen = nHeadLen + size;
*m_pSendBuf = (char*)malloc(nHeadLen + size);
memcpy(*m_pSendBuf,&m_oHeader,nHeadLen);
memcpy(*m_pSendBuf+nHeadLen,pb->m_pData,size);
}
else
{
**m_pSendLen = size;
*m_pSendBuf = (char*)malloc(size);
memcpy(*m_pSendBuf,pb->m_pData,size);
}
*/
return 1;
}
int CD5KServicesProxy::TxHead(NET_HEAD *head)
{
memcpy(&m_oHeader,head,sizeof(NET_HEAD));
return 1;
}
int CD5KServicesProxy::RxHead(NET_HEAD *head)
{
printf("beigin RxHead\n");
if(m_pRecvBuf == NULL)
{
return 0;
}
int nHeadLen = sizeof(NET_HEAD);
if(m_nRecvLen < nHeadLen)
{
return 0;
}
memcpy(head,m_pRecvBuf,sizeof(NET_HEAD));
memcpy(&m_oHeader,head,sizeof(NET_HEAD));
return 1;
}
void CD5KServicesProxy::CloseSocket()
{
// SocketProxy::CloseSocket();
}
int CD5KServicesProxy::TxStream(NET_HEAD * pHeader,XByteArray *pb)
{
return TxStream(pHeader,pb->m_pData);
}
int CD5KServicesProxy::TxStream(NET_HEAD * pHeader,void * pBuffer)
{
TxHead(pHeader);
return TxData(pBuffer,(int)pHeader->len);
}
int CD5KServicesProxy::TxStream(char *user,int cmdtype,int user1,int user2,int len,void *buf)
{
NET_HEAD head;
head.cmdtype = cmdtype;
head.userdata1 = user1;
head.userdata2 = user2;
head.len = len;
strcpy(head.src.user,user);
return TxStream(&head,buf);
}
CD5KMsgProxy::CD5KMsgProxy()
{
m_pMsgBus = NULL;
m_nProcKey = 0;
m_pMsgBus = new message_invocation;
}
void CD5KMsgProxy::InitMsgData(const char *context_name, const char *app_name, const char *proc_name)
{
m_nProcKey = m_pMsgBus->messageInit((char *)context_name,(char *)app_name,(char *)proc_name);
}
CD5KMsgProxy::~CD5KMsgProxy()
{
if(m_pMsgBus != NULL)
{
if(m_nProcKey > 0)
{
m_pMsgBus->messageExit(m_nProcKey);
}
delete m_pMsgBus;
}
m_nProcKey = 0;
m_pMsgBus = NULL;
}
//2006/2/29
// Add by Wangbin 发送字节流 [5/25/2010]
int CD5KMsgProxy::TxStream(NET_HEAD *head, XByteArray *pb)
{
return TxStream(head,pb->m_pData);
}
int CD5KMsgProxy::TxStream(NET_HEAD *head, void *buf)
{
BYTE * pSendBuf = (BYTE *)buf;
int nLen =(int)head->len;
Message oMsg;
memset(&oMsg,0,sizeof(oMsg));
CD5KMsgHeaderInfo oHeaderInfo;
int nNetHeaderLen = sizeof(NET_HEAD);
int nHeaderLen = sizeof(CD5KMsgHeaderInfo);
int nValidDataLen = sizeof(oMsg.Msg_buf) - nHeaderLen;
int nTotalLen = head->len + nNetHeaderLen;
int nTotalPacket = nTotalLen/nValidDataLen;
int nResLen = nTotalLen%nValidDataLen;
if(nResLen > 0)
{
nTotalPacket ++;
}
oMsg.header.len = sizeof(oMsg.Msg_buf);
oMsg.header.serv = head->cmdtype;
oMsg.header.event = head->userdata1 * 256 + head->userdata2;
int nCurrPos = 0;
static int nRandCode = 0;
nRandCode ++;
oHeaderInfo.m_nRandCode = nRandCode % 1000;
oHeaderInfo.m_nCurrPos = 0;
oHeaderInfo.m_nTotalLen = nTotalLen;
oHeaderInfo.m_nTotalPacket = nTotalPacket;
nCurrPos = 0;
printf("随机码: %d 总包个数: %d 总长度: %d %d\n",
(int)oHeaderInfo.m_nRandCode,(int)oHeaderInfo.m_nTotalPacket,nTotalLen);
for(int i = 0;i<nTotalPacket;i++)
{
memset(oMsg.Msg_buf,0,sizeof(oMsg.Msg_buf));
oHeaderInfo.m_nCurrPos = nCurrPos;
memcpy(oMsg.Msg_buf,&oHeaderInfo,nHeaderLen);
char * pBufPos = oMsg.Msg_buf + nHeaderLen;
int nRealDataLen = nValidDataLen;
int nRemainDataLen = nTotalLen - nCurrPos;
if(i == 0)
{
memcpy(pBufPos ,head,nNetHeaderLen);
nRealDataLen -= nNetHeaderLen;
pBufPos += nNetHeaderLen;
}
if(nRealDataLen > nRemainDataLen)
{
nRealDataLen = nRemainDataLen;
}
memcpy(pBufPos,pSendBuf+nCurrPos,nRealDataLen);
int nBufLen = nRealDataLen + pBufPos - oMsg.Msg_buf;
/*
printf("发送包:%d 随机码: %d 总包个数: %d 总长度: %d %d\n",
i,(int)oHeaderInfo.m_nRandCode,(int)oHeaderInfo.m_nTotalPacket,sizeof(oMsg),nBufLen);
*/
oMsg.header.len = nBufLen;
int ret_code = m_pMsgBus->messageSend(&oMsg, nBufLen);
//int ret_code = m_pMsgBus->messageSend(&oMsg, sizeof(oMsg.Msg_buf));
if(ret_code < 0)
{
printf("error messagesend : %d!!! ",ret_code);
}
nCurrPos += nRealDataLen;
if((i+1)%100 == 0)
{
printf("休息一下\n");
Sleep(100);
}
}
printf("结束发送!\n");
// sleep(1);
}
int CD5KMsgProxy::TxStream(char *user,int cmdtype,int user1,int user2,int len,void *buf)
{
NET_HEAD head;
head.cmdtype = cmdtype;
head.userdata1 = user1;
head.userdata2 = user2;
head.len = len;
strcpy(head.src.user,user);
return TxStream(&head,buf);
}
#endif