objective how combine and objective-c network-programming foundation

objective-c - how - swift cocoa



Detecta cualquier red conectada (3)

¿Cómo puedo detectar si algún adaptador de red está conectado? Solo puedo encontrar ejemplos sobre el uso de NSReachability para detectar una conexión a Internet, pero quiero detectar incluso una conexión de red que no sea de internet. Obtener la dirección de IP en eth0 debería funcionar? Estoy trabajando solo en Mac.


Puede usar el código de Accesibilidad, proporcionado por Apple. Aquí está el enlace donde puede obtener el código fuente de "Accesibilidad":

También puede descargar este archivo: TestWifi en Github. Le mostrará cómo implementar la clase Accesibilidad.

Espero que esto pueda ayudarte.


Obtener una lista de todas las direcciones IP en la Nota técnica de Apple TN1145 menciona 3 métodos para obtener el estado de las interfaces de red:

  • Marco de configuración del sistema
  • API Open Transport
  • Zócalos BSD

Marco de configuración del sistema: este es el camino recomendado por Apple y hay un código de muestra en el TN1145. La ventaja es que proporciona una forma de recibir notificaciones de cambios en la configuración de la interfaz.

Open Transport API: también hay código de muestra en TN1145; de lo contrario, no puedo decir mucho al respecto. (Solo hay documentación "heredada" en el sitio web de Apple).

Enchufes BSD: Esta parece ser la forma más fácil de obtener la lista de interfaces y determinar el estado de la conexión (si no necesita notificaciones de cambio dinámico).

El siguiente código demuestra cómo encontrar todas las interfaces IPv4 e IPv6 que están "en funcionamiento".

#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); }


Reachability (supongo que se refería a la clase de demostración de Apple basada en la API SCNetworkReachability... subyacente) funciona para cualquier host conectado a IP, incluso en su red local. Puede usar el método reachabilityForLocalWiFi , aunque según esta página , devolverá SÍ cuando la red esté activa pero no enrutable. Por lo tanto, es posible que prefiera consultar reachabilityWithAddress: con una dirección local.

Este es un reemplazo Reachability para Reachability que algunas personas recomiendan.