我正在关注此example,
#!/usr/bin/python # This is server.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close() # Close the connection
尽管有良好的网络,但我收到了这个错误:
>>> s.bind((host, port))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Applications/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
我该如何解决这个问题?
答案 0 :(得分:3)
我们来看看the docs:
<强> socket.gethostname()强>
返回包含主机名的字符串 Python解释器当前正在执行的机器。
如果您想知道当前机器的IP地址,您可能需要 使用 gethostbyname(gethostname())。此操作假定存在 主机的有效地址到主机映射,并且假设确实如此 并不总是坚持。
注意:gethostname()并不总是返回完全限定的域 名称;使用getfqdn()(见上文)。
我想这就是发生的事情:bind正在尝试为主机建立IP地址,但它失败了。运行host = socket.gethostbyname(socket.gethostname())
而不是有效的IP地址,您很可能会看到与调用bind时相同的错误。
您说返回的主机名有效,但您必须确保DNS响应者能够识别它。例如,从命令行执行ping {hostname}
时,解决方案是否有效?
可能的解决方案是:
host = socket.getfqdn()
(如果您没有获得完全限定的名称,则无法正确解析)。即使它有效,我认为你应该尝试修复本地分辨率。host = ''
),绑定意味着“侦听所有可用接口”。 (这是文档中的第一个example。)