UDP数据包,由Wireshark看,下降(甚至不能达到)WSARecvFrom

UDP数据包,由Wireshark看,下降(甚至不能达到)WSARecvFrom,第1张

概述UDP数据包,由Wireshark看,下降(甚至不能达到)WSARecvFrom

我有一个相当令人困惑的问题。


我在windows XP / 7上使用一个大的C ++库来处理UDP上的一些专有协议。 它在整个程序运行过程中监听一个端口,并等待来自远方的连接。

大多数情况下,这个效果很好。 但是,由于我遇到的一些问题,我决定直接调用WSARecvFrom (库中使用的win32函数来从感兴趣的套接字中接收数据报,并告诉哪些IP和端口他们来自)。


奇怪的是,在某些情况下,我发现数据包在 *** 作系统级别被丢弃(即我在Wireshark中看到它们,它们具有正确的dst-port,所有校验和都是正确的 – 但是它们从来没有出现在我的deBUGging打印中植入到代码中)。

现在,我完全知道这个事实(人们常常提到一点)“UDP不保证传送” – 但是这不是相关的,因为数据包被机器接收 – 我在Wireshark中看到它们。


此外,我熟悉 *** 作系统缓冲区和潜在的填补,但这里来了奇怪的部分…

我已经做了一些研究,试图找出哪些数据包完全丢弃。 我发现,所有丢弃的数据包都有两个共同的东西(虽然一些但是绝对不是大多数没有被丢弃的数据包也共享这两个东西):

他们很小。 协议中的许多数据包都很大,接近于MTU,但所有丢弃的数据包都小于100字节(总数)。

它们总是两者之一:SYN等价物(即对等体发送给我们以发起通信的第一个数据包)或FIN等价物(即对等体在不再有兴趣与我们交谈时发送的数据包) 。

这两个品质中的任何一个能否影响 *** 作系统的缓冲区,并导致数据包是随机的(或者更有趣的 – 有select的)掉线?


任何关于这个奇怪的问题的灯光将非常感激。

非常感谢。

编辑(24/10/12):

我想我可能错过了一个重要的细节。 看来在到达之前丢弃的数据包还有其他共同之处:他们(我开始相信, 只有他们)通过“新”对等方(即它之前没有尝试联系的对等方)发送到服务器。

例如,如果一个syn等效数据包来自我们以前从未见过的peer *,那么WSARecvFrom将看不到它。 但是,如果我们自己发送了一个syn-equivalent数据包(即使它没有在当时回复),现在它发送给我们一个syn-equivalent,我们将会看到它。

(*)我不确定这是否是我们还没有看到的对等 (即ip:port)还是我们之前从未见过的端口 。

这有帮助吗?


这是我从来没有听说过的某种WinSock选项吗? (正如我上面所说,代码不是我的,所以它可能使用套接字选项,我不知道)

再次感谢!

*** 作系统具有固定大小的缓冲区,用于已经到达您的套接字但尚未被您读取的数据。 当这个缓冲区耗尽时,它将开始丢弃数据。 调试日志记录可能会延迟从套接字中提取数据的速度,从而增加溢出的可能性。

如果这是个问题,至少可以通过请求更大的recv缓冲区来减少它的实例。

您可以使用检查套接字recv缓冲区的大小

int recvBufSize; int err = getsockopt(socket,Sol_SOCKET,SO_RCVBUF,(char*)&recvBufSize,sizeof(recvBufSize));

您可以使用它将其设置为较大的尺寸

int recvBufSize = /* usage specific size */; int err = setsockopt(socket,(const char*)&recvBufSize,sizeof(recvBufSize));

如果您仍然看到数据被 *** 作系统接收但没有传送到您的套接字客户端,您可以考虑采用不同的方法来记录。 例如

登录到RAM缓冲区,只偶尔打印(无论您的个人资料是最有效的大小)

从一个低优先级的线程中记录,或者接受这个内存需求是不可预知的,或者在日志缓冲区满了时添加代码来丢弃数据

关闭windows防火墙。

这能解决吗? 如果是这样,您可能会启用防火墙,只是为您的程序添加一个规则。

这是我最合乎逻辑的猜测,根据你在更新中的说法:

看来在到达之前丢弃的数据包还有其他共同之处:他们(我开始相信,只有他们)通过“新”对等方(即它之前没有尝试联系的对等方)发送到服务器。

在redhat-linux上也面临同样的问题。 这是一个路由问题。

RCA如下。 1.确实UDP能够到达目标机器(在wireshark上可见)。 2.现在路由到源没有找到,所以没有回复可以在wireshark上看到。 3.在某些 *** 作系统上,你可以在wireshark上看到请求数据包,但是 *** 作系统实际上并没有提供数据包套接字(你可以在netstat-nap中看到这个套接字)。 4.在这种情况下,请始终检查Ping(Ping -I)

Rgds,Kishor

总结

以上是内存溢出为你收集整理的UDP数据包,由Wireshark看,下降(甚至不能达到)WSARecvFrom全部内容,希望文章能够帮你解决UDP数据包,由Wireshark看,下降(甚至不能达到)WSARecvFrom所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1283203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存