我需要在Cocoa/Objective-C中编写一个简单的ping
方法,它还需要在iPhone上工作。
我找到了一个使用icmp
的示例,这个方法能在iPhone上使用吗?
我倾向于使用NSNetServices
来解决问题,这是一个好主意吗?
该方法只需对目标主机进行ping
几次,并返回平均值以及-1(如果主机不可达或无法访问)。
我需要在Cocoa/Objective-C中编写一个简单的ping
方法,它还需要在iPhone上工作。
我找到了一个使用icmp
的示例,这个方法能在iPhone上使用吗?
我倾向于使用NSNetServices
来解决问题,这是一个好主意吗?
该方法只需对目标主机进行ping
几次,并返回平均值以及-1(如果主机不可达或无法访问)。
StreamSCNetworkCheckReachabilityByName已经过时,并且不适用于iPhone。 注意:需要SystemConfiguration.framework
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");
}
我曾经遇到了同样的问题,最终编写了一个简单的 SimplePing 包装器来实现此功能,并在博客中详细介绍了此过程,同时在 Github 上发布了一些代码。希望对大家有所帮助:
http://splinter.com.au/how-to-ping-a-server-in-objective-c-iphone
在iPhone上进行ping操作与其他平台有所不同,因为您没有root访问权限。请参阅苹果公司的示例代码。
Gene Myers 发布的答案对我来说使用 "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]];
}
}
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
。SCNetworkReachability
并不是判断主机是否在线的好指标。在局域网环境中,当有WiFi连接时,可达性似乎总是返回主机可达的结果,尽管它实际上是一个无效的主机名。 - adib
SCNetworkReachabilityGetFlags
后,需要添加代码CFRelease(reachability)
来释放reachability变量(以防止内存泄漏),正如文档中所述。 - Carlos GuzmanSCNetworkReachabilityGetFlags
是ping的不良替代品 - 如果设备连接到网络,kSCNetworkFlagsReachable
将被设置,而kSCNetworkFlagsConnectionRequired
将不会被设置,即使目标主机处于离线状态。 - adib