【问题标题】:How to solve python socket error?如何解决python套接字错误?
【发布时间】:2015-07-20 00:37:17
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

  • host 的值是多少? socket.gethostname() 是否有可能返回无效的主机名?
  • 如果您尝试:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 会发生什么?如果这不起作用,请尝试更改 host = ''?
  • @shuttle87 应该这样做。我试图找到我的套接字代码,但 .AF_INET 是我们以前使用过的——我认为这会起作用!
  • 主机有效,返回机器名。我做了 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM), s 是一个有效的套接字对象,但得到了同样的错误。 host = '' 有效,但为什么它有效,因为根据 python 文档,如果使用 AF_INET,它应该是主机名字符串或 IP 地址?

标签: python sockets


【解决方案1】:

我们来看看the docs

socket.gethostname()

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

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

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

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

您说返回的主机名是有效的,但您必须确保它被 DNS 响应程序识别。例如,从命令行执行ping {hostname} 时,解析是否有效?

可能的解决方案是:

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

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 2010-09-23
    • 1970-01-01
    • 2016-04-19
    • 2015-09-27
    • 2020-12-06
    • 1970-01-01
    • 2011-11-21
    • 2018-10-30
    相关资源
    最近更新 更多