Linux系统利用C语言获取网口信息(IP地址,MAC地址,状态,带宽speed等) 您所在的位置:网站首页 查看网口的ip地址 Linux系统利用C语言获取网口信息(IP地址,MAC地址,状态,带宽speed等)

Linux系统利用C语言获取网口信息(IP地址,MAC地址,状态,带宽speed等)

2024-01-05 23:04| 来源: 网络整理| 查看: 265

目录

设计思路

ioctl操作参数

获取网口的遍历结构

获取对应的参数信息

源代码

ifinfo.c

ifinfo.h

test.c

测试结果

 

设计思路

首先给需要查询的信息定义个结构(当然,这里可以扩展)

/** * struct ifinfo - 网卡信息结构 * * if_idx 网口在系统中的索引, 这里需要注意的是,派生的网口 em1:1 与 em1 的索引相同 * if_name 网口名,例如:eth0 * if_flag 网口状态,参见 IFSTAT_XXX 宏定义 * if_ipv4 网口IP地址,例如:10.170.6.66 * if_eth.if_ethmac 网口MAC地址,格式:28:6E:D4:88:C7:9A * if_eth.if_ethspeed 网口带宽,单位:Mbps */ struct ifinfo { unsigned int if_idx; //接口索引号 char if_name[32]; //接口名 如:eth0 int if_flag; #define IFSTAT_UP 0x0001 /* 接口状态为 up */ #define IFSTAT_BROADCAST 0x0002 /* 广播地址可用 */ #define IFSTAT_LOOPBACK 0x0004 /* 该网口是回环口 */ #define IFSTAT_POINTOPOINT 0x0010 /* 点对点连接 */ #define IFSTAT_MULTICAST 0x0020 /* 支持多播 */ char if_ipv4[16]; //接口IPv4地址 struct { char if_ethmac[64]; //MAC地址 unsigned int if_ethspeed; //速率 Mbps }if_eth; }; ioctl操作参数

才头文件 sys/sockios.h,linux/sockios.h 中定义了一些列的操作数

#include #include #define SIOCGIFNAME 0x8910 /* get iface name */ #define SIOCSIFLINK 0x8911 /* set iface channel */ #define SIOCGIFCONF 0x8912 /* get iface list */ #define SIOCGIFFLAGS 0x8913 /* get flags */ #define SIOCSIFFLAGS 0x8914 /* set flags */ #define SIOCGIFADDR 0x8915 /* get PA address */ #define SIOCSIFADDR 0x8916 /* set PA address */ #define SIOCGIFDSTADDR 0x8917 /* get remote PA address */ #define SIOCSIFDSTADDR 0x8918 /* set remote PA address */ #define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ #define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ #define SIOCGIFNETMASK 0x891b /* get network PA mask */ #define SIOCSIFNETMASK 0x891c /* set network PA mask */

 

获取网口的遍历结构

使用ioctl接口的SIOCGIFCONF选项,

/* 获取所有网口的句柄信息 */ static int get_ifconf_r(int sockfd, struct ifconf *ifc, void *buf, int buf_len) { if(sockfd ifc_buf = buf; if (ioctl(sockfd, SIOCGIFCONF, ifc) == -1) { return -1; } return 0; } 获取对应的参数信息

使用ioctl接口的SIOCGIFADDR选项,

/* 查询网口 IPv4 地址 */ static int get_ifaddr(int sockfd, const char *if_name, char *addr, int addr_len) { if(sockfd if_eth.if_ethmac,info->if_eth.if_ethspeed); } int main() { int ret = 0; while(1) { ret = get_ifinfo(ifdisplay, NULL); printf("Total %d interface.\n", ret); sleep(1); } }

 

测试结果

在虚拟机中无法查询网口带宽

[root@localhost ifinfo]# make gcc ifinfo.c test.c -o test.out [root@localhost ifinfo]# ./test.out 1: lo 127.0.0.1 00:00:00:00:00:00 0 Mb 2: eth0 10.170.6.66 28:6E:D4:88:C7:9A 0 Mb 5: docker0 172.17.0.1 02:42:57:6F:10:40 0 Mb Total 3 interface. 用ifconfig查询的结果 ----------------------------------- [root@localhost ifinfo]# ifconfig -a docker0: flags=4099 mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:57:6f:10:40 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163 mtu 1500 inet 10.170.6.66 netmask 255.255.255.0 broadcast 10.170.6.255 inet6 fe80::2731:24c7:9924:2028 prefixlen 64 scopeid 0x20 inet6 fe80::4b76:dca0:14ca:2d95 prefixlen 64 scopeid 0x20 inet6 fe80::cb30:c5c4:34dd:895f prefixlen 64 scopeid 0x20 ether 28:6e:d4:88:c7:9a txqueuelen 1000 (Ethernet) RX packets 3347634794 bytes 2727102880807 (2.4 TiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 43937802 bytes 187858063132 (174.9 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 888190 bytes 13054543624 (12.1 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 888190 bytes 13054543624 (12.1 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

这里介绍一个工具《Linux查看网口带宽状态(ifconfig,netstat,ethtool)》,该工具的:github地址。

[root@localhost ifstatus]# ./ifstatus.sh Name Speed Status docker0 Unknown! down eth0 Unknown! up lo Unknown! up

在真实的物理服务器上运行结果为

[root@localhost rtoax]# ./test.out 1: lo 127.0.0.1 00:00:00:00:00:00 0 Mb 2: em1 10.170.7.166 20:04:0F:FA:87:3C 1000 Mb 2: em1:1 10.170.7.183 20:04:0F:FA:87:3C 1000 Mb 2: em1:2 10.170.7.184 20:04:0F:FA:87:3C 1000 Mb 2: em1:3 10.170.7.185 20:04:0F:FA:87:3C 1000 Mb 2: em1:4 10.170.7.186 20:04:0F:FA:87:3C 1000 Mb 2: em1:5 10.170.7.187 20:04:0F:FA:87:3C 1000 Mb 2: em1:6 10.170.7.188 20:04:0F:FA:87:3C 1000 Mb 2: em1:7 10.170.7.189 20:04:0F:FA:87:3C 1000 Mb 2: em1:8 10.170.7.190 20:04:0F:FA:87:3C 1000 Mb 2: em1:9 10.170.7.191 20:04:0F:FA:87:3C 1000 Mb 2: em1:10 10.170.7.192 20:04:0F:FA:87:3C 1000 Mb 3: em2 10.171.7.166 20:04:0F:FA:87:3D 65535 Mb 7: virbr0 192.168.122.1 52:54:00:9F:56:64 0 Mb Total 14 interface.

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有