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.
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.
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.
Look into CFHost and in particular CFHostGetReachability. There is sample CFHost code available, as well, which includes a routine to check host availability.
Let me try this again...this time logging in, and formatting better ;-)
StreamSCNetworkCheckReachabilityByName is deprecated and NOT available for the iPhone.
Note: SystemConfiguration.framework is required
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).
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