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

时间:2014-06-12 21:21:15

标签: python socketserver

做一个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'。事实上,如果最后有一个.local,s.bind()会起作用。为什么不在那里?

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

1 个答案:

答案 0 :(得分:2)

来自socket module documentation

  

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

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

s.bind(('', port))

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