2013-04-30 181 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