2010-01-11 156 views
8

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

我添加了应该从ipv6转换到ipv4的代码,试图解决这个问题。这是从这个在线教程:http://www.4guysfromrolla.com/articles/071807-1.aspx .I'm使用dsn.GetHostAddress,然后循环通过IPS退换寻找一个是“互联网络”

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连接的客户端将返回机器的ipv4 IP而不是客户端计算机。

+8

我见过许多博客上重复的示例代码。我很惊讶,因为它是错误的。第1部分,获取客户端的IP地址。如果失败,请返回服务器的IP地址。 WTF?!? – 2010-04-05 16:07:17

+4

是的,刚刚在这里找到同样的例子:http://www.4guysfromrolla.com/articles/071807-1.aspx。如果没有别的,使用'ToString()'来检查枚举相等,看起来它是由一个.NET新手编写的。 – Groo 2010-12-07 16:03:07

回答

7

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

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

+6

当然还有一些明显的建议:IPv6即将到来,请准备好您的软件以正确处理它。依靠IPv4地址会伤害你。 – 2013-03-14 15:43:33

1

,如果你使用的是.NET 4.5框架,然后有一个方法供将IP6转换为IP4

public IPAddress MapToIPv4() 

你可以找到here

+4

该方法仅适用于通过首先将IPv4地址映射到v6而获得的IPv6地址。正如Jesse Weigert所说,没有魔法v6 - > v4转换器。 – AakashM 2013-05-03 15:54:56

6

我也有复制的示例代码和一个同事的细节指出它显然是越野车。 该行使用的服务器的主机名,因此,不正确的结果:

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; 
} 

上面的代码在ASP.Net 2.0在Windows 7/Server 2008上。 希望这会有所帮助。

+0

不是括号的粉丝吗? :) – Evorlor 2017-06-13 23:58:09