【问题标题】:EHOSTUNREACH on UDP recvmsgUDP recvmsg 上的 EHOSTUNREACH
【发布时间】:2013-02-24 19:28:14
【问题描述】:

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

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

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

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

关于如何进一步解决此问题的任何想法。我试图了解为什么我收到此 errno 而没有 ICMP 消息与之关联。

【问题讨论】:

  • 只是补充一点。我的 UDP 套接字确实是 RTP。我也有一个与之配对的 RTCP 套接字。

标签: linux sockets


【解决方案1】:

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

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

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

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

类似的讨论here

【讨论】:

  • 嗨塞尔比。我使用这个套接字进行发送和接收。但是错误只发生在接收端,而不是发送端。所以我试图通过我的数据包捕获来保持简单。我基本上只是捕获了 IP A 和 B 之间的所有流量。在我复制后,我通过 ICMP 过滤。然后当我看到 ping 和回复时,我只是过滤掉了那些 ICMP 类型,什么都没有留下。看那篇文章,听起来这是一个暂时性错误,也许我只需要忽略该错误并保持该端口上的套接字打开?
  • 我添加了一些代码来忽略错误一定次数。这解决了这个问题。感谢塞尔比提供的信息。
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多