即使主机名不存在,reachability也会返回主机可达

时间:2012-02-19 23:15:53

标签: iphone reachability

关于可达性的许多问题,但似乎没有人有我做的问题...... 正如许多例子所示,我以这种方式使用可达性:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

hostReach = [[Reachability reachabilityWithHostName: @"www.google.com"] retain];
[hostReach startNotifier];
[self updateInterfaceWithReachability: hostReach];

这很好用。但是,如果我将主机名更改为不存在的主机名,例如www.nonexistanthostforsure.com,则可达性仍然可以使主机可达。现在,阅读苹果文档,我的印象是,可达性无法告诉我主机(服务器)是否在线。在这种情况下,结果是有意义的,但问题是为什么要干扰主机名呢?

3 个答案:

答案 0 :(得分:0)

为什么要干扰主机名?

我同意。

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

hostReach = [[Reachability reachabilityForInternetConnection] retain];
[hostReach startNotifier];
[self updateInterfaceWithReachability: hostReach];

Apple Reachability docs州:

  

reachabilityForInternetConnection-检查默认路由是否可用。   应该由未连接到特定主机的应用程序使用

如果检查默认路由是否可用,然后轮询服务器并且连接超时,您仍然可以执行显示“无法连接到服务器”消息的操作,而无需针对特定主机名测试可达性。它基本上完成了同样的事情,除了它更自然,因为错误处理代码位于轮询代码的中间,所以你不必为它调用全局可达性处理程序。

答案 1 :(得分:0)

您是否尝试在该服务器上打开端口21的TCP / IP普通套接字?如果成功,你会知道主人在线......

答案 2 :(得分:0)

可达性仅检查您的主机网址请求是否可以从您的设备转移到您的路由器,它不会确认您的请求是否到达实际服务器

我认为检查主机地址可用性的最佳方法是检查NSURL请求的结果。

NSString *url= @"http://google.com";
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:reqURL]];
NSURLResponse *resp = nil;
NSError *error = nil;
NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &error];
NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

使用此代码,如果您的设备无法访问提供的URL,它会向错误变量提供一些输出,如果它可以访问URL请求,则错误为Nil。

即使您的URL数据包可以从您的设备路由出来并且永远不会到达主机服务器,可达性也会产生正输出。