如何在uri中为(或没有)区域索引包含ipv6地址以进行.net远程处理?

时间:2011-06-06 06:43:05

标签: .net url remoting ipv6

此应用程序发布自己的地址,供其他系统连接到使用.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。这将暂时做到。

2 个答案:

答案 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,目前我对如何处理区域索引感到困惑,因为规格对它们来说有点冷,并且它们没有太多使用。 ..)