2013-04-30 1 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.Any и IPAddress.IPv6Any поля?

The documentation on MSDN is a bit vague

ответ

6

IPAddress.Any для всех интерфейсов IPv4, IPAddress.IPv6Any для всех интерфейсов IPv6.

IPAddress.Any является 0.0.0.0, IPAddress.IPv6Any является ::

Если вы просто использовать IPv6Any без использования SocketOptionName.IPv6Only, то вы можете принять оба IPv4 и IPv6 соединения на тот же сокет.

+0

, чтобы сделать мой код протокола агностистом, могу ли я использовать IPAddress.IPv6Any? – sarat

+0

@sarat: Я так считаю. – Jon

+0

Да, вы можете, опубликовать обновление. – PhonicUK

5

Для прослушивания как 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. По умолчанию используется только прослушивание в указанном стеке.

+0

То же решение работает для 'System.Net.Sockets'' Socket.SetSocketOption' в dot net 4.0. В 4.5 просто используйте 'TcpListener listener = TcpListener.Create (port);' поскольку это теперь поведение по умолчанию, см. Http://blogs.msdn.com/b/webdev/archive/2013/01/08/dual-mode- sockets-never-create-an-ipv4-socket-again.aspx – KCD

+0

И mono 4.0 throws «Опция протокола не поддерживается», но это, вероятно, разрешено здесь: https://github.com/mono/mono/blob/mono-4.2 0,0-ветвь/моно/метаданные/сокет-io.C# L536 – KCD

Смежные вопросы