2010-01-07 10 views
11

Ich habe Code, mit dem ich die MAC-Adresse und die IP-Adresse der WiFi-Verbindung auf dem iPhone bestimmen kann, aber ich kann nicht herausfinden, wie die Subnetzmaske und Router-Adresse für erhalten die Verbindung. Kann mir hier jemand in die richtige Richtung zeigen?iPhone WiFi Subnet Mask und Router Adresse

+0

Momentan suche ich ICMP (Router Solicitation) oder ICMP (Echo-Anfrage, 1 Hop, sehen wer antwortet). Ich glaube nicht, dass mein Router auf Router-ICMP-Anfragen reagiert. Die zweite Methode ist, wie Traceroute funktioniert (glaube ich). Eine andere Option wäre eine DHCP-API (kann auf iPhone nicht gefunden werden) oder das Senden von DHCP-Paketen für Informationen (weil in meinem Fall immer DHCP vorhanden ist und der Router immer auch der DHCP-Server ist). – Bill

+0

FYI - Die iPhone-Anwendung wurde entwickelt, um Sicherheits-/Zugriffsrichtlinien auf DLink-Home-NAT-Routern zu steuern (die Web-Schnittstelle ist ein Schmerz zu verwenden); Ich versuche einfach zu vermeiden, dass der Benutzer die Adresse des Routers eingibt. Sie müssen ein Passwort angeben, also keine große Sache, wenn ich hier keine gute Lösung finde. – Bill

+0

@bvanderw - können Sie einen Link zu Ihrem Code oder der Dokumentation veröffentlichen, um die MAC-Adresse der WiFi-Verbindung zu bestimmen? Ich konnte es nicht aufspüren. – Ciaran

Antwort

13

Sie können diese Informationen erhalten, indem Sie getifaddrs anrufen. (Ich benutze diese Funktion in einer App von mir die IP-Adresse des iPhone, um herauszufinden.)

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 

Diese bekommt man die Subnetz-Maske; für the router address, see this question.

Dies ist alles alte Schule UNIX-Netzwerk-Zeug, müssen Sie wählen, welche der Schnittstellen ist die WiFi-Verbindung (andere Sachen wie eine Loopback-Schnittstelle wird auch dort sein). Dann müssen Sie möglicherweise Funktionen wie inet_ntoa() verwenden, abhängig davon, welches Format Sie die IP-Adressen lesen möchten. Es ist nicht schlecht, nur langweilig und hässlich. Habe Spaß!

+0

ifa-> ifa_dstaddr ist die Broadcast-Adresse, nicht die Router-Adresse. – Bill

+2

@Bill: habe meine Antwort korrigiert, bitte überdenken Sie Ihren Downvote. – benzado

+0

müssen Sie ifaddrs.h importieren –

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); 
Verwandte Themen