我正在使用c ++开发TCP客户端服务器应用程序。现在允许在这个项目中使用第三方库。
此处客户端服务器之间的交换使用良好定义的协议格式。客户端接收它将发送它用于解析的数据包。我有协议管理器,它将负责解析活动。
我有疑问 当数据从网络到达客户端时,操作系统会将其缓冲,直到应用程序调用recv()函数。
因此,两个消息msg1和msg2到达缓冲区,对recv的调用将返回msg1 + msg2。现在这可能导致解析活动失败。
我的疑问 1.上述假设是否正确? 2.如果上述提议是正确的,那么如何解决这个问题。
答案 0 :(得分:0)
在TCP中,您无法看到数据包边界,因此如果两个数据包在您致电recv()
之前到达,您将一次性获得两个数据包的内容。
在UDP中,数据包边界被保留,因此每次调用recv()
都会返回一个数据包。
答案 1 :(得分:0)
Revathy,
这里需要做的是制作固定长度的数据包或至少固定长度的数据包,然后是可变长度数据。
标头应包含数据包的大小。所以在recv函数中,你总是读取头字节并解码数据包的大小,并使用另一个recv调用读取数据包的其余部分。
这样即使您的TCP层缓冲任意数量的数据包,您也可以正确读取它
unsigned char* pBuffer = NULL;
pBuffer = new unsigned char[MESSAGE_HEADER_LENGTH];
// reading header from socket
int nRet = recv(sock,(char*)pBuffer,MESSAGE_HEADER_LENGTH,0);
int nDataLen = //Read the packet length from pBuffer
// reading body from socket
unsigned char* pPacket = NULL;
pPacket= new unsigned char[nDataLen ];
nRet = recv(sock,(char*)pPacket ,nDataLen ,0 );