【问题标题】:socket.connect() gives socket.gaierror: [Errno 11004] getaddrinfo failedsocket.connect() 给出 socket.gaierror: [Errno 11004] getaddrinfo failed
【发布时间】:2016-11-03 10:28:36
【问题描述】:

我已经检查了有关我的问题的答案,但我找不到问题所在。我是 Python 新手,这可能是个问题。我已经编写了这个简单的代码来连接到一个站点,但是我收到了这个错误:

socket.gaierror: [Errno 11004] getaddrinfo failed

这是我的代码:

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('http://www.py4e.com', 80))
mysock.send('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
while True:
    data = mysock.recv(512)        
    if(len(data) < 1):
        break
    print (data)
mysock.close()

【问题讨论】:

  • 主机名包含方案 (xxx://)。
  • @MichaelFoukarakis 副本用于绑定套接字,该套接字在主机名查找期间的工作方式完全不同。但值得注意的是。
  • 有几十个重复的问题也有相同的错误,例如this。即使确切的 MVCE 不一样,查看其中任何一个以获取此错误代码或描述也可以解决此问题。
  • 谢谢你们的宝贵建议!

标签: python


【解决方案1】:
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4e.com', 80))
mysock.send('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
while True:
    data = mysock.recv(512)        
    if(len(data) < 1):
        break
    print (data)
mysock.close()

很简单,不要在.connect() 的主机声明中使用http://
http:// 是一个协议www.py4e.com 是一个主机(或 DNS 服务器中的 A 记录)。标准套接字库对协议一无所知,因此只需要一个 host 和一个 port 号。
如果您想要自动化流程,请查看 urllib.request 或 @Mego 的答案,使用 Requests 为您处理连接和 HTTP 解析。

此外,如果您可能应该使用Python3,您需要在执行.send() 时发送bytes 数据。

有两种方法可以将您的字符串转换为bytes 数据:

mysock.send(b'GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
mysock.send(bytes('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n', 'UTF-8'))

两者基本上都做同样的事情。

最后,在 GET 请求中,您也不会请求 http://
相反,您只需发送要检索的文件的路径:

mysock.send(b'GET /code3/mbox-short.txt HTTP/1.0\n\n')

原因是(再次)http:// 是一个协议描述符,而不是发送的实际协议数据的一部分。您也不需要在 GET 请求中声明 host,因为您连接的服务器已经知道您在哪个主机上 - 因为您已经...连接到它。 相反,如果主机为多个虚拟主机提供服务,则服务器希望您提供 Host: &lt;hostname&gt;\r\n 标头。
您可能需要一些其他标头才能从某些 Web 服务器请求实际内容。

但这是事情的基本要点。

继续阅读

这是一个好的开始:

它向您展示了原始 GET 请求的样子。
将来我建议使用您的浏览器内置的Network Debugger,它可以显示原始标题、原始响应和一大堆其他内容。

【讨论】:

  • 非常感谢您的帮助!我也会检查您发送的链接。
  • @A.Drosi 不客气,欢迎来到 SO!如果您觉得我的或任何其他答案解决了您的问题,请随时将您认为合适的任何答案标记为可接受的解决方案。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多