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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值