HTTPServer:本地主机上的 "Cannot assign requested address" 与 127.0.0.1
HTTPServer: "Cannot assign requested address" on localhost vs 127.0.0.1
使用以下 Python 3 代码:
from http.server import HTTPServer, SimpleHTTPRequestHandler
s = HTTPServer(('localhost', 0), SimpleHTTPRequestHandler)
我收到以下错误:
Traceback (most recent call last):
File "repro.py", line 2, in <module>
s = HTTPServer(('localhost', 0), SimpleHTTPRequestHandler)
File "/usr/lib/python3.6/socketserver.py", line 453, in __init__
self.server_bind()
File "/usr/lib/python3.6/http/server.py", line 136, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.6/socketserver.py", line 467, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 99] Cannot assign requested address
我注意到有 3 件事可以防止这种情况发生:
- 正在禁用 WiFi。
- 正在切换到不同的 WiFi 网络(从我的家用路由器切换到 phone 上的网络共享)。
- 将代码中的
'localhost'
更改为 '127.0.0.1'
。
所以我的问题是,这里出了什么问题?为什么这段代码执行时会失败?
P.S。 Here is ip a's output when connected to my home router, and here's its output when tethering.
我想,你不能在 0 端口收听。
我在节点 js 和 SocketTest 中尝试过。他们 2 可以(也不能)听 but/and 无法连接到端口。这意味着它可以也不能同时做到这一点。
这个 link 可以帮助你
https://unix.stackexchange.com/questions/180492/is-it-possible-to-connect-to-tcp-port-0
https://docs.python.org/2/library/simplehttpserver.html
我认为问题出在我家庭 WiFi 网络上的 DNS 服务没有返回正确的本地主机信息。我最终通过将地址硬编码为 127.0.0.1
.
来解决这个问题
我更改 vps 的 ip 后出现相同的错误,因此 ifconfig
将输出如下内容:
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo
接口没有IP地址。如果一切正常,这个ip地址应该是127.0.0.1
,正常输出是这样的:
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我不确定是什么原因导致这个错误,但是这个错误与端口无关,而是与ip地址有关,你可以查看[=的输出12=].
使用以下 Python 3 代码:
from http.server import HTTPServer, SimpleHTTPRequestHandler
s = HTTPServer(('localhost', 0), SimpleHTTPRequestHandler)
我收到以下错误:
Traceback (most recent call last):
File "repro.py", line 2, in <module>
s = HTTPServer(('localhost', 0), SimpleHTTPRequestHandler)
File "/usr/lib/python3.6/socketserver.py", line 453, in __init__
self.server_bind()
File "/usr/lib/python3.6/http/server.py", line 136, in server_bind
socketserver.TCPServer.server_bind(self)
File "/usr/lib/python3.6/socketserver.py", line 467, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 99] Cannot assign requested address
我注意到有 3 件事可以防止这种情况发生:
- 正在禁用 WiFi。
- 正在切换到不同的 WiFi 网络(从我的家用路由器切换到 phone 上的网络共享)。
- 将代码中的
'localhost'
更改为'127.0.0.1'
。
所以我的问题是,这里出了什么问题?为什么这段代码执行时会失败?
P.S。 Here is ip a's output when connected to my home router, and here's its output when tethering.
我想,你不能在 0 端口收听。
我在节点 js 和 SocketTest 中尝试过。他们 2 可以(也不能)听 but/and 无法连接到端口。这意味着它可以也不能同时做到这一点。
这个 link 可以帮助你
https://unix.stackexchange.com/questions/180492/is-it-possible-to-connect-to-tcp-port-0
https://docs.python.org/2/library/simplehttpserver.html
我认为问题出在我家庭 WiFi 网络上的 DNS 服务没有返回正确的本地主机信息。我最终通过将地址硬编码为 127.0.0.1
.
我更改 vps 的 ip 后出现相同的错误,因此 ifconfig
将输出如下内容:
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo
接口没有IP地址。如果一切正常,这个ip地址应该是127.0.0.1
,正常输出是这样的:
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我不确定是什么原因导致这个错误,但是这个错误与端口无关,而是与ip地址有关,你可以查看[=的输出12=].