Python 套接字:绑定到 '' 与 socket.gethostname()

Python sockets: binding to '' vs socket.gethostname()

这样绑定套接字有什么区别:

sock.bind((socket.gethostname(), 9999))

与此相对:

sock.bind(('', 9999))

根据 HOWTO,绑定到 socket.gethostname() 使套接字对外界可见。但是,它还表示绑定到 '' 使得套接字可以通过机器恰好具有的任何地址访问。这是否意味着它也可以让外界访问它?我的猜测是绑定到 '' 允许从同一台机器内部(通过环回)以及从其他机器到达套接字,而绑定到 socket.gethostname() 将只允许来自其他机器的连接(包括同一台机器,只是不通过环回接口)。如果这是错误的,请告诉我。另外,如果我在路由器后面,我是否还需要设置某种端口转发才能使用这两种绑定方法侦听来自 Internet 的连接?或者绑定到 '' 是否允许我直接监听与我的 public ip 的连接?谢谢。

绑定到0.0.0.0''(又名"Wildcard Address"或INADDR_ANY)将绑定到所有接口,包括public个。

绑定到 127.0.0.1 ('localhost') 将只绑定到环回接口。

绑定到特定的 IP 地址,如 gethostname 的结果所解析,将只接受到关联接口的连接。 (从同一台机器建立的连接必须连接到已解析的 IP,而不是环回。)

路由/防火墙/转发是一个单独的问题,因为侦听套接字在机器本地,必须通过网络暴露给外界:一旦连接gets机套接字绑定规则变得相关。