linux 下C语言实现 读取网卡速度

该博客介绍了如何在Linux环境中使用C语言通过ethtool工具来获取网卡的速度,以实现监控网卡利用率。作者分享了相关源码,并提供了编译和运行的命令,帮助读者理解并应用到自己的项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天要写一个监控之类东东,其中网卡一项要计算利用率,那就要取得网卡本身速度才能计算出来,本来想用perl实现,但发现网上没有现成的东东,后来几经辗转,最后想起ethtool能取到,就参考了此源码,贴出来供大家以后有个思路吧,

有时间再转成perl的:)

直接编译命令:gcc -p -g  getNet.c && gcc -o getNet getNet.c && ./getNet eth0

源码如下:

 

// filename: getNet.c
// command sample: ./getNet eth0
// compile command: gcc -p -g  getNet.c && gcc -o getNet getNet.c


#include <string.h>
#include <sys/ioctl.h>
#include <string.h>
#include <errno.h>
#include <linux/sockios.h>
#include <net/if.h>
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>


#ifndef SIOCETHTOOL
#define SIOCETHTOOL     0x8946
#endif
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeo
Linux环境下,MDIO(Management Data Interface)通常用于访问网络设备控制器中的PHY(Physical Layer Device,物理层模块)。当你想要通过C语言读取PHY的状态时,你需要使用硬件相关的库函数,如libmii(Management Information Base for Ethernet),它提供了一套API来操作MDIO。 以下是使用C语言通过MDIO读取PHY状态的基本步骤: 1. **包含头文件**:首先,在C程序中包含`<linux/mii.h>`,这是处理MDIO功能的关键头文件。 ```c #include <linux/mii.h> ``` 2. **初始化MDIO bus**:使用`mii_read()`函数连接到特定的管理地址,这通常是一个由网卡制造商提供的注册地址。 ```c int mii_dev = mdiodev_open("eth0"); // 假设你要操作的是"eth0"网卡的PHY if (mii_dev < 0) { perror("Failed to open MII device"); return -1; } ``` 3. **设置PHY ID**:确定你要读取的PHY ID。每个PHY都有一个唯一的标识符。 ```c u16 phy_id = PHY_ID(0, 0); // 这里假设你想读取的第一个PHY ``` 4. **发送MII命令**:使用`mii_readreg()`函数向PHY发送请求,并指定要读取的数据位。 ```c unsigned char data; mii_result_t result = mii_readreg(mii_dev, phy_id, MII_BMSR, &data); ``` 5. **解析结果**:`mii_result_t`类型的变量`result`将告诉你操作是否成功。根据`BMSR`寄存器的内容(比如是否存在链路活动、速度信息),你可以获取PHY的状态。 ```c if (result == MII_SUCCESS) { if ((data & BMSR_LSTATUS) != 0) { // 判断是否有链路状态 printf("PHY Link Status: Up\n"); } else { printf("PHY Link Status: Down\n"); } } ``` 6. **关闭MDIO bus**:完成操作后记得释放资源。 ```c mdiodev_close(mii_dev); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值