在这个问题上有点困惑:-)。我在Ubuntu 10.04上运行了一些代码,它使用recvmsg调用来接收音频UDP数据包。这篇文章是一个更大的SIP客户端的一部分,我一直在测试网络上的远程系统。
通常我能够建立呼叫没有问题,音频愉快地从远程源传播到我的程序。然而,在一段随机的时间后,我遇到了端口上的读取错误。当发生这种情况时,我得到了错误的EHOSTUNREACH。在此错误中,我关闭了我的端口并终止连接。
关于这一点的奇怪之处在于我的印象是,这会在响应ICMP消息时发生。也许是由于瞬间的网络故障。然而,在重现此问题并进行完整的数据包捕获之后,我只看到了ICMP ping和响应的位置。我没有看到内核解释为EHOSTUNREACH的任何ICMP错误消息。
我的UDP端口非常基本。如果确实需要,我可以发布代码。但这只是一个基本的SOCK_DGRAM。在遇到此错误情况之前,套接字有时可以接收超过8小时的数据。
我有什么想法可以进一步解决这个问题。我试图理解为什么我收到这个错误,没有ICMP消息来关联它。
答案 0 :(得分:0)
您是否使用相同的套接字发送数据包?或者共享同一端口的不同套接字?我很好奇是否有可能另一个套接字实际产生错误。
多年前我记得处理ICMP消息导致sendto和recvfrom失败 间歇地像你描述的那样。如果我记得,解决方法是忽略它并再做一次recvfrom / recvmsg。
至于为什么你在没有看到线路上的ICMP消息的情况下获得该错误代码超出了我。您确定您正在驳回您认为“ping和响应”正确的ICMP消息吗? ICMP消息没有端口号,因此与该远程主机关联的所有套接字(或随机套接字)可能会返回此错误代码。
我认为可能有一个ioctl来禁用此行为,但我找不到它。
类似的讨论here。