【问题标题】:Why does IPAddress.MapToIPv4() throw ArgumentOutOfRangeException?为什么 IPAddress.MapToIPv4() 会抛出 ArgumentOutOfRangeException?
【发布时间】:2014-06-29 19:17:16
【问题描述】:

此代码在最后一行引发 ArgumentOutOfRangeException

var initAddress = IPAddress.Parse("1.65.128.190");
var ipv6Address = initAddress.MapToIPv6();
Assert.IsTrue(ipv6Address.IsIPv4MappedToIPv6);
var ipv4Address = ipv6Address.MapToIPv4();

谁能解释为什么 MapToIPv6() 和 MapToIPv4() 不兼容往返行程?

编辑:异常源自 IPAddress 构造函数,由 MapToIPv4() 调用。

另外,当第一行是

var initAddress = IPAddress.Parse("1.65.128.90");

不再抛出异常

edit2:@Luaan 复制了这个,我添加了标签 [bug-reporting]。还添加了 [bcl]。让我们看看是否有任何 MS 人员跟踪这些标签 :)

edit3:在 Connect https://connect.microsoft.com/VisualStudio/feedback/details/871964 报告

【问题讨论】:

  • 有趣。有很多 IPv4 地址可以正常工作。事实上,根据一些临时测试,似乎最后一点是罪魁祸首——也许代码中的某个地方存在错误,如此随意地使用 longulongint 正数和负数强制转换.但是,为什么您仍然想要 IPv6 映射的 IPv4 地址呢?你在使用 linux 服务器吗?我认为 Windows 并没有真正处理这些(因为 IPv4 和 IPv6 是网络堆栈上的单独驱动程序 - 您需要两个单独的套接字来处理 IPv4 和 IPv6)。
  • 好吧,我真的不需要它,但在比较地址时我认为这是一个小小的胜利。我想我很幸运,我的代码测试实际上有一个这样的地址,以引导我远离我过早的(未分析的)优化......
  • @PatrickHuizinga 啊,我也一直在发布错误报告。无论如何,我提高了你的:)

标签: .net ipv6 ipv4 base-class-library bug-reporting


【解决方案1】:

好的,我实际上已经验证了这一点,所以让我发布这个作为答案。

IPAddress 类在将地址映射回 IPv4 时出错。

根据 .NET 参考代码,它是这样做的:

long address = 
  (((m_Numbers[6] & 0x0000FF00) >> 8) | ((m_Numbers[6] & 0x000000FF) << 8)) |
  ((((m_Numbers[7] & 0x0000FF00) >> 8) | ((m_Numbers[7] & 0x000000FF) << 8)) << 16);

对于在 .NET 中进行按位运算的任何人来说,这个问题应该是非常明显的 - 数字都是 ints。所以移动第二个ushort (m_Numbers[7]) 会得到一个负值,因为最高有效位是1。这意味着所有以高于127 的字节结尾的 IPv4 地址在从 IPv6 映射回来时都会导致错误。

简单的解决方法是这样的:

long address = 
 (((m_Numbers[6] & 0x0000FF00) >> 8) | ((m_Numbers[6] & 0x000000FF) << 8)) 
 |
 (
  (uint)(((m_Numbers[7] & 0x0000FF00) >> 8) | ((m_Numbers[7] & 0x000000FF) << 8))
  << 16
 );

只需在执行位移之前将 int 转换为 uint 即可。

当您考虑有符号类型时,按位运算可能会非常棘手。我猜代码是从 C++ 库或其他东西中复制的,不会出现此问题。

【讨论】:

  • 您是说这本质上是 .NET 源代码中的错误吗? - 是否应该通知 Microsoft?
  • @series0ne 是的,现在已经报告了 - connect.microsoft.com/VisualStudio/feedback/details/871964/…
  • 仅供大家参考,我在运行 .NET Framework 4.5.2 的完全修补的服务器上打了这个,所以我想修复要到 4.6
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 2021-03-05
  • 2021-03-19
  • 2023-03-14
  • 2021-04-09
  • 2014-12-18
  • 2013-12-08
  • 2010-09-27
相关资源
最近更新 更多