基于 UDP 是无连接协议的前提,我假设主机是否启动或关闭都无关紧要。
然而,现在我正在进行测试,我发现当我“连接”我的 UDP 客户端套接字时,write
到该套接字会返回错误,因为服务器已发回 ICMP 端口不可达错误。
“连接”UDP端口的目的(根据StevensUnix网络编程)基本上是caches路由表中的条目,而不是为每个数据包创建一个新条目,这应该具有性能优势。
然而,这个 ICMP 数据包导致我丢失客户端套接字,这非常烦人。
有人能解释一下为什么会这样吗?有任何已知的解决方法吗?
我正在使用一个 3p java 库,它不考虑这个问题,只是断开连接,我可能必须破解它才能重新连接,但在我这样做之前,我有点希望我可以在(Linux)上做点什么操作系统级别可能是为了防止这种情况发生......对套接字选项等的所有调查都被证明是徒劳的。
EDIT
总之,这是不可能的,修复代码是做到这一点的唯一方法。
唯一的可能性似乎是配置 iptables 来阻止 ICMP 响应,但这对于破解这个特定的坚果来说有点像大锤。
虽然您的 UDP 套接字并未严格“连接”,但connect()
调用确实为该套接字创建本地“状态”。
这种状态不仅允许系统缓存目的地的当前路由条目,而且还意味着所有后续输出操作都不需要指定目的地——它们将使用在connect()
称呼。它还确保内核将丢弃不是来自“连接”方的发往套接字的入站数据包。
这种连接状态还允许内核将与该套接字相关的错误(通过 ICMP 发出信号)传递给应用程序 - 未连接的套接字不会收到这些错误 - 它们是“即发即忘”。
对于您向我指出的离线 log4j 代码,问题似乎完全出在用户空间代码中。日志4jUDPAppender
当它得到一个时,只是单方面扔掉套接字IOException
on a write
调用,并且没有提供检测该情况的方法以便您可以修复它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)