iOS开发获取当前网速

释放双眼,带上耳机,听听看~!

首先需要开启一个定时器,每隔1S获取一次当前网速

#pragma mark - 计时器
- (NSTimer *)timer{
    if(!_timer){
        _timer =[NSTimer timerWithTimeInterval:1 target:self selector:@selector(currentNetSpeed) userInfo:nil repeats:YES];
        [_timer setFireDate:[NSDate distantFuture]];
        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
    }
    return _timer;
}
#pragma mark 暂停
- (void)distantFutureTimer{
    [self.timer setFireDate:[NSDate distantFuture]];
}
#pragma mark 开始
- (void)startTimer{
    [self.timer setFireDate:[NSDate distantPast]];
}
#pragma mark 停止
- (void)stopTimer{
    [self.timer  invalidate];
    self.timer = nil;
}

然后开始获取网速:

引入头文件:

#include <arpa/inet.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <net/if_dl.h>

相关代码:

#pragma mark 当前网速
- (void)currentNetSpeed {
    struct ifaddrs *ifa_list = 0, *ifa;
    if (getifaddrs(&ifa_list) == -1) return;
    
    uint32_t iBytes = 0;
    uint32_t oBytes = 0;
    uint32_t allFlow = 0;

    for (ifa = ifa_list; ifa; ifa = ifa->ifa_next) {
        if (AF_LINK != ifa->ifa_addr->sa_family) continue;
        if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING)) continue;
        if (ifa->ifa_data == 0) continue;
        
        // network
        if (strncmp(ifa->ifa_name, "lo0", 2)) {
            struct if_data* if_data = (struct if_data*)ifa->ifa_data;
            iBytes += if_data->ifi_ibytes;
            oBytes += if_data->ifi_obytes;
            allFlow = iBytes + oBytes;
        }
    }
    
    freeifaddrs(ifa_list);
    if (_iBytes != 0) {
        _downloadNetSpeed = [[self stringWithbytes:iBytes - _iBytes] stringByAppendingString:@"/s"];
    }
    _iBytes = iBytes;
    
    if (_oBytes != 0) {
        _uploadNetSpeed = [[self stringWithbytes:oBytes - _oBytes] stringByAppendingString:@"/s"];
    }
    _oBytes = oBytes;
}

#pragma mark 转换
- (NSString *)stringWithbytes:(int)bytes {
    if (bytes < 1024) { // B
        return [NSString stringWithFormat:@"%dB", bytes];
    } else if (bytes >= 1024 && bytes < 1024 * 1024) { // KB
        return [NSString stringWithFormat:@"%.0fKB", (double)bytes / 1024];
    } else if (bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024) { // MB
        return [NSString stringWithFormat:@"%.1fMB", (double)bytes / (1024 * 1024)];
    } else { // GB
        return [NSString stringWithFormat:@"%.1fGB", (double)bytes / (1024 * 1024 * 1024)];
    }
}

这里我选择使用lo0判断,类似的参数还有很多,比如loen0pdp_ip0,具体代表什么意思可以参考mac ifconfig解释

可以知道lo0loopback的意思,具体意思查看loopback,用途可以参考loopback(本地回环)接口的作用,在里面第12条:

12、NetFlow Flow-Export
从一个路由器向NetFlow采集器传送流量数据,以实现流量分析和计费目的,将路由器的Router的Loopback地址作为路由器所有输出流量统计数据包的源地址,可以在服务器或者是服务器外围提供更精确,成本更低的过滤配置。

 

为TA充电
共{{data.count}}人
人已赞赏
iOS文章

iOS cookie失效处理

2021-5-13 19:43:25

iOS文章

iOS开发使用pageViewController实现多视图滑动切换

2021-5-17 11:23:53

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索