【问题标题】:IPv6 socket creationIPv6 套接字创建
【发布时间】:2011-06-14 12:52:47
【问题描述】:

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

【问题讨论】:

    标签: sockets ipv6


    【解决方案1】:

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

    【讨论】:

    • 我在 .Net 中注意到您必须将 SocketOptionName.IPv6Only 显式设置为 false,否则它不会接受 IPv6 套接字上的 IPv4 连接。示例:listener_socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
    【解决方案2】:

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

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

    【讨论】:

    • @spencercw...但是在 ipv6 套接字上创建和接受连接时,我们必须传递 sockaddr_in6 结构及其大小。那么,它不会有所作为。以及如何设置 IPV6_V6ONLY 的值。您能否解释一下如何在代码中实现它。我需要在 setsocketoption 中传递这个吗??
    • 您可能不想更改仅 IPv6 选项。如果您可以使用双栈功能,请使用它,只有在不可用时才为 IPv4 打开第二个套接字。您需要使用getsockopt() 来获取选项的值。
    【解决方案3】:

    根据Microsoft,即使在双堆栈模式下,默认设置也是将 IPV6_V6ONLY 设置为 false - 但您可以通过 setsockopt(2) 调用启用它。 FWIW,“旧版本”的 Windows(单堆栈)包括仍在广泛使用的 Windows XP(比 Vista 更早的版本)。

    因此,如果您使用的是 Windows,您应该尝试禁用 IPV6_V6ONLY 并查看它是否成功。我不知道这对于其他单栈实现是否是一个好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2011-07-18
      相关资源
      最近更新 更多