如何在 uri 中包含带(或不带)区域索引的 ipv6 地址,以便进行 .net 远程处理



此应用程序发布自己的地址,供其他系统使用 .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;
}

我添加了方括号,以防根据此 rfc 被冒号混淆。我认为问题是区域索引 - ToString()返回fe80::a8e8:2b42:3c07:c04a%10 - 请注意%10区域索引。我可以将区域索引放入 URL 中吗?根据这个维基百科页面,他们会引起问题?我需要区域索引吗?有没有更好的方法来从 IP 地址组装 URI?

编辑:

根据查找有效地址的答案,我更改了代码以忽略链接本地地址,环回和组播地址 - 这不包括Windows7中的这些地址,例如。

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

我现在假设,如果有人使用具有实际ipv6地址的软件,窗口将不会报告该地址具有区域索引,否则我构建的URL将损坏。我希望有一个现有的 .net url 构建类,它可以将 IPAddress、端口等作为输入,甚至更好地以某种方式将远程处理客户端连接到 IPAddress 类,而不是激活器中要求的字符串 url.GetObject 但现在可以。

区域索引对其他系统没有任何意义。(您的区域索引 10 可能是其他人的区域索引 25、eth0、en0 等,具体取决于恰好用于该特定网络的网络接口和平台。另外,由于它们是链路本地地址(您可以知道,因为它们以fe80::开头(,因此无论如何,它们只有在播发到本地 LAN 上的其他计算机时才可用。

我建议您不要宣传IPv6链路本地地址。如果必须通告它们,请查看是否有办法将它们仅播发到特定接口并保留区域索引。其他系统需要知道链路本地地址只能从接收它们的同一接口使用。

更好的方法是将IPv6路由器添加到您的网络,并且仅使用全局单播地址。

从 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 解析、操作和格式化库,目前有点坚持如何处理区域索引,因为规范对它们有点酷,而且它们使用不多......

最新更新