Como escrever um método Ping simples em Cocoa / Objective-C

Eu preciso escrever um método de ping simples em Cocoa / Objective-C. Também precisa funcionar no iPhone.

Eu encontrei um exemplo que usa icmp , isso funcionará no iPhone?

Estou inclinado para uma solução usando NSNetServices , isso é uma boa ideia?

O método só precisa ping algumas vezes e retornar a média e -1 se o host estiver inativo ou inacessível.

O código abaixo parece estar funcionando de forma síncrona:

 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 é obrigatório

Deixe-me tentar novamente … desta vez logando e formatando melhor 😉

StreamSCNetworkCheckReachabilityByName está obsoleto e NÃO está disponível para o 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: SystemConfiguration.framework é obrigatório

Eu tive esse mesmo problema, e acabei escrevendo um simples wrapper em torno do SimplePing para conseguir isso, escrevi um blog sobre ele e há algum código no github, espero que ajude alguém aqui:

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

Você não está perdendo nada – “Reachability” não testa realmente que o domínio de destino é de fato alcançável, ele apenas avalia se existe um caminho fora da máquina pelo qual o domínio de destino é potencialmente alcançável. Contanto que você tenha alguma conexão de saída (por exemplo, uma conexão sem fio ou com fio ativa) e uma configuração de roteamento que leve ao destino, o site estará “acessível” no que se refere ao SCNetworkReachability.

Ping no iPhone funciona um pouco diferente do que em outras plataformas, devido ao fato de que você não tem access root. Veja este exemplo de código da Apple.

Olhe para CFHost e em particular CFHostGetReachability . Também há um código CFHost de amostra disponível, que inclui uma rotina para verificar a disponibilidade do host.

A resposta Gene Myers postou trabalhos usando “SCNetworkReachabilityCreateWithName” para mim – mas apenas no simulador. No meu dispositivo (iPod w / OS 2.2.1), ele sempre retorna “Host acessível”, mesmo para endereços sem sentido, como “zzz”.

Eu estou entendendo mal alguma coisa? Obrigado.

Aqui está o meu código apenas no caso:

Como escrever um método Ping simples em 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]]; } } 

Por favor, note que existe uma diferença entre o simulador e o iPhone real. O simulador não é um verdadeiro simulador como o fornecido pelo Android, ele usa classs do Mac OSX para a maioria das funções.

Isso é particularmente ruim se houver uma diferença entre o Mac OSX e o iPhonew (por exemplo, o keychain).