Мы размещаем сервер 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-адресу доступен наш сервер?