2014-09-12 110 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*