使用/etc/hosts中定义的实际主机名时出现socket.gaierror错误2,但使用localhost时未出现错误
我复制了一些简单的服务器/客户端的Python程序来测试一下套接字通信。如果主机定义为'localhost'或者'',它们就能正常工作。但如果我在/etc/hosts文件中替换成实际的主机名,它们就会失败,并出现socket.gaierror 2的错误。使用socket.gethostname()可以返回正确的值,命令行中的'hostname'也能返回正确的主机名。
这是导致失败的服务器代码:
#!/usr/bin/env python
"""
A simple echo server
"""
import socket
import sys
host = ''
port = 50000
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
print( " using host [%s] " % (host) )
s.bind((host,port))
s.listen(backlog)
while 1:
client, address = s.accept()
data = client.recv(size)
print( data )
if data:
client.send(data)
client.close()
这是客户端程序:
#!/usr/bin/env python
"""
A simple echo client
"""
import socket
host = 'localhost'
port = 50000
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
s.connect((host,port))
s.send('Hello, world')
data = s.recv(size)
s.close()
print( 'Received:', data )
这是在使用gethostname()调用时,server.py的实际输出:
using host [HP-linux]
Traceback (most recent call last):
File "server.py", line 18, in <module>
s.bind((host,port))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.gaierror: [Errno -2] Name or service not known
就像我说的,如果我把'gethostname()'的调用注释掉,它们就能正常工作。我找不到任何关于gaierror的帖子,里面的答案也没有解决这个问题。我是在SuSE Linux 13.1上运行的,使用的是python2.7。
谢谢。
这个问题通过在/etc/hosts文件中添加一个别名解决了。没有合理的解释说明为什么这样做会有效。
2 个回答
0
我简单地按照以下步骤操作。
运行了这个命令:
hostname
假设它返回了一个值 'yourHostName'
然后在你的 /etc/hosts 文件中添加一条记录,格式如下:
127.0.0.1 yourHostName localhost
关于这些信息的参考是:/etc/hosts 文件的格式。你可以在这里查看。
0
当你把服务器绑定到某个主机名时,其实你是在绑定到本地地址。这是因为通常在 /etc/hosts
文件里会有一行像这样:127.0.1.1 somehostname。这是为了让服务器使用本机的 lo
接口,而不是 eth
接口,这样可以提高性能。如果你想让服务器接受来自所有网络接口的连接,可以用 '0.0.0.0' 来代替。