读书人

客户端处理服务端数据包的有关问题

发布时间: 2013-07-09 09:50:48 作者: rapoo

客户端处理服务端数据包的问题
这两天要做一个客户端测试程序,
当客户端向服务端请求登陆成功后,
服务端会连续向客户端发送三个数据包,
1.验证成功数据包
2.登陆完成数据包
3.用户列表数据包

我利用recv接收时,接收到了3个数据包。
但是当接收第二条数据包时,里面却包含了第三条数据包的数据,如图:
客户端处理服务端数据包的有关问题

而第三条数据包过来时,就显示为空了,如图:
客户端处理服务端数据包的有关问题

以下为客户端接收时的部分代码:


char recvBuf[1024];
int len=0;
int dataLen=0;
DequeData* pDequeData=0;

while (1)
{
memset(recvBuf,0,1024);
len=recv(sockClient,recvBuf,sizeof(recvBuf), 0);
if (len != SOCKET_ERROR)
{
dataLen=*(WORD*)(recvBuf+0);
printf("数据包长度:%d\n",dataLen);
pDequeData=new DequeData;
pDequeData->dataLens=dataLen;
memcpy(pDequeData->buff,recvBuf,dataLen);
recvDeque.push_back(pDequeData);
}
else
{
printf("%d\n",len);
}
}


还请各位指点一下,是那里的问题,需要怎么处理。这里谢过。
[解决办法]
TCP是字节流,这个现象叫做“粘包”,需要你解析字节流将报文一个一个解析出来。
[解决办法]
底层发包,是会好几个包一块发的,这是操作系统帮你干了,这么干主要是为了合理利用资源,首先要理解为啥会出现这种情况,

解决的办法就是在每个包的包头加上该数据包的长度,这样就可以处理粘包问题了
[解决办法]
需要自己定义每个包的长度,然后解析,这有很多socket源码,你找一个看看:
http://download.csdn.net/detail/geoff08zhang/4571358

读书人网 >C++

热点推荐