【发布时间】:2011-06-14 12:52:47
【问题描述】:
我正在实施双栈模式以支持 IPv4 和 IPv6。 如果我正在创建一个 IPv6 套接字并监听它,它是否也会接受来自 IPv4 套接字的连接??
【问题讨论】:
我正在实施双栈模式以支持 IPv4 和 IPv6。 如果我正在创建一个 IPv6 套接字并监听它,它是否也会接受来自 IPv4 套接字的连接??
【问题讨论】:
是的,除非操作系统另有配置,例如net.ipv6.bindv6only=1 在 Linux 中,或者您设置 IPV6_V6ONLY 套接字选项。
【讨论】:
SocketOptionName.IPv6Only 显式设置为 false,否则它不会接受 IPv6 套接字上的 IPv4 连接。示例:listener_socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
仅当系统具有dual-stack 实现时。大多数现代系统都有,但旧版本的 Windows 和 OpenBSD 没有。你不应该依赖这个。获取 IPV6_V6ONLY 套接字选项的值,如果它为零,则需要为 IPv4 打开第二个套接字。
当使用双栈套接字时,IPv4 地址表示为::ffff:[IPv4 address];例如::ffff:127.0.0.1(这对应于::ffff:7f00:1;为了便于阅读,它通常以点十进制表示法打印)。
【讨论】:
根据Microsoft,即使在双堆栈模式下,默认设置也是将 IPV6_V6ONLY 设置为 false - 但您可以通过 setsockopt(2) 调用启用它。 FWIW,“旧版本”的 Windows(单堆栈)包括仍在广泛使用的 Windows XP(比 Vista 更早的版本)。
因此,如果您使用的是 Windows,您应该尝试禁用 IPV6_V6ONLY 并查看它是否成功。我不知道这对于其他单栈实现是否是一个好的答案。
【讨论】: