How to write a simple Ping method in Cocoa/Objective-C

匿名 (未验证) 提交于 2019-12-03 08:57:35

问题:

I need to write a simple ping method in Cocoa/Objective-C. It also needs to work on the iPhone.

I found an example that uses icmp, will this work on the iPhone?

I'm leaning towards a solution using NSNetServices, is this a good idea?

The method only needs to ping a few times and return the average and -1 if the host is down or unreachable.

回答1:

The code below seems to be working synchronously:

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

Note: SystemConfiguration.framework is required



回答2:

Let me try this again...this time logging in, and formatting better ;-)

StreamSCNetworkCheckReachabilityByName is deprecated and NOT available for the 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"); }

Note: SystemConfiguration.framework is required



回答3:

I had this same problem, and ended up writing a simple wrapper around SimplePing to achieve this, wrote a blog about it and there's some code on github, hopefully will help someone here:

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



回答4:

You are not missing anything -- "Reachability" doesn't actually test that the target domain is in fact reachable, it only assesses if there is a pathway out of the machine by which the target domain is potentially reachable. So long as you have some outbound connection (e.g., an active wirless or wired connection), and a routing configuration that leads to the target, then the site is "reachable" as far as SCNetworkReachability is concerned.



回答5:

Pinging on the iPhone works a bit different than on other platforms, due to the fact that you don't have root access. See this sample code from Apple.



回答6:

Look into CFHost and in particular CFHostGetReachability. There is sample CFHost code available, as well, which includes a routine to check host availability.



回答7:

Please take note that there is an difference between the simulator and the actual iPhone. The simulator is not a true simulator like the one supplied by Android, it uses Mac OSX classes for most of the functions.

This is particularly hell if there is a difference between the Mac OSX and iPhonew(for example the keychain).



回答8:

The answer Gene Myers posted works using "SCNetworkReachabilityCreateWithName" for me - but only in the simulator. On my device (iPod w/OS 2.2.1) it always returns "Host is reachable" even for nonsense addresses like "zzz".

Am I misunderstanding something? Thanks.

Here's my code just in case:

From 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]];      }             
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!