2011-06-06 1 views
1

Это приложение публикует собственный адрес для других систем для подключения к удаленному удаленному компьютеру .net. Он получает все адреса компьютера что-то вроде:Как включить адреса ipv6 с (или без) индексами зоны в uri для удаленного доступа .net?

IPAddress[] IPList = Dns.GetHostEntry(Environment.MachineName).AddressList; 
string ipAddress = IPList[ipIndex].ToString(); 
if(ipAddress.contains(":")) 
{ 
    // ip6 address 
    url = "tcp://[" + ipAddress + "]:" + port + "/" + name; 
} 
else 
{ 
    url = "tcp://" + ipAddress + ":" + port + "/" + name; 
} 

Я добавил квадратные скобки в случае было путаницы в двоеточием согласно this RFC. Я думаю, что проблема заключается в зонных индексах - ToString() возвращает fe80::a8e8:2b42:3c07:c04a%10 - Обратите внимание на индекс зоны %10. Могу ли я помещать индекс зоны в URL? Согласно странице this wikipedia они вызывают проблемы? Нужен ли мне индекс зоны? Есть ли лучший способ собрать uri с IP-адреса?

редактировать:

В соответствии с ответом, чтобы найти действительные адреса Я изменил код, чтобы игнорировать ссылку локальных адресов, замыкания на себя и групповые адреса - это исключает их в windows7, например.

IPList[ipIndex].IsIPv6LinkLocal || IPList[ipIndex].IsIPv6Multicast || IPAddress.IsLoopback(IPList[ipIndex]) 

теперь я предполагаю, что если кто-то использует это программное обеспечение актуальной ipv6 адреса окна не сообщит адрес, как имеющий индекс зоны или другой URL, я строю сломается. Я надеялся на существующий класс построения url .net, который мог бы использовать IPAddress, порт и т. Д. Как входной сигнал или даже лучше для некоторого способа подключения удаленного клиента к классу IPAddress вместо строкового url, как это требуется в Activator.GetObject, но это будет сделано сейчас.

+1

Как в стороне, это не очень хороший способ проверить адрес IPv6. Класс IPAddress содержит свойство AddressFamily, которое представляет собой перечисление, которое содержит AddressFamily.InterNetworkV6, который указывает адрес IPv6 – blowdart

ответ

2

Индексы зон ничего не означают для других систем. (Ваш индекс зоны 10 может быть чужим зонным индексом 25, eth0, en0 и т. Д., В зависимости от сетевого интерфейса, который используется в этой конкретной сети, и платформы.) Кроме того, поскольку они являются адресами link-local (вы может сказать, потому что они начинаются с fe80::), они могут использоваться только в том случае, если они рекламируются другими машинами локальной сети.

Я предлагаю вам не рекламировать локальные адреса ссылок IPv6. Если вы должны их рекламировать, посмотрите, есть ли способ рекламировать их только на определенных интерфейсах и оставьте индекс зоны. Другие системы должны знать, что локальные адреса ссылок могут использоваться только из того же интерфейса, из которого они были получены.

Лучше было бы добавить маршрутизатор IPv6 в вашу сеть и использовать только адреса global unicast.

0

От чтения RFC 3986, я думаю правильный результат будет что-то вроде tcp://[fe80::a8e8:2b42:3c07:c04a%2510]:port/name - вы должны кодировать % в %25, в противном случае индекс зоны рассматривается как процент закодированный символ! С другой стороны, §3.2.2 говорит:

ABNF , представленный здесь, является переводом текста определения буквального адреса IPv6 , представленным в [RFC3513]. Этот синтаксис не поддерживает Идентификаторы зоны зоны действия IPv6.

... так что URI с индексом зоны может не соответствовать этому RFC, в зависимости от того, как вы его читаете.

ETA: О, вот мы идем, RFC 6874 Обновления 3986, чтобы описать взаимодействие. Да, вам нужно избежать знака процента.

(Я нахожусь в середине написания URL parsing, manipulation, and formatting library, и в настоящее время я немного зациклен на том, как обрабатывать индексы зон, учитывая, что спецификация немного крута на них, и они мало используются ...)