【问题标题】:What's the difference between IPAddress.Any and IPAddress.IPv6Any fields?IPAddress.Any 和 IPAddress.IPv6Any 字段有什么区别?
【发布时间】:2013-04-30 12:52:14
【问题描述】:

我尝试了以下代码以使我的代码在双堆栈模式下工作。不幸的是,它没有在双栈模式下打开端口。

var listener = new TcpListener(IPAddress.Any, 2222);
listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0);
listener.Start();

后来我意识到更改为 var listener = new TcpListener(IPAddress.IPv6Any, 2222); 会使其对我有用。到底有什么区别

IPAddress.AnyIPAddress.IPv6Any 字段?

The documentation on MSDN is a bit vague

【问题讨论】:

    标签: c# networking network-programming


    【解决方案1】:

    IPAddress.Any 用于所有 IPv4 接口,IPAddress.IPv6Any 用于所有 IPv6 接口。

    IPAddress.Any0.0.0.0IPAddress.IPv6Any::

    如果您只使用 IPv6Any 而不使用 SocketOptionName.IPv6Only,那么您可以在同一个套接字上同时接受 IPv4 和 IPv6 连接。

    【讨论】:

    • 要使我的代码协议不可知,我可以使用 IPAddress.IPv6Any 吗?
    • 我们确定使用 IPAddress.IPv6 是否可以使用 IPv4 和 IPv6?
    • @Kiewic,是的。喜欢的话自己试试吧:)
    • 我的测试表明 IPv6Any 默认情况下不会导致监听器绑定到 IPv4 堆栈(即需要指定套接字选项)。例如,当我尝试连接到 127.0.0.1 时,它失败了。请注意,使用主机名可能会导致混淆。例如,当我尝试连接到“localhost”时它起作用了,但只有在尝试 127.0.0.1 失败然后回退到 ::1 之后。
    • 如果你想使用双模式监听器并且你在 .NET 4.5 上使用 TcpListener.Create(port)。这就是您需要做的所有事情。
    【解决方案2】:

    要同时监听 IPv4 和 IPv6 堆栈,请使用以下代码:

    var listener = new TcpListener(IPAddress.IPv6Any, 2222);
    listener.Server.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
    

    IPv6Any 告诉 Windows 侦听 IPv6 堆栈。将 socket 选项设置为 false 会告诉 Windows 不将自身限制在 IPv6 堆栈上,而是还要侦听 IPv4 堆栈。默认是只监听明确指定的栈。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2011-12-06
    • 2019-04-18
    • 2019-06-14
    相关资源
    最近更新 更多