主机在终端中超时并在可达性iOS中显示为已连接

时间:2014-03-15 12:52:54

标签: ios networking reachability

今天,我正在测试reachabilityWithHostName,并且我正在键入一个在我加入的网络内超时的域,但是它的可达性因为它的连接而返回。

为什么会发生这种情况?

由于

这是我的ping日志:

PING 188.121.62.144 (188.121.62.144): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4
Request timeout for icmp_seq 5
Request timeout for icmp_seq 6

这是我的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    Reachability* reachability = [Reachability reachabilityWithHostName:@"188.121.62.144"];
    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

    if(remoteHostStatus == NotReachable)
    {
        isInternet = NO;
    }
    else if (remoteHostStatus == ReachableViaWWAN)
    {
        isInternet = TRUE;
    }
    else if (remoteHostStatus == ReachableViaWiFi)
    {
        isInternet = TRUE;

    }

    if (!isInternet)
    {
        NSLog(@"No connection");
    }
    else
    {
        NSLog(@"There is connection");
    }

    return YES;

}

2 个答案:

答案 0 :(得分:0)

您可以尝试使用以下修改过的代码ping。

Reachability* reachability = [Reachability reachabilityWithHostName:@"http://188.121.62.144"];

答案 1 :(得分:0)

Reachability类和-reachabilityWithHostname:旨在成为一种快速,快速,快速的机制,用于确定您是否具有与主机的基本网络连接。如果您需要验证是否可以下载特定的URL,您需要查看使用NSURLConnection来检索URL的内容,以验证它是否真正可用。

根据您是否需要在前台或后台执行此操作,您可以使用简单但阻止:

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

或者您可以使用更复杂的方法创建NSURLConnection对象,设置委托以接收响应并等待这些响应进入。

对于简单的案例:

 NSURL *myURL = [NSURL urlWithString: @"http://188.121.62.144"];
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
 [request setHTTPMethod: @"HEAD"];
 NSURLResponse *response;
 NSError *error;
 NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];

如果您收到非零myData,则表示您已获得某种连接。响应和错误将告诉您服务器对您的响应(在响应的情况下,如果您收到了非零的myData)或者发生了什么样的错误,在nil myData的情况下。

对于非平凡的案例,您可以从Apple使用NSURLConnection获得良好的指导。

如果您不想拖延前台进程,可以通过两种不同的方式执行此操作。上面的文档将提供有关如何实现委托等的信息。但是,更简单的实现是使用GCD在后台线程上发送同步请求,然后在完成后在主线程上发送消息。

这样的事情:

 NSURL *myURL = [NSURL urlWithString: @"http://188.121.62.144"];
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
 [request setHTTPMethod: @"HEAD"];
 dispatch_async( dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{
      NSURLResponse *response;
      NSError *error;
      NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
      BOOL reachable;

      if (myData) {
            // we are probably reachable, check the response
            reachable=YES;
      } else {
            // we are probably not reachable, check the error:
            reachable=NO;
      }

      // now call ourselves back on the main thread
      dispatch_async( dispatch_get_main_queue(), ^{
            [self setReachability: reachable];
      });
 });