第一次写博客,希望将自己学到的的东西记录下来,同时也分享给大家。
如果你看到我写的文章,若有不到之处,还望多多指教。
我们进入正题吧:在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