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

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

Marsh Posté le 23-03-2013 à 18:43:21    

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 :)

Reply

Marsh Posté le 23-03-2013 à 18:43:21   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed