使用/etc/hosts中定义的实际主机名时出现socket.gaierror错误2,但使用localhost时未出现错误

0 投票
2 回答
1990 浏览
提问于 2025-04-17 22:07

我复制了一些简单的服务器/客户端的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' 来代替。

撰写回答