zoukankan      html  css  js  c++  java
  • iOS 网络流量统计

      在开发中,有时候需要获取流量统计信息。研究发现:通过函数getifaddrs来得到系统网络接口的信息,网络接口的信息,包含在if_data字段中, 有很多信息, 但我现在只关心ifi_ibytes, ifi_obytes, 应该就是接收到的字节数和发送的字节数, 加起来就是流量了。还发现,接口的名字, 有en, pdp_ip, lo等几种形式,en应该是wifi, pdp_ip大概是3g或者gprs, lo是环回接口, 通过名字区分可以分别统计。

      

    1、导入必要头文件

    #include <ifaddrs.h>
    #include <sys/socket.h>
    #include <net/if.h>

    2、获取3G或者GPRS的流量

    //获取3G或者GPRS的流量
    + (NSString *)getGprs3GFlowIOBytes
    {
        
        struct ifaddrs *ifa_list = 0, *ifa;
        if (getifaddrs(&ifa_list) == -1)
        {
            return 0;
        }
        
        uint32_t iBytes = 0;
        uint32_t oBytes = 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;
            
            //3G或者GPRS
            if (!strcmp(ifa->ifa_name, "pdp_ip0"))
            {
                struct if_data *if_data = (struct if_data *)ifa->ifa_data;
                
                iBytes += if_data->ifi_ibytes;
                oBytes += if_data->ifi_obytes;
                NSLog(@"%s :iBytes is %d, oBytes is %d",
                      ifa->ifa_name, iBytes, oBytes);
            }
        }
        
        
        freeifaddrs(ifa_list);
        
        uint32_t bytes = 0;
        
        bytes = iBytes + oBytes;
        
        //将bytes单位转换
        
        if(bytes < 1024)        // B
        {
            return [NSString stringWithFormat:@"%dB", bytes];
        }
        else if(bytes >= 1024 && bytes < 1024 * 1024)    // KB
        {
            return [NSString stringWithFormat:@"%.1fKB", (double)bytes / 1024];
        }
        else if(bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024)    // MB
        {
            return [NSString stringWithFormat:@"%.2fMB", (double)bytes / (1024 * 1024)];
        }
        else    // GB
        {
            return [NSString stringWithFormat:@"%.3fGB", (double)bytes / (1024 * 1024 * 1024)];
        }
    
    }

    3、获取Wifi流量

    //获取Wifi流量
    + (NSString *)getGprsWifiFlowIOBytes
    {
        struct ifaddrs *ifa_list = 0, *ifa;
        if (getifaddrs(&ifa_list) == -1) {
            return 0;
        }
        uint32_t iBytes = 0;
        uint32_t oBytes = 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;
            
            //Wifi
            if (strncmp(ifa->ifa_name, "lo", 2)) {
                struct if_data *if_data = (struct if_data *)ifa->ifa_data;
                iBytes += if_data->ifi_ibytes;
                oBytes += if_data->ifi_obytes;
                NSLog(@"%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);
            }
        }
        
        freeifaddrs(ifa_list);
        
        uint32_t bytes = 0;
        
        bytes = iBytes+oBytes;
        
        NSLog(@"%d",bytes);
        
        //将bytes单位转换
        if(bytes < 1024)        // B
        {
            return [NSString stringWithFormat:@"%dB", bytes];
        }
        else if(bytes >= 1024 && bytes < 1024 * 1024)    // KB
        {
            return [NSString stringWithFormat:@"%.1fKB", (double)bytes / 1024];
        }
        else if(bytes >= 1024 * 1024 && bytes < 1024 * 1024 * 1024)    // MB
        {
            return [NSString stringWithFormat:@"%.2fMB", (double)bytes / (1024 * 1024)];
        }
        else    // GB
        {
            return [NSString stringWithFormat:@"%.3fGB", (double)bytes / (1024 * 1024 * 1024)];
        }
    }

    注意:1、通过读取系统网络接口信息,获取当前iphone设备的流量相关信息,统计的是上次开机至今的流量信息. 

       2、上面两方法统计的结果是字符串格式

  • 相关阅读:
    福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
    福大软工1816 · 第六次作业
    2018软工实践——团队答辩
    福大软工1816 · 第五次作业
    福大软工1816 · 第二次作业
    福大软工1816 · 第一次作业
    个人作业——软件产品案例分析
    第二次结对编程作业--毕设导师智能匹配
    结对项目之需求分析与原型设计
    调研《构建之法》指导下的全国高校的历届软工实践作品、全国互联网+竞赛、物联网竞赛等各类全国性大学生信息化相关的竞赛平台的历届作品
  • 原文地址:https://www.cnblogs.com/jukaiit/p/5730228.html
Copyright © 2011-2022 走看看