Macos 具有可达性的奇怪结果
我正在使用OSX应用程序来控制我的Arduino机器人。我必须检查我的机器人的两个IP地址的可达性:IP摄像头和Arduino WiFi屏蔽 我是Xcode新手。我正在使用Xcode 5.1.1。在OSX10.9.2下。我想做一个非常简单的Mac应用程序来检查特定IP地址的可达性。 在阅读了多个来源(包括Apple和StackOverflow)后,我得出了以下代码:Macos 具有可达性的奇怪结果,macos,cocoa,Macos,Cocoa,我正在使用OSX应用程序来控制我的Arduino机器人。我必须检查我的机器人的两个IP地址的可达性:IP摄像头和Arduino WiFi屏蔽 我是Xcode新手。我正在使用Xcode 5.1.1。在OSX10.9.2下。我想做一个非常简单的Mac应用程序来检查特定IP地址的可达性。 在阅读了多个来源(包括Apple和StackOverflow)后,我得出了以下代码: // AppDelegate.m // MyCheckReachability #import "AppDelegate.h"
// 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
//AppDelegate.m
//MyCheckReach可达性
#导入“AppDelegate.h”
#进口
#进口
@实现AppDelegate
-(无效)ApplicationIDFinishLaunching:(NSNotification*)通知{}
-(iAction)检查:(id)发件人
{NSString*ipAddr=[\u getURL stringValue];//这只是UI文本字段中的一个IP地址
SCNetworkReachabilityRef-reachabilityRef=SCNetworkReachabilityCreateWithName(NULL,[ipAddr UTF8String]);
SCNetworkReachabilityFlags标志;
SCNetworkReachabilityGetFlags(reachabilityRef和flags);
BOOL isReachable=((flags&kSCNetworkFlagsReachable)!=0);
布尔需要连接=((需要标志和KSCNetworkFlagsConnection)!=0);
NSLog(@“%d%d”,可删除,需要连接);
如果(isReachable&!needs连接)
{NSLog(@“…%@-可访问”,ipAddr);}其他{NSLog(@“…%@-不可访问,ipAddr);}
CFRelease(可达性ref);
}
@结束
我试着用不同的IP地址测试我的CheckReach应用程序。我有一个IP扫描应用程序,它向我显示连接到网络的所有IP。
以下是我在控制台上的测试结果:
10
…192.168.0.86-可访问(此IP存在)
10
…192.168.0.87-可访问(此IP不存在)
10
…192.168.0.99-可访问(此IP不存在)
令人惊讶的是,(flags&kSCNetworkFlagsReachable)对于现有和缺失的IP地址总是=1。
如何判断与之通信的IP地址的可达性
谢谢。这是预期的行为。可达性API只是告诉您是否有可以到达给定目的地的接口/路由。它实际上并不试图联系目的地并与之通信 根据: 可达性不能保证主机将实际接收数据包 如果您试图验证连接到远程主机的能力,则必须实际尝试连接到该主机