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. 广播 (Broadcast)

    广播 :在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内 ...

  2. android----AsyncHttpClient的get,post和图片上传

    async-http-client库是一个基于回调函数的Http异步通信客户端Android组件,是在Apache的HttpClient库的基础上开发构建而成的. Eclipse使用:导入androi ...

  3. Confluence 6 LDAP 成员结构设置

    用户组成员属性(Group Members Attribute) 这个属性字段将在载入用户组成员的时候使用.例如: member 用户成员属性(User Membership Attribute) 这 ...

  4. ubuntu svn二进制文件

    1. 查找2:04时间的日志文件和position. Ps:这里假设我找到的是 mysql-bin.000065 位置开始为1356. 2  复制最近的几个日志文件,从mysql-bin.000065 ...

  5. javaScript 删除确认实现方法小结

    第一种: <a href="javascript:if(confirm('确认删除吗?'))window.location='del.php'">删除</a> ...

  6. vue 表单校验(二)

    vue 表单校验(二) vue element-ui表单校验 由于现在使用element-ui进行form表单校验,因而使用其自带的校验规则进行校验,发现有些并不是那么好校验,或者说是校验起来很繁琐, ...

  7. spring cloud学习(四) Fegin 的使用

    Feign 的使用 什么是Feign? Feign : Declarative REST clients. Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创 ...

  8. linux create a process

    When the system starts up it is running in kernel mode and there is, in a sense, only one process, t ...

  9. struts2 实现rest

    参考链接https://www.ibm.com/developerworks/cn/java/j-lo-struts2rest/

  10. 玩转X-CTR100 l STM32F4 l CAN通信

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器STM32F4处理器内置CAN ...