static void HandlePackets(void* pParams)
{
int iResult = 0;
char recvbuf[MAX_PACKET_LENGTH];
printf("Packet handling started\n");
while((iResult = recv(lhSocket, recvbuf, MAX_PACKET_LENGTH, 0)) > 0)
printf("Bytes received: %d\n", iResult);
printf("Packet handling stopped with reason %i", WSAGetLastError());
}
目前,它只打印接收到的字节数。
会不会发生这样的事情,recv
只会收到一半的数据包?或者一个完整的数据包和下一个数据包的一半,如果服务器快速地一个接一个地发送它们?
例如,服务器发送了一个长度为 512 字节的数据包,是否有可能 recv 第一次收到 500 字节,然后第二次尝试接收剩下的 12 字节?
如果服务器发送大量数据包,每个数据包长度为 512 字节,recv
是否有可能在第一次执行时获得 700 字节,在第二次执行时获得剩余字节?
MAX_PACKET_LENGTH
为 1024
(我这里说的是应用层包,不是传输层。)
整个问题是——我是否需要为客户端提供某种可能性,将接收到的字节合并到一个数据包中,或者将过度接收的字节拆分到不同的数据包中?
最佳答案
Is it possible that
recv
first got 500 bytes, and the remain 12 will receive from second attempt?
是的,绝对是。
您无法保证,当发送端发送 X 字节的突发时,接收端会在一次调用 recv
中将它们全部接收。 recv
甚至不知道您的应用层“数据包” 中有多少字节。
The whole problem is - do I need to make some possibility for client to combine received bytes into one packet or split over-received bytes to different packets?
您的应用程序肯定必须从可能的顺序读取中累积数据、填充缓冲区并执行解析以查找完整的数据包。
TCP/IP 不知道您的应用程序的协议(protocol);正如 David 所说,如果您想将传入的数据流拆分为“数据包”,那么您必须自己做。
关于c++ - C++ `recv` 函数如何处理数据接收?它能收到部分 "packet"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275762/