如何解决python socket错误?

时间:2015-07-20 00:37:18

标签: python sockets

我正在关注此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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

我们来看看the docs

  

<强> socket.gethostname()

     

返回包含主机名的字符串   Python解释器当前正在执行的机器。

     

如果您想知道当前机器的IP地址,您可能需要   使用 gethostbyname(gethostname())。此操作假定存在   主机的有效地址到主机映射,并且假设确实如此   并不总是坚持。

     

注意:gethostname()并不总是返回完全限定的域   名称;使用getfqdn()(见上文)。

我想这就是发生的事情:bind正在尝试为主机建立IP地址,但它失败了。运行host = socket.gethostbyname(socket.gethostname())而不是有效的IP地址,您很可能会看到与调用bind时相同的错误。

您说返回的主机名有效,但您必须确保DNS响应者能够识别它。例如,从命令行执行ping {hostname}时,解决方案是否有效?

可能的解决方案是:

  1. 修复您的本地DNS解析。
  2. 使用host = socket.getfqdn()(如果您没有获得完全限定的名称,则无法正确解析)。即使它有效,我认为你应该尝试修复本地分辨率。
  3. 使用空主机(host = ''),绑定意味着“侦听所有可用接口”。 (这是文档中的第一个example。)