2_linux下使用代码获取网卡信息

在 Linux 系统中,可以使用 ethtool 工具获取网卡的网速、双工模式以及自动协商状态。以下是具体步骤和示例:

17e8b46936627879fe479bd8f1f248b6.jpeg

一、使用ethtool获取网卡信息

1、获取网卡信息

ethtool eth0           Settings for eth0:    Supported ports: [ TP ]    Supported link modes:   10baseT/Half 10baseT/Full                            100baseT/Half 100baseT/Full                            1000baseT/Full    Supported pause frame use: No    Supports auto-negotiation: Yes    Advertised link modes:  1000baseT/Full    Advertised pause frame use: No    Advertised auto-negotiation: Yes    Link partner advertised link modes:  100baseT/Half 100baseT/Full                                         1000baseT/Full    Link partner advertised pause frame use: No    Link partner advertised auto-negotiation: Yes    Speed: 1000Mb/s    Duplex: Full        Port: Twisted Pair    PHYAD: 1    Transceiver: internal    Auto-negotiation: onMDI-X: Unknown

关键字段解释:    

Speed: 当前网卡的连接速率,例如 1000Mb/s 表示 1Gbps。

Duplex: 当前的双工模式,Full 表示全双工,Half 表示半双工。

Auto-negotiation: 当前的自动协商状态,on 表示已启用,off 表示未启用。

Advertised link modes: 网卡当前支持的链路模式。

Link partner advertised link modes: 对端设备支持的链路模式。

2、提取网速、双工模式和自动协商状态

如果只想提取特定字段,可以使用 grep 和 awk 命令

ethtool eth0 | grep -E "Speed|Duplex|Auto-negotiation"    Speed: 1000Mb/s    Duplex: Full    Auto-negotiation: on

2、参考:实时网速

如果需要实时查看网卡的传输速率,可以使用 nload 或 iftop 工具:

二、使用代码获取网卡信息

1、获取网卡连接状态

int res;    struct ifreq ifr;    struct ethtool_cmd edata;
    memset(&ifr, 0, sizeof(struct ifreq));    memset(&edata, 0, sizeof(struct ethtool_cmd));                  strncpy(ifr.ifr_name, NIC, sizeof(ifr.ifr_name));    edata.cmd = ETHTOOL_GLINK;    ifr.ifr_data = (char *) &edata;              res = ioctl(sockStatus, SIOCETHTOOL, &ifr);    if (0 != res) {        printf("failed to read Ethernet link state");        return -1;    }              pStateLink = (((struct ethtool_value *) &edata)->data);    printf("---------->>>> link status %d \n", pStateLink );

3、获取网卡支持网速

if (edata.supported & SUPPORTED_1000baseT_Half) {        printf("SUPPORTED_1000baseT_Half \n");    }    if (edata.supported & SUPPORTED_1000baseT_Full) {        printf("SUPPORTED_1000baseT_Full \n");    }    if (edata.supported & SUPPORTED_100baseT_Half) {        printf("SUPPORTED_100baseT_Half \n");    }    if (edata.supported & SUPPORTED_100baseT_Full) {        printf("SUPPORTED_100baseT_Full \n");    }    if (edata.supported & SUPPORTED_10baseT_Half) {        printf("SUPPORTED_10baseT_Half \n");    }    if (edata.supported & SUPPORTED_10baseT_Full) {        printf("SUPPORTED_10baseT_Full \n");}

4、获取网卡双工模式

res = ioctl(sockStatus, SIOCETHTOOL, &ifr);    if (0 != res) {        printf("failed to read Ethernet duplex setting");        return -1;    }                   if (duplex != edata.duplex) {        if (duplexNext != edata.duplex) {            duplexNext = edata.duplex;        }else{            printf("not DUPLEX_HALF\n");        }}

5、获取网卡自动协商是否支持

res = ioctl(sockStatus, SIOCETHTOOL, &ifr);    if (0 != res) {        printf("failed to read Autonegotiation status");        return -1;    }               if (AUTONEG_ENABLE == edata.autoneg) {        printf("GOAL_ETH_AUTONEG_ON \n");    }    else {        printf("GOAL_ETH_AUTONEG_OFF \n");    }

欢迎关注:

linux下使用代码设置ip

记一次网络无法ping通的排查

7_计算机网络五层体系结构

Modbus发送的报文何时等到应答

tcp通信测试报告单1——connect和send

libmodbus库的一些使用经历

6_协议与层次划分

5_计算机网络体系结构的形成

4_计算机网络在我国的发展_20241024

3_路由器分组交换知多少?20241009

2_互联网概述_20241007

1_计算机网络体系结构的形成_20241006

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值