如何在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]]; } }