首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ipv6转换为ipv4的问题

问将ipv6转换为ipv4的问题
EN

Stack Overflow用户
提问于 2010-01-11 18:04:16
回答 3查看 21.7K关注 0票数 9

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

为了解决这个问题,我添加了从ipv6转换到ipv4的代码。它来自于这个在线教程:https://web.archive.org/web/20211020102847/https://www.4guysfromrolla.com/articles/071807-1.aspx,我正在使用dsn.GetHostAddress,然后遍历返回的is,寻找一个是"InterNetwork“

代码语言:javascript
复制
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和not 7连接的客户端返回服务器计算机的ipv4 IP,而不是客户端计算机。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-17 03:36:51

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

没有一个神奇的IPV6 4<->IPV6 6转换器。它们是完全不同的协议,一个地址不能转换成另一个协议。如果希望可靠地检索客户端的IPV4地址,则需要确保客户端通过IPV4进行连接。

票数 7
EN

Stack Overflow用户

发布于 2013-08-29 06:19:25

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

代码语言:javascript
复制
foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))

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

代码语言:javascript
复制
/// <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;
}

以上代码在Windows7/Server 2008上的ASP.Net 2.0中工作。希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2013-03-14 07:39:41

如果您使用的是.Net 4.5Framework,那么就提供了一个将IP6转换为IP4的方法

代码语言:javascript
复制
public IPAddress MapToIPv4()

你可以找到细节这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2043769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档