gpt4 book ai didi

linux - bind() before connect() 可能会返回 EADDRNOTAVAIL,即使有许多临时端口可用

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:02 26 4
gpt4 key购买 nike

(已在 Centos 6.5 和 Centos 7 上测试过)

如果您在 linux 中使用 INADDR_ANY 和 0 端口在 connect() 之前调用 bind() 那么 bind() 的临时端口选择可能与已建立的连接或 TIME_WAIT 中的连接冲突,并且 connect() 将返回 EADDRNOTAVAIL。这是设置了 SO_REUSEADDR 的套接字。如果你调用 connect() 时不带 bind() 就不会发生这种情况,因为 connect() 有它的自己的(更复杂的)选择临时端口的方法。

这似乎与此处的讨论一致:

http://mail-archives.apache.org/mod_mbox/trafficserver-dev/201210.mbox/%3C001601cda670 $fc59e470$f50dad50$@yooser.com%3E

在这里:

http://aleccolocco.blogspot.com/2008/11/ephemeral-ports-problem-and-solution.html

我已经看到这种情况发生在高负载下,只有几个现有的已建立连接到目标 IP,所以这并不是真正使用所有可用的临时端口或更改可用的临时端口范围。

简单的解决方法(如 apache 列表中所讨论的那样)就是在之前不调用 bind()connect(),这样 connect() 的更复杂的临时端口选择就可以用过的。

但这并不总是可能的。如果您的应用程序可选地允许配置一个为传出连接或 IP 池绑定(bind)的显式端口?

还有其他解决方法吗?

最佳答案

What if your application optionally allows configuration of an explicit port to bind to for outgoing connections, or a pool of IPs?

运气不好。你对此无能为力。

bind() 不知道您要连接什么(如果有的话),因此在分配端口时它无法考虑 TCP 4 元组的远程部分数字。出于同样的原因,它也不知道连接后本地 IP 地址是什么,因此它也无法考虑这一点。

关于linux - bind() before connect() 可能会返回 EADDRNOTAVAIL,即使有许多临时端口可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33635773/

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