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机套接字绑定规则变得相关。
这样绑定套接字有什么区别:
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机套接字绑定规则变得相关。