Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2527 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  [Objective C][Cocoa] Détecter si un host est accessible

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Objective C][Cocoa] Détecter si un host est accessible

n°2182052
Amonchakai
Posté le 23-03-2013 à 18:43:21  profilanswer
 

Hello,
 
En ce moment, j'essaye de bricoler un truc en ObjectiveC/Coca pour des terminaux iOS. Et j'ai comme un souci: est ce que vous avez déjà tenté de détecter si une IP est accessible?  
 
Le truc, c'est que j'ai un bout de code comme ça:

Code :
  1. - (void) initNetwork {
  2.     Settings *settings = [Settings get];
  3.    
  4.     CFReadStreamRef readStream;
  5.     CFWriteStreamRef writeStream;
  6.     CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef) settings.ipServer, 8080, &readStream, &writeStream);
  7.    
  8.     istream = objc_unretainedObject(readStream);
  9.     ostream = objc_unretainedObject(writeStream);
  10.    
  11.     [istream setDelegate:self];
  12.     [ostream setDelegate:self];
  13.    
  14.     // schedule a task, so it keep the TCP connection open.
  15.     [istream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
  16.     [ostream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
  17.    
  18.     [istream open];
  19.     [ostream open];
  20.    
  21. }


Pour ouvrir une connexion TCP avec un serveur distant.  
 
Le soucy, c'est quand je tente de taper dans mon flux:

Code :
  1. int len = [istream read:buffer maxLength:sizeof(buffer)];


Si mon hôte est pas une IP accessible, le read deviens bloquant. Alors bien sur, il faut vérifier l'état de la connexion avant... Il y a un champ "streamStatus" (un NSStreamStatus) dans le NSInputStream, mais ce con là que l'IP soit bonne ou une ip même pas sur le même réseau il est jusqu'avant l'appel du read à "NSStreamStatusOpening". Dc super...  
 
Par contre si l'ip donnée est existante, mais que il y a pas mon serveur a cette adresse le "read" échoue. Et problème est réglé, je sais ensuite traiter l'erreur...
 
 
Mon souci est donc de savoir détecter si le host est "unreachable" ou pas... Et là, j'ai passé toute la journée a tester toutes les solutions du net et j'en ai marre :D
 
J'ai trouvé:
- Reachability
sur Apple: http://developer.apple.com/library [...] Intro.html
ici avec l'ACR: https://github.com/tonymillion/Reachability
Que j'ai intégrer a mon code:
 
Dans le init avant d'ouvrir les streams

Code :
  1. Reachability* wifiReach = [Reachability reachabilityWithHostName:settings.ipServer];
  2. NetworkStatus netStatus = [wifiReach currentReachabilityStatus];
  3. switch (netStatus)
  4. {
  5.     case NotReachable:
  6.     {
  7.         NSLog(@"Access Not Available" );
  8.         break;
  9.     }
  10.     case ReachableViaWWAN:
  11.     {
  12.         NSLog(@"Reachable WWAN" );
  13.         break;
  14.     }
  15.     case ReachableViaWiFi:
  16.     {
  17.         NSLog(@"Reachable WiFi" );
  18.         break;
  19.     }
  20. }


Manque de pôt, que je mette n'importe quelle ip il me la trouve accessible via Wifi  :heink:  
 
J'ai tenté ça aussi:

Code :
  1. bool success = false;
  2. const char *host_name = [@"stackoverflow.com"
  3.                          cStringUsingEncoding:NSASCIIStringEncoding];
  4. SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
  5.                                                                         host_name);
  6. SCNetworkReachabilityFlags flags;
  7. success = SCNetworkReachabilityGetFlags(reachability, &flags);
  8. bool isAvailable = success && (flags & kSCNetworkFlagsReachable) &&
  9.                              !(flags & kSCNetworkFlagsConnectionRequired);
  10. if (isAvailable) {
  11.     NSLog(@"Host is reachable: %d", flags);
  12. }else{
  13.     NSLog(@"Host is unreachable" );
  14. }


Pareil il me trouve mon host accessible peu importe l'ip filé :heink:  
 
J'ai trouvé aussi un truc a base du SimplePing d'apple:
http://www.splinter.com.au/how-to- [...] -c-iphone/
bon là j'ai galéré ça freeze  :whistle:  
 
 
Bref, je suis con ou je suis con? Je comprends pas, mon ip dans mes settings est bonne car ça marche quand je donne la bonne IP. Mais pkoi quand je donne de la merde, il me trouve l'host accessible?  
 
 bien sur avec le mac, si je fait un ping de l'ip demandé (quand c'est de la merde) il me dit host unreachable...  
 
Des gens ont déjà essayé ce genre de blague? :) Je suis a deux doigts d'injecter du C, là :D
 
Merci :)

mood
Publicité
Posté le 23-03-2013 à 18:43:21  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  [Objective C][Cocoa] Détecter si un host est accessible

 

Sujets relatifs
[C#] Trier un tableau d'objet[Recrutement] Jeu vidéo sur mobile recherche un développeur C++
regex : pattern pour détecter les lettres et leur accent [résolu][ASP.NET - C#] Titre gridview
[C/C++]Programme cube led, besoin d'aide pour comprendre[ASP.NET - C#] Récupérer valeur d'un gridview
Rencontre C++ Francophone 
Plus de sujets relatifs à : [Objective C][Cocoa] Détecter si un host est accessible


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR