2012-10-02 19 views
6

कोई नेटवर्क एडाप्टर कनेक्ट होने पर मैं कैसे पता लगा सकता हूं? मैं केवल इंटरनेट कनेक्शन का पता लगाने के लिए एनएसआरचैबिलिटी का उपयोग करने के उदाहरण देख सकता हूं, लेकिन मैं एक गैर-इंटरनेट नेटवर्क कनेक्शन का पता लगाना चाहता हूं। Eth0 पर आईपी एड्रेस प्राप्त करना चाहिए? मैं केवल मैक पर काम कर रहा हूं।किसी भी कनेक्टेड नेटवर्क का पता लगाएं

+2

क्या आप आईओएस, मैक या दोनों पर काम कर रहे हैं? – Bryan

+0

केवल मैक, धन्यवाद। –

+0

ठीक है, मैंने केवल आईफोन पर यह कोशिश की है, इसलिए मेरा जवाब मैक पर काम नहीं कर सकता है। मैं देखूंगा कि मैं कुछ और शोध कर सकता हूं या नहीं। – Bryan

उत्तर

8

एप्पल के तकनीकी नोट TN1145 नेटवर्क इंटरफेस का दर्जा प्राप्त करने के लिए 3 तरीकों का उल्लेख में Getting a List of All IP Addresses:

  • सिस्टम विन्यास फ्रेमवर्क
  • ओपन परिवहन एपीआई
  • बीएसडी सॉकेट

सिस्टम कॉन्फ़िगरेशन फ्रेमवर्क: यह ऐप्पल की अनुशंसित तरीका है और टीएन 1145 में नमूना कोड है। लाभ यह है कि यह इंटरफ़ेस कॉन्फ़िगरेशन में परिवर्तनों को अधिसूचित करने का एक तरीका प्रदान करता है।

ओपन ट्रांसपोर्ट एपीआई: टीएन 1145 में नमूना कोड भी है, अन्यथा मैं इसके बारे में ज्यादा कुछ नहीं कह सकता। (वहाँ केवल "विरासत" एप्पल वेबसाइट पर प्रलेखन है।)

बीएसडी सॉकेट: यह सबसे आसान तरीका है इंटरफेस की सूची प्राप्त करने और कनेक्शन स्थिति निर्धारित करने के लिए (यदि आप गतिशील की जरूरत नहीं है हो रहा है नोटिफिकेशन बदलें)।

निम्नलिखित कोड दर्शाता है कि सभी आईपीवी 4 और आईपीवी 6 इंटरफेस जो "ऊपर और चल रहे हैं" को कैसे ढूंढें।

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <ifaddrs.h> 
#include <net/if.h> 
#include <netdb.h> 

struct ifaddrs *allInterfaces; 

// Get list of all interfaces on the local machine: 
if (getifaddrs(&allInterfaces) == 0) { 
    struct ifaddrs *interface; 

    // For each interface ... 
    for (interface = allInterfaces; interface != NULL; interface = interface->ifa_next) { 
     unsigned int flags = interface->ifa_flags; 
     struct sockaddr *addr = interface->ifa_addr; 

     // Check for running IPv4, IPv6 interfaces. Skip the loopback interface. 
     if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) { 
      if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) { 

       // Convert interface address to a human readable string: 
       char host[NI_MAXHOST]; 
       getnameinfo(addr, addr->sa_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST); 

       printf("interface:%s, address:%s\n", interface->ifa_name, host); 
      } 
     } 
    } 

    freeifaddrs(allInterfaces); 
} 
+0

बहुत बहुत धन्यवाद, अब तक का सबसे अच्छा जवाब।मेरे पास अभी कोशिश करने का समय नहीं है, लेकिन आने वाले 6 घंटों में कुछ बेहतर बूंद नहीं होने तक मैं इसे स्वीकार करूंगा। –

+0

@ एंड्रियासबर्गस्ट्रॉम: यह ठीक है। अगर यह मदद मिली तो मुझे खुशी है। –

0

Reachability (मुझे लगता है कि आप अंतर्निहित SCNetworkReachability... एपीआई के आधार पर ऐप्पल की डेमो कक्षा का मतलब है) आपके स्थानीय नेटवर्क सहित किसी भी आईपी से जुड़े होस्ट के लिए काम करता है। आप reachabilityForLocalWiFi विधि का उपयोग कर सकते हैं, हालांकि this page के अनुसार यह नेटवर्क सक्रिय है लेकिन रूट करने योग्य नहीं है। इसलिए आप स्थानीय पते के साथ reachabilityWithAddress: पर क्वेरी करना पसंद कर सकते हैं।

ThisReachability के लिए एक ड्रॉप-इन प्रतिस्थापन है जो कुछ लोग अनुशंसा करते हैं।

1

आप सेब द्वारा प्रदान किए गए रीचबिलिटी कोड का उपयोग कर सकते हैं। यहां link है जहां आप "पहुंच योग्यता" स्रोत कोड प्राप्त कर सकते हैं:

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

आशा है कि यह आपकी मदद कर सके।


+0

आपके द्वारा प्रदान किया गया पहुंच योग्यता लिंक आईओएस के लिए है। –

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