Обнаружить любую подключенную сеть

Как я могу определить, подключен ли какой-либо сетевой адаптер? Я могу только найти примеры использования 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 что некоторые люди рекомендуют.

Другие вопросы по тегам