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

3
绑定套接字的方式有何不同?如下所示:
sock.bind((socket.gethostname(), 9999))

与此相比:
sock.bind(('', 9999))

根据 HOWTO,将绑定到socket.gethostname()使套接字对外可见。但是,它还说,将绑定到''可以使套接字被机器拥有的任何地址访问。这是否意味着它也可以被外部世界访问?我猜测,将绑定到''允许套接字从同一台机器(通过环回)以及其他机器访问,而将绑定到socket.gethostname()仅允许来自其他机器(包括相同的机器,但不能通过环回接口)的连接。如果我理解有误,请告诉我。此外,如果我在路由器后面,使用这两种绑定方法监听来自Internet的连接,是否仍需要设置某种端口转发?或者将绑定到''是否允许我直接侦听对我的公共IP的连接?谢谢。
1个回答

4
将绑定到0.0.0.0''(也称为“通配符地址”或INADDR_ANY)将绑定到所有接口,包括公共接口。

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

将绑定到特定的IP地址,根据gethostname的结果解析而来,仅接受到关联接口的连接。(在相同机器上建立的连接必须是到解析出的IP地址,而不是回环。)

路由/防火墙/转发是一个单独的问题,因为监听套接字是本地的,必须通过网络向外界公开:一旦连接到达机器,套接字绑定规则就变得相关了。


你能详细说明最后一部分吗?socket.gethostname() 的绑定实际上是做什么的?你所说的“关联接口”是什么意思? - b_pcakes
1
gethostname 返回机器的主机名。机器的主机名(在控制台上键入 hostname)将被解析为一个 IP 地址。套接字绑定到的是 IP 地址(而不是主机名本身)。 - user2864740
谢谢。所以,如果我想让我的套接字可以从互联网访问,我只需要绑定到 '',而不需要设置端口转发或任何类似的东西吗? - b_pcakes
@SimonZhu 路由/防火墙/转发是一个独立的问题。这个绑定仅影响机器上本地套接字绑定。接口本身必须通过网络向外界公开: 一旦连接到达机器,套接字绑定规则将生效。 - user2864740
好的。最后一个问题(为了澄清):''0.0.0.0 效果上是一样的,对吗? - b_pcakes
@SimonZhu 是的,没错。 - user2864740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接