我复制了简单的服务器/客户端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文件中添加别名来解决此问题。 没有理由回答为什么会这样做。
答案 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.