簡體   English   中英

如何解決python socket錯誤?

[英]How to solve python socket error?

我正在關注這個例子

#!/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

我怎樣才能解決這個問題?

讓我們看一下docs

socket.gethostname()

返回一個字符串,其中包含Python解釋器當前正在執行的機器的主機名。

如果您想知道當前機器的IP地址,則可能要使用gethostbyname(gethostname()) 此操作假定主機存在有效的主機到地址的映射 ,並且該假設並不總是成立。

注意:gethostname()並不總是返回完全限定的域名; 使用getfqdn()(請參見上文)。

我想這是發生了什么:綁定正在嘗試為主機建立IP地址,但是失敗了。 運行host = socket.gethostbyname(socket.gethostname()) ,而不是有效的IP地址,您很可能會看到與調用bind時相同的錯誤。

您說返回的主機名有效,但是必須確保DNS響應者可以識別它。 例如,從命令行ping {hostname}時,解析是否有效?

可能的解決方案是:

  1. 修復您的本地DNS解析。
  2. 使用host = socket.getfqdn() (以防萬一您沒有獲得完全合格的名稱,然后又無法正確解析)。 即使有效,我認為您也應該嘗試解決本地分辨率問題。
  3. 使用空主機( host = '' ),這在綁定時意味着“在所有可用接口上監聽”。 (這是文檔中的第一個示例 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM