c++ - Windows/Winsock UDP 数据包被分组在一起?

标签 c++ c sockets networking

我有一个 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/

相关文章:

c++ - 无法将 std::string 转换为初始化

java - Android NDK 写入 SQLite

C 中取消线程

Java Socket 多线程文件传输

python - 通过套接字进行通信的最佳方式是什么?

c++ - 知道使用哪个适配器来建立套接字连接

c++ - 指向尚未初始化的成员

c++ - cin.ignore 的 getline 问题

c - 如何跟踪 C 中的内存使用情况?

c - fork() 子进程实际上在什么时候开始?