2009-10-21 8 views
1

Я хочу получить текущий IP-адрес компьютера, на котором установлено 3 виртуальных машины (VM Ware). Я хочу получить адрес LAN этого компьютера.Получите IP-адрес моей машины C# с установленной виртуальной машиной

текущий код, который я вернул мне массив, но как определить текущий локальный адрес компьютера?

public static string getThisCompIPAddress() 
    { 
     IPAddress[] addresslist = Dns.GetHostAddresses(Dns.GetHostName()); 
     return (addresslist[0].ToString()); 


    } 

AddressList возвращает массив 3 IP адреса

+0

Что такое 3 адреса? Вы можете исключить 127.0.0.1, например ... –

+0

Они также из тех же сетей. VM 192.168.3.44 Ethernet 192.168.3.111 –

ответ

0
public static ArrayList getThisCompIPAddress() 
    { 
     ArrayList strArrIpAdrs = new ArrayList(); 
     ArrayList srtIPAdrsToReturn = new ArrayList(); 
     addresslist = Dns.GetHostAddresses(Dns.GetHostName()); 
     for (int i = 0; i < addresslist.Length; i++) 
     { 
      try 
      { 
       long ip = addresslist[i].Address; 
       strArrIpAdrs.Add(addresslist[i]); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 

     } 

     foreach (IPAddress ipad in strArrIpAdrs) 
     { 

      lastIndexOfDot = ipad.ToString().LastIndexOf('.'); 
      substring = ipad.ToString().Substring(0, ++lastIndexOfDot); 
      if (!(srtIPAdrsToReturn.Contains(substring)) && !(substring.Equals(""))) 
      { 
       srtIPAdrsToReturn.Add(substring); 
      } 
     } 

     return srtIPAdrsToReturn; 
    } 

это 100% рабочий, реальная проблема была, что она была метание ошибка при вычислении адреса, который возвращает долго. Код ошибки: 10045

+0

Здесь мы получаем только действительные IP-адреса, но проблема все еще там, как получить активный IP-адрес ??? Некоторые VM IPV6 вызывают ошибку, когда мы вызываем функцию .Address, которая возвращает long. –

+0

Как различать VM IP и этот компьютер IP? –

+0

В: Почему выполняется подстрока? Если IP-адрес 192.168.1.1, я просто хочу «192.168.1». и я вручную добавлю диапазон для сканирования, скажем от 1 до 254 –

3

Вы можете попробовать NetworkInterface класс, и попытаться соответствовать имени или физический адрес сетевого соединения, чтобы выяснить реальный. Возможно, поиск в этом классе, и это члены, вы можете найти то, что соответствует вашим потребностям.

Вот простой способ предоставить некоторую информацию об использовании:

using System.Net.NetworkInformation; 

... 

static void ViewNetworkInfo() 
{ 
    NetworkInterface[] networks = NetworkInterface.GetAllNetworkInterfaces(); 
    foreach (NetworkInterface nw in networks) 
    { 
     Console.WriteLine(nw.Name); 
     Console.WriteLine(nw.GetPhysicalAddress().ToString()); 

     IPInterfaceProperties ipProps = nw.GetIPProperties(); 
     foreach (UnicastIPAddressInformation ucip in ipProps.UnicastAddresses) 
     { 
      Console.WriteLine(ucip.Address.ToString()); 
     } 

     Console.WriteLine(); 
    } 
    Console.ReadKey(); 
} 
+0

Получите местоположение NIC (например, PCI Slot 10 (PCI-шина 3, устройство 0, функция 0)), если он возвращает значение null, это означает, что это виртуальный сетевой адаптер, и вы можете его отбросить. –

1

Я пробовал все вышеперечисленные решения, но не смог получить ip из моей «реальной» машины, а не виртуальной. Я сумел использовать это, чтобы получить IP-адрес от моей виртуальной машины:

IPAddress[] addresslist = Dns.GetHostAddresses(Environment.ExpandEnvironmentVariables("%CLIENTNAME%")); 

Причина, почему я использовал это таким образом, что функция Dns.GetHostAddresses возвращает АДРЕС данного хоста, так что если вы используете функция Dns.GetHostName() возвращает имя виртуальной машины, а не локальную машину, но используя имя машины, где вы можете найти ее с помощью: Environment.ExpandEnvironmentVariables («% CLIENTNAME%»), вы можете получить клиент имя, а не имя виртуальной машины, таким образом вы можете получить реальный IP-адрес своего локального компьютера.

Надеюсь, это поможет.