2012-04-26 15 views
31

मुझे विंडोज 8 WinRT/Metro ऐप से मेरे वास्तविक स्थानीय आईपी पते (यानी लूपबैक पता नहीं) जानने की आवश्यकता है। मुझे इसके कई कारण हैं। सबसे आसान यह है कि ऐप के यूआई में मैं कुछ टेक्स्ट दिखाना चाहता हूं जैसे "आपका स्थानीय नेटवर्क आईपी पता है: [आईपी कोड से पूछताछ]"।क्वेरी स्थानीय आईपी पता

हम कुछ अतिरिक्त नेटवर्क कॉम के लिए पते का भी उपयोग करते हैं। वे comms पूरी तरह मान्य हैं क्योंकि अगर मैं नियंत्रण कक्ष में आईपी पता देखता हूं तो यह सब काम करता है, फिर इसे ऐप में हार्ड-कोड करें। पते को देखने के लिए उपयोगकर्ता से एक संवाद में पूछना और मैन्युअल रूप से इसे दर्ज करना वास्तव में कुछ है, वास्तव में इससे बचना चाहते हैं।

मुझे लगता है कि यह प्रोग्राम प्रोग्रामेटिक रूप से प्राप्त करने के लिए एक जटिल कार्य नहीं होगा, लेकिन मेरा खोज इंजन और स्टैक ओवरफ्लो कौशल खाली हो रहे हैं।

इस बिंदु पर मैं अपना स्वयं का अनुरोध सुनने और उस पते को निकालने के लिए यूडीपी प्रसारण/सुनो लूप करने पर विचार करना शुरू कर रहा हूं, लेकिन यह वास्तव में हैकी क्लज की तरह लगता है। क्या नई एवीआरटी सामग्री में कहीं कोई एपीआई है जो मुझे वहां ले जाएगी?

ध्यान दें कि मैंने कहा "WinRT अनुप्रयोग। इसका मतलब है कि Dns.GetHostEntry या NetworkInterface.GetAllInterfaces() जैसे विशिष्ट तंत्र काम करने के लिए नहीं जा रहे हैं।

+0

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

+0

http://msdn.microsoft.com/en-us/library/windows/apps/hh454046(v=vs.85).aspx –

+0

@Ramhound पर एक नज़र डालें: सुनिश्चित नहीं है कि मुझे क्या देखना चाहिए - और यह दस्तावेज उपभोक्ता पूर्वावलोकन और वीएस 11 बीटा के साथ देखे गए व्यवहार के साथ वर्ग नहीं है।उदाहरण के लिए दस्तावेज़ 'NetworkIntrface.GetAllNetworkInterfaces()' को दिखाना चाहिए, लेकिन यह अस्तित्व में नहीं है। – ctacke

उत्तर

33

ज्यादा खुदाई के बाद, मैं जानकारी आप NetworkInformation और HostName का उपयोग कर की जरूरत नहीं मिला।

NetworkInformation.GetInternetConnectionProfile वर्तमान में स्थानीय मशीन द्वारा इस्तेमाल किया इंटरनेट कनेक्शन के साथ जुड़े कनेक्शन प्रोफ़ाइल प्राप्त करता है।

NetworkInformation.GetHostNames मेजबान के नाम की एक सूची प्राप्त करता है। यह स्पष्ट नहीं है, लेकिन इस IPv4 और IPv6 पते पर शामिल तारों के रूप में एसईएस।

इस जानकारी का उपयोग हम इस तरह इंटरनेट से जुड़ा हुआ नेटवर्क एडाप्टर का IP पता प्राप्त कर सकते हैं:

public string CurrentIPAddress() 
{ 
    var icp = NetworkInformation.GetInternetConnectionProfile(); 

    if (icp != null && icp.NetworkAdapter != null) 
    { 
     var hostname = 
      NetworkInformation.GetHostNames() 
       .SingleOrDefault(
        hn => 
        hn.IPInformation != null && hn.IPInformation.NetworkAdapter != null 
        && hn.IPInformation.NetworkAdapter.NetworkAdapterId 
        == icp.NetworkAdapter.NetworkAdapterId); 

     if (hostname != null) 
     { 
      // the ip address 
      return hostname.CanonicalName; 
     } 
    } 

    return string.Empty; 
} 

नोट HostName गुण CanonicalName, DisplayName और RawName है, लेकिन वे सभी एक ही वापस जाने के लिए लग रहे हैं कि स्ट्रिंग।

हम भी इस के समान कोड के साथ कई एडेप्टर के लिए पते प्राप्त कर सकते हैं:

private IEnumerable<string> GetCurrentIpAddresses() 
{ 
    var profiles = NetworkInformation.GetConnectionProfiles().ToList(); 

    // the Internet connection profile doesn't seem to be in the above list 
    profiles.Add(NetworkInformation.GetInternetConnectionProfile()); 

    IEnumerable<HostName> hostnames = 
     NetworkInformation.GetHostNames().Where(h => 
      h.IPInformation != null && 
      h.IPInformation.NetworkAdapter != null).ToList(); 

    return (from h in hostnames 
      from p in profiles 
      where h.IPInformation.NetworkAdapter.NetworkAdapterId == 
        p.NetworkAdapter.NetworkAdapterId 
      select string.Format("{0}, {1}", p.ProfileName, h.CanonicalName)).ToList(); 
} 
+4

वाह। ऐसा लगता है कि विंडोज 8 का समर्थन करना गधे में दर्द होने वाला है। –

+0

@JimSchubert: या शायद एक दिलचस्प चुनौती। आखिरकार यह एक पूर्ण पुनर्लेखन है और नहीं .नेट। :) – Phil

+3

वास्तव में एक चुनौती। मेरी टीम को जल्द ही विंडोज 2003+ (विंडोज 8 सहित) का समर्थन करने की आवश्यकता होगी। दर्द यह है कि वर्तमान मशीन के आईपी पते को ढूंढने जितना सरल कुछ भी 'खुदाई' की आवश्यकता है। –

1

बारे में स्वीकार किए जाते हैं जवाब है, तो आप सिर्फ यह की जरूरत है:

HostName localHostName = NetworkInformation.GetHostNames().FirstOrDefault(h => 
        h.IPInformation != null && 
        h.IPInformation.NetworkAdapter != null); 

आप स्थानीय आईपी पता प्राप्त कर सकते हैं तरीका:

string ipAddress = localHostName.RawName; //XXX.XXX.XXX.XXX 

इस्तेमाल किया नेमस्पेस:

using System.Linq; 
using Windows.Networking; 
using Windows.Networking.Connectivity; 
+0

यह उत्तर पूरी तरह गलत है। यह किसी विशेष नेटवर्क कॉन्फ़िगरेशन में काम कर सकता है लेकिन सिस्टम और वर्चुअल स्विच में वर्चुअल मशीनों को जोड़ने का प्रयास करता है और पहला लौटा होस्ट नाम वर्चुअल स्विच आईपी हो सकता है जो पूरी तरह से अनुपयोगी है। – Alex

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