【问题标题】:Should I listen for IPv6 connections on a separate port than IPv4?我应该在与 IPv4 不同的端口上侦听 IPv6 连接吗?
【发布时间】:2011-06-16 16:01:13
【问题描述】:

我有一个程序可以监听连接并处理它们。我知道许多网络堆栈支持通过同一套接字/端口接受 IPv4 和 IPv6 连接,但我也听说 Windows XP 不是其中之一。为了让相同的代码在所有平台上运行良好,我应该只在单独的端口上监听 IPv6 连接吗?

【问题讨论】:

  • 为什么不直接绑定两个具有相同端口号的 v6 和 v4 套接字呢?这不是一个复杂的概念。
  • @Jeremy - 如果您正在谈论将 IPv4 和 IPv6 流量放在同一个端口上,那么这在 XP 中是行不通的。它在 Vista 和 Windows 7 中运行良好,但 XP 无法处理(根据下面列出的 Microsoft 解释)。
  • 据我所知,这仍然不正确。所有文章都说在 XP 上,您需要同时绑定 AF_INET 和 AF_INET6 以在同一端口上同时支持 v4 和 v6,这与其他操作系统不同,您可以通过 v4 映射地址在单个 AF_INET6 套接字上支持 v4 和 v6。 (除非我看错了,这完全有可能。)

标签: c networking ipv6 sockets


【解决方案1】:

Windows XP SP2+ 实现dual-stack IP 架构。这意味着您可以有两个绑定到相同端口号的套接字(一个用于 AF_INET,另一个用于 AF_INET6 系列)。这很好用。

注意:如果您打算使用单个套接字来处理 IPv4 和 IPv6 连接,那么您依赖于 Windows Vista 及更高版本中实现的所谓的dual IP layer stack 架构(在这种情况下,您'必须禁用该套接字上的IPV6_V6ONLY 选项)。

参考Microsoft's Objectives for IP Version 6

查看Application Aspects of IPv6 Transition (RFC 4038) 中的一般建议。

PS:BiggsTRC 目前接受的答案通常不准确,如相应的 cmets 中所述。但是,如果您可以使用两个端口号 - 那么这个答案仍然很有意义。

PS2:我使用了链接文章中的术语。不确定是否有任何其他平台在dual-stackdual-layer 术语之间使用这种分隔。

【讨论】:

    【解决方案2】:

    如果您希望与 XP 平台兼容,最简单的答案是监听两个单独的端口。如果你想变得更复杂,你可能会在运行时进行操作系统检测并确定端口或其他东西,但是当简单地拥有两个端口就可以解决问题时,这似乎过于复杂。

    这里是有关 IPv6 和 XP 的更多信息的链接:

    http://msdn.microsoft.com/en-us/library/bb513665(v=vs.85).aspx

    【讨论】:

    • 我能得到关于-1的解释吗?
    • 该页面告诉您不能在 XP/2003 上制作单插槽双栈。它没有告诉你它们必须有不同的端口号。
    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多