此应用程序发布自己的地址,供其他系统连接到使用.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
区域索引。我可以将区域索引放入网址吗?根据{{3}}维基百科页面,它们会导致问题?我需要区域索引吗?有没有更好的方法从IP地址组装uri?
编辑:
根据查找有效地址的答案,我将代码更改为忽略链接本地地址,环回和多播地址 - 这在windows7中排除了这些地址,例如。
IPList[ipIndex].IsIPv6LinkLocal || IPList[ipIndex].IsIPv6Multicast || IPAddress.IsLoopback(IPList[ipIndex])
我现在假设如果有人使用这个软件和实际的ipv6地址,windows将不会将地址报告为具有区域索引,否则我构建的URL将会中断。我希望有一个现有的.net url构建类,它可以将IPAddress,port等作为输入,甚至可以更好地将远程客户端连接到IPAddress类,而不是Activator.GetObject中所需的字符串url。这将暂时做到。
答案 0 :(得分:2)
区域索引对其他系统没有任何意义。 (您的区域索引10可能是其他人的区域索引25,eth0,en0等,具体取决于恰好用于该特定网络和平台的网络接口。)另外,因为它们是link-local地址,(你可以告诉,因为它们以fe80::
开头)它们只有在被广告到本地局域网上的其他机器时才可用。
我建议你不要宣传IPv6链接本地地址。如果您必须通告它们,请查看是否有办法仅将它们通告给特定接口并且不要使用区域索引。其他系统需要知道链接本地地址只能从它们收到的相同接口使用。
最好将IPv6路由器添加到您的网络,并仅使用global unicast个地址。
答案 1 :(得分:0)
从RFC 3986的读数中,我认为正确的输出类似于tcp://[fe80::a8e8:2b42:3c07:c04a%2510]:port/name
- 您必须将%
编码为{{1} ,否则您的区域索引被视为百分比编码字符!另一方面,§3.2.2说:
ABNF 这里提供的是IPv6的文本定义的翻译 [RFC3513]中提供的字面地址。此语法不支持 IPv6范围的寻址区域标识符。
...所以带有区域索引的URI可能不符合该RFC,具体取决于您的阅读方式。
ETA:哦,我们走了,RFC 6874更新3986来描述互动。是的,你需要逃避百分号。
(我正在编写一个URL parsing, manipulation, and formatting library,目前我对如何处理区域索引感到困惑,因为规格对它们来说有点冷,并且它们没有太多使用。 ..)