¿Cómo obtener la dirección de la puerta de enlace WIFI en el iPhone?

Necesito obtener la dirección de la puerta de enlace de la red wifi que conecto con el iPhone. Alguien sabe cómo conseguir eso?

Solo para aclarar, estoy buscando la información de esta pantalla:

enter image description here

Gracias.

Agregue a su proyecto el archivo route.h de http://opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/net/route.h

Crea getgateway.h

int getdefaultgateway(in_addr_t * addr); 

Crear getgateway.c

 #include  #include  #include  #include  #include "getgateway.h" #include "TargetConditionals.h" #if TARGET_IPHONE_SIMULATOR #include  #define TypeEN "en1" #else #include "route.h" #define TypeEN "en0" #endif #include  #include  #define CTL_NET 4 /* network, see socket.h */ #if defined(BSD) || defined(__APPLE__) #define ROUNDUP(a) \ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) int getdefaultgateway(in_addr_t * addr) { int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; size_t l; char * buf, * p; struct rt_msghdr * rt; struct sockaddr * sa; struct sockaddr * sa_tab[RTAX_MAX]; int i; int r = -1; if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) { return -1; } if(l>0) { buf = malloc(l); if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) { return -1; } for(p=buf; prtm_msglen) { rt = (struct rt_msghdr *)p; sa = (struct sockaddr *)(rt + 1); for(i=0; irtm_addrs & (1 < < i)) { sa_tab[i] = sa; sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len)); } else { sa_tab[i] = NULL; } } if( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY)) && sa_tab[RTAX_DST]->sa_family == AF_INET && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) { if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) { char ifName[128]; if_indextoname(rt->rtm_index,ifName); if(strcmp(TypeEN,ifName)==0){ *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr; r = 0; } } } } free(buf); } return r; } #endif 

A través del siguiente fragmento, este ejemplo será un buen trabajo en el simulador y el dispositivo.

 #include "TargetConditionals.h" #if TARGET_IPHONE_SIMULATOR #include  #define TypeEN "en1" #else #include "route.h" #define TypeEN "en0" #endif 

Use este código en su proyecto Objective C

 #import "getgateway.h" #import  - (NSString *)getGatewayIP { NSString *ipString = nil; struct in_addr gatewayaddr; int r = getdefaultgateway(&(gatewayaddr.s_addr)); if(r >= 0) { ipString = [NSString stringWithFormat: @"%s",inet_ntoa(gatewayaddr)]; NSLog(@"default gateway : %@", ipString ); } else { NSLog(@"getdefaultgateway() failed"); } return ipString; } 

esto funciona para mí, aunque necesito obtener una copia de la ruta.h en mi proyecto

Mi comprensión general es que este código consulta, recupera y enruta la tabla y usa sus entradas para determinar la ruta predeterminada, también conocida como gateway ip.

 /* $Id: getgateway.c,v 1.6 2007/12/13 14:46:06 nanard Exp $ */ /* libnatpmp * Copyright (c) 2007, Thomas BERNARD  * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include  #include  #include  #include  #include "getgateway.h" #include "route.h" #include  #include  #define CTL_NET 4 /* network, see socket.h */ #if defined(BSD) || defined(__APPLE__) #define ROUNDUP(a) \ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) int getdefaultgateway(in_addr_t * addr) { int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; size_t l; char * buf, * p; struct rt_msghdr * rt; struct sockaddr * sa; struct sockaddr * sa_tab[RTAX_MAX]; int i; int r = -1; if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) { return -1; } if(l>0) { buf = malloc(l); if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) { return -1; } for(p=buf; prtm_msglen) { rt = (struct rt_msghdr *)p; sa = (struct sockaddr *)(rt + 1); for(i=0; irtm_addrs & (1 < < i)) { sa_tab[i] = sa; sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len)); } else { sa_tab[i] = NULL; } } if( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY)) && sa_tab[RTAX_DST]->sa_family == AF_INET && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) { if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) { char ifName[128]; if_indextoname(rt->rtm_index,ifName); if(strcmp("en0",ifName)==0){ *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr; r = 0; } } } } free(buf); } return r; } #endif 

Después de volver a consultar con Apple, el SDK no ofrece una manera fácil de hacerlo. La forma más difícil, si la hay, es cavar profundamente en el sistema o usar un traceroute.

Archivé un informe de error, tal vez lo agregarán en el futuro.

Eche un vistazo a las respuestas a Objective-C: ¿Cómo recuperar la dirección del enrutador?

Tal vez solo se relacione tangencialmente, pero vea la técnica descrita en esta publicación del blog: http://blog.zachwaugh.com/post/309927273/programmatically-retrieving-ip-address-of-iphone

Obtiene la dirección IP de la interfaz Wi-Fi, y podría ser otro punto de partida para encontrar otra solución …

 - (NSString *)getIPAddress { NSString *address = @"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)]; } } temp_addr = temp_addr->ifa_next; } } // Free memory freeifaddrs(interfaces); return address; }