套接字绑定名称之间的区别

Difference between socket bind names

要在特定端口上创建新的 INET 套接字,执行以下操作有什么区别:

serversocket.bind((socket.gethostname(), 80))

并将绑定名称留空:

serversocket.bind(('', 80))

只有当您的机器有多个 IP 地址时才有意义。如果您提供特定名称,您将绑定到主机解析到的任何 IP 地址。空字符串会将您绑定到所有地址。


更新中。实际上,我意识到问题比我最初发布的问题更严重。你在每台机器上都会有问题。

很多人没有意识到localhost是一个与电脑ip地址完全不同的接口。 localhost 不仅仅是机器 IP 的别名。

如果服务器绑定到 localhost,它将只监听从当前机器到 localhost 的连接。如果服务器绑定到机器的外部 IP 地址,它将只监听与该 IP 地址的连接;它不会看到与 localhost 的连接。如果一个服务器绑定到 '',相当于 0.0.0.0,它会同时监听。

在我的 MacOS 上,socket.gethostname() returns 一个名称被解析为 127.0.0.1,localhost。我不知道这是 MacOS-ism 还是在其他操作系统上也是如此。

但通常情况下,如果您仅侦听来自您自己的计算机(测试,本地服务器)的连接,则使用 localhost 或使用 "".