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