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

时间:2014-03-13 13:34:40

标签: python sockets

我复制了简单的服务器/客户端python程序来测试一些套接字通信。 如果将host定义为“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()调用,它们就会起作用。 我无法找到任何有关解决此问题的答案的gaierrors帖子。 这在SuSE Linux 13.1和python2.7上运行。

由于

通过在/ etc / hosts文件中添加别名来解决此问题。 没有理由回答为什么会这样做。

2 个答案:

答案 0 :(得分:0)

在主机名上绑定服务器你实际上是将它绑定在本地地址上,这是因为通常在/etc/hosts中有一行像127.0.1.1 somehostname,这是使用lo iface而不是出于优化原因,eth位于同一台计算机上。如果要接受来自所有接口的连接,请使用“0.0.0.0”。

答案 1 :(得分:0)

我只是做了这些步骤。

Ran命令:

hostname

说它给我一个价值&#39; yourHostName&#39;

在/ etc / hosts文件中输入如下内容。

127.0.0.1 yourHostName localhost

此信息的参考是:/ etc / hosts文件的格式。你可以see here.