2014-09-12 714 views
3

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

python -m http.server [port] 
+2

使用netstat的'向-l'看看它绑定到端口上的IPv6地址。如果是,那么“是的,它是支持的”。 – user2864740 2014-09-12 22:38:29

+0

你如何解释结果?我甚至没有看到我连接到的端口号(或任何提到的IPv6)。 – Shule 2014-09-12 23:13:21

+1

也使用'-n'选项,这是否使输出更有用? IPv6地址可以通过与IPv4相对应的不同来识别 - 如果服务器侦听IPv6和IPv4上的端口,则会显示两个条目。 IPv4的listen-all-IPs值为0.0.0.0,IPv6的值为:: 0。 (如果之后没有显示端口,那么服务器当前不在运行/收听。) – user2864740 2014-09-12 23:16:25

回答

4

是的,它的确如此。在定义你的服务器时,像这样做,如here

class HTTPServerV6(HTTPServer): 
    address_family = socket.AF_INET6 

,然后听这样的:

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

令人难过的是,让内置HTTP服务器处理IPv6和IPv4连接似乎很困难 – 2015-09-18 07:14:38

+0

IPv6栈将IPv4连接处理为只要被动套接字未绑定到特定的v6地址(!= in6addr_any,一个空字符串“::”)或选项IPv6_ONLY被设置。 – 2016-05-30 09:05:09

5

有一个补丁,允许IPv6的绑定在http.server在Python 3。我试了一下,发现它可以在我的笔记本电脑。 请访问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*