Как включить адреса IPv6 с (или без) зонными индексами в URI для удаленного взаимодействия. - PullRequest
1 голос
/ 06 июня 2011

Это приложение публикует свой собственный адрес для подключения других систем с использованием удаленного взаимодействия .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?Согласно этой странице википедии они вызывают проблемы?Нужен ли мне индекс зоны?Есть ли лучший способ собрать URI из IP-адреса?

edit:

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

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

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

Гораздо лучше было бы добавить маршрутизатор IPv6 в вашу сеть и использовать только глобальные одноадресные адреса.

0 голосов
/ 22 октября 2015

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

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

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

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

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

...