IPAddress.Any和IPAddress.IPv6Any字段有什么区别?

时间:2013-04-30 12:52:15

标签: c# networking network-programming

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

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

2 个答案:

答案 0 :(得分:7)

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

IPAddress.Any0.0.0.0IPAddress.IPv6Any::

如果您在不使用SocketOptionName.IPv6Only的情况下使用IPv6Any,则可以在同一套接字上同时接受IPv4和IPv6连接。

答案 1 :(得分:6)

要同时侦听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堆栈。默认设置是仅侦听显式指定的堆栈。