0

我有一个 C++ 和 C 语言的测试应用程序,其中客户端不断用服务器发送它的最后一个数字轰炸服务器,当服务器接收到其中一个数据包时,它会增加一次数字,然后将新数字发送给客户端,发生的情况是客户端始终位于运行客户端和服务器的本地计算机上的服务器后面的 1 号,这是完全可以预期的。

当 recvfrom 和 sendto 期望并发送 9328 字节的数据包时,这很好,但是当我将数据包的大小降低到 256 时,客户端总是 33 计数不同步,当客户端发送 44 字节的数据包并且服务器期望 256 字节客户端总是 212 计数不同步,每次都在同一台机器上没有失败。

我使用 LAN IP 地址发送这些数据包,客户端和服务器在同一台机器上,分别通过端口 3000 和 2000 进行监听。

客户端尽可能快地在服务器上发送数据包。服务器只会在收到数据包时向客户端发送更新的计数。

有趣的是,当我关闭客户端时,服务器仍在处理客户端发送的数据包,所以我猜这是操作系统轰炸保护或 Windows 将许多小的 UDP 数据包组合成一个 9328 字节的 UDP 数据包。

如何在不发生这种情况的情况下发送 < 256 字节的数据包?我想在数据包的传输过程中尽可能地避免数据包碎片,因此在数据包进入和离开某些特定硬件时需要保持较小的尺寸。

4

1 回答 1

0

这 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 ) );

请记住,这样做意味着数据包在收到后不会被存储,因此如果接收端没有足够频繁地收听,则更有可能丢失数据包。

于 2013-09-25T22:17:57.307 回答