繁体   English   中英

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

[英]I am sending UDP packets from localhost to localhost and runs on packets sometimes drop. How do I stop this and why does it happen?

这是我的程序输出

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。 增加缓冲区大小可以解决问题。

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

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

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

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

您可能过快地发送数据包,因此溢出缓冲区。 您需要实现发送调步以确保发送器不会压倒接收器。 你永远不会100%避免这种情况 - 这是UDP的本质,它不提供交付保证。

作为一个非常快速的猜测 - 过去我见过这个因为接收窗口已满。 基本上你的应用程序没有足够快地消耗数据包,内核只有很多空间保留 - 你需要增加rwin参数。 或者另一方面,你发送的速度太快了 - Linux机器上的参数就是

net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM