zoukankan      html  css  js  c++  java
  • 利用ifaddrs结构体中的if_data计算即时网速

    首先我拜读了这篇博客中的做法,但是当我调试好文中的程序后,显示的网速却一直是0.

    http://blog.csdn.net/ieczw/article/details/41011603   

    文中利用了ifaddrs中最后一个元素if_data,但是这个结构体到底是什么结构,找不到他的文档。所以只有试着输出,看看里面的内容。

    /* The `getifaddrs' function generates a linked list of these structures.
       Each element of the list describes one network interface.  */
    struct ifaddrs
    {
      struct ifaddrs *ifa_next; /* Pointer to the next structure.  */
    
      char *ifa_name;       /* Name of this network interface.  */
      unsigned int ifa_flags;   /* Flags as from SIOCGIFFLAGS ioctl.  */
    
      struct sockaddr *ifa_addr;    /* Network address of this interface.  */
      struct sockaddr *ifa_netmask; /* Netmask of this interface.  */
      union
      {
        /* At most one of the following two is valid.  If the IFF_BROADCAST
           bit is set in `ifa_flags', then `ifa_broadaddr' is valid.  If the
           IFF_POINTOPOINT bit is set, then `ifa_dstaddr' is valid.
           It is never the case that both these bits are set at once.  */
        struct sockaddr *ifu_broadaddr; /* Broadcast address of this interface. */
        struct sockaddr *ifu_dstaddr; /* Point-to-point destination address.  */
      } ifa_ifu;
      /* These very same macros are defined by <net/if.h> for `struct ifaddr'.
         So if they are defined already, the existing definitions will be fine.  */
    # ifndef ifa_broadaddr
    #  define ifa_broadaddr ifa_ifu.ifu_broadaddr
    # endif
    # ifndef ifa_dstaddr
    #  define ifa_dstaddr   ifa_ifu.ifu_dstaddr
    # endif 
            
      void *ifa_data;       /* Address-specific data (may be unused).  */
    };

    所以我在程序上添加了很多占位元素将if_data中的内容尽可能多的输出

    有点蛮力的做法,但是能看到内容就行。运行后数结果如下面右图所示:

    除了前两个u_long和第十一个有数据,其他的均为0

    在对比一下ifconfig的内容和if_data中的内容,会发现第一个u_long就是RX packages,第二个就是RX bytes,根据这个可以计算出下载的网速。之前出错是因为使用了第3,4个ulong来计算但是其一直是0.

    所以暂且利用第二个值计算了一下接收数据的速度。修改过程遇到个问题:

    直接将u_long强制类型转换为float的出入很大,将其先转化为int类型参与运算,运算过程中和float类型的数据运算,最后得到float类型的数据。

      int rawspeed=ndev.ifs_ispeed;
      printf("--------------%d ",rawspeed);
      ispeed = rawspeed * 1.0/(ndev.ifs_us/1000 * 0.001);
      printf("%s: Rec Speed: %f MB/s || Down Speed: %f MB/s ",
      ndev.ifs_name,ispeed/(1024.0*1024.0),ospeed/(1024.0*1024.0));

    最终结果:

    左侧是程序算出的接收速度,右侧是用nload测出速度,由于计量单位不同,将bit值除以8,之后看以看出,测出的速度还是比较准确的。

  • 相关阅读:
    [转][C#]文件流读取
    03-算数运算符
    02-bytes和str
    01-爬虫必备基础知识
    如何使用油猴脚本不要vip就能观看各大视频网站如腾讯,爱奇艺等的vip视频
    django下的framework
    centos6.7升级python3.6.1
    python 连接sqlserver: pymssql
    pycharm中提交Git 忽略部分代码
    jmeter 性能插件
  • 原文地址:https://www.cnblogs.com/littleby/p/7251281.html
Copyright © 2011-2022 走看看