How to write a simple Ping method in Cocoa/Objecti

2019-01-06 10:55发布

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.

8条回答
冷血范
2楼-- · 2019-01-06 11:17

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.

查看更多
放荡不羁爱自由
3楼-- · 2019-01-06 11:19

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.

查看更多
冷血范
4楼-- · 2019-01-06 11:21

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

查看更多
成全新的幸福
5楼-- · 2019-01-06 11:24

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

查看更多
Lonely孤独者°
6楼-- · 2019-01-06 11:34

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).

查看更多
迷人小祖宗
7楼-- · 2019-01-06 11:35

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]]; 
    }
    else
    {
        NSLog([NSString stringWithFormat: @"'%s' is not reachable", host_name]);
        [imageView setImage: [UIImage imageNamed:imageConnectionFailed]]; 
    }
}
查看更多
登录 后发表回答