2009-04-28 10 views
18

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

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

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

El método solo necesita ping algunas veces y devuelve el promedio y -1 si el host está inactivo o inaccesible.

Respuesta

-5

El código de abajo parece estar funcionando de forma sincrónica:

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: SystemConfiguration.framework se requiere

+3

Desafortunadamente , SCNetworkCheckReachabilityByName ahora está en desuso. –

+28

8 votos y + recompensa por un código que no responde a la pregunta, es decir, ping/traceroute, pero básicamente es una búsqueda de DNS. – bestsss

+0

El código no solo está en desuso, sino que también busca DNS –

35

me dejó probar este nuevo ... esta vez de entrar, y dar formato a una 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

+0

Gracias hombre que tiene la mejor solución con Accesibilidad – YannickSteph

+0

Hola. Código excelente y útil, pero solo una cosa. Es necesario agregar el código 'CFRelease (alcanzable)' después de llamar a 'SCNetworkReachabilityGetFlags' para liberar la variable de accesibilidad (para evitar fugas de memoria) como se menciona en [documentación] (https://developer.apple.com/reference/systemconfiguration/1514904- scnetworkreachabilitycreatewithn? language = objc) –

+0

'SCNetworkReachabilityGetFlags' es un mal sustituto del ping: si el dispositivo está conectado a una red, se establecerá' kSCNetworkFlagsReachable' y 'kSCNetworkFlagsConnectionRequired' se desconectará aunque el host de destino esté desconectado. – adib

0

La respuesta de Gene Myers publicado trabajos utilizando "SCNetworkReachabilityCreateWithName" para mí - pero sólo 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 entendiendo mal algo? Gracias.

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

De How to write a simple Ping method in 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]]; 
    } 
} 
0

Por favor tome en cuenta que hay 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 especialmente extraño si hay una diferencia entre Mac OSX e iPhonew (por ejemplo, el llavero).

13

No le falta nada - "Accesibilidad" en realidad no prueba que el dominio objetivo es de hecho alcanzable, solo evalúa si hay un camino fuera de la máquina por el cual el dominio objetivo 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.

5

Hacer ping en el iPhone funciona de forma un poco diferente que en otras plataformas, debido a que no tiene acceso de root.Vea esto sample code de Apple.

+0

Este archivo se elimina de la biblioteca de desarrolladores de Apple. –

32

tenía este mismo problema, y ​​terminó escribiendo un simple envoltorio alrededor SimplePing para lograr esto, escribió un blog acerca de ello y hay un poco de código en GitHub, se espera ayude a alguien aquí:

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

+13

Voten por una solución que realmente responda a la pregunta (¡frente a todas estas cosas inútiles de accesibilidad que a las personas parece gustarles pero que no abordan totalmente la pregunta planteada!). ¡Gracias! –

+0

Hombre que rock: D –

+0

Sí, esta es la respuesta real. – user623396

Cuestiones relacionadas