2010-01-07 22 views
11

Tengo un código que me permite determinar la dirección MAC y la dirección IP de la conexión WiFi en el iPhone, pero no entiendo cómo obtener la Máscara de subred y la dirección del enrutador la conexión. Puede alguien señalarme la dirección correcta?iPhone Máscara de subred WiFi y dirección del enrutador

+0

En este momento estoy buscando ICMP (solicitud de enrutador) o ICMP (solicitud de eco, 1 salto, ver quién responde). No creo que mi enrutador responda a las solicitudes ICMP de solicitudes de enrutadores; el segundo método es cómo funciona Traceroute (creo). Otra opción sería una API DHCP (no puede encontrar una en Iphone) o enviar paquetes DHCP para obtener información (porque en mi caso siempre habrá DHCP y el enrutador siempre será el servidor DHCP). – Bill

+0

FYI - La aplicación iPhone está diseñada para controlar las políticas de seguridad/acceso en los enrutadores DLink Home NAT (la interfaz web es difícil de usar); Simplemente trato de evitar que el usuario ingrese la dirección del enrutador. Tendrán que proporcionar una contraseña, así que no hay problema si no puedo encontrar una buena solución aquí. – Bill

+0

@bvanderw: ¿puede publicar un enlace a su código o la documentación para determinar la dirección MAC de la conexión WiFi? No he podido rastrearlo. – Ciaran

Respuesta

13

Puede obtener esa información llamando al getifaddrs. (Utilizo esta función en una aplicación de la mina para averiguar la dirección IP del iPhone.)

struct ifaddrs *ifa = NULL, *ifList; 
getifaddrs(&ifList); // should check for errors 
for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next) { 
    ifa->ifa_addr // interface address 
    ifa->ifa_netmask // subnet mask 
    ifa->ifa_dstaddr // broadcast address, NOT router address 
} 
freeifaddrs(ifList); // clean up after yourself 

Esto le pone la máscara de subred; para the router address, see this question.

Esto es todo lo de la red UNIX de la vieja escuela, tendrás que elegir cuál de las interfaces es la conexión WiFi (otras cosas como una interfaz loopback también estarán ahí). Entonces puede que tenga que usar funciones como inet_ntoa() dependiendo del formato en que desee leer las direcciones IP. No está mal, solo es tedioso y feo. ¡Que te diviertas!

+0

ifa-> ifa_dstaddr es la dirección de difusión, no la dirección del enrutador. – Bill

+2

@Bill: corrigió mi respuesta, reconsidere su voto negativo. – benzado

+0

tendrá que importar ifaddrs.h –

3
NSString *address = @"error"; 
NSString *netmask = @"error"; 
struct ifaddrs *interfaces = NULL; 
struct ifaddrs *temp_addr = NULL; 
int success = 0; 

// retrieve the current interfaces - returns 0 on success 
success = getifaddrs(&interfaces); 
if (success == 0) 
{ 
    // Loop through linked list of interfaces 
    temp_addr = interfaces; 
    while(temp_addr != NULL) 
    { 
     if(temp_addr->ifa_addr->sa_family == AF_INET) 
     { 
      // Check if interface is en0 which is the wifi connection on the iPhone 

      if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) 
      { 
       // Get NSString from C String 
       address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; 
       netmask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]; 
      } 
     } 

     temp_addr = temp_addr->ifa_next; 
    } 
} 

// Free memory 
freeifaddrs(interfaces); 
NSLog(@"address %@", address); 
NSLog(@"netmask %@", netmask); 
Cuestiones relacionadas