Я искал способ, чтобы получить IP-адрес шлюза по умолчанию сам. Я собираюсь сосредоточиться именно на этом - мне не нужно было получать MAC-адрес маршрутизатора по умолчанию, так что это лишь частично отвечает на вопрос OP.
Мне не понравилась синтаксическая обработка вывода netstat. Кроме того, вы не можете получить маршрут по умолчанию на основе IP-адреса, который имеет интерфейс на вашем компьютере. Любой IP-адрес в том же диапазоне, что и ваш, может быть шлюзом по умолчанию - единственное правило заключается в том, что ваш IP-адрес и шлюз по умолчанию должны быть частью одной и той же подсети.
Еще одна вещь, которую я хотел бы обеспечить, - это получить IP-адрес шлюза по умолчанию, даже если для одного из моих локальных интерфейсов назначен назначенный ему IP-адрес (например, я подключен к Wi-Fi и проводному Ethernet в то же время, и оба интерфейса вверх, с IP-адресом на них). Для моего приложения не имеет значения, с каким интерфейсом устанавливается маршрут по умолчанию (он может быть en0, en1, ppp0 или вообще что-либо еще).
Я думаю, что лучший (и самый похожий на Apple) способ получить эту информацию - использовать System Configuration Framework - ссылки в сообщении выше в этом потоке указывали мне в этом направлении, но на самом деле не дали подробностей как использовать его, и я не нашел документацию Apple на нем очень полезной (по крайней мере, учитывая мой уровень квалификации).
Пожалуйста, помните, что я не очень опытен в Objective-C. Я нахожусь в середине написания приложения, которое мне нужно (и которое я не мог найти), и для этого приложения мне просто нужен IP-адрес адрес шлюза по умолчанию.
Итак - вот что я делаю в моем приложении, и это, кажется, работает хорошо (плюс намного короче и проще, чем большинство других решений, которые я нашел до сих пор:
- (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;
}
Обратите внимание, что в мое приложение, приведенное выше, является частью более крупного метода (у меня на самом деле нет метода defaultRouter:). Я также пропустил некоторые проверки (например, [длина маршрутизатора] и т. д.) для краткости.
Надеюсь, кто-то посчитает это полезным. Также не стесняйтесь исправить любые ошибки, которые могут возникнуть в коде выше - я все еще новичок!
PS. Я получил представление о том, что нужно искать, когда я проверил выход «scutil», которая использует Framework конфигурации системы сам:
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 это широковещательный адрес, который объясняет «255-х». – Bill
проверить эту ссылку может быть полезно для вас http://stackoverflow.com/questions/6530322/fetching-ip-address-of-router-to-which-iphone-is-connected –