套接字绑定名称之间的区别
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
或使用 ""
.
要在特定端口上创建新的 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
或使用 ""
.