通信约定:头两个字节(WORD)为数据包的大小。
下面是拆包和并包的代码:
UINT CNetBaseCompoment::RecvLoops()
{
int curdatalen = 0; //当前数据长度,用于拆包并包。
while (1)
{
DWORD dwValue = WaitForSingleObject(m_hEventQuit,0);
if (dwValue == WAIT_OBJECT_0)
{
//收到停止的消息
break;
}
//ERROR_MSG("进入RECV循环!\n");
//经过拆包并包处理后,每次recv的时候数据的第一个字节总是在m_RecvBuffer[0]处
int recvlen = recv(m_socket, m_RecvBuffer+curdatalen, sizeof(m_RecvBuffer)-curdatalen, 0);
if (recvlen == 0)
{
ERROR_MSG("错误,与服务器的连接断开,ErrorCode : %d",WSAGetLastError());
break;
}
else if (recvlen == -1)
{
ERROR_MSG("[%s]与服务器的通信发生错误: %d\n", DateTime().toString().c_str(),WSAGetLastError());
break;
}
else
{
curdatalen += recvlen;
}
//开始拆包并包
int packlen = *(USHORT*)m_RecvBuffer;
if(packlen <= 0 || packlen > MAX_LOCAL_BUFFER)
{
char