objective framework developer apple apis iphone objective-c cocoa cocoa-touch networking

iphone - framework - objective c swift 4



Cómo escribir un método Ping simple en Cocoa/Objective-C (8)

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

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 estoy inclinando hacia una solución usando NSNetServices , ¿es una buena idea?

El método solo necesita hacer ping varias veces y devolver el promedio y -1 si el host está inactivo o no se puede alcanzar.


Déjame intentarlo 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 = [@".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


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

const char *hostName = [@".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


Hacer ping en el iPhone funciona 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.


La respuesta que publicó Gene Myers funciona con "SCNetworkReachabilityCreateWithName" para mí, pero solo en el simulador. En mi dispositivo (iPod w / OS 2.2.1) siempre devuelve "Se puede acceder al host" incluso para direcciones sin sentido como "zzz".

¿Estoy malinterpretando algo? Gracias.

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

De Cómo escribir un método Ping simple 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]]; } }


No le falta nada: "Alcance" en realidad no prueba que el dominio de destino sea realmente accesible, solo evalúa si hay una ruta fuera de la máquina por la cual el dominio de destino es potencialmente accesible. Siempre que tenga alguna conexión de salida (por ejemplo, una conexión inalámbrica o cableada activa), y una configuración de enrutamiento que conduzca al destino, entonces el sitio es "accesible" en lo que respecta a SCNetworkReachability.


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

Esto es particularmente terrible si hay una diferencia entre el Mac OSX y el iPhonew (por ejemplo, el llavero).