2010-01-11 155 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