我正在使用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地址的可达性进行通信?
感谢。
答案 0 :(得分:1)
这是预期的行为。 Reachability API只会告诉您是否有可以到达给定目标的接口/路由。它实际上并没有尝试联系目的地并与之通信。
根据SCNetworkReachability documentation:
可达性并不能保证主机实际接收数据包。
如果您尝试验证连接到远程主机的能力,则必须实际尝试连接到远程主机。