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.
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);
}
vous pouvez utiliser le code D'accessibilité fourni par apple. Voici le lien 151920920" où vous pouvez obtenir le code source" Reachability":
vous pouvez également télécharger ce fichier: TestWifi in Github. Il vous montrera comment implémenter la classe Reachability.
J'espère que cela pourrait vous aider.
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.