做一个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)
答案 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地址并传递它。