Python gethostname()返回准确的主机名,bind()不';我不喜欢

Python gethostname()返回准确的主机名,bind()不';我不喜欢,python,socketserver,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')

在编写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
实际上,这是我的计算机的主机名,尽管我觉得应该在它的末尾加上“.local”。事实上,如果最后有一个.local,s.bind()就可以工作。为什么不在那里

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

来自:

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

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

s.bind(('', port))
这样,您就不必担心主机名或当前网络接口地址等。只有在希望绑定到特定网络接口(例如,在具有多个NIC的主机上)的更不寻常的情况下,您才需要在调用
bind()
时指定地址;在这种情况下,您需要计算出所需网络接口的数字IP地址并传递该地址

s.bind(('', port))