我正在从localhost向localhost发送UDP数据包,并且有时会丢弃数据包.我如何阻止这种情况以及为什么会发生这种情况?

Hal*_*ate 7 c++ sockets networking udp

这是我的程序输出

sending agent update
Created new player
Identified
sending agent update
Physics: 2 ticks this frame
time= 200
time= 300
***Packet Dropped: 2:10 ***
***Packet Dropped: 2:11 ***
***Packet Dropped: 2:12 ***
***Packet Dropped: 2:13 ***
***Packet Dropped: 2:14 ***
***Packet Dropped: 2:15 ***
***Packet Dropped: 2:16 ***
***Packet Dropped: 2:17 ***
***Packet Dropped: 2:18 ***
***Packet Dropped: 2:19 ***
***Packet Dropped: 2:20 ***
***Packet Dropped: 2:21 ***
time= 400
Physics: 2 ticks this frame
time= 500
Physics: 2 ticks this frame
Run Code Online (Sandbox Code Playgroud)

将数据包从本地主机发送到本地主机,数据包正在丢弃.这只发生在开头附近.前10个左右的数据包通过,然后数据包丢失.连续5到40个包.然后数据包停止下降.

这有什么理由发生吗?

更新:

以下代码修复了该问题.

int buffsize = 65536; // 65536
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (void*)&buffsize, sizeof(buffsize));
Run Code Online (Sandbox Code Playgroud)

我发送的数据包太快,超出了Windows默认的接收缓冲区,只有8 KB.增加缓冲区大小可以解决问题.

Aru*_*nmu 8

检查操作系统中默认配置的UDP缓冲区大小.

如果您发现它较少,则可以在创建UDP套接字时显式提供更大的值.

int buffer_size = 4 * 1024 * 1024 ;
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof(buffer_size));

您可能会发现链接非常有用.