我需要在Cocoa / Objective-C中编写一个简单的ping
方法。它还需要在iPhone上运行。
我找到了一个使用icmp
的示例,这会在iPhone上运行吗?
我倾向于使用NSNetServices
解决方案,这是一个好主意吗?
该方法只需要ping
几次,如果主机关闭或无法访问,则返回平均值和-1。
答案 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
是必需的