4

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

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领域?

MSDN上的文档有点模糊

4

2 回答 2

11

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

IPAddress.Any0.0.0.0IPAddress.IPv6Any::

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

于 2013-04-30T13:07:29.473 回答
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 堆栈。默认是只监听明确指定的堆栈。

于 2015-02-02T15:49:32.157 回答