WinError 10049:请求的地址在其上下文中无效

use*_*109 2 python sockets httprequest

我试图在Python中创建一个原始HTTP请求并将响应写入文件.当我尝试绑定到已解析的IP地址或主机的域时,我得到:

Traceback(最近一次调用最后一次):

File "thingy.py", line 3, in <module>

  soc.bind(('168.62.48.183', 80))
Run Code Online (Sandbox Code Playgroud)

OSError:[WinError 10049]请求的地址在其上下文中无效

我发现一个StackOverflow问题有相同的错误,但它没有回答我的问题,因为它是一个监听套接字.这是我的代码:

from socket import *
soc = socket(AF_INET, SOCK_STREAM)
soc.bind(('168.62.48.183', 80))
soc.send('GET /miners/get?file=BFGMiner-3.99-r.1-win32.zip HTTP/1.1\nUser-Agent:MultiMiner/V3\nHost: www.multiminerapp.com\n')
response = soc.recv()
respfile = open("http-response.txt","w")
respfile.writelines(response)
respfile.close()
Run Code Online (Sandbox Code Playgroud)

Tor*_*xed 6

from socket import *
soc = socket(AF_INET, SOCK_STREAM)
soc.connect(('168.62.48.183', 80))
soc.send('GET /miners/get?file=BFGMiner-3.99-r.1-win32.zip HTTP/1.1\nUser-Agent:MultiMiner/V3\nHost: www.multiminerapp.com\n')
with open("http-response.txt","w") as respfile:
    response = soc.recv(1024) # <--- Use select.epoll or asyncore instead!
    respfile.writelines(response)
Run Code Online (Sandbox Code Playgroud)

您的代码失败的原因是因为您尝试绑定到外部IP.
你的机器不知道这个IP,因此错误信息,如果你改变它说它127.0.0.1会起作用,但是再次你需要一个.listen(4)ns, na = soc.accept()之前的utelizing .send(),你soc.recv()需要ns.recv(1024).

换句话说,您将客户端套接字与服务器套接字混合在一起,并且您绑定到本地计算机上不存在的IP.

另请注意:soc.recv()将失败,您需要一个缓冲区大小的参数,如下所示:soc.recv(1024)

Python3:

from socket import *
soc = socket(AF_INET, SOCK_STREAM)
soc.connect(('168.62.48.183', 80))
soc.send(b'GET /miners/get?file=BFGMiner-3.99-r.1-win32.zip HTTP/1.1\nUser-Agent:MultiMiner/V3\nHost: www.multiminerapp.com\n\n') # Note the double \n\n at the end.
with open("http-response.txt","wb") as respfile:
    response = soc.recv(8192)
    respfile.write(response)
Run Code Online (Sandbox Code Playgroud)

有两个主要区别,我们发送二进制GET /miners/..字符串而不是标准字符串.其次,我们以二进制形式打开输出文件,因为收到的数据也将是二进制形式.

这是因为Python由于多种原因不再为您解码字符串,因此您需要将数据视为二进制或手动解码.

你可能应该:

import urllib.request
f = urllib.request.urlopen("http://www.multiminerapp.com/miners/get?file=BFGMiner-3.99-r.1-win32.zip")
print(f.read())
Run Code Online (Sandbox Code Playgroud)

  • @Torxed:感谢您为我们指明了正确的方向:“您的代码失败的原因是因为您试图绑定到外部IP。” (2认同)

vre*_*err 5

首先,您必须将两台设备连接到同一网络。然后,对于 server.py (或任何你想调用它的东西)

soc.bind(('', PORT))
Run Code Online (Sandbox Code Playgroud)

代替

soc.bind(('IP', PORT))
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明一下吗? (3认同)
  • 当您使用 python 创建服务器时, soc.bind 的第一个字段需要是空字符串。 (2认同)