287 lines
6.3 KiB
C++
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
|