如何在Cocoa / Objective-C中编写一个简单的Ping方法

时间:2009-04-28 15:07:33

标签: iphone objective-c cocoa cocoa-touch networking

我需要在Cocoa / Objective-C中编写一个简单的ping方法。它还需要在iPhone上运行。

我找到了一个使用icmp的示例,这会在iPhone上运行吗?

我倾向于使用NSNetServices解决方案,这是一个好主意吗?

该方法只需要ping几次,如果主机关闭或无法访问,则返回平均值和-1。

8 个答案:

答案 0 :(得分:35)

让我再试一次......这次登录,格式化更好; - )

StreamSCNetworkCheckReachabilityByName已弃用,不适用于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");
}

注意:SystemConfiguration.framework是必需的

答案 1 :(得分:32)

我遇到了同样的问题,最后围绕SimplePing写了一个简单的包装器来实现这个目的,写了一篇关于它的博客,github上有一些代码,希望能帮到这里的人:

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

答案 2 :(得分:13)

您没有遗漏任何内容 - “可达性”实际上并未测试目标域实际上是否可达,它仅评估是否存在可从目标域到达的机器路径。只要您有一些出站连接(例如,活动的无线或有线连接)以及通向目标的路由配置,就SCNetworkReachability而言,该站点是“可达的”。

答案 3 :(得分:5)

由于您没有root访问权限,因此在iPhone上进行Ping操作与在其他平台上有所不同。请参阅Apple的此sample code

答案 4 :(得分:2)

查看CFHost,特别是CFHostGetReachability。还有sample CFHost code可用,其中包括检查主机可用性的例程。

答案 5 :(得分:0)

答案Gene Myers为我发布了使用“SCNetworkReachabilityCreateWithName”的作品 - 但仅限于模拟器中。在我的设备(iPod w / OS 2.2.1)上,它总是返回“主机可以访问”,即使对于像“zzz”这样的无意义地址也是如此。

我误解了什么吗?感谢。

以下是我的代码以防万一:

来自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]]; 
    }
}

答案 6 :(得分:-1)

请注意,模拟器和实际iPhone之间存在差异。模拟器不是像Android提供的模拟器,它使用Mac OSX类来完成大部分功能。

如果Mac OSX和iPhonew(例如钥匙串)之间存在差异,这尤其可能。

答案 7 :(得分:-7)

以下代码似乎同步工作:

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

注意:SystemConfiguration.framework是必需的