C`recv`函数如何作用于数据接收?它能收到部分“数据包”吗?

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不知道您的应用程序的协议;正如David所说,如果你想将传入的数据流分成“数据包”,那么你必须自己做.

上一篇:Linux-TCP之深入浅出send和recv【转】


下一篇:wemos D1 arduino物联网开发板应用笔记2-串口通讯