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 件事可以防止这种情况发生:

  1. 正在禁用 WiFi。
  2. 正在切换到不同的 WiFi 网络(从我的家用路由器切换到 phone 上的网络共享)。
  3. 将代码中的 '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=].