linux中获取网卡ip,linux下获取网卡IP地址、MAC地址、RX_BYTES、TX_BYTES

第一次写博客,希望将自己学到的的东西记录下来,同时也分享给大家。

如果你看到我写的文章,若有不到之处,还望多多指教。

我们进入正题吧:在linux下面获取网卡IP地址、MAC地址、RX_BYTES、TX_BYTES。

我的思路是:

1、读取“/proc/net/dev”这个路径文件,获取rx_bytes、tx_bytes的值

2、在这个文件中记录网络接口的名称,再通过socket与ioctl获取IP地址与MAC地址。

代码如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct net{

char name[128];

char mac[30];

char ip[30];

unsigned long long rx_bytes;

unsigned long long tx_bytes;

};

enum if_item

{

RX_BYTES = 0,

RX_PACKETS,

RX_ERRS,

RX_DROP,

RX_FIFO,

RX_FRAME,

RX_COMPRESSED,

RX_MULTICAST,

TX_BYTES,

TX_PACKETS,

TX_ERRS,

TX_DROP,

TX_FIFO,

TX_COLLS,

TX_CARRIER,

TX_COMPRESSED,

IF_ITEM_MAX

};

int AdapterCount(struct net* Adapter)

{

int nCount=0;

FILE* fp = fopen("/proc/net/dev", "r");//打开系统文件查看网卡接口

if(!fp)

{

perror("fopen /proc/net/dev");

exit(0);

}

char szline[1024] = {0};

fgets(szline, sizeof(szline), fp);//跳过前面两行

fgets(szline, sizeof(szline), fp);

int i=0;

struct ifreq ifr_mac_ip;//保存IP MAC地址的结构体

struct sockaddr_in* ipaddr;

int s = socket(AF_INET, SOCK_STREAM, 0);//创建socket接口

memset(szline, 0, sizeof(szline));

//跳过前两行,后面一行代表一个网卡的信息,循环读取每个网卡的信息

while(fgets(szline, sizeof(szline), fp) != NULL)

{

//分析字符串,获取网卡名称

string name = szline;

int p1 = name.find_first_of(':', 0);//查找第一个出现:的位置

name = name.substr(0, p1);//字符串截取

int p2 = name.rfind(' ', -1);//字符串截取后从后往前第一个出现空格的位置

if(p2 != -1)//如果有空间,字符串再字截取

{

name = name.substr(p2+1, -1);

}

memcpy(Adapter[i].name, name.c_str(), strlen(name.c_str()));//将名字保存到数组中

unsigned long long data[32] = {0};

sscanf(szline+p1+1, "%llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu",

data + RX_BYTES,

data + RX_PACKETS,

data + RX_ERRS,

data + RX_DROP,

data + RX_FIFO,

data + RX_FRAME,

data + RX_COMPRESSED,

data + RX_MULTICAST,

data + TX_BYTES,

data + TX_PACKETS,

data + TX_ERRS,

data + TX_DROP,

data + TX_FIFO,

data + TX_COLLS,

data + TX_CARRIER,

data + TX_COMPRESSED);

Adapter[i].rx_bytes = data[RX_BYTES];//网卡接收流量

Adapter[i].tx_bytes = data[TX_BYTES];//网卡输出流量

memcpy(ifr_mac_ip.ifr_name, name.c_str(), strlen(name.c_str()));//将名字赋值给结构

//查找IP

ioctl(s, SIOCGIFADDR , &ifr_mac_ip);

ipaddr = (struct sockaddr_in*)&ifr_mac_ip.ifr_addr;

char ipbuff[20] = {0};

strcpy(ipbuff, inet_ntoa(ipaddr->sin_addr));

memcpy(Adapter[i].ip, ipbuff, strlen(ipbuff));

//查找MAC

ioctl(s, SIOCGIFHWADDR, &ifr_mac_ip);

char macbuff[30] = {0};

sprintf(macbuff, "%02x:%02x:%02x:%02x:%02x:%02x",

(unsigned char)ifr_mac_ip.ifr_hwaddr.sa_data[0],

(unsigned char)ifr_mac_ip.ifr_hwaddr.sa_data[1],

(unsigned char)ifr_mac_ip.ifr_hwaddr.sa_data[2],

(unsigned char)ifr_mac_ip.ifr_hwaddr.sa_data[3],

(unsigned char)ifr_mac_ip.ifr_hwaddr.sa_data[4],

(unsigned char)ifr_mac_ip.ifr_hwaddr.sa_data[5]);

memcpy(Adapter[i].mac, macbuff, strlen(macbuff));//保存MAC地址

i++;

nCount++;//网卡数量相加

memset(szline, 0, sizeof(szline));//每循环一次,数据清0

}

fclose(fp);

close(s);

return nCount;

}

int main()

{

struct net netlist[20]={0};

int j = AdapterCount((struct net*)&netlist);

for(int i=0; i

{

printf("%s\n", netlist[i].name);

printf("%s\n", netlist[i].ip);

printf("%s\n", netlist[i].mac);

printf("%ld\n", netlist[i].rx_bytes);

printf("%ld\n", netlist[i].tx_bytes);

printf("\n");

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用以下命令可以查看Linux系统的IP地址: 1. ifconfig命令 ifconfig命令可以查看网络接口信息,包括IP地址、子网掩码、MAC地址等。 例如,输入ifconfig命令后,可以看到如下结果: ``` eth0 Link encap:Ethernet HWaddr 00:0c:29:e6:4f:4a inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fee6:4f4a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:914 errors:0 dropped:0 overruns:0 frame:0 TX packets:634 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:94346 (92.1 KiB) TX bytes:85413 (83.4 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:240 (240.0 B) TX bytes:240 (240.0 B) ``` 其,eth0是网卡名,inet addr:后面的就是该网卡IP地址。 2. ip命令 ip命令也可以查看网络接口信息,包括IP地址、子网掩码、MAC地址等。 例如,输入ip addr命令后,可以看到如下结果: ``` 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fee6:4f4a/64 scope link valid_lft forever preferred_lft forever ``` 其,eth0是网卡名,inet后面的就是该网卡IP地址

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值