我有一个 C++ 和 C 语言的测试应用程序,其中客户端不断地用服务器发送的最后一个数字轰炸服务器,当服务器收到这些数据包之一时,它会增加数字一次,然后将新数字发送到客户端,发生的情况是,在客户端和服务器都运行的本地计算机上,客户端始终落后于服务器 1 个数字,这完全是预期的。
当recvfrom和sendto期望并发送9328字节数据包时,这很好,但是当我将数据包大小降低到256时,当客户端发送44字节数据包和服务器时,客户端总是33计数不同步期望 256 字节,客户端总是 212 计数不同步,每次都在同一台机器上不会失败。
我使用 LAN IP 地址发送这些数据包,客户端和服务器位于同一台计算机上,分别通过端口 3000 和 2000 监听。
客户端以最快的速度向服务器发送数据包。 服务器仅在收到数据包时才会向客户端发送更新的计数。
有趣的是,当我关闭客户端时,服务器仍然处理客户端发送的数据包,所以我猜测这是操作系统轰炸保护或 Windows 将许多小 UDP 数据包组合在一起形成一个 9328 字节的 UDP 数据包。
如何发送 < 256 字节的数据包而不发生这种情况?我希望在数据包传输过程中尽可能避免数据包碎片,因此当数据包进入和离开某些特定硬件时,需要保持较小的大小。
最佳答案
这 3 行将通过将数据包缓冲区的大小设置为零来禁用数据包缓冲区。
const int size = 0;
setsockopt( sd, SOL_SOCKET, SO_SNDBUF, ( const char * )&size, sizeof( int ) );
setsockopt( sd, SOL_SOCKET, SO_RCVBUF, ( const char * )&size, sizeof( int ) );
请记住,这样做意味着数据包在接收后不会被存储,因此如果接收端没有足够频繁地监听,数据包更有可能丢失。
关于c++ - Windows/Winsock UDP 数据包被分组在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19015552/