2016-07-19 4 views
0

Ich schreibe gerade eine Anwendung, die mehrere Objekte pingt. Ich mache das, indem ich ein Array erstelle und dann dieses Array durchlaufe. Ich gebe ein Ping-Ergebnis pro Objekt zurück. Wenn jedoch ein bestimmtes Objekt keinen Antwort-Ping empfängt, führt SimplePing eine Schleife durch, pingt die Objekte an, bis sie das fehlerhafte Objekt erreicht, und führt dann eine Schleife durch.Zum nächsten Objekt im Array nach einer Antwort mit fehlgeschlagenem Ping verschieben

Nun, hier ist meine Frage. Wie kann ich mit anderen Objekten fortfahren, nachdem ich zu einem fehlerhaften Objekt gelangt bin?

Hier ist ein Beispiel Code auf, was ich bis jetzt sowie einige Protokolle habe.

-(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; 
} 

Hier sind die entsprechenden Protokolle.

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 

Also jetzt, dass Sie (möglicherweise) meine Situation zu verstehen, und Sie sehen, wie ich durch meine For-Schleife gehe mit der Do - Während Aussage ... irgendwelche Vorschläge, wie ich vorgehen kann auf 10,0 Pingen .0.4 und 10.0.0.5 nachdem keine Antwort auf .03 empfangen wurde?

Antwort

0

UPDATE !!

Ich habe herausgefunden, wo ich keinen kritischen Code hinzufügen konnte. Ich musste zuerst den SimplePing TimeoutTimer ungültig machen und dann self.ping = nil; innerhalb der -(void)timerFired:(NSTimer*)timer Methode setzen.

So ist die editierte Methode sollte wie folgt aussehen:

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

    [pingTimeoutTimer invalidate]; 
    self.ping = nil; 
} 
Verwandte Themen