2012-10-02 15 views
6

¿Cómo puedo detectar si hay algún adaptador de red 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.Detectar cualquier red conectada

+2

¿Estás trabajando en iOS, Mac o en ambos? – Bryan

+0

Solo Mac, gracias. –

+0

OK, solo he probado esto en el iPhone, por lo que mi respuesta podría no funcionar en Mac. Veré si puedo investigar un poco más. – Bryan

Respuesta

8

Getting a List of All IP Addresses en Nota TN1145 técnico de Apple menciona 3 métodos para obtener el estado de las interfaces de red:

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

Marco de configuración del sistema: Este es el camino recomendado por Apple y hay 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. (Sólo hay documentación "legado" en el sitio web de Apple.)

sockets BSD: Esta parece ser la forma más fácil de obtener la lista de interfaces y para determinar el estado de la conexión (si es que no es necesario dinámico cambiar notificaciones).

El siguiente código muestra 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); 
} 
+0

Muchas gracias, la mejor respuesta hasta ahora.No tengo tiempo para probarlo ahora, pero a menos que algo mejor disminuya en las próximas 6 horas, lo aceptaré. –

+0

@ AndreasBergström: Eso está bien. Me alegra que haya sido de ayuda. –

0

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

This es un reemplazo directo para Reachability que algunas personas recomiendan.

1

Puede usar el código de Accesibilidad, proporcionado por Apple. Aquí está el link 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 te pueda ayudar.


+0

El enlace de accesibilidad que ha proporcionado es para iOS. –

Cuestiones relacionadas