Я знаю, что это немного устарело, но выбранный ответ не идеален.
API SCReachability может использоваться для определения доступности определенного хоста. Если все, что вы хотите знать, - это когда назначен действительный IP-адрес (а не жизнеспособный маршрут к целевому IP-адресу), вам следует вместо этого взглянуть на API SCDynamicStore *.
Эти функции позволяют подписаться на хранилище конфигурации системы для уведомления при изменении определенных значений.
Таким образом, для уведомления об изменении адреса IPv4 на любом интерфейсе вы должны сделать следующее (проверка ошибок удалена для удобства чтения)
SCDynamicStoreRef dynStore;
SCDynamicStoreContext context = {0, NULL, NULL, NULL, NULL};
dynStore = SCDynamicStoreCreate(kCFAllocatorDefault,
CFBundleGetIdentifier(CFBundleGetMainBundle()),
scCallback,
&context);
const CFStringRef keys[3] = {
CFSTR("State:/Network/Interface/.*/IPv4")
};
CFArrayRef watchedKeys = CFArrayCreate(kCFAllocatorDefault,
(const void **)keys,
1,
&kCFTypeArrayCallBacks);
if (!SCDynamicStoreSetNotificationKeys(dynStore,
NULL,
watchedKeys))
{
CFRelease(watchedKeys);
fprintf(stderr, "SCDynamicStoreSetNotificationKeys() failed: %s", SCErrorString(SCError()));
CFRelease(dynStore);
dynStore = NULL;
return -1;
}
CFRelease(watchedKeys);
rlSrc = SCDynamicStoreCreateRunLoopSource(kCFAllocatorDefault, dynStore, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rlSrc, kCFRunLoopDefaultMode);
CFRelease(rlSrc);
Вам нужно будет реализовать функцию scCallback, которая будет вызываться при каждом изменении. Также вам нужно будет вызвать CFRunLoopRun где-нибудь, чтобы заставить код работать.