问题描述
在使用getaddrinfo(3)
来从命令行输入中检索要绑定的IP地址和端口号的服务器应用程序中(主机部分可以为空⇒ node 参数将为{{1} }),我无法安全地绑定到所有返回的地址。
当用户提供主机名和端口时,它将轻松绑定到主机名解析的所有本地地址。
当用户仅提供端口时, 如果不使用 对于可移植性(尤其是对于没有v4映射的系统,如大多数其他野外操作系统),也不能选择仅绑定到 因此,天真的会使用 实际上,在测试中,当我使用它时,我可以启动第二个服务器应用程序,然后在第一个服务器仍在运行时将其绑定到相同的端口 并接管其所有流量 因此,程序将如何绑定到返回的任何NULL
将按照 顺序返回INADDR_ANY(0.0.0.0)和IN6ADDR_ANY(::) 。 >
getaddrinfo(3)
,则会失败,仅保留服务器IPv4,这很糟糕。SO_REUSEADDR
(将服务器保留为仅IPv6,从而使人生气)。这也适用于关闭了v4映射的Linux,是的。 (当然,可以为每个套接字重新启用,但是……向其他操作系统的可移植性很重要。)::
…,除了上有a recent LWN article基本上说使用SO_REUSEADDR
是邪恶的,并可能导致接管。SO_REUSEADDR
中提到的特定于Linux的SO_REUSEPORT
(仅在Linux 3.9及更高版本上可用)也独立于其可能的不可用性,不是一种选择:它还允许另一个进程执行在(ip,port)元组上。socket(7)
输出上的端口,从而允许在同一服务器或仅
更新:事实证明getaddrinfo(3)
也存在于达尔文之下,实际上是需要,SO_REUSEPORT
在Mac OSX上将失败...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)