【问题标题】:Python 3: Does http.server support ipv6?Python 3:http.server 是否支持 ipv6?
【发布时间】:2014-11-07 04:43:53
【问题描述】:

http.serverhttp 是 Python 3.x 模块)是否支持 ipv6?例如,使用这个命令行代码(启动一个网络服务器):

python -m http.server [port]

【问题讨论】:

  • 使用 netstat -l 查看它是否绑定到 IPv6 地址上的端口。如果是,“是的,它受支持”。
  • 你如何解释结果?我什至没有看到我要连接的端口号(或任何提及 IPv6)。
  • 也使用-n 选项,这会使输出更有用吗? IPv6 地址可以通过看起来与 IPv4 对应的不同来识别 - 如果服务器侦听 IPv6 和 IPv4 上的端口,则会显示两个条目。 IPv4 的 listen-all-IPs 值为 0.0.0.0,而 IPv6 的值为 ::0。 (如果此后未显示端口,则服务器当前根本没有运行/侦听。)
  • 但这不是一个答案 :( 它只是说它当前没有在 IPv6 上侦听;并不是说它不能。可能有一个选项等,或者它可能只是网络接口未设置为 IPv6。
  • 没有理由这不应该工作。底层代码显然支持它。是时候提交功能请求了。

标签: python-3.x webserver ipv6


【解决方案1】:

是的,确实如此。当定义你的服务器时,像here看到的那样做。

import socket
from http.server import HTTPServer

class HTTPServerV6(HTTPServer):
    address_family = socket.AF_INET6

然后像这样听:

server = HTTPServerV6(('::', 8080), MyHandler)
server.serve_forever()

【讨论】:

  • 遗憾的是,让内置 HTTP 服务器同时处理 IPv6 和 IPv4 连接似乎很困难。
  • 只要被动套接字未绑定到特定的 v6 地址(!= in6addr_any,“::”的空字符串)或设置了选项 IPv6_ONLY,IPv6 堆栈就会处理 IPv4 连接。
【解决方案2】:

Python 3 中有一个补丁允许在http.server 中绑定 IPv6。我试过了,发现它可以在我的笔记本电脑上运行。 请访问https://bugs.python.org/issue24209 了解更多信息。 或者只需执行以下操作:

+ 之后的行添加到文件/your/path/to/python/Lib/http/server.py。 请注意,没有+的行是server.py的原始代码。

    server_address = (bind, port)

+   if ':' in bind:
+       ServerClass.address_family = socket.AF_INET6
+        
    HandlerClass.protocal_version = protocol    
    httpd = ServerClass(server_address, HandlerClass)

那就试试吧:

python -m http.server -b *your-ipv6-addr* *your-port*

【讨论】:

  • 您可以扩展 HttpServer 而不是破解您的 Python 安装。
【解决方案3】:

从 Python 3.8 开始,python -m http.server 支持 IPv6(请参阅 documentationbug report with implementation history)。

监听所有可用接口:

python -m http.server --bind ::

Python 3.8 于 2019-10-14 发布。

【讨论】:

    【解决方案4】:

    Oliver Bock 的 Python 3 版本(直到 3.8)看起来像这样:

    myserver.py:

    from http.server import HTTPServer
    from http.server import SimpleHTTPRequestHandler
    import socket
    
    class HTTPServerV6(HTTPServer):
        address_family = socket.AF_INET6
    
    server = HTTPServerV6(('::', 8080), SimpleHTTPRequestHandler)
    server.serve_forever()
    

    修改您的内部 Python 3 文件,例如 Edward Zhang 似乎相当极端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-16
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多