IPv6套接字创建

3

我正在实现双栈模式以支持IPv4和IPv6。 如果我创建一个IPv6套接字并在其上进行监听,它是否也会接受IPv4套接字的连接?

我正在实现双栈模式以支持IPv4和IPv6。如果我创建一个IPv6套接字并开始监听它,是否能够接受来自IPv4套接字的连接?

3个回答

3
是的,除非操作系统被配置为不支持IPv4和IPv6混合模式,例如在Linux中设置net.ipv6.bindv6only=1,或者您设置了IPV6_V6ONLY套接字选项。

我注意到在.Net中,你必须明确将SocketOptionName.IPv6Only设置为false,否则它不会在IPv6套接字上接受IPv4连接。例如:listener_socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); - j.w.r

2
只有系统实现了双栈,才能进行此操作。大多数现代系统都支持,但旧版本的Windows和OpenBSD不支持。但您不应该依赖这一点。获取IPV6_V6ONLY套接字选项的值,如果为零,则需要打开第二个IPv4套接字。
在使用双栈套接字时,IPv4地址表示为 ::ffff:[IPv4地址] ;例如, ::ffff:127.0.0.1 (这对应于 ::ffff:7f00:1 ;仅出于可读性的考虑,通常以点十进制表示法打印)。

@spencercw...但是在创建和接受ipv6套接字连接时,我们必须传递sockaddr_in6结构及其大小。那么这不会有什么区别吗?如何设置IPV6_V6ONLY的值?您能否解释一下如何在代码中实现它?我需要在setsocketoption中传递吗? - Kundan Kumar
你可能不想改变IPv6 only选项。如果有双栈能力,请使用双栈,如果没有,则为IPv4打开第二个套接字。您需要使用getsockopt()来获取选项的值。 - spencercw

1

根据微软的说法,在双栈模式下,默认情况下IPV6_V6ONLY被设置为false - 但你可以通过setsockopt(2)调用来启用它。值得一提的是,“旧版本”的Windows(单栈)包括仍广泛使用的Windows XP(任何比Vista旧的版本)。

因此,如果你在Windows上,应该尝试禁用IPV6_V6ONLY,看看是否成功。我不知道这是否适用于其他单栈实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接