一尘不染

为什么connect()给EADDRNOTAVAIL?

linux

我的申请中出现了似乎无法再现的故障。我有一个TCP套接字连接失败,该应用程序尝试重新连接它。在第二次尝试重新连接的connect()调用中,我得到了一个错误结果,错误代码为errno
== EADDRNOTAVAIL,connect()的手册页说:“指定的地址在本地计算机上不可用。”

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

如果我等待了足够长的时间,如果我再次尝试调用connect,此错误是否会是暂时的错误?如果不是,我应如何尝试从此故障中恢复?


阅读 370

收藏
2020-06-07

共1个答案

一尘不染

检查此链接

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

编辑 :是的,我原本打算添加更多内容,但由于紧急情况不得不在此删减

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

这里还有一些其他项目:

  • 如果本地端口已连接到给定的远程IP和端口(即已经有相同的套接字对),则会收到此错误(请参见下面的错误链接)。
  • 绑定不是本地地址的套接字地址将产生此错误。如果计算机的IP地址是127.0.0.1和1.2.3.4,并且您尝试绑定到1.2.3.5,则将收到此错误。
  • EADDRNOTAVAIL:指定的地址在远程计算机上不可用,或者名称结构的地址字段全为零。

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

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4294599

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

2020-06-07