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、上面两方法统计的结果是字符串格式

  • 相关阅读:
    第一周、学习嵌入式
    centos7及xfce桌面环境安装,远程工具配置使用方法
    第一次作业
    2018下C语言基础课第1次作业
    第二次作业
    第一次作业
    第0次作业
    博客园第五次作业
    博客园第四次作业
    博客园第三次作业
  • 原文地址:https://www.cnblogs.com/jukaiit/p/5730228.html
Copyright © 2011-2022 走看看