【问题标题】:HTTPServer: "Cannot assign requested address" on localhost vs 127.0.0.1HTTPServer:本地主机与 127.0.0.1 上的“无法分配请求的地址”
【发布时间】:2017-12-25 07:06:50
【问题描述】:

使用以下 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 网络(从我的家用路由器到我的手机上的网络共享)。
  3. 将代码中的'localhost'更改为'127.0.0.1'

所以我的问题是,这里出了什么问题?为什么这段代码会失败?

附: Here is ip a's output when connected to my home routerhere's its output when tethering

【问题讨论】:

  • 你试过其他可用的端口吗?端口 0 是系统或众所周知的端口,如 here 所述。
  • 如果从localhost 更改为127.0.0.1 可以修复它,这听起来像是DNS 问题。 dig localhost 显示什么?
  • 您的ip a 输出缺少重要的位,即接口lo。请添加此信息。

标签: python sockets tcp ipv6


【解决方案1】:

我想,你不能在 0 端口监听。 我在节点 js 和 SocketTest 中尝试过。他们 2 可以(并且不能)监听但/并且不能连接到端口。这意味着它可以也不能这样做。
这个链接可以帮助你吗
https://unix.stackexchange.com/questions/180492/is-it-possible-to-connect-to-tcp-port-0
https://docs.python.org/2/library/simplehttpserver.html

【讨论】:

  • 我不明白为什么这个答案被否决,它是正确的。你通常不能在端口 0 上监听。除非你以 root 身份运行你的 python sn-p,否则你将无法绑定低于 1024 的端口。所以你应该试试这个: s = HTTPServer(('localhost', 8080 ), SimpleHTTPRequestHandler)
  • @opentokix 使用('localhost', 0) 将分配一个随机的、开放的、非特权端口。
【解决方案2】:

我认为问题在于我的家庭 WiFi 网络上的 DNS 服务没有返回 localhost 的正确信息。我最终通过将地址硬编码为127.0.0.1 来解决这个问题。

【讨论】:

    【解决方案3】:

    在我更改我的 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地址有关,你可以查看ifconfig的输出。

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 2013-11-08
      • 2014-08-19
      • 2021-11-03
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多