1. 程式人生 > >iOS計算網路測試中的丟包率,延遲,下載速度等引數、iOS實現ping

iOS計算網路測試中的丟包率,延遲,下載速度等引數、iOS實現ping

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">這段時間公司iOS的網路測試的專案。</span>

首先,對我最不好做的模組Ping,這網上找了很久的資料都指向SimplePing這個原始碼,SimplePing是由Apple提供的官方程式碼,官方下載地址:SimplePing,這裡有一個對SimplePing進行封裝的Demo,但是這個demo只能告訴使用者ping的結果,即ping成功還是Ping失敗了,不能像在Mac的終端和win的CMD命令列中顯示ping的詳情結果,所以並不完美。由於現在對ICMP並不熟悉,不知道怎麼通過ICMP來計算這些引數,所以昨天晚上找資料到凌晨3點,在CocoaChina程式碼區,終於看到一個demo,心存僥倖地運行了一下,執行結果好極了,跟我想要的基本一致,原文

連結,demo相當完美。demo下載地址https://github.com/lovesunstar/STPingTest。不過demo裡面用到了作者自己的框架需要自己新增到工程中去,,並且還需要匯入一個系統庫libz.1.2.5,也需要手動匯入工程。

其次,網路下載速度,比較簡單。用AFNetWork中的AFURLConnectionOperation

- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block;     方法,在block中計算每秒鐘的下載速度。
在計算速度的時候需要自己寫一個downTask類,負責計算、記錄每一秒(左右)的速度。downTask主要程式碼<a target=_blank href="http://doc.okbase.net/conslee/archive/126370.html">點選開啟連結</a> 或 http://doc.okbase.net/conslee/archive/126370.html
<span style="font-family: Arial, Helvetica, sans-serif;">connectionOperation = [[AFURLConnectionOperation alloc] initWithRequest:request];</span>
    [connectionOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
//        NSLog(@"bytesRead:%zi", bytesRead);
//        NSLog(@"totalBytesRead:%zi", totalBytesRead);
//        NSLog(@"totalBytesExpectedToRead:%zi", totalBytesExpectedToRead);
        
        weakSelf.downTask.totalReadPeriod += bytesRead;
        weakSelf.downTask.totalRead += bytesRead;
        NSDate *currentDate = [NSDate date];
        if ([currentDate timeIntervalSinceDate:weakSelf.downTask.oldDatePeriod] >= 1) {
            double speed = [weakSelf.downTask getSpeedWithDate:currentDate];
            
            [weakSelf.gaugeView setGaugeValue:speed animation:YES];
            NSString *unit = nil;
            if (speed > RATIO) {
                unit = @"M";
                speed = speed / RATIO;
            }
            else {
                unit = @"KB";
                speed = speed;
            }
            NSLog(@"current speed:%f %@", speed, unit);
            weakSelf.labSpeed.text = [NSString stringWithFormat:@"%.2f %@", speed, unit];
            //NSLog(@"totalBytesRead:%zi", totalBytesRead);
        }
        
    }];