2016-07-19 15 views
0

複数のオブジェクトにpingを実行するアプリケーションを作成中です。私は配列を作成し、その配列をループすることでこれを行います。オブジェクトごとにping結果を返します。しかし、特定のオブジェクトが応答pingを受信できなかった場合、SimplePingはループバックして、失敗したオブジェクトに到達するまでオブジェクトをpingし、ループし続けます。pingに失敗した後に配列内の次のオブジェクトに移動する

ここに私の質問があります。障害の発生したオブジェクトに到達した後、他のオブジェクトにどのように進めることができますか?

これまでのログといくつかのログのサンプルコードを示します。

-(void)beginConnectivitySetupAndTests { 

    NSArray *arrayOfIPAddresses = [NSArray arrayWithObjects:@"10.0.0.1", @"10.0.0.2", @"10.0.0.3", @"10.0.0.4", @"10.0.0.5", nil]; 

    for (int i = 0; i<[arrayOfIPAddresses count]; i++) { 

     if (self.ping != nil) { 
     } else { 
      assert(self.ping == nil); 
      (self.ping = nil); 
     } 
     assert(self.ping == nil); 

     NSString *individualObjectIP = [arrayOfIPAddresses objectAtIndex:i]; 
     self.ping = [[SimplePing alloc] initWithHostName:individualObjectIP];    
     assert(self.ping != nil); 

     self.ping.delegate = self; 
     [self.ping start]; 
     do { 
      [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
     } while (self.ping != nil); 
    } 
} 

-(void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address { 
    [self.ping sendPingWithData:nil]; 
} 

-(void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber address:(nonnull NSString *)address { 
    pingTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO]; 
    _dateRef = [NSDate date]; 
} 

- (void)timerFired:(NSTimer *)timer { 
    NSString *failedHostnameString = [NSString stringWithFormat:@"%@", self.ping.hostName]; 
    // Move to next host 

    [self beginConnectivitySetupAndTests]; 
} 


-(void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error { 
    [self.pingTimeoutTimer invalidate]; 
    pingTimeoutTimer = nil; 

// self.ping = nil; 
} 

-(void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet { 
} 

-(void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber address:(NSString *)address { 
    assert(pinger = self.ping); 
    [pingTimeoutTimer invalidate]; 

    NSDate *end = [NSDate date]; 
    double _latency = [end timeIntervalSinceDate:_dateRef] *10; 

    self.ping = nil; 
} 

-(void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error { 
    assert(pinger == self.ping); 
    [self.ping stop]; 

    self.ping = nil; 
} 

これは対応するログです。

だから、
2016-07-15 09:47:56.462871 pingSimply[1536:597333] 64 bytes from 10.0.0.1: icmp_seq=0 ttl=64 time = 0.017010 ms 
2016-07-15 09:47:56.473984 pingSimply[1536:597333] 64 bytes from 10.0.0.2: icmp_seq=0 ttl=64 time = 0.057189 ms 
2016-07-15 09:47:56.705777 pingSimply[1536:597333] 10.0.0.3 Failed 
2016-07-15 09:47:56.812671 pingSimply[1536:597333] 64 bytes from 10.0.0.1: icmp_seq=0 ttl=64 time = 0.995070 ms 
2016-07-15 09:47:56.816320 pingSimply[1536:597333] 64 bytes from 10.0.0.2: icmp_seq=0 ttl=64 time = 0.020010 ms 
2016-07-15 09:48:56.952408 pingSimply[1536:597333] 10.0.0.3 Failed 

今、あなたは私の状況を理解する(こと)、そしてあなたは私がして、私のためにループを通って行くよどのように見ていること - ...私は10.0にpingを実行するに進めることができる方法についての任意の提案を陳述しながら.03で応答を受け取らないと.0.4と10.0.0.5?

答えて

0

UPDATE !!

重要なコードを追加できなかった箇所がわかりました。最初にSimplePing TimeoutTimerを無効にして、-(void)timerFired:(NSTimer*)timerメソッド内にself.ping = nil;と設定する必要がありました。

ので、編集された方法は、次のようになります。

- (void)timerFired:(NSTimer *)timer { 
    NSString *failedHostnameString = [NSString stringWithFormat:@"%@", self.ping.hostName]; 
    NSLog(@"Host %@ not reachable", failedHostnameString); 

    [pingTimeoutTimer invalidate]; 
    self.ping = nil; 
} 
関連する問題