C # – Encontrar la dirección IP local de mi máquina y no las máquinas virtuales

Tengo una VirtualBox VM instalada en mi máquina y, como tal, hay un adaptador de Ethernet que aparece para ella. Estoy enumerando a través de la lista de la dirección IP de mi máquina a través de lo siguiente:

public string GetLocalIpAddress() { try { string strHostName = Dns.GetHostName(); // Then using host name, get the IP address list.. IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); foreach (IPAddress ip in ipEntry.AddressList) { if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { return string.Format("({0})", ip.ToString()); } } } catch(Exception e) { Global.ApplicationLog.AddApplicationLog(EnumAppEventTypes.SYSTEM_ERROR, e.ToString()); } return ""; } 

Mi problema es que el adaptador de Ethernet de la máquina virtual también detecta la condición:

 if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) 

¿Hay alguna forma de seleccionar la dirección IP local de mi máquina y de ignorar la de mi máquina virtual?

Puede ignorar el adaptador Ethernet por su nombre. Como el adaptador Ethernet de VM está representado por un controlador NIC válido, es completamente equivalente a la NIC física de su máquina desde el punto de vista del sistema operativo.

Estoy refinando la respuesta de Andrej Arh, ya que la dirección IP reportada por GatewayAddresses también puede ser “0.0.0.0” en lugar de simplemente nula:

  public static string GetPhysicalIPAdress() { foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { var addr = ni.GetIPProperties().GatewayAddresses.FirstOrDefault(); if (addr != null && !addr.Address.ToString().Equals("0.0.0.0")) { if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet) { foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { return ip.Address.ToString(); } } } } } return String.Empty; } 

Hay una opción. VM IP no tiene la puerta de enlace predeterminada, por lo tanto, excluya todas las IP sin la puerta de enlace predeterminada.

 foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { var addr = ni.GetIPProperties().GatewayAddresses.FirstOrDefault(); if (addr != null) { 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()); } } } } } 

Use WMI y verifique la propiedad ConnectorPresent para dispositivos físicos.

 public static string GetPhysicalIPAdress() { foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { if (ConnectorPresent(ni)) { if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet) { foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { return ip.Address.ToString(); } } } } } return string.Empty; } private static bool ConnectorPresent(NetworkInterface ni) { ManagementScope scope = new ManagementScope(@"\\localhost\root\StandardCimv2"); ObjectQuery query = new ObjectQuery(String.Format( @"SELECT * FROM MSFT_NetAdapter WHERE ConnectorPresent = True AND DeviceID = '{0}'", ni.Id)); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); ManagementObjectCollection result = searcher.Get(); return result.Count > 0; }