2013-10-25 2 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

Что вы подразумеваете под "active"? ПК может иметь много IP-адресов, а несколько могут считаться активными. –

+0

Я хочу знать, какой IP - это тот, кто представляет ПК в локальной сети. –

+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.

// EDIT Если вы хотите, чтобы IP-адрес, который фактически соединяется с использованием Интернет Hosam Aly «ы solution

Это его код:

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. Ваш код вернет это ip –

+0

Ну, как я писал: удалите оператор if, если вы хотите больше, чем указано в списке ethernet и беспроводных подключений. – Marco

+0

Я не хочу больше подключений. Я не хочу получать Windows Mobile Remote Adapter ip, но он указан как ethernet. Я только хочу, чтобы локальный IP-адрес подключался через Ehternet к локальной сети. –

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; 
      } 
Смежные вопросы