2009-04-28 5 views
18

Ich muss eine einfache ping Methode in Cocoa/Objective-C schreiben. Es muss auch auf dem iPhone funktionieren.Wie schreibe ich eine einfache Ping-Methode in Cocoa/Objective-C

Ich habe ein Beispiel gefunden, das icmp verwendet, wird dies auf dem iPhone funktionieren?

Ich bin auf eine Lösung mit NSNetServices gelehnt, ist das eine gute Idee?

Die Methode muss nur ein paar Mal ping und gibt den Durchschnitt und -1 zurück, wenn der Host nicht erreichbar oder nicht erreichbar ist.

Antwort

-5

Der folgende Code zu arbeiten synchron scheint:

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"); 
} 

Hinweis: SystemConfiguration.framework

+3

, SCNetworkCheckReachabilityByName ist jetzt veraltet. –

+28

8 Stimmen und + Bounty für Code, der völlig nicht tun, was Frage war, d. H. Ping/Traceroute, aber es ist im Grunde eine DNS-Lookup. – bestsss

+0

Der Code ist nicht nur veraltet, sondern sucht auch nach dem DNS –

35

Lassen Sie mich diese wieder benötigt wird versuchen ... dieses Mal anmelden und eine bessere Formatierung ;-)

StreamSCNetworkCheckReachabilityByName ist veraltet und NICHT für das iPhone verfügbar.

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"); 
} 

Hinweis: SystemConfiguration.framework ist erforderlich

+0

Danke Mann, Sie haben die beste Lösung mit Erreichbarkeit – YannickSteph

+0

Hallo. Ausgezeichneter Code und hilfreich, aber nur eine Sache. Sie benötigen den Code 'CFRelease (Erreichbarkeit)' nach dem Aufruf 'SCNetworkReachabilityGetFlags', um die Erreichbarkeitsvariable (zur Vermeidung von Speicherlecks) wie in [Dokumentation] (https://developer.apple.com/reference/systemconfiguration/1514904- scnetworkreachabilitycreatewithn? language = objc) –

+0

'SCNetworkReachabilityGetFlags' ist ein schlechter Ersatz für Ping - wenn das Gerät mit einem Netzwerk verbunden ist, wird' KSCNetworkFlagsReachable' gesetzt und 'kSCNetworkFlagsConnectionRequired' wird zurückgesetzt, obwohl der Zielhost offline ist. – adib

0

Die Antwort Gene Myers Werke geschrieben "SCNetworkReachabilityCreateWithName" für mich mit - aber nur im Simulator. Auf meinem Gerät (iPod w/OS 2.2.1) gibt es immer "Host ist erreichbar" auch für unsinnige Adressen wie "zzz".

Habe ich etwas falsch verstanden? Vielen Dank.

Hier ist mein Code für alle Fälle:

Von 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

Bitte nehmen Sie zur Kenntnis, dass es einen Unterschied zwischen dem Simulator und dem tatsächlichen iPhone. Der Simulator ist kein echter Simulator wie der von Android, er verwendet Mac OSX-Klassen für die meisten Funktionen.

Dies ist besonders die Hölle, wenn es einen Unterschied zwischen dem Mac OSX und iPhonew gibt (zum Beispiel der Schlüsselbund).

13

Sie verpassen nichts - "Erreichbarkeit" testet nicht wirklich, dass die Zieldomäne tatsächlich erreichbar ist, sie prüft nur, ob es einen Weg aus der Maschine gibt, über den die Zieldomäne potenziell erreichbar ist. Solange Sie eine ausgehende Verbindung (z. B. eine aktive drahtlose oder drahtgebundene Verbindung) und eine Routingkonfiguration haben, die zum Ziel führt, ist die Site "erreichbar", soweit es SCNetworkReachability betrifft.

5

Ping auf dem iPhone funktioniert ein bisschen anders als auf anderen Plattformen, aufgrund der Tatsache, dass Sie keinen Root-Zugang haben.Siehe hierzu von Apple.

+0

Diese Datei wird aus der gesamten Apple Developer Library entfernt. –

32

Ich hatte das gleiche Problem, und am Ende einen einfachen Wrapper zu schreiben, um dies zu erreichen SimplePing, hat einen Blog darüber und es gibt einige Code auf Github, wird hoffentlich jemand helfen hier: Leider

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

+13

Upvote für eine Lösung, die tatsächlich die Frage beantwortet (vs all diese nutzlosen Erreichbarkeit Zeug, die Menschen mögen, aber die die gestellte Frage überhaupt nicht beantwortet!). Vielen Dank! –

+0

Man du rock: D –

+0

Ja, das ist die tatsächliche Antwort. – user623396

Verwandte Themen