Это приложение публикует собственный адрес для других систем для подключения к удаленному удаленному компьютеру .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, но это будет сделано сейчас.
Как в стороне, это не очень хороший способ проверить адрес IPv6. Класс IPAddress содержит свойство AddressFamily, которое представляет собой перечисление, которое содержит AddressFamily.InterNetworkV6, который указывает адрес IPv6 – blowdart