基于UDP是无连接协议的前提,我曾认为主机是否启动不重要。但是,现在我正在进行测试时发现,当我“连接”我的UDP客户端套接字时,对该套接字的“写入”会返回一个错误,因为服务器已发送回一个ICMP端口不可达错误。
根据Stevens的《Unix网络编程》,“连接”UDP端口的目的基本上是从路由表中缓存条目,而不是为每个数据包创建新条目,这应该具有性能优势。
然而,这个ICMP数据包导致我失去了客户端套接字,这非常令人恼火。
有没有人能够解释一下为什么会这样?是否有任何已知的解决方法?
我正在使用一个第三方Java库,它没有考虑到这一点,只是断开连接,我可能不得不对其进行修改以重新连接,但在此之前,我希望在(Linux)操作系统级别上有些事情可以防止这种情况发生……所有关于套接字选项等的调查都没有结果。
编辑
总之,这是不可能的,修复代码是唯一的方法。
唯一的可能性似乎是配置iptables来阻止ICMP响应,但这是一个过于严厉的措施。
根据Stevens的《Unix网络编程》,“连接”UDP端口的目的基本上是从路由表中缓存条目,而不是为每个数据包创建新条目,这应该具有性能优势。
然而,这个ICMP数据包导致我失去了客户端套接字,这非常令人恼火。
有没有人能够解释一下为什么会这样?是否有任何已知的解决方法?
我正在使用一个第三方Java库,它没有考虑到这一点,只是断开连接,我可能不得不对其进行修改以重新连接,但在此之前,我希望在(Linux)操作系统级别上有些事情可以防止这种情况发生……所有关于套接字选项等的调查都没有结果。
编辑
总之,这是不可能的,修复代码是唯一的方法。
唯一的可能性似乎是配置iptables来阻止ICMP响应,但这是一个过于严厉的措施。
address
字段正好可以用于此,只是BSD的开发人员决定如果有ICMP错误就不填充它。WRS已经离开我们了,但我认识其中一位合著者,可以向他询问此事。 - Alnitak