2011-11-11 15 views
8

मेरे पास मेरी मशीन पर वर्चुअलबॉक्स वीएम स्थापित है और इस तरह एक ईथरनेट एडाप्टर है जो इसके लिए दिखाई देता है। मैं अपने मशीन का IP पता की सूची के माध्यम गणना कर रहा हूँ निम्नलिखित के माध्यम से:सी # - मेरी मशीन का स्थानीय आईपी पता ढूँढना और वीएम के

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

मेरे समस्या यह है कि आभासी मशीन के ईथरनेट एडाप्टर भी शर्त पर फैल जाती है है:

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

वहाँ का एक तरीका है मेरी मशीन के स्थानीय आईपी पते को चुनना और मेरी वर्चुअल मशीन को अनदेखा करना?

उत्तर

4

आप ईथरनेट एडाप्टर को इसके नाम से अवहेलना कर सकते हैं। चूंकि वीएम ईथरनेट एडाप्टर को एक वैध एनआईसी चालक द्वारा दर्शाया जाता है, यह ओएस के दृष्टिकोण से आपकी मशीन के भौतिक एनआईसी के बराबर है।

+0

दुर्भाग्यवश आईपीएड्रेस क्लास ईथरनेट एडाप्टर का नाम नहीं रखता है, इसलिए मैं उस विधि के साथ वीएम ईथरनेट एडाप्टर को खत्म नहीं कर सकता। – n00b

+2

हां, आपको NetworkInterface.GetAllNetworkInterfaces() विधि का उपयोग कर अपना दृष्टिकोण बदलना पड़ सकता है। यह सभी इंटरफेस वापस कर देगा, और फिर आप प्रत्येक इंटरफ़ेस के लिए सभी उपलब्ध आईपी पते के माध्यम से गणना कर सकते हैं। – pennanth

+0

हाय पेनैंथ, मुझे कोई सदस्य चर नहीं मिल रहा है जो नेटवर्क इंटरफेस क्लास के अंदर आईपी पता दिखाता है। अगर मैं गलत हूं लेकिन नेटवर्क इंटरफेस क्लास के नाम का उपयोग करके भी मुझे सही कर दूं तो आप ईथरनेट एडाप्टर नामों का नाम बदलकर इसे तोड़ सकते हैं? मैं – n00b

4

एक विकल्प है। वीएम आईपी में डिफॉल्ट गेटवे नहीं है, इसलिए, डिफ़ॉल्ट गेटवे के बिना सभी आईपी को बाहर कर दें।

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

है यह मेरे लिए ठीक से काम करता है। बहुत बहुत धन्यवाद – RainClick

8

मैं शोधन Andrej ARH का जवाब, आईपी पता GatewayAddresses द्वारा रिपोर्ट भी "0.0.0.0" बस अशक्त के बजाय हो सकता है के रूप में:

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

यदि कोई गेटवे नहीं है तो यह काम नहीं करता है लेकिन पता अभी भी भौतिक है। – zezba9000

2

उपयोग WMI और शारीरिक के लिए ConnectorPresent संपत्ति की जाँच डिवाइस।

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

यह मेरे लिए एक चिमटा के साथ काम किया: मैंने यह भी जांच की कि ni.OperationalStatus == OperationalStatus.Up। उस अतिरिक्त जांच के बिना यह वास्तव में नीचे इंटरफेस लौट रहा था। –

संबंधित मुद्दे