// // WHPingTester.m // BigVPN // // Created by wanghe on 2017/5/11. // Copyright © 2017年 wanghe. All rights reserved. // #import "WHPingTester.h" @interface WHPingTester() { NSTimer* _timer; } @property(nonatomic, strong) SimplePing* simplePing; @property(nonatomic, strong) NSMutableArray* pingItems; @end @implementation WHPingTester - (instancetype) initWithHostName:(NSString*)hostName { if(self = [super init]) { self.simplePing = [[SimplePing alloc] initWithHostName:hostName]; self.simplePing.delegate = self; self.simplePing.addressStyle = SimplePingAddressStyleAny; self.pingItems = [NSMutableArray new]; } return self; } - (void) startPing { [self.simplePing start]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ if([self.pingItems count] > 0) { if(self.delegate!=nil && [self.delegate respondsToSelector:@selector(didPingSucccessWithTime:withError:)]) { [self.delegate didPingSucccessWithTime:0 withError:[NSError errorWithDomain:NSURLErrorDomain code:111 userInfo:nil]]; } } }); } - (void) stopPing { [_timer invalidate]; _timer = nil; [self.simplePing stop]; } - (void) actionTimer { if (self.countdownTime > 0) { _timer = [NSTimer scheduledTimerWithTimeInterval:self.countdownTime target:self selector:@selector(sendPingData) userInfo:nil repeats:YES]; } else { _timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(sendPingData) userInfo:nil repeats:YES]; } } - (void) sendPingData { [self.simplePing sendPingWithData:nil]; } #pragma mark Ping Delegate - (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address { [self actionTimer]; } - (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error { HLog(@"ping失败--->%@", error); if(self.delegate!=nil && [self.delegate respondsToSelector:@selector(didPingfialewithError:)]) { [self.delegate didPingfialewithError:error]; } } - (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber { WHPingItem* item = [WHPingItem new]; item.sequence = sequenceNumber; [self.pingItems addObject:item]; item.beginDate = [NSDate date]; } - (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error { HLog(@"发包失败--->%@", error); if(self.delegate!=nil && [self.delegate respondsToSelector:@selector(didPingSucccessWithTime:withError:)]) { [self.delegate didPingSucccessWithTime:0 withError:error]; } } - (void)simplePing:(SimplePing *)pinger didReceivePingResponsePacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber { [self.pingItems enumerateObjectsUsingBlock:^(WHPingItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if(obj.sequence == sequenceNumber) { if(self.delegate!=nil && [self.delegate respondsToSelector:@selector(didPingSucccessWithTime:withError:)]) { float delayTime = [[NSDate date] timeIntervalSinceDate:obj.beginDate] * 1000; [self.delegate didPingSucccessWithTime:delayTime withError:nil]; } [self.pingItems removeObject:obj]; } }]; } - (void)simplePing:(SimplePing *)pinger didReceiveUnexpectedPacket:(NSData *)packet { } @end @implementation WHPingItem @synthesize beginDate; @end