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

rjs*_*ing 19 iphone networking cocoa cocoa-touch objective-c

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

我发现了一个使用的例子,icmp这会在iPhone上运行吗?

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

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

Gen*_*ers 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");
}
Run Code Online (Sandbox Code Playgroud)

注意:SystemConfiguration.framework是必需的

  • `SCNetworkReachabilityGetFlags` 是 ping 的一个糟糕的替代品 - 如果设备连接到网络,即使目标主机离线,也会设置 `kSCNetworkFlagsReachable` 并且取消设置 `kSCNetworkFlagsConnectionRequired`。 (2认同)

Chr*_*ris 32

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

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

  • 提供一个实际回答问题的解决方案(与人们似乎喜欢但完全没有解决问题的所有这些无用的可达性东西相比!).谢谢! (14认同)

Zha*_*ami 13

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


Mon*_*ono 5

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


Vad*_*dim -8

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

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");
}
Run Code Online (Sandbox Code Playgroud)

注:SystemConfiguration.framework为必填项

  • 8 票和+赏金完全不做问题所涉及的代码,即 ping/traceroute 但它基本上是一个 DNS 查找。 (30认同)
  • 不幸的是,SCNetworkCheckReachabilityByName 现已弃用。 (3认同)