通過搜索“python dual-stack”,我發現https://bugs.python.org/issue25667有人提到這已經在https://bugs.python.org/issue17561中解決。在后一期中,最后一條訊息很有幫助地提到了實施的解決方案是什么:
# IPv4 only
>>> socket.create_server(addr)
# IPv6 only
>>> socket.create_server(addr, family=socket.AF_INET6)
# IPv4 IPv6
>>> socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
但是,我正在尋找一個通用的解決方案。或者更確切地說,我一直在尋找 UDP,但我想,因為這是在 IP 層上,所以任何解決方案都是通用的。事實證明,這create_server()是僅限 TCP 的。
手動系結到 v4 和 v6 意味著我不能只是呼叫recvfrom()并讓它阻塞直到資料包進來,因為這樣 v6 資料包可能會在它阻塞 v4recvfrom呼叫時排隊,反之亦然。所以我想我需要使用執行緒?
在 python 3.x 中制作雙堆疊 UDP 服務器的最佳方法是什么?對我來說,一個 Linux 解決方案就足夠了,但平臺獨立的答案當然更好。
基本上,如何在雙堆疊中撰寫:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('0.0.0.0', 53))
while True:
message, address = server_socket.recvfrom(1400)
uj5u.com熱心網友回復:
至少在 Linux 下,創建 IPv6 套接字會同時監聽 IPv6 和 IPv4 連接。也就是說,給定以下代碼:
import socket
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
s.bind(('::', 9090))
while True:
message, address = s.recvfrom(1024)
print(address, "says: ", message.decode())
我可以使用 IPv4 連接:
echo hello world | nc -u 127.0.0.1 9090
結果是:
('::ffff:127.0.0.1', 36694, 0, 0) says: hello world
或者我可以使用 IPv6 連接:
echo hello world | nc -u ::1 9090
結果是:
('::1', 51880, 0, 0) says: hello world
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/471942.html
標籤:Python python-3.x 插座 IPv6 IPv4
