• 使用ioctl获取网卡统计信息


    ethtool -S获取接口统计信息总共分三步:

    1、获取统计项个数,使用SIOCETHTOOL+ETHTOOL_GSSET_INFO

    2、(可选)获取统计项名字,使用SIOCETHTOOL+ETHTOOL_GSTRINGS,需要使用第1步中获取的统计项个数来申请足够大的内存

    3、获取统计值,使用SIOCETHTOOL+ETHTOOL_GSTATS,需要使用第1步中获取的统计项个数来申请足够大的内存

    上代码:

    #include <sys/types.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/ioctl.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <net/if.h>
    
    #include <linux/sockios.h>
    #include <linux/ethtool.h>
    
    int main(int argc, char* argv[])
    {
        int fd;
        int ret;
        unsigned int n_stats, i;
        struct ifreq ifr;
        struct {
                    struct ethtool_sset_info hdr;
                    unsigned int buf[1];
            } sset_info;
        struct ethtool_stats *stats;
        struct ethtool_gstrings *strings;
        unsigned int sz_stats;
    
        fd = socket(AF_INET, SOCK_DGRAM, 0);
    
        sset_info.hdr.cmd = ETHTOOL_GSSET_INFO;
            sset_info.hdr.reserved = 0;
            sset_info.hdr.sset_mask = 1ULL << ETH_SS_STATS;
    
        memset(&ifr, 0, sizeof(ifr));
        strcpy(ifr.ifr_name, "eth2");
        ifr.ifr_data = (void*)&sset_info;
        ret = ioctl(fd, SIOCETHTOOL, &ifr);
        if (0 != ret) {
            printf("ETHTOOL_GSSET_INFO errno=%d
    ", errno);
            return -1;
        }
    
        n_stats = sset_info.hdr.sset_mask ? sset_info.hdr.data[0] : 0;
        printf("stats n_stats=%d
    ", n_stats);
    
        /*strings = calloc(1, sizeof(*strings) + n_stats * ETH_GSTRING_LEN);
            if (!strings)
                    return -1;
    
            strings->cmd = ETHTOOL_GSTRINGS;
            strings->string_set = ETH_SS_STATS;
            strings->len = n_stats;
    
        memset(&ifr, 0, sizeof(ifr));
            strcpy(ifr.ifr_name, "eth2");
        ifr.ifr_data = (void*)strings;
        ret = ioctl(fd, SIOCETHTOOL, &ifr);
        if (0 != ret) {
            printf("ETH_SS_STATS, errno=%d
    ", errno);
            return -1;
        }
        */
        sz_stats = n_stats * sizeof(unsigned long long);
        stats = calloc(1, sz_stats + sizeof(struct ethtool_stats));
        stats->cmd = ETHTOOL_GSTATS;
        stats->n_stats = n_stats;
    
        memset(&ifr, 0, sizeof(ifr));
        strcpy(ifr.ifr_name, "eth2");
        ifr.ifr_data = (void*)stats;
        ret = ioctl(fd, SIOCETHTOOL, &ifr);
        if (0 != ret) {
            printf("ETHTOOL_GSTATS errno=%d
    ", errno);
            return -1;
        }
    
        for (i = 0; i < n_stats; i++) {
                    printf("%llu
    ", stats->data[i]);
        }
    
        return 0;
    }
  • 相关阅读:
    指针变量的值和指针变量地址
    定时备份docker容器中mysql的数据
    sql server表外键查询
    Go语言strings包基本操作
    centos安装字体库处理中文乱码
    codeforces 1610D
    汽车配件生产加工企业管理软件出售生产加工刹车盘、刹车鼓、刹车蹄、刹车片等企业通用
    关于document.onmousemove报错Invalid or unexpected token问题
    SilverLight支持的DataTable可以直接绑定
    我的工作我的状态
  • 原文地址:https://www.cnblogs.com/shijianyujingshen/p/7441633.html
Copyright © 2020-2023  润新知