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