这是我的程序输出
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
将数据包从本地主机发送到本地主机,数据包正在丢弃。这只发生在开头附近。前10个左右的数据包通过,然后数据包丢失。连续5到40个数据包。然后数据包停止下降。
有没有理由这样做?
更新
以下代码解决了问题。
int buffsize = 65536; // 65536
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (void*)&buffsize, sizeof(buffsize));
我发送数据包太快,超出了Windows默认接收缓冲区,只有8 KB。增加缓冲区大小可以解决问题。
答案 0 :(得分:8)
检查操作系统中默认配置的UDP缓冲区大小。
如果您发现它较少,则可以在创建UDP套接字时显式提供更大的值。
int buffer_size = 4 * 1024 * 1024 ; setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof(buffer_size));
您可能会发现THIS 链接非常有用。
答案 1 :(得分:4)
您可能过快地发送数据包,因此溢出缓冲区。您需要实现发送调步以确保发送器不会压倒接收器。你永远不会100%避免这种情况 - 它的本质是它没有提供交付保证。
答案 2 :(得分:1)
作为一个非常快速的猜测 - 在过去我见过这个因为接收窗口已满。基本上你的应用程序没有足够快地消耗数据包,内核只有很多空间保留 - 你需要增加rwin参数。或者另一方面,你发送的速度太快了 - Linux盒子上的参数是
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096