Как мы узнаем, на каком сетевом интерфейсе работает наш сервер? - PullRequest
0 голосов
/ 12 октября 2019

Мы размещаем сервер UDP в нашем приложении для iOS.

Мы проверяем IP-адреса, которые использует наш iPhone, выполнив следующие действия:

void getIPAddresses(std::map<std::string, std::string>& addresses) {
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    // Retrieve the current interfaces - returns 0 on success
    int success = getifaddrs(&interfaces);
    if (success == 0) {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while (temp_addr != NULL) {
            if (temp_addr->ifa_addr->sa_family == AF_INET) {
                // Check if interface is en0 which is the wifi connection on the iPhone
                addresses[temp_addr->ifa_name] = inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr);
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    // Free memory
    freeifaddrs(interfaces);
}

Так, например, при подключении кWi-Fi, у нас есть следующие ips:

en0: 192.168.1.3
en2: 169.254.197.151
ipsec1: 10.254.254.254
ipsec2: 10.254.254.254
lo0: 127.0.0.1
pdp_ip0: 100.94.88.145

Если мы отправляем пакеты на IP-адрес, указанный в en2, то наш UDP-сервер получает его. Если мы отправим его на en0, то наш сервер не отправит. Если по какой-либо причине выводится только en0, а не en2, то, похоже, наш сервер получает пакеты по IP-адресу в en0.

Теперь предположим, что мы заставляем наше мобильное устройство действовать как точка доступа для мобильных устройств, тогда новая запись называетсяПоявляется bridge100, и наш сервер получает пакеты по ip-адресу для bridge100.

Может кто-нибудь дать объяснение, какова логика, лежащая в основе этого, чтобы мы могли легко определить, по какому IP-адресу доступен наш сервер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...