为什么connect()会给EADDRNOTAVAIL?

Wil*_*mKF 13 c++ sockets linux tcp ip-address

我在我的应用程序中出现了一个似乎不可重现的故障.我有一个TCP套接字连接失败,应用程序尝试重新连接它.在第二次调用connect()尝试重新连接时,我得到了errno == EADDRNOTAVAIL的错误结果,connect()的手册页表示:"指定的地址不能从本地计算机上获得."

看看对connect()的调用,第二个参数似乎是错误引用的地址,但据我所知,这个参数是远程主机的TCP套接字地址,所以我对这个人感到困惑页面引用本地计算机.是否我的本地计算机无法访问远程TCP套接字主机的此地址?如果是这样,为什么会这样呢?它必须在连接失败之前第一次成功调用connect()并尝试重新连接并获得此错误.connect()的参数两次都是相同的.

这个错误会不会是一个短暂的错误,如果我等了很长时间,如果我再次尝试调用connect可能已经消失了?如果没有,我应该如何从这次失败中恢复?

Dav*_*vid 19

检查此链接

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

编辑:是的我想增加更多,但由于紧急情况不得不削减它

在尝试重新连接之前,您是否关闭了套接字?关闭将告诉系统socketpair(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_id=4294599

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