问题:为什么 connect() 会给出 EADDRNOTAVAIL?

我在我的应用程序中出现了一个似乎无法重现的失败。我有一个失败的 TCP 套接字连接,应用程序试图重新连接它。在尝试重新连接的第二次 connect() 调用中,我得到一个错误结果,错误结果为 errno u003du003d EADDRNOTAVAIL,connect() 的手册页表示:“本地计算机无法使用指定的地址。”

查看对connect()的调用,第二个参数似乎是错误所指的地址,但据我了解,这个参数是远程主机的TCP套接字地址,所以我对这个人感到困惑指本地机器的页面。是不是我的本地机器上没有远程 TCP 套接字主机的这个地址?如果是这样,为什么会这样?它必须在连接失败之前第一次成功调用 connect() 并尝试重新连接并收到此错误。两次 connect() 的参数都是相同的。

如果我等待足够长的时间,如果我再次尝试调用 connect,这个错误是否会消失?如果没有,我应该如何尝试从这次失败中恢复?

解答

检查此链接

http://www.toptip.ca/2010/02/linux-eaddrnotavail-address-not.html

编辑:是的,我的意思是添加更多,但由于紧急情况不得不在那里剪掉

您在尝试重新连接之前是否关闭了套接字?关闭将告诉系统套接字对(ip/port)现在是空闲的。

以下是要查看的其他项目:

  • 如果本地端口已经连接到给定的远程 IP 和端口(即,已经有一个相同的套接字对),您将收到此错误(请参阅下面的错误链接)。

  • 绑定一个不是本地的套接字地址会产生这个错误。如果一台机器的 IP 地址是 127.0.0.1 和 1.2.3.4,并且你试图绑定到 1.2.3.5,你会得到这个错误。

  • EADDRNOTAVAIL:指定地址在远程机器上不可用或名称结构的地址字段全为零。

链接到与您类似的错误(答案接近底部)

http://bugs.sun.com/bugdatabase/view_bug.do?bug_idu003d4294599

似乎您的套接字基本上停留在 TCP 内部状态之一,并且添加延迟重新连接可能会解决您的问题,因为他们似乎在该错误报告中已经完成了。

Logo

更多推荐