2013-07-29 44 views
-2

我米使用代碼ip地址在服務器上沒有得到妥善

string host = System.Net.Dns.GetHostName(); 
string hostname = Dns.GetHostEntry(host).HostName; 
IPHostEntry ipEntry = Dns.GetHostEntry(host); 
IPAddress[] addr = ipEntry.AddressList; 

在當地其工作細,給我「192.168.1.4」,但在服務器端它給「2002:cc5d:A178 :: cc5d:A178 「

+1

沒有什麼不對勁的地方。 – CodeCaster

+1

第一個地址'192.168.1.4'是IPv4,第二個地址'2002:cc5d:a178 :: cc5d:a178'是IPv6地址。你需要使用哪個IP? – Kane

+0

@CodeCaster我想在服務器端192.168.1.4也 –

回答

2

第一個地址192.168.1.4是IPv4,第二個地址2002:cc5d:a178 :: cc5d:a178是一個IPv6地址。可悲的是,你不能從IPv6轉換成IPv4的如下詳述:Problem Converting ipv6 to ipv4

答案很簡單:禁用IPV6的服務器上,或者從DNS條目中刪除服務器的IPv6地址。

有沒有一個神奇的IPV4 < - > IPV6轉換器。它們是完全不同的協議,一個地址不會翻譯成另一個。如果您想要可靠地檢索客戶端的IPV4地址,則需要確保客戶端通過IPV4進行連接。

更新如果要禁用IPv6(在Windows服務器上)遵循Microsoft支持文章中說明:http://support.microsoft.com/kb/929852但請記住,IPv4是慢慢通過IPv6的替換,所以你可能會更好過使用服務器默認的IP分辨率。

+0

我應該如何在服務器上禁用IPV6?有沒有任何代碼? –

+0

禁用服務器上的ipv6幾乎肯定不是一個好主意。上面的知識庫文章明確指出「我們不建議禁用ipV6」,並且您可能在沒有這樣激進的步驟的情況下獲得所需的信息。 – weloytty

1

如果你得到的IP地址大於1個Ip,並且(假設服務器真的獲得了IPv4地址),你只需要尋找IPv4地址而不是ipV6。像

 string host = System.Net.Dns.GetHostName(); 
     string hostname = Dns.GetHostEntry(host).HostName; 
     IPHostEntry ipEntry = Dns.GetHostEntry(host); 
     IPAddress[] addr = ipEntry.AddressList; 
     foreach (IPAddress a in addr) 
      Console.WriteLine("{0}:{1}", a.AddressFamily, a.ToString()); 

這將讓你的線沿線的東西:

InterNetworkV6:fe80::c80b:d804:38c3:2734%17 
InterNetworkV6:fe80::752d:9c4a:69fd:cb63%15 
InterNetwork:169.254.80.80 
InterNetwork:10.0.1.17 
+0

IPAddress [] addr = ipEntry.AddressList;給我addr [0] = fe80 :: c80b:d804:38c3:2734%17 .... addr [1] = fe80 :: 752d:9c4a:69fd:cb63%15 ..... addr [2] = 192.168.1.5 ...... addr [3] = 10.0.1.17 ...它在我的本地主機上正常工作......但是在服務器上運行時addr [2]返回了一些像2002年的內容:cc5d: a178 :: cc5d:a178 –

+0

如果你根本沒有安裝ipv4 ......那麼你可能會運氣不好。你可以輕鬆地啓用/禁用它(一個快速谷歌發現http://mscerts.programming4.us/windows_server/windows%20server%202008%20%20%20configuring%20ipv4%20and%20ipv6%20addressing.aspx)但這不是什麼你應該隨心所欲地做,或者不知道發生了什麼(爲什麼服務器上沒有啓用ipv4?你有DHCP設置嗎?你需要讓你的網絡管理員參與進來) – weloytty

0

您可以使用此。

using System; 
using System.Net; 

public class IPNetworking 
{ 
    public static string GetIP4Address() 
    { 
    string IP4Address = String.Empty; 

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

//調用這個函數來獲得IP

string ClientIP = IP4.GetIP4Address();