我尝试使用以下代码使我的代码在双堆栈模式下工作。不幸的是,它没有在双堆栈模式下打开端口。
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.Any
和IPAddress.IPv6Any
字段?
答案 0 :(得分:7)
IPAddress.Any
适用于所有IPv4接口,IPAddress.IPv6Any
适用于所有IPv6接口。
IPAddress.Any
为0.0.0.0
,IPAddress.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堆栈。默认设置是仅侦听显式指定的堆栈。