像这样绑定套接字有什么区别:
sock.bind((socket.gethostname(), 9999))
与此相对:
sock.bind(('', 9999))
根据HOWTO,绑定到socket.gethostname()
使套接字对外界可见。但是,它还表示绑定到''
使得套接字可以通过机器碰巧拥有的任何地址访问。这是否意味着它也可以让外界接触到它?我的猜测是绑定到''
允许从同一台机器(通过环回)以及从其他机器到达套接字,而绑定到socket.gethostname()
只允许来自其他机器的连接(< strong>包括同一台机器,但只是不通过loopback接口)。如果这是错误的,请告诉我。此外,如果我在路由器后面,我是否仍需要设置某种端口转发,以便使用这两种绑定方法来监听来自互联网的连接?或者绑定到''
是否允许我直接侦听与公共IP的连接?感谢。
答案 0 :(得分:2)
绑定到0.0.0.0
或''
(又名“通配符地址”或INADDR_ANY)将绑定到所有接口,包括公共接口。
绑定到127.0.0.1
('localhost')只会绑定到环回接口。
绑定到特定IP地址(从gethostname
的结果中解析)将仅接受与关联接口的连接。 (必须对已解析的IP建立与同一台计算机的连接,而不是环回。)
路由/防火墙/转发是一个单独的问题,因为侦听套接字是机器本地的,必须通过网络向外界公开:一旦连接获取来加工套接字绑定规则变得相关。