2011-06-14 123 views
3

我正在实现双协议栈模式来支持IPV4和IPV6。 如果我正在创建一个IPV6套接字并监听它,它是否会接受来自IPv4套接字的连接?创建IPV6套接字

回答

3

是的,除非操作系统被另外配置,例如,您可以在Linux中使用net.ipv6.bindv6only=1,或者设置IPV6_V6ONLY套接字选项。

+0

我在.Net注意到你必须明确地将'SocketOptionName.IPv6Only'设置为'false',否则它不会接受IPv6套接字上的IPv4连接。例如:'listener_socket.SetSocketOption(SocketOptionLevel.IPv6,SocketOptionName.IPv6Only,false);' – 2011-06-14 19:12:34

2

仅当系统具有dual-stack实施。大多数现代系统都可以,但旧版本的Windows和OpenBSD不支持。你不应该依赖这个。获取IPV6_V6ONLY套接字选项的值,如果它为零,则需要为IPv4打开第二个套接字。

当使用双栈插座时,IPv4地址表示为::ffff:[IPv4 address];例如::ffff:127.0.0.1(这对应于::ffff:7f00:1;为便于阅读,它通常仅以点十进制表示法打印)。

+0

@spencercw ...但在创建并接受ipv6套接字连接时,我们必须传递sockaddr_in6结构及其大小。所以,它会不会有所作为。以及如何设置IPV6_V6ONLY的值。你能解释一下如何在代码中实现它吗?我需要通过setsocketoption传递这个吗? – 2011-06-14 20:55:24

+0

您可能不想更改仅IPv6选项。如果可用,请使用双栈功能,只有在不支持IPv4时才打开第二个套接字。您需要使用[getsockopt()](http://linux.die.net/man/3/getsockopt)来获取选项的值。 – spencercw 2011-06-14 21:51:57

1

Microsoft,默认甚至在双栈模式是有IPV6_V6ONLY设置为false - 但你可以通过调用setsockopt(2)调用启用它。 FWIW,Windows的“旧版本”(单一堆栈)包括仍然广泛使用的Windows XP(比Vista更早)。

所以,如果你在Windows上,你应该尝试和禁用IPV6_V6ONLY,看看它是否成功。我不知道这是否是其他单堆栈实现的好答案。