gpt4 book ai didi

linux - UDP recvmsg 上的 EHOSTUNREACH

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:49 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

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

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

类似的讨论here .

关于linux - UDP recvmsg 上的 EHOSTUNREACH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15055655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com