WinError 10049:请求的地址在其内容中无效

2024-04-25 06:08:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python发出一个原始HTTP请求,并将响应写入一个文件。当我尝试绑定到主机的解析IP地址或域时,会得到以下信息:

Traceback (most recent call last):

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

  soc.bind(('168.62.48.183', 80))

OSError: [WinError 10049] The requested address is not valid in its context

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

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()

Tags: 文件in信息httpmostbindresponsesocket
3条回答
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)

代码失败的原因是您试图绑定到外部IP。
您的计算机不知道这个IP,因此出现错误消息,如果您将其更改为127.0.0.1它将工作,但在取消.send()之前,您需要.listen(4)ns, na = soc.accept(),而您的soc.recv()需要ns.recv(1024)

换言之,您将客户端套接字与服务器套接字混淆,并将绑定到本地计算机上不存在的IP。

还要注意soc.recv()将失败,您需要一个缓冲区大小参数,如so: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)

有两个主要区别,我们发送的是二进制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())

使用第三方软件(如xamp、wamp)创建服务器

那么

 soc.bind(('server_ip',port_number))

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

使用

soc.bind(('', PORT))

而不是

soc.bind(('IP', PORT))

相关问题 更多 >