Обнаружить любую подключенную сеть
Как я могу определить, подключен ли какой-либо сетевой адаптер? Я могу только найти примеры использования NSReachability для обнаружения интернет-соединения, но я хочу обнаружить даже не-интернет-соединение. Получение IP-адреса на eth0 должно работать? Я работаю только на Mac.
3 ответа
Получение списка всех IP-адресов в технической заметке Apple TN1145 упоминает 3 метода получения статуса сетевых интерфейсов:
- Структура конфигурации системы
- Открытый транспортный API
- BSD розетки
Структура конфигурации системы: это рекомендуемый Apple способ, и в TN1145 есть пример кода. Преимущество заключается в том, что он позволяет получать уведомления об изменениях в конфигурации интерфейса.
Open Transport API: в TN1145 также есть пример кода, иначе я не могу много сказать об этом. (На сайте Apple есть только "устаревшая" документация.)
Сокеты BSD: это, кажется, самый простой способ получить список интерфейсов и определить состояние соединения (если вам не нужны уведомления о динамических изменениях).
Следующий код демонстрирует, как найти все работающие интерфейсы IPv4 и IPv6.
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <netdb.h>
struct ifaddrs *allInterfaces;
// Get list of all interfaces on the local machine:
if (getifaddrs(&allInterfaces) == 0) {
struct ifaddrs *interface;
// For each interface ...
for (interface = allInterfaces; interface != NULL; interface = interface->ifa_next) {
unsigned int flags = interface->ifa_flags;
struct sockaddr *addr = interface->ifa_addr;
// Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) {
if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) {
// Convert interface address to a human readable string:
char host[NI_MAXHOST];
getnameinfo(addr, addr->sa_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
printf("interface:%s, address:%s\n", interface->ifa_name, host);
}
}
}
freeifaddrs(allInterfaces);
}
Вы можете использовать код Reachability, предоставленный Apple. Вот ссылка, по которой вы можете получить исходный код "Reachability":
Вы также можете скачать этот файл: TestWifi в Github. Он покажет вам, как реализовать класс Reachability.
Надеюсь, это поможет вам.
Reachability
(Я предполагаю, что вы имели в виду демонстрационный класс Apple, основанный на SCNetworkReachability...
API) работает для любого IP-хоста, в том числе в вашей локальной сети. Вы могли бы использовать reachabilityForLocalWiFi
метод, хотя согласно этой странице он вернет ДА, когда сеть активна, но не маршрутизируема. Так что вы можете предпочесть запрос reachabilityWithAddress:
с локальным адресом.
Это замена для замены Reachability
что некоторые люди рекомендуют.