具有可达性的奇怪结果

时间:2014-05-17 19:40:48

标签: macos cocoa

我正在使用OS X应用来控制我的Arduino机器人。我必须检查机器人的两个IP地址的可达性:IP摄像头和Arduino WiFi Shield。

我是Xcode的新手。我正在使用Xcode 5.1.1。在OS X 10.9.2下。我想做一个非常简单的Mac应用程序来检查特定IP地址的可达性。 在阅读了几个来源(包括Apple和StackOverflow)后,我到达了代码:

//  AppDelegate.m
//  MyCheckReachability
#import "AppDelegate.h"
#import <SystemConfiguration/SystemConfiguration.h>
#import <netinet/in.h>

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { }

- (IBAction)check:(id)sender
{   NSString *ipAddr = [_getURL stringValue];     // this is just an IP-address from UI textField

SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithName(NULL, [ipAddr UTF8String]);
SCNetworkReachabilityFlags flags;
SCNetworkReachabilityGetFlags(reachabilityRef, &flags);

BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
NSLog(@"%d  %d", isReachable, needsConnection);

if(isReachable && !needsConnection)
{ NSLog (@"… %@ - reachable", ipAddr); } else {NSLog (@"… %@ - NOT REACHABLE", ipAddr);}

CFRelease(reachabilityRef);
}
@end

我尝试使用不同的IP地址测试MyCheckReachability应用。我有一个IP扫描仪应用程序,它显示连接到我的网络的所有IP。 这是我在控制台上测试的结果:

1 0  ... 192.168.0.86 - 可达(此IP存在)

1 0  ... 192.168.0.87 - 可达(此IP不存在)

1 0  ... 192.168.0.99 - 可达(此IP不存在)

令人惊讶的是(flags&amp; kSCNetworkFlagsReachable)现有和丢失的IP地址总是= 1。 如何判断与IP地址的可达性进行通信?

感谢。

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 Reachability API只会告诉您是否有可以到达给定目标的接口/路由。它实际上并没有尝试联系目的地并与之通信。

根据SCNetworkReachability documentation

  

可达性并不能保证主机实际接收数据包。

如果您尝试验证连接到远程主机的能力,则必须实际尝试连接到远程主机。