使用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[];
} 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获取网卡统计信息的更多相关文章
- 用ioctl获取无线网络信息 /usr//include/linux/wireless.h
1.UNIX Network Programming环境搭建 Unix NetWork Programming――环境搭建(解决unp.h等源码编译问题) http://blog.csdn.net/a ...
- C++通过GetAdapatersInfo获取网卡配置信息
DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, //指向一个缓冲区,用来取得IP_ADAPTER_INFO结构列表 PULONG pOutB ...
- DSAPI 获取实时统计信息CPU/内存/硬盘/网络
有时,我们需要获取当前计算机中CPU.内存.硬盘.网络等实时信息,如下图:\ 要实现上述几项信息的获取,通常需要使用Timer控件来间隔获取,以便刷新最新的数据. 本示例中,放一个Timer控件,放一 ...
- 自己动手写路由器之ioctl获取网络接口信息
最近打算写一个简单路由器,里面有用到ioctl获取网络接口信息,那就先把这部分单独拿出来说一说吧! ioctl这个函数,可以用来对特殊文件的基础设备参数进行操作,它们可以完成与打开文件描述符相关联的控 ...
- 通过API获取统计信息时报Access denied错误处理记录
通过API获取HDFS统计信息时报Access denied错误信息,错误信息如下: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.s ...
- SQL Server 统计信息(Statistics)-概念,原理,应用,维护
前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述 ...
- ioctl()获取本地网卡设备信息
获得eth0接口所有信息: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #inclu ...
- C语言实现ifconfig获取网卡接收和发送流量统计
在Windows下我们可以利用ipconfig命令获取网卡的相关信息,在Linux下命令是ifconfig 我们可以获取的信息更为丰富,其中包括网卡接收和发送的流量,用C语言实现这个命令并不是一件简单 ...
- Oracle重新获取统计信息以及SQLSERVER重建索引
Oracle重新获取统计信息 exec dbms_stats.gather_schema_stats(ownname =>'LCoe739999',options => 'GATHER', ...
随机推荐
- Confluence 6 权限设置
备注:当 '外部用户管理' 权限没有被选择的时候,你仅可以指派 LDAP 用户到本地用户组中. 只读(Read Only) 从你目录服务器上获得 LDAP 用户,用户组只能通过你的目录服务器进行修改. ...
- zzuli1985(dp/水dfs郑轻比赛)
再一次感受到dp的威力 1985: 即将到来的新生赛 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 112 Solved: 28 SubmitStat ...
- JSP内置对象和属性
JSP内置对象和属性列举如下: 1.request对象 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的 ...
- Django rest framework(2)----权限
一 添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 #!/usr/bin/env python # coding:u ...
- The Architecture of Open Source Applications——阅读笔记part 1
Architects look at thousands of buildings during their training, and study critiques of those buildi ...
- 我所理解的event loop
灵魂三问 JS为什么是单线程的 我们都知道,JS是单线程的语言,那为什么呢?我的理解是JS设计之初就是为了在浏览器端完成DOM操作和一些简单交互的,既然涉及到DOM操作如果是多线程就会带来复杂的同步问 ...
- UVALive 5984
题目链接:Save the Students! #include<stdio.h> #include<string.h> #include<iostream> #i ...
- HDU 2767 Proving Equivalences (Tarjan)
Proving Equivalences Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...
- jquery ajax 无法跨域调用的解决办法
今天要用到jquery ajax 跨域调用,但是ajax是禁止跨域调用的,所以只能先在php文件使用函数取得跨域的值,然后用ajax调用本地php文件.
- 什么是 dynaTrace Ajax
随着 jQuery.Dojo.YUI 等框架的兴起让构建 Web2.0 应用更加容易,但随之带来的定位等应用问题也越来越难,尤其是与性能相关的.dynaTrace Ajax Edition 是一个强大 ...