Détecter tout réseau connecté

Comment puis-je détecter si un adaptateur réseau est connecté? Je ne peux trouver que des exemples d'utilisation de la N-Seachability pour détecter une connexion internet, mais je veux détecter même une connexion réseau non-internet. Obtenir l'adresse IP sur eth0 devrait fonctionner? Je ne travaille que sur Mac.

6
demandé sur Andreas Bergström 2012-10-02 16:51:37

3 réponses

obtenir une liste de toutes les adresses IP dans la Note technique TN1145 mentionne 3 méthodes pour obtenir le statut des interfaces réseau:

    "151980920 Configuration Du Système" Cadre
  • Open Transport API
  • prises BSD

System Configuration Framework: C'est la manière recommandée par Apple et là est un exemple de code dans le TN1145. L'avantage est qu'il fournit un moyen d'obtenir notifié des changements dans la configuration de l'interface.

Open Transport API: il y a aussi un exemple de code dans TN1145, sinon je ne peux pas en dire grand chose. (Il n'y a que de la documentation "legacy" sur le site Web D'Apple.)

BSD sockets: cela semble être la façon la plus facile d'obtenir la liste des interfaces et de déterminer la état de la connexion (si vous n'avez pas besoin de notifications de changement dynamique).

le code suivant montre comment trouver toutes les interfaces IPv4 et IPv6 qui sont"opérationnelles".

#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);
}
8
répondu Martin R 2012-10-14 16:05:00

Reachability (je suppose que vous parliez de la classe démo D'Apple basée sur L'API SCNetworkReachability... sous-jacente) fonctionne pour n'importe quel hôte connecté sur IP, y compris sur votre réseau local. Vous pouvez utiliser la méthode reachabilityForLocalWiFi , bien que selon cette page elle retournera Oui lorsque le réseau est actif mais pas routable. Vous pouvez donc préférer interroger reachabilityWithAddress: avec une adresse locale.

ce est un remplacement sans rendez-vous pour Reachability que certains recommandent.

0
répondu Bryan 2012-10-08 19:54:24