• 获取当前iphone设备的流量


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

    1.

    导入库:SystemConfiguration.framework

    2.

    加入头文件:

    #include <ifaddrs.h>

    #include <sys/socket.h>

    #include <net/if.h>

    3.

    代码实现:

    -(NSString *)bytesToAvaiUnit:(int)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)];
      }
    }

    //
    -(void)checkNetworkflow {

      struct ifaddrs *ifa_list = 0, *ifa;

      if (getifaddrs(&ifa_list) == -1)
      {
      return;
      }

      uint32_t iBytes = 0;

      uint32_t oBytes = 0;

      uint32_t allFlow = 0;

      uint32_t wifiIBytes = 0;

      uint32_t wifiOBytes = 0;

      uint32_t wifiFlow = 0;

      uint32_t wwanIBytes = 0;

      uint32_t wwanOBytes = 0;

      uint32_t wwanFlow = 0;

      struct timeval time ;

      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;


        // Not a loopback device.
        // network flow

        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;

        allFlow = iBytes + oBytes;

        time = if_data->ifi_lastchange;

        // NSLog(@"1111===%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);


        }

         //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">WIFI流量统计功能</span>

         if (!strcmp(ifa->ifa_name, "en0"))

         {
          struct if_data *if_data = (struct if_data *)ifa->ifa_data;

          wifiIBytes += if_data->ifi_ibytes;

          wifiOBytes += if_data->ifi_obytes;

          wifiFlow = wifiIBytes + wifiOBytes;

        }

        //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; ">3G和GPRS流量统计</span>

        if (!strcmp(ifa->ifa_name, "pdp_ip0"))

        {

          struct if_data *if_data = (struct if_data *)ifa->ifa_data;

          wwanIBytes += if_data->ifi_ibytes;

          wwanOBytes += if_data->ifi_obytes;

          wwanFlow = wwanIBytes + wwanOBytes;

          //NSLog(@"111122===%s :iBytes is %d, oBytes is %d", ifa->ifa_name, iBytes, oBytes);

        }

      }

      freeifaddrs(ifa_list);

      NSString *changeTime=[NSString stringWithFormat:@"%s",ctime(&time)];
      NSLog(@"changeTime==%@",changeTime);


      NSString *receivedBytes= [self bytesToAvaiUnit:iBytes];
      NSLog(@"receivedBytes==%@",receivedBytes);


      NSString *sentBytes = [self bytesToAvaiUnit:oBytes];
      NSLog(@"sentBytes==%@",sentBytes);


      NSString *networkFlow = [self bytesToAvaiUnit:allFlow];
      NSLog(@"networkFlow==%@",networkFlow);

      NSString *wifiReceived = [self bytesToAvaiUnit:wifiIBytes];
      NSLog(@"wifiReceived==%@",wifiReceived);


      NSString *wifiSent = [self bytesToAvaiUnit: wifiOBytes];
      NSLog(@"wifiSent==%@",wifiSent);

      NSString *wifiBytes = [self bytesToAvaiUnit:wifiFlow];
      NSLog(@"wifiBytes==%@",wifiBytes);


      NSString *wwanReceived = [self bytesToAvaiUnit:wwanIBytes];
      NSLog(@"wwanReceived==%@",wwanReceived);


      NSString *wwanSent = [self bytesToAvaiUnit:wwanOBytes];
      NSLog(@"wwanSent==%@",wwanSent);


      NSString *wwanBytes = [self bytesToAvaiUnit:wwanFlow];
      NSLog(@"wwanBytes==%@",wwanBytes);
    }

    然后在你想要知道的结果的地方调用:

      [self checkNetworkflow];

    控制台输出结果如下:

    1. 2013-03-30 23:45:33.565 Reachability[2993:707] changeTime==Sat Mar 30 09:52:09 2013
    2. 2013-03-30 23:45:33.567 Reachability[2993:707] receivedBytes==62.73MB
    3. 2013-03-30 23:45:33.569 Reachability[2993:707] sentBytes==8.22MB
    4. 2013-03-30 23:45:33.571 Reachability[2993:707] networkFlow==70.94MB
    5. 2013-03-30 23:45:33.573 Reachability[2993:707] wifiReceived==55.40MB
    6. 2013-03-30 23:45:33.575 Reachability[2993:707] wifiSent==5.41MB
    7. 2013-03-30 23:45:33.577 Reachability[2993:707] wifiBytes==60.81MB
    8. 2013-03-30 23:45:33.579 Reachability[2993:707] wwanReceived==7.33MB
    9. 2013-03-30 23:45:33.581 Reachability[2993:707] wwanSent==2.81MB
    10. 2013-03-30 23:45:33.583 Reachability[2993:707] wwanBytes==10.14MB

     

    当然你也可以只统计3G/GPRS流量统计 或者 WIFI流量统计。

     3G/GPRS流量统计

    -(int) 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;
     
            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);
     
    	return iBytes + oBytes;
    }

    返回的结果为byte

    WIFI流量统计功能

    - (long long int)getInterfaceBytes
    {
        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;
     
            /* Not a loopback device. */
            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);
     
        return iBytes+oBytes;
    }

     转自:http://blog.csdn.net/jinglijun/article/details/8741554

  • 相关阅读:
    关于SNMP的MIB文件的语法简述
    windows 与 Centos7 共享文件方法
    虚拟机 与 host主机,无法ping通的问题
    能ping通虚拟机,但snmp报文 Destination unreachable(Host administratively prohibited
    qt 打包发布 获取dll
    qt5.7.1 (create4.2.0)+msvc2015 安装后无法编译 & 缺少h文件
    windows 为qt5.7.1 安装openssl
    windows下为qt msvc版本配置调试器
    Rust中的类型大小总结
    substrate 为什么有的调用的地方用<T::Lookup as StaticLookup>::Source 代替 T::AccountId
  • 原文地址:https://www.cnblogs.com/jiangshiyong/p/3054770.html
Copyright © 2020-2023  润新知