连接到 IP 0.0.0.0 成功。如何?为什么?

eri*_*ork 46 networking tcp strace

我们正在本地主机上提供一个端口,如果该端口可用,我们希望检查另一个进程。由于我们代码中的一个错误,它实际上是在尝试连接到 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
[...]
Run Code Online (Sandbox Code Playgroud)

这是什么意思?为什么有效?

Ste*_*itt 75

0.0.0.0 作为目标地址以各种方式指代不可路由的主机或“此主机”。实际上连接到 0.0.0.0 相当于连接到 localhost。(严格来说它不能作为目的地址,只能作为源地址,但实践与理论不符。)

绑定时,“此主机”扩展为“此主机上的任何地址”——因此应用程序通常通过绑定到 0.0.0.0 来接受连接,这意味着它们将接收寻址到系统上任何 IPv4 地址的数据包。

  • 稍微扩展一下这个答案 - 这意味着“此系统上的任何 IP 地址,包括在侦听过程开始后添加的 IP” (8认同)
  • @Dezza 不,本地主机是 127.0.0.1。127.0.0.0/8(如您所说,又名 127.0.0.0 到 127.255.255.255)是大多数设备的环回,例如 [RFC 5735 第 4 页](https://tools.ietf.org/html/rfc5735#page -4). (有趣的是,一些 Cisco 设备可以将环回分配给任何地址,但默认情况下根本不支持环回。并不是说这可能会影响网络上的其他设备。)但是,localhost 是一个名称,通常只指向一个地址为 127.0.0.1,通常使用“hosts”文件实现。所以我不同意你尝试更正。 (6认同)
  • localhost 是单个地址,主要是 127.0.0.1,而 0.0.0.0 表示该主机上的所有地址。 (5认同)