zoukankan      html  css  js  c++  java
  • proc/net/dev实时网速统计实例【转】

    转自:https://blog.csdn.net/dosthing/article/details/80384541

    前言

      网络编程是程序连接网络拓展的基础,尤其是在物联网、互联网加等概念火热的当下,网络编程能力体现了一个程序员能否具有大型程序的开发能力。在实际应用中,往往需要显示目前系统的实时网速等信息,当然获取网速等信息的软件方法很多,但是用小几行代码,并可移植性好的方法却不多,这里介绍如何通过Linux的proc文件系统进行实时获取网卡收发速率。

    原理简介

        Linux提供的LKM机制可以使我们通过proc伪文件系统来获取Linux内核信息,而通过proc/net/dev我们可以实时获取网络适配器及统计信息。抛开复杂的概念,简单说就是我们可以利用proc/net/dev来获取网卡的网速及网络包的收发情况。这里我们主要关心Receive和Transmit项的bytes项。bytes定义:The total number of bytes of datatransmitted or received by the interface. 即网口的发送或接收的数据的总字节数。更多选项的定义,我们用不着,如有兴趣了解戳这里。

    实例详解

      有了以上的背景知识,足够我们理解实例的内容了,直接上源码,看看如何实现实时统计网卡的网速信息。

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/ioctl.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #include <sys/time.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    #include <dirent.h>
    #include <time.h>
    #include <fcntl.h>
    #include <errno.h>

    #ifdef debugprintf
    #define debugpri(mesg, args...) fprintf(stderr, "[NetRate print:%s:%d:] " mesg " ", __FILE__, __LINE__, ##args)
    #else
    #define debugpri(mesg, args...)
    #endif

    int GetNetRate(FILE* fd,char *interface,long *recv,long *send)
    {
    char buf[1024];
    char *p;
    char flow[32];
    int i = 0;
    char tempstr[16][16]={0};

    memset(buf,0,sizeof(buf));
    memset(tempstr,0,sizeof(tempstr));
    fseek(fd, 0, SEEK_SET);
    int nBytes = fread(buf,1, sizeof(buf)-1,fd);
    if (-1 == nBytes)
    {
    debugpri("fread error");
    fclose(fd);
    return -1;
    }
    buf[nBytes] = '';
    char* pDev = strstr(buf, interface);
    if (NULL == pDev)
    {
    printf("don't find dev %s ", interface);
    fclose(fd);
    return -1;
    }
    sscanf(pDev,"%[^' '] %[^' '] %[^' '] %[^' '] %[^' '] %[^' '] %[^' '] %[^' '] %[^' '] %[^' '] %[^' '] %[^' '] ",
    tempstr[0],tempstr[1],tempstr[2],tempstr[3],tempstr[4],tempstr[5],tempstr[6],tempstr[7],tempstr[8],tempstr[9],tempstr[10],tempstr[11]);
    *recv = atol(tempstr[1]);
    *send = atol(tempstr[9]);
    }
    int main(int argc, char** argv)
    {
    struct timeval tv_now,tv_pre;
    char netdevice[16]={0};
    int nDevLen;
    long recvpre = 0,recvcur = 0;
    long sendpre = 0,sendcur = 0;
    double sendrate;
    double recvrate;

    if(argc != 2)
    {
    printf("Usage: netrate <network device> ");
    exit(0);
    }

    nDevLen = strlen(argv[1]);
    if (nDevLen < 1 || nDevLen > 10)
    {
    printf("unkown device ");
    exit(0);
    }
    sprintf(netdevice,"%s",argv[1]);
    FILE* fd = fopen("/proc/net/dev","r+");
    if (NULL == fd)
    {
    debugpri("/proc/net/dev not exists! ");
    return -1;
    }
    while(1)
    {
    gettimeofday(&tv_pre,NULL);
    GetNetRate(fd,netdevice,&recvpre,&sendpre);
    sleep(2);
    gettimeofday(&tv_now,NULL);
    GetNetRate(fd,netdevice,&recvcur,&sendcur);
    recvrate= (recvcur - recvpre)/(1024*(tv_now.tv_sec+tv_now.tv_usec*0.000001-tv_pre.tv_sec+tv_pre.tv_usec*0.000001));
    if(recvrate<0)
    {
    recvrate = 0;
    }
    sendrate= (sendcur - sendpre)/(1024*(tv_now.tv_sec+tv_now.tv_usec*0.000001-tv_pre.tv_sec+tv_pre.tv_usec*0.000001));
    if(sendrate<0)
    {
    sendrate = 0;
    }
    system("clear");
    printf("NetWorkRate Statistic Verson 0.0.1 ");
    printf("Net Device receive rate send rate ");
    printf("%-10s %-6.2fKB/sec %-6.2fKB/sec ",netdevice,recvrate,recvrate);
    }
    fclose(fd);
    return 0;
    }
     

    总结:

        物联网、互联网加的蓬勃发展,产品的功能实现越来越依赖网络,掌握一些网络编程的小技巧,可以使得我们在产品开发中能够事半功倍,提升软实力。今天是5月20日,在特殊的日子里整理一下知识,以做备忘,原创不易,转载说明文章出处。番外篇,我把上面的实例程序整理成了一个网络小工具,很实用,在主流的Linux平台编译运行没有任何的warning警告,如需要嵌入式移植开发或者其他用途请点此下载。


    ---------------------
    作者:dosthing
    来源:CSDN
    原文:https://blog.csdn.net/dosthing/article/details/80384541
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/10440490.html
Copyright © 2011-2022 走看看