2013-10-25 38 views
0

我需要找出本地IP地址,因爲這個原因,我用下面的代碼:找出活動的本地IP

IPHostEntry host; 
string localIP = ""; 
host = Dns.GetHostEntry(Dns.GetHostName()); 
foreach (IPAddress ip in host.AddressList) 
{ 
    if (ip.AddressFamily == AddressFamily.InterNetwork) 
    { 
     localIP = ip.ToString(); 
     break; 
    } 
} 
return localIP; 

我發現,當電腦有一個以上的IP與AddressFamily.InterNetwork我總是第一個。但是我找不到任何屬性來查找活動IP。

如何獲得正確的IP?

感謝您的任何提示!

+2

你是什麼意思「活躍」? PC可以有很多IP地址,多個可以被認爲是活動的。 –

+0

我想知道哪個IP代表本地網絡上的PC –

+0

檢查連接的一個:System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); – Stefan

回答

0

前段時間我從網上找到了這個。

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

這應該給你一個你的電腦的所有IP地址的數組。

0

Bwall張貼在this thread.

foreach(NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 
{ 
    if(ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet) 
    { 
     Console.WriteLine(ni.Name); 
     foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses) 
     { 
      if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 
      { 
       Console.WriteLine(ip.Address.ToString()); 
      } 
     } 
    } 
} 

在這段代碼最重要的是,它僅列出了以太網和無線接口的IP地址,一個合適的解決方案。我懷疑你會有一個串行連接活動,所以這不會很重要。另外你可以隨時編輯if語句。

//編輯 如果你只想IP實際連接到互聯網使用Hosam Alysolution

地址這是他的代碼:

static IPAddress getInternetIPAddress() 
{ 
    try 
    { 
     IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()); 
     IPAddress gateway = IPAddress.Parse(getInternetGateway()); 
     return findMatch(addresses, gateway); 
    } 
    catch (FormatException e) { return null; } 
} 

static string getInternetGateway() 
{ 
    using (Process tracert = new Process()) 
    { 
     ProcessStartInfo startInfo = tracert.StartInfo; 
     startInfo.FileName = "tracert.exe"; 
     startInfo.Arguments = "-h 1 www.example.com 
     startInfo.UseShellExecute = false; 
     startInfo.RedirectStandardOutput = true; 
     tracert.Start(); 

     using (StreamReader reader = tracert.StandardOutput) 
     { 
      string line = ""; 
      for (int i = 0; i < 5; ++i) 
       line = reader.ReadLine(); 
      line = line.Trim(); 
      return line.Substring(line.LastIndexOf(' ') + 1); 
     } 
    } 
} 

static IPAddress findMatch(IPAddress[] addresses, IPAddress gateway) 
{ 
    byte[] gatewayBytes = gateway.GetAddressBytes(); 
    foreach (IPAddress ip in addresses) 
    { 
     byte[] ipBytes = ip.GetAddressBytes(); 
     if (ipBytes[0] == gatewayBytes[0] 
      && ipBytes[1] == gatewayBytes[1] 
      && ipBytes[2] == gatewayBytes[2]) 
     { 
      return ip; 
     } 
    } 
    return null; 
} 

它通常做的,是跟蹤到www.example.com的路由並從那裏處理正確的IP。我測試了我的機器上的代碼,並需要將迭代從9更改爲5,以便從流中獲取正確的代碼。你最好重新檢查一下,否則你可能會陷入NullReferenceException,因爲line將會是null

+0

它仍然給我一個錯誤的。例如,我將Windows Mobile設備連接到創建Windows Mobile Remote Adapter的PC上。你的代碼返回這個ip –

+0

好吧,正如我寫的:刪除if語句,如果你想要更多的然後列出的以太網和無線連接。 – Marco

+0

我不想要更多的連接。我不想獲得Windows Mobile Remote Adapter ip,但它被列爲以太網。我只想通過Ehternet將本地IP連接到本地網絡 –

0
static string GetActiveIP() 
      { 
       string ip = ""; 
       foreach (NetworkInterface f in NetworkInterface.GetAllNetworkInterfaces()) 
       { 
        if (f.OperationalStatus == OperationalStatus.Up) 
        { 
         IPInterfaceProperties ipInterface = f.GetIPProperties(); 
         if (ipInterface.GatewayAddresses.Count > 0) 
         {`enter code here` 
          foreach (UnicastIPAddressInformation unicastAddress in ipInterface.UnicastAddresses) 
          { 
           if ((unicastAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) && (unicastAddress.IPv4Mask.ToString() != "0.0.0.0")) 
           { 
            ip = unicastAddress.Address.ToString(); 
break; 

           }       
          }`enter code here` 
         } 


        } 
       } 
       return ip; 
      }