参考了一些网上的方法,整理如下:
#include
#include
#include
#include
#include
#include
#define ETH_NAME"eth0"
int main()
{
intsockfd;
struct sockaddr_insin;
struct ifreqifr;
unsigned charmac[6];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket error");
exit(1);
}
strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);//Interface name
if (ioctl(sockfd, SIOCGIFADDR, &ifr) == 0) {//SIOCGIFADDR 获取interface address
memcpy(&sin, &ifr.ifr_addr, sizeof(ifr.ifr_addr));
printf("ip: %s\n", inet_ntoa(sin.sin_addr));
}
if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == 0) {//SIOCGIFHWADDR 获取hardware address
memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
printf("mac: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
return 0;
}
/*
struct ifreq {
char ifr_name[IFNAMSIZ];
union {
struct sockaddrifr_addr;
struct sockaddr ifr_dstaddr;
struct sockaddr ifr_broadaddr;
struct sockaddr ifr_netmask;
struct sockaddr ifr_hwaddr;
shortifr_flags;
intifr_ifindex;
intifr_metric;
intifr_mtu;
struct ifmapifr_map;
charifr_slave[IFNAMSIZ];
charifr_newname[IFNAMSIZ];
char *ifr_data;
};
};
*/