我们在 localhost 上提供一个端口,如果该端口可用,我们希望检查另一个进程。由于我们代码中的一个错误,它实际上是在尝试连接到 IP 0.0.0.0:<port>
,并且由于某种原因它成功了——正如 strace 所证明的那样:
[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]
这是什么意思?为什么它有效?
我们在 localhost 上提供一个端口,如果该端口可用,我们希望检查另一个进程。由于我们代码中的一个错误,它实际上是在尝试连接到 IP 0.0.0.0:<port>
,并且由于某种原因它成功了——正如 strace 所证明的那样:
[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]
这是什么意思?为什么它有效?
0.0.0.0 作为目标地址不同地指代不可路由的主机或“此主机”。在实践中,连接到 0.0.0.0 相当于连接到 localhost。(严格来说它不能作为目的地址,只能作为源地址,但实践与理论不符。)
绑定时,“此主机”扩展为“此主机上的任何地址”——因此应用程序通常通过绑定到 0.0.0.0 来接受连接,这意味着它们将接收寻址到系统上任何 IPv4 地址的数据包。