2013-04-30 94 views
3

我试了下面的代码,使我的代码在双栈模式下工作。不幸的是,它不是在双栈模式下打开端口。IPAddress.Any和IPAddress.IPv6Any字段有什么区别?

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

回答

6

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

IPAddress.Any0.0.0.0IPAddress.IPv6Any::

如果只是用IPv6Any不使用SocketOptionName.IPv6Only那么你可以接受相同的插槽上IPv4和IPv6连接。

+0

使我的代码协议agnost,我可以使用IPAddress.IPv6Any? – sarat 2013-04-30 13:13:19

+0

@sarat:我相信。 – Jon 2013-04-30 13:18:50

+0

是的,你可以,发布更新。 – PhonicUK 2013-04-30 13:35:09

5

上侦听IPv4和IPv6双协议栈,使用此代码:

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

IPv6Any告诉Windows要侦听的IPv6堆栈。将套接字选项设置为false可以让Windows不将自身限制在IPv6堆栈中,而是监听IPv4堆栈。默认情况下只侦听显式指定的堆栈。

+0

相同的解决方案适用于dot net 4.0中的'System.Net.Sockets''Socket.SetSocketOption'。在4.5中简单地使用'TcpListener listener = TcpListener.Create(port);'因为这是现在的默认行为,请参阅http://blogs.msdn.com/b/webdev/archive/2013/01/08/dual-mode- socket-never-create-an-ipv4-socket-again.aspx – KCD 2015-11-26 21:24:05

+0

单声道4.0抛出'协议选项不支持',但这可能在这里解决:https://github.com/mono/mono/blob/mono-4.2的3.0支/单声道/元/插座io.c中#L536 – KCD 2015-11-26 23:22:49