2011-11-11 59 views
8

Tôi có một VirtualBox VM được cài đặt trên máy của mình và như vậy có một adapter ethernet xuất hiện cho nó. Tôi liệt kê qua danh sách các địa chỉ IP máy tính của tôi qua những điều sau đây:C# - Tìm địa chỉ IP cục bộ của máy tôi và không phải là máy ảo

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

Vấn đề của tôi là rằng bộ chuyển đổi ethernet của máy ảo cũng bắt với điều kiện:

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

Có một cách để chọn địa chỉ IP cục bộ của máy của tôi và bỏ qua máy ảo của tôi?

Trả lời

4

Bạn có thể bỏ qua bộ điều hợp Ethernet theo tên của nó. Do bộ điều hợp VM Ethernet được trình bày bởi một trình điều khiển NIC hợp lệ, nó hoàn toàn tương đương với NIC vật lý của máy tính của bạn theo quan điểm của hệ điều hành.

+0

Thật không may lớp IPAddress dường như không giữ tên bộ điều hợp ethernet vì vậy tôi không thể loại bỏ bộ điều hợp ethernet VM bằng phương pháp đó. – n00b

+2

Vâng, bạn có thể cần phải thay đổi cách tiếp cận của bạn bằng cách sử dụng phương thức NetworkInterface.GetAllNetworkInterfaces(). Nó sẽ trả về tất cả các giao diện, và sau đó bạn có thể liệt kê tất cả các địa chỉ IP có sẵn cho mỗi giao diện. – pennanth

+0

Hi pennanth, tôi dường như không thể tìm thấy bất kỳ biến thành viên nào hiển thị địa chỉ IP bên trong lớp NetworkInterface. Ngoài ra sửa tôi nếu tôi sai nhưng bằng cách sử dụng tên của lớp NetworkInterface bạn có thể phá vỡ nó bằng cách đổi tên tên bộ điều hợp ethernet? Tôi đang tìm kiếm một giải pháp đáng tin cậy hơn là – n00b

4

Có một tùy chọn. VM IP không có Cổng Mặc định, vì vậy, loại trừ tất cả IP không có Cổng Mặc định.

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()); 
       } 
      } 
     } 
    } 
} 
+0

Điều này phù hợp với tôi. Cảm ơn quá nhiều – RainClick

8

Tôi trả lời lọc Andrej ARH, như địa chỉ IP báo cáo của GatewayAddresses cũng có thể là "0.0.0.0" thay vì chỉ null:

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

Điều này không có tác dụng nếu không có cổng nhưng địa chỉ vẫn là vật lý. – zezba9000

2

Sử dụng WMI và kiểm tra tài sản ConnectorPresent cho vật lý thiết bị.

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

Điều này làm việc cho tôi với một tinh chỉnh: Tôi cũng đã kiểm tra ni.OperationalStatus == OperationalStatus.Up. Nếu không có kiểm tra thêm nó đã trở về giao diện đã thực sự xuống. –

Các vấn đề liên quan