2

在这个问题上有点困惑:-)。我在 Ubuntu 10.04 上运行了一些代码,它使用 recvmsg 调用来接收音频 UDP 数据包。这件作品是一个更大的 SIP 客户端的一部分,我一直在通过网络使用远程系统对其进行测试。

通常,我可以毫无问题地建立呼叫,并且音频可以愉快地从远程源传输到我的程序。但是,经过随机时间后,我在端口上遇到了读取错误。发生这种情况时,我会得到 errno EHOSTUNREACH。在这个错误上,我关闭了我的端口并终止了连接。

奇怪的是,我的印象是这会在响应 ICMP 消息时发生。也许是由于暂时的网络故障。然而,在重现此问题并进行完整的数据包捕获后,我看到的都是 ICMP ping 和响应的位置。我没有看到内核解释为 EHOSTUNREACH 的任何 ICMP 错误消息。

我的 UDP 端口非常基本。如果真的需要,我可以发布代码。但这只是一个基本的 SOCK_DGRAM。套接字在遇到此错误条件之前,有时能够接收超过 8 小时的数据。

任何想法我可以如何进一步解决这个问题。我试图理解为什么我收到这个 errno 而没有 ICMP 消息与之关联。

4

1 回答 1

0

您是否使用相同的套接字发送数据包?或者不同的套接字共享同一个端口?我很好奇是否有可能另一个套接字实际上正在产生错误。

我记得几年前处理 ICMP 消息导致 sendto 和 recvfrom 间歇性失败,就像你描述的那样。如果我记得,解决方法是忽略它并执行另一个recvfrom/recvmsg。

至于为什么在没有看到线路上的 ICMP 消息的情况下收到该错误代码,我无法理解。您确定您将观察到的 ICMP 消息正确地视为“ping 和响应”吗?ICMP 消息没有端口号,因此与该远程主机关联的所有套接字(或随机套接字)都可能返回此错误代码。

我认为可能有一个 ioctl 来禁用此行为,但我找不到它。

这里有类似的讨论。

于 2013-02-24T21:46:49.373 回答