【问题标题】:Problem Converting ipv6 to ipv4将 ipv6 转换为 ipv4 的问题
【发布时间】:2011-01-03 20:47:10
【问题描述】:

我在一个 asp.net 应用程序中有一些代码需要获取客户端计算机的 ipv4 地址(用户都在我们自己的网络上)。最近我们将运行应用程序的服务器升级到 Windows 2008 服务器。现在,当客户端在较旧的操作系统上时,Request.UserHostAddress 代码返回 ipv4,当客户端在较新的操作系统(Vista 和更高版本)上时返回 ipv6。因此,依赖于此的功能适用于某些客户而不适用于其他客户。

我添加了应该从 ipv6 转换为 ipv4 的代码来尝试解决这个问题。它来自这个在线教程:http://www.4guysfromrolla.com/articles/071807-1.aspx。我正在使用 dsn.GetHostAddress,然后遍历返回的 IP,寻找一个“InterNetwork”

foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress))
{
    if (IPA.AddressFamily.ToString() == "InterNetwork")
    {
        IP4Address = IPA.ToString();
        break;
    }
}

if (IP4Address != String.Empty)
{
    return IP4Address;
}


foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
    if (IPA.AddressFamily.ToString() == "InterNetwork")
    {
        IP4Address = IPA.ToString();
        break;
    }
}

return IP4Address;

问题是这对我不起作用。从 ipv4 连接的客户端继续返回客户端计算机的正确 ipv4 IP,但从 Vista 和 Windows 7 连接的客户端返回的是 SERVER 机器的 ipv4 IP,而不是客户端计算机。

【问题讨论】:

  • 我在很多博客上都看到过这个示例代码。我很惊讶,因为它是如此错误.. 第 1 部分,获取客户端的 IP 地址。如果失败,则返回服务器的 IP 地址。 wtf?!?
  • 是的,刚刚在这里找到了相同的示例:4guysfromrolla.com/articles/071807-1.aspx。如果不出意外,使用ToString() 来检查枚举相等性看起来像是由一个 .NET 新手编写的。

标签: c# asp.net ipv6


【解决方案1】:

我还复制了示例代码,一位同事指出这显然是错误的。 此行使用服务器的主机名,因此结果不正确:

foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))

我已将项目中的代码更正如下:

/// <summary>
/// Returns the IPv4 address of the specified host name or IP address.
/// </summary>
/// <param name="sHostNameOrAddress">The host name or IP address to resolve.</param>
/// <returns>The first IPv4 address associated with the specified host name, or null.</returns>
public static string GetIPv4Address(string sHostNameOrAddress)
{
  try
  {
    // Get the list of IP addresses for the specified host
    IPAddress[] aIPHostAddresses = Dns.GetHostAddresses(sHostNameOrAddress);

    // First try to find a real IPV4 address in the list
    foreach (IPAddress ipHost in aIPHostAddresses)
      if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
        return ipHost.ToString();

    // If that didn't work, try to lookup the IPV4 addresses for IPV6 addresses in the list
   foreach (IPAddress ipHost in aIPHostAddresses)
     if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
      {
        IPHostEntry ihe = Dns.GetHostEntry(ipHost);
        foreach (IPAddress ipEntry in ihe.AddressList)
          if (ipEntry.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
            return ipEntry.ToString();
      }
  }
  catch (Exception ex)
  {
    System.Diagnostics.Trace.WriteLine(ex);
  }
  return null;
}

以上代码适用于 Windows 7/Server 2008 上的 ASP.Net 2.0。 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您使用的是 .Net 4.5 Framework,那么有一种方法可以将 IP6 转换为 IP4

    public IPAddress MapToIPv4()
    

    你可以找到详情here

    【讨论】:

    • 该方法仅适用于首先通过将 IPv4 地址映射到 v6 获得的 IPv6 地址。正如 Jesse Weigert 所说,没有神奇的 v6 -> v4 转换器。
    【解决方案3】:

    简单回答:在服务器上禁用 IPV6,或者从 DNS 条目中删除服务器的 IPV6 地址。

    没有神奇的 IPV4IPV6 转换器。它们是完全不同的协议,一个中的地址不会转换为另一个。如果您想可靠地检索客户端的 IPV4 地址,则需要确保客户端通过 IPV4 连接。

    【讨论】:

    • 当然还有明显的建议:IPv6 即将到来,准备好您的软件以正确处理它。依赖 IPv4 地址会伤害你。
    猜你喜欢
    • 2015-03-28
    • 2015-03-10
    • 2019-09-22
    • 1970-01-01
    • 2017-12-17
    • 2018-01-23
    • 2020-11-06
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多