Cómo escribir un método simple de Ping en Cocoa / Objective-C

Necesito escribir un método de ping simple en Cocoa / Objective-C. También necesita trabajar en el iPhone.

Encontré un ejemplo que usa icmp , ¿funcionará esto en el iPhone?

Me NSNetServices una solución usando NSNetServices , ¿es esta una buena idea?

El método solo necesita hacer ping unas pocas veces y devolver el promedio y -1 si el host está inactivo o no disponible.

El siguiente código parece estar funcionando sincrónicamente:

 const char *hostName = [@"stackoverflow.com" cStringUsingEncoding:NSASCIIStringEncoding]; SCNetworkConnectionFlags flags = 0; if (SCNetworkCheckReachabilityByName(hostName, &flags) && flags > 0) { NSLog(@"Host is reachable: %d", flags); } else { NSLog(@"Host is unreachable"); } 

Nota: se requiere SystemConfiguration.framework

Déjame probar esto de nuevo … esta vez iniciando sesión, y formateando mejor 😉

StreamSCNetworkCheckReachabilityByName está en desuso y NO está disponible para el iPhone.

 bool success = false; const char *host_name = [@"stackoverflow.com" cStringUsingEncoding:NSASCIIStringEncoding]; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name); SCNetworkReachabilityFlags flags; success = SCNetworkReachabilityGetFlags(reachability, &flags); //prevents memory leak per Carlos Guzman's comment CFRelease(reachability); bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); if (isAvailable) { NSLog(@"Host is reachable: %d", flags); }else{ NSLog(@"Host is unreachable"); } 

Nota: se requiere SystemConfiguration.framework

Tuve el mismo problema y terminé escribiendo un borrador simple sobre SimplePing para lograr esto, escribí un blog sobre él y hay algún código en github, con suerte ayudará a alguien aquí:

http://splinter.com.au/how-to-ping-a-server-in-objective-c-iphone

No le falta nada: “Accesibilidad” en realidad no prueba que el dominio objective es, de hecho, alcanzable, solo evalúa si hay un camino fuera de la máquina por el cual el dominio objective es potencialmente alcanzable. Siempre que tenga alguna conexión saliente (por ejemplo, una conexión activa inalámbrica o por cable) y una configuración de enrutamiento que conduzca al destino, entonces el sitio es “alcanzable” en lo que respecta a SCNetworkReachability.

Hacer ping en el iPhone funciona de forma un poco diferente que en otras plataformas, debido al hecho de que no tiene acceso de root. Vea este código de ejemplo de Apple.

Mire en CFHost y, en particular, CFHostGetReachability . También hay un código CFHost de muestra disponible, que incluye una rutina para verificar la disponibilidad del host.

La respuesta que Gene Myers publicó funciona para mí con “SCNetworkReachabilityCreateWithName”, pero solo en el simulador. En mi dispositivo (iPod w / OS 2.2.1) siempre devuelve “El host es alcanzable” incluso para direcciones sin sentido como “zzz”.

¿Estoy malentendiendo algo? Gracias.

Aquí está mi código por si acaso:

De Cómo escribir un método simple de Ping en Cocoa / Objective-C

  - (IBAction) TestReachability:(id)sender { bool success = false; const char *host_name = [ipAddressText.textcStringUsingEncoding:NSASCIIStringEncoding]; NSString *imageConnectionSuccess = @"Connected.png"; NSString *imageConnectionFailed = @"NotConnected.png"; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name); SCNetworkReachabilityFlags flags; success = SCNetworkReachabilityGetFlags(reachability, &flags); bool isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); if (isAvailable) { NSLog([NSString stringWithFormat: @"'%s' is reachable, flags: %x", host_name, flags]); [imageView setImage: [UIImage imageNamed:imageConnectionSuccess]]; } else { NSLog([NSString stringWithFormat: @"'%s' is not reachable", host_name]); [imageView setImage: [UIImage imageNamed:imageConnectionFailed]]; } } 

Tenga en cuenta que existe una diferencia entre el simulador y el iPhone real. El simulador no es un verdadero simulador como el proporcionado por Android, sino que utiliza clases de Mac OSX para la mayoría de las funciones.

Esto es particularmente extraño si hay una diferencia entre Mac OSX e iPhonew (por ejemplo, el llavero).