2009-07-10 22 views
2

Je programme en objectif C pour plusieurs appareils iPod et je me posais des questions à propos de quelque chose. Je développe une application qui utilise le modèle client-serveur et j'utilise le protocole UDP avec des sockets C. Y at-il une classe là-bas qui me permet de déterminer l'adresse IP des appareils iPod? Après avoir parcouru d'autres forums, je n'ai rien trouvé. Évidemment, cette commande ne fonctionnerait pas, mais quelque chose comme ipAddress = self.ip est ce que j'avais en tête. Je configure des sockets multicast C et j'essaye de faire une solution qui ressemble à la commande ping, qui n'existe pas non plus dans l'objective-C ni à ma connaissance (ce qui est limité, car j'ai seulement programmé en objectif-C depuis le début de cet été) au moins. Des conseils ou des astuces?Objective-C - Détermination par programme de l'adresse IP de l'iPod touch

Répondre

7

Cet extrait de code le récupèrera en passant par les interfaces.

- (NSString *)getIPAddress 
{ 
    NSString *address = @"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)]; 
       } 
      } 
      temp_addr = temp_addr->ifa_next; 
     } 
    } 

    // Free memory 
    freeifaddrs(interfaces); 
    return address; 
} 
+0

Commencez par tester et exécutez le code, puis postez le code complet. Je reçois des warings et des erreurs du code ci-dessus. avertissement: déclaration implicite de la fonction 'getifadrs' erreur: pointeur de déréférencement au type incomplet pour (temp_addr! = NULL) et quelques autres erreurs. – Biranchi

+6

Vous n'avez pas inclus les en-têtes appropriés. Comprenez d'abord le code avant de le copier et de le coller sur le mur de la salle de bain. –

+0

Quelqu'un veut-il nous inciter à savoir ce que sont les en-têtes appropriés? – AddisDev

0

Vous ne voyez pas? http://www.appsamuck.com/day4.html. Je pense que la bonne réponse est d'utiliser CFHost dans le SDK.

EDIT
Il apparaît la source dans ce projet est en utilisant le code suivant, ce qui en fait une solution totalement invalide moins qu'Apple décide de mettre NSHost dans le SDK.

-(NSString*)getAddress { 
    char iphone_ip[255]; 
    strcpy(iphone_ip,"127.0.0.1"); // if everything fails 
    NSHost* myhost =[NSHost currentHost]; 
    if (myhost) 
    { 
     NSString *ad = [myhost address]; 
     if (ad) 
      strcpy(iphone_ip,[ad cStringUsingEncoding: NSISOLatin1StringEncoding]); 
    } 
    return [NSString stringWithFormat:@"%s",iphone_ip]; 
} 
+0

C'est la première chose qui a sauté dans ma tête, et – ryansstack

+0

NSHost est pas pris en charge par le SDK iPhone. Ce serait génial si c'était le cas. –

+0

NSHost est pris en charge par le SDK iPhone! – user200654