gethostname() 返回准确的主机名,bind() 不喜欢它



做一个python套接字教程,整个代码库如下

import socket as so
s = so.socket()
host = so.gethostname()
port = 12345
s.bind((host, port))
s.listen(5)
while True:
    c, addr = s.accept()
    print 'Got connection from', addr
    c.send('Thank you for connecting')
    c.close()

和错误信息:

Traceback (most recent call last):
  File "server.py", line 13, in <module>
    s.bind((host, port))
  File "/Users/solid*name*/anaconda/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

打印主机名给我

super*name*

实际上是我电脑的主机名,虽然我觉得应该有。最后是"本地"。事实上,如果末尾有一个.local, s.bind()就可以工作。为什么它不在那儿?

Mac OS X 10.7.5, Python 2.7.6:: Anaconda 2.0.0 (x86_64)

socket模块文档:

如果您在IPv4/v6套接字地址的host部分中使用主机名,则程序可能会显示不确定性行为,因为Python使用从DNS解析返回的第一个地址。根据DNS解析和/或主机配置的结果,套接字地址将以不同的方式解析为实际的IPv4/v6地址。对于确定性行为,在host部分使用数字地址。

绑定套接字的典型方法是只绑定到所有网络接口,使用等效的主机规范'''0.0.0.0'(对于IPv4)。这相当于C常数INADDR_ANY:

s.bind(('', port))

然后你不必担心主机名或当前网络接口地址等。只有在更不寻常的情况下,想要绑定到一个特定的网络接口(例如,在一个有多个网卡的主机上),你应该在调用bind()时指定地址;在这种情况下,您需要找出您想要的网络接口的数字IP地址并传递它。

最新更新