通过搜索“ python dual-stack”,我找到了 https://bugs.pys.python.org/issue256667 有人提到有人已经在上一条消息
# 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数据包在v4 recvfrom上阻止它时可能会排队
致电,反之亦然。所以我想我需要使用线程?
在Python 3.x中制作双堆UDP服务器的最佳方法是什么?对我来说,Linux解决方案就足够了,但是当然,与平台无关的答案甚至更好。
基本上,如何在dual-stack中写这篇文章:
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)
By searching for 'python dual-stack', I found https://bugs.python.org/issue25667 where someone mentions that this was already resolved in https://bugs.python.org/issue17561. In the latter issue, one of the last messages helpfully mentions what the implemented solution is:
# 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)
However, I was looking for a generic solution. Or rather, I was looking for UDP but figured that, because this is on the IP layer, any solution would be generic. It turns out that create_server()
is TCP-only.
Binding to both v4 and v6 manually means I cannot just call recvfrom()
and let it block until a packet comes in, because then a v6 packet might be queued while it's blocking on the v4 recvfrom
call or vice versa. So I guess I need to use threading?
What is the best way to make a dual-stack UDP server in python 3.x? For me, a Linux solution would be sufficient, but of course platform-independent answers are even better.
Basically, how to write this in dual-stack:
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)
发布评论
评论(1)
至少在Linux下,为IPv6和IPv4连接创建IPv6插座。也就是说,给定以下代码:
连接
我可以使用IPv4:哪个导致IPv4
:或者我可以使用IPv6:
哪个导致:
At least under Linux, creating an IPv6 socket listens for both IPv6 and IPv4 connections. That is, given this code:
I can connect using IPv4:
Which results in:
Or I can connect using IPv6:
Which results in: