He estado buscando una manera de obtener la dirección IP de la puerta de enlace predeterminada a mí mismo. Voy a centrarme solo en esto: no necesito obtener la dirección MAC del enrutador predeterminado, así que esto solo responde parcialmente a la pregunta del OP.
No me gustó la idea de analizar la salida de netstat. Además, no puede obtener una ruta predeterminada en función de la dirección IP que tiene una interfaz en su máquina. Cualquier dirección IP dentro del mismo rango que la suya puede ser una puerta de enlace predeterminada: la única regla es que tanto su IP como la puerta de enlace predeterminada deben ser parte de la misma subred.
Una cosa más que quería asegurar es obtener una dirección IP de la puerta de enlace predeterminada incluso si más de una de mis interfaces locales tiene una dirección IP asignada a la misma (por ejemplo, estoy conectado al Wifi y al cable Ethernet al mismo tiempo, y ambas interfaces están arriba, con una dirección IP en ellas). Para mi aplicación, no importa a qué interfaz se establezca la ruta predeterminada (puede ser en0, en1, ppp0 o cualquier otra cosa).
Creo que la mejor forma (y la más similar a Apple) para obtener esa información es usar el Marco de Configuración del Sistema - los enlaces en la publicación de arriba en este hilo me indicaron en esa dirección, pero realmente no dieron muchos detalles en cuanto a cómo usarlo, y no encontré la documentación de Apple muy útil (al menos teniendo en cuenta mi nivel de habilidad).
Tenga en cuenta que no tengo mucha experiencia en Objective-C: estoy escribiendo una aplicación que necesito (y que no pude encontrar), y para esa aplicación solo necesito la IP dirección de la puerta de enlace predeterminada.
Por lo tanto - aquí es lo que estoy haciendo en mi aplicación, y parece estar funcionando bien (además es mucho más corto y más simple que la mayoría de las otras soluciones que he encontrado hasta ahora:
- (NSString *)defaultRouter {
SCDynamicStoreRef ds = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("myapp"), NULL, NULL);
CFDictionaryRef dr = SCDynamicStoreCopyValue(ds, CFSTR("State:/Network/Global/IPv4"));
CFStringRef router = CFDictionaryGetValue(dr, CFSTR("Router"));
NSString *routerString = [NSString stringWithString:(__bridge NSString *)router];
CFRelease(dr);
CFRelease(ds);
return routerString;
}
Tenga en cuenta que en mi aplicación, lo anterior es parte de un método más grande (en realidad no tengo un método defaultRouter:). Además, he omitido algunas de las comprobaciones (como [longitud de routerString] y así sucesivamente) para abreviar.
Esperemos que alguien encuentre esto útil. También puede corregir cualquier error que pueda tener en el código anterior - ¡Todavía soy un novato!
PS. Tengo una idea de lo que debe buscar cuando he comprobado la salida de 'scutil', que utiliza el marco de configuración del sistema en sí:
MacBook:~$ scutil
> show State:/Network/Global/IPv4
<dictionary> {
PrimaryInterface : en1
PrimaryService : <service_id>
Router : <ipv4_address>
}
> show State:/Network/Global/IPv6
<dictionary> {
PrimaryInterface : en1
PrimaryService : <service_id>
Router : <ipv6_address>
}
ifa-> ifa_dstaddr es la dirección de difusión, lo que explica el "255 de". – Bill
echa un vistazo a este enlace puede ser útil http://stackoverflow.com/questions/6530322/fetching-ip-address-of-router-to-which-isonectado –