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

我需要在Cocoa / Objective-C中写一个简单的ping方法。 它也需要在iPhone上工作。

我发现一个使用icmp的例子,这将在iPhone上工作吗?

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

该方法只需要ping几次,如果主机closures或不可达,则返回平均值和-1。

下面的代码似乎是同步工作的:

 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是必需的

让我再试一次…这次login,格式化更好;-)

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是必需的

我也遇到了同样的问题,最后在SimplePing上写了一个简单的包装来达到这个目的,写了一个关于它的博客,并且在github上有一些代码,希望能够帮助别人:

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

您不会错过任何东西 – “可达性”实际上并不testing目标域实际上是否可达,而只是评估目标域是否有潜在可达的path。 只要你有一些出站连接(例如一个活动的无线连接或有线连接)和一个通向目标的路由configuration,就SCNetworkReachability而言,该站点是“可到达的”。

在iPhone上进行Ping操作与其他平台上的操作有所不同,因为您没有root权限。 请参阅Apple的示例代码 。

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

请注意,模拟器和实际的iPhone是有区别的。 模拟器不是像Android提供的模拟器,它使用Mac OSX类来实现大多数function。

如果Mac OSX和iPhonew(例如钥匙串)之间存在差异,那么这是非常地狱。

答案吉姆·迈尔斯张贴工作使用“SCNetworkReachabilityCreateWithName”对我来说 – 但只在模拟器。 在我的设备(iPod w / OS 2.2.1)上,即使是像“zzz”这样的无意义地址,它总是返回“主机可达”。

我误解了什么? 谢谢。

这是我的代码,以防万一:

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

  - (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]]; } }