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[];
} sset_info;
struct ethtool_stats *stats;
struct ethtool_gstrings *strings;
unsigned int sz_stats; fd = socket(AF_INET, SOCK_DGRAM, ); sset_info.hdr.cmd = ETHTOOL_GSSET_INFO;
sset_info.hdr.reserved = ;
sset_info.hdr.sset_mask = 1ULL << ETH_SS_STATS; memset(&ifr, , sizeof(ifr));
strcpy(ifr.ifr_name, "eth2");
ifr.ifr_data = (void*)&sset_info;
ret = ioctl(fd, SIOCETHTOOL, &ifr);
if ( != ret) {
printf("ETHTOOL_GSSET_INFO errno=%d\n", errno);
return -;
} n_stats = sset_info.hdr.sset_mask ? sset_info.hdr.data[] : ;
printf("stats n_stats=%d\n", 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\n", errno);
return -1;
}
*/
sz_stats = n_stats * sizeof(unsigned long long);
stats = calloc(, sz_stats + sizeof(struct ethtool_stats));
stats->cmd = ETHTOOL_GSTATS;
stats->n_stats = n_stats; memset(&ifr, , sizeof(ifr));
strcpy(ifr.ifr_name, "eth2");
ifr.ifr_data = (void*)stats;
ret = ioctl(fd, SIOCETHTOOL, &ifr);
if ( != ret) {
printf("ETHTOOL_GSTATS errno=%d\n", errno);
return -;
} for (i = ; i < n_stats; i++) {
printf("%llu\n", stats->data[i]);
} return ;
}

使用ioctl获取网卡统计信息的更多相关文章

  1. 用ioctl获取无线网络信息 /usr//include/linux/wireless.h

    1.UNIX Network Programming环境搭建 Unix NetWork Programming――环境搭建(解决unp.h等源码编译问题) http://blog.csdn.net/a ...

  2. C++通过GetAdapatersInfo获取网卡配置信息

    DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, //指向一个缓冲区,用来取得IP_ADAPTER_INFO结构列表 PULONG pOutB ...

  3. DSAPI 获取实时统计信息CPU/内存/硬盘/网络

    有时,我们需要获取当前计算机中CPU.内存.硬盘.网络等实时信息,如下图:\ 要实现上述几项信息的获取,通常需要使用Timer控件来间隔获取,以便刷新最新的数据. 本示例中,放一个Timer控件,放一 ...

  4. 自己动手写路由器之ioctl获取网络接口信息

    最近打算写一个简单路由器,里面有用到ioctl获取网络接口信息,那就先把这部分单独拿出来说一说吧! ioctl这个函数,可以用来对特殊文件的基础设备参数进行操作,它们可以完成与打开文件描述符相关联的控 ...

  5. 通过API获取统计信息时报Access denied错误处理记录

    通过API获取HDFS统计信息时报Access denied错误信息,错误信息如下: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.s ...

  6. SQL Server 统计信息(Statistics)-概念,原理,应用,维护

    前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述 ...

  7. ioctl()获取本地网卡设备信息

    获得eth0接口所有信息: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #inclu ...

  8. C语言实现ifconfig获取网卡接收和发送流量统计

    在Windows下我们可以利用ipconfig命令获取网卡的相关信息,在Linux下命令是ifconfig 我们可以获取的信息更为丰富,其中包括网卡接收和发送的流量,用C语言实现这个命令并不是一件简单 ...

  9. Oracle重新获取统计信息以及SQLSERVER重建索引

    Oracle重新获取统计信息 exec dbms_stats.gather_schema_stats(ownname =>'LCoe739999',options => 'GATHER', ...

随机推荐

  1. Android之RecyclerView实现时光轴

    做项目的过程中有个需求需要时光轴,于是网上找了部分资料 ,写了个案例,现在分享给大家. 如图: activity_main.xml <?xml version="1.0" e ...

  2. Windows 环境下安装 Oracle JDK

    本页面中描述了如何在 Window 环境下安装 Oracle JDK. 我们使用的版本是 Window 10,我们需要安装的版本是 Oracle JDK 8u191. 检查当前版本 在进行新的 JDK ...

  3. zzuli1728(数学期望,组合数)

    1728: 社交网络 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 232  Solved: 64 SubmitStatusWeb Board Desc ...

  4. Leetcode 115

    Ø r a b b b i t Ø r a b b i t class Solution { public: int numDistinct(string s, string t) { ; ; int ...

  5. Mac无法写入移动硬盘,Mac移动硬盘不能写

    对于使用 Mac 的朋友,有时候难免需会使用移动硬盘.一般的移动硬盘的容量都比较大,再加上国内大多数人使用的都是 Windows 系统,为了通用与方便,所以硬盘的分区一般都是 NTFS 格式的.对于 ...

  6. C#窗体控件简介ListBox

    ListBox 控件 ListBox 控件又称列表框,它显示一个项目列表供用户选择.在列表框中,用户 一次可以选择一项,也可以选择多项. 1.常用属性: (1) Items属性: 用于存放列表框中的列 ...

  7. Oracle12cr1新特性之容器数据库(CDB)和可插拔数据库(PDB) 的启动和关闭

    Oracle12c中引入的多宿主选项(multitenant option)允许一个容器数据库容纳多个独立的可插拔数据库(PDB).本文将说明如何启动和关闭容器数据库(CDB)和可插拔数据库(PDB) ...

  8. MVC,重写AuthorizeAttribute实现自己的权限验证(一)

    我们要实现下面的效果,某个controller,只允许某几个角色访问(admin,user,document controller) [MyAuthorize(Roles = "Admin, ...

  9. learning shell built-in variables (1)

    Shell built-in variables [Purpose]        Learning shell built-in variables, example $0,$1,$2,$3,$#, ...

  10. 可远程定位、解锁并启动汽车的黑客设备OwnStar

    GM告诉WIRED,OnStar用户不必担心之前存在的问题,现在已经修复了之前可被利用的漏洞,. 然而,Kamkar表示问题还是没有被解决,并且已经由GM汇报了该问题. 在任何已经连接的汽车上,GM的 ...