2012-10-02 17 views
6

Wie kann ich feststellen, ob ein Netzwerkadapter angeschlossen ist? Ich kann nur Beispiele für die Verwendung von NSReachability finden, um eine Internetverbindung zu erkennen, aber ich möchte auch eine Nicht-Internet-Netzwerkverbindung erkennen. Die IP-Adresse auf eth0 sollte funktionieren? Ich arbeite nur am Mac.Erkennen eines verbundenen Netzwerks

+2

Arbeiten Sie auf iOS, Mac oder beiden? – Bryan

+0

Nur Mac, danke. –

+0

OK, ich habe es nur auf dem iPhone versucht, daher funktioniert meine Antwort möglicherweise nicht auf dem Mac. Ich werde sehen, ob ich noch mehr recherchieren kann. – Bryan

Antwort

8

Getting a List of All IP Addresses in Technical Note TN1145 Apple für das Erhalten des Status der Netzwerkschnittstellen 3 Methoden erwähnt:

  • Systemkonfiguration Rahmen
  • Open Transport API
  • BSD-Sockets

Systemkonfiguration Framework: Dies ist Apples empfohlene Methode, und es gibt Beispielcode in der TN1145. Der Vorteil besteht darin, dass es eine Möglichkeit bietet, über Änderungen in der Schnittstellenkonfiguration benachrichtigt zu werden.

Open Transport API: Es gibt auch Beispielcode in TN1145, sonst kann ich nicht viel dazu sagen. (Es gibt nur „Legacy“ Dokumentation auf der Apple-Website.)

BSD-Sockets: Dies scheint der einfachste Weg, um die Liste der Schnittstellen zu bekommen und den Verbindungsstatus zu bestimmen (wenn Sie nicht dynamisch brauchen Benachrichtigungen ändern).

Der folgende Code zeigt, wie Sie alle IPv4- und IPv6-Schnittstellen finden, die "betriebsbereit" sind.

#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

Vielen Dank, beste Antwort bisher.Ich habe keine Zeit, es jetzt zu versuchen, aber wenn in den kommenden 6 Stunden nicht etwas besser wird, werde ich es akzeptieren. –

+0

@ AndreasBergström: Das ist OK. Ich bin froh, wenn es geholfen hat. –

0

Reachability (Ich nehme an, Sie meinten, Apple Demo-Klasse basierend auf der zugrunde liegenden SCNetworkReachability... API) funktioniert für jeden IP-verbundenen Host, einschließlich in Ihrem lokalen Netzwerk. Sie können die reachabilityForLocalWiFi Methode verwenden, obwohl laut this page YES zurückgegeben wird, wenn das Netzwerk aktiv, aber nicht routingfähig ist. Sie möchten vielleicht lieber reachabilityWithAddress: mit einer lokalen Adresse abfragen.

This ist ein Drop-In-Ersatz für Reachability, dass einige Leute empfehlen.

1

Sie können den von Apple bereitgestellten Erreichbarkeitscode verwenden. Hier ist die link, wo Sie den "Erreichbarkeit" Quellcode erhalten können:

Sie können auch diese Datei herunterladen: TestWifi in Github. Es zeigt Ihnen, wie Sie die Erreichbarkeitsklasse implementieren.

Hoffe, das könnte Ihnen helfen.


+0

Der Erreichbarkeitslink, den Sie angegeben haben, ist für iOS. –

Verwandte Themen