2010-01-07 5 views
11

У меня есть код, который позволяет мне определять MAC-адрес и IP-адрес WiFi-соединения на iPhone, но я не могу понять, как получить адрес и маску подсети для связь. Может ли кто-нибудь указать мне в правильном направлении?iPhone Маска подсети и маршрутизатора iPhone WiFi

+0

Прямо сейчас я смотрю ICMP (приглашение на маршрутизатор) или ICMP (эхо-запрос, 1 хп, см., Кто отвечает). Я не думаю, что мой маршрутизатор отвечает на запросы ICMP на запрос маршрутизатора; второй метод - как работает traceroute (я считаю). Другой вариант - это DHCP-API (не может найти его на Iphone) или отправки DHCP-пакетов для информации (потому что в моем случае всегда будет DHCP, а маршрутизатор всегда является сервером DHCP). – Bill

+0

FYI - приложение iPhone предназначено для управления политиками безопасности/доступа на маршрутизаторах DLL Home Home NAT (веб-интерфейс - боль в использовании); Я просто пытаюсь избежать ввода типа пользователя в адрес маршрутизатора. Они должны будут предоставить пароль, так что неважно, если я не могу найти здесь хорошее решение. – Bill

+0

@bvanderw - можете ли вы разместить ссылку на свой код или документацию, чтобы определить MAC-адрес WiFi-соединения? Я не смог отследить его. – Ciaran

ответ

13

Вы можете получить эту информацию, позвонив по телефону getifaddrs. (Я использую эту функцию в приложении шахты, чтобы выяснить IP-адрес iPhone в.)

struct ifaddrs *ifa = NULL, *ifList; 
getifaddrs(&ifList); // should check for errors 
for (ifa = ifList; ifa != NULL; ifa = ifa->ifa_next) { 
    ifa->ifa_addr // interface address 
    ifa->ifa_netmask // subnet mask 
    ifa->ifa_dstaddr // broadcast address, NOT router address 
} 
freeifaddrs(ifList); // clean up after yourself 

Это получает вас маску подсети; для the router address, see this question.

Это все сетевые материалы для школьной школы UNIX, вам нужно будет выбрать, какой из интерфейсов является WiFi-соединением (там тоже будут другие элементы, такие как интерфейс loopback). Тогда вам, возможно, придется использовать такие функции, как inet_ntoa(), в зависимости от формата, который вы хотите прочитать IP-адреса. Это неплохо, просто утомительно и уродливо. Повеселись!

+0

ifa-> ifa_dstaddr - это широковещательный адрес, а не адрес маршрутизатора. – Bill

+2

@Bill: исправил свой ответ, пожалуйста, пересмотреть ваш downvote. – benzado

+0

вам нужно будет импортировать ifaddrs.h –

3
NSString *address = @"error"; 
NSString *netmask = @"error"; 
struct ifaddrs *interfaces = NULL; 
struct ifaddrs *temp_addr = NULL; 
int success = 0; 

// retrieve the current interfaces - returns 0 on success 
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 

      if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) 
      { 
       // Get NSString from C String 
       address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]; 
       netmask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]; 
      } 
     } 

     temp_addr = temp_addr->ifa_next; 
    } 
} 

// Free memory 
freeifaddrs(interfaces); 
NSLog(@"address %@", address); 
NSLog(@"netmask %@", netmask);