UDP的阻塞式监听不触发问题

Posted Lanny Priest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UDP的阻塞式监听不触发问题相关的知识,希望对你有一定的参考价值。

排查故障
通讯失败,观察通讯日志发现发送但未接收.查看Wireshark监控,发送与响应均有记录,因此发送模块没有问题.问题在于监听部分.

360阻塞监听

在一台新电脑上安装了程序,但发现开启程序后Listener(UdpClient)在执行Receive(ref IPEndPoint)时被强制停止.

并出现listener被释放时出现的错误:"一个封锁操作被对 WSACancelBlockingCall 的调用中断".
考虑到之前360存在影响程序通讯的情况,把360关闭后执行,同样存在问题.卸载360后监听成功启动并阻塞等待.

Win防火墙阻挡接收
在解决了360阻塞监听后,仍然未收到数据,开启WireShark监控并在监听启动处设置断点.发现通讯WireShark中首发正常,但监听阻塞未触发.
试通过两种本地通讯软件与硬件通讯,一个成功一个失败,成功的程序可能是C++程序,而失败程序同样是C#+.net.
之后使用失败的工具与软件进行通讯,测试成功.
.net的Udp方式在PC内外通讯时被阻塞,而在PC内通讯成功.此时想到Win防火墙.关闭后成功触发.

相关经验
在解决问题过程中咨询了群里的朋友,找到一些很好的排查方法及之前收集的方法:
- cmd中输入netstat - ano可以查看本地所有使用中的IP及端口状态.
- UDP协议中.如果收到未开放监听的端口.则在wireshark中看到收到的包不再是UDP类型,而是ICMP类型.

以上是关于UDP的阻塞式监听不触发问题的主要内容,如果未能解决你的问题,请参考以下文章

select及触发方式,select监听多链接,select与epoll的实现区别

如何在 Kotlin 上持续监听 UDP 数据

使“scrollLeft”/“scrollTop”更改不触发滚动事件监听器

创建一个监听多个表的全局触发器

什么是socket网络编程

Android事件处理