编写工具:source insight 3.5
编译环境:ubantu 18
运行环境:hi3516EV200
注意:需要在arm板上运行才能获取ip、mac、gateway、mask。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ctype.h>
#define NAME_SIZE 8
#define MAC_SIZE 18
#define IP_SIZE 16
#define MASK_SIZE 24
#define GATEWAY_SIZE 24
typedef enum {
false=0, true=!false
} bool; //c语言中没有bool类型,需要自己定义
typedef struct _NET_WORK_ATTR
{
char name[NAME_SIZE];
char ip[IP_SIZE];
char mac[MAC_SIZE];
char netmask_addr[MASK_SIZE];
char gateway[GATEWAY_SIZE];
}NET_WORK_ATTR;
// function declare
bool GetLocalMac(const char *eth_inf, char *mac); // 获取本机mac
bool GetLocalIp(const char *eth_inf, char *ip); // 获取本机ip
bool GetLocalNetMask(const char *eth_inf,char* netmask_addr); //获取本机mask
bool GetLocalGateWay(char* gateway);//获取本机gateway
/****** main test **********/
int main(void)
{
NET_WORK_ATTR net_attr = {0};
sprintf(net_attr.name,"eth0");
while(1)
{
sleep(1); //降低cpu占用率
GetLocalMac(net_attr.name, net_attr.mac);
printf("local %s mac: %s\n", net_attr.name, net_attr.mac);
GetLocalIp(net_attr.name, net_attr.ip);
printf("local %s ip: %s\n", net_attr.name, net_attr.ip);
GetLocalNetMask(net_attr.name,net_attr.netmask_addr);
printf("local %s netmask:%s\n",net_attr.name,net_attr.netmask_addr);
GetLocalGateWay(net_attr.gateway);
printf("local %s netmask:%s\n",net_attr.name,net_attr.gateway);
}
return 0;
}
// 获取本机mac
bool GetLocalMac(const char *eth_inf, char *mac)
{
struct ifreq ifr;
int sd;
bzero(&ifr, sizeof(struct ifreq));
if( (sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("get %s mac address socket creat error\n", eth_inf);
return false;
}
strncpy(ifr.ifr_name, eth_inf, sizeof(ifr.ifr_name) - 1);
if(ioctl(sd, SIOCGIFHWADDR, &ifr) < 0)
{
printf("get %s mac address error\n", eth_inf);
close(sd);
return false;
}
snprintf(mac, MAC_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
close(sd);
return true;
}
// 获取本机ip
bool GetLocalIp(const char *eth_inf, char *ip)
{
int sd;
struct sockaddr_in sin;
struct ifreq ifr;
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sd)
{
printf("socket error: %s\n", strerror(errno));
return false;
}
strncpy(ifr.ifr_name, eth_inf, IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0;
// if error: No such device
if (ioctl(sd, SIOCGIFADDR, &ifr) < 0)
{
printf("ioctl error: %s\n", strerror(errno));
close(sd);
return false;
}
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
snprintf(ip, IP_SIZE, "%s", inet_ntoa(sin.sin_addr));
close(sd);
return true;
}
//获取本机mask
bool GetLocalNetMask(const char *eth_inf,char* netmask_addr)
{
int sock_netmask;
struct ifreq ifr_mask;
struct sockaddr_in *net_mask;
sock_netmask = socket( AF_INET, SOCK_STREAM, 0 );
if( sock_netmask == -1)
{
perror("create socket failture...GetLocalNetMask\n");
return false;
}
memset(&ifr_mask, 0, sizeof(ifr_mask));
strncpy(ifr_mask.ifr_name, eth_inf, sizeof(ifr_mask.ifr_name )-1);
if( (ioctl( sock_netmask, SIOCGIFNETMASK, &ifr_mask ) ) < 0 )
{
printf("mac ioctl error\n");
return false;
}
net_mask = ( struct sockaddr_in * )&( ifr_mask.ifr_netmask );
strcpy( netmask_addr, inet_ntoa( net_mask -> sin_addr ) );
close( sock_netmask );
return true;
}
//获取本机gateway
bool GetLocalGateWay(char* gateway)
{
FILE *fp;
char buf[512];
char cmd[128];
char *tmp;
strcpy(cmd, "ip route");
fp = popen(cmd, "r");
if(NULL == fp)
{
perror("popen error");
return false;
}
while(fgets(buf, sizeof(buf), fp) != NULL)
{
tmp =buf;
while(*tmp && isspace(*tmp))
++ tmp;
if(strncmp(tmp, "default", strlen("default")) == 0)
break;
}
sscanf(buf, "%*s%*s%s", gateway);
pclose(fp);
return true;
}