参考了一些网上的方法,整理如下:
#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ETH_NAME "eth0"
int main()
{
int sockfd;
struct sockaddr_in sin;
struct ifreq ifr;
unsigned char mac[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 sockaddr ifr_addr;
struct sockaddr ifr_dstaddr;
struct sockaddr ifr_broadaddr;
struct sockaddr ifr_netmask;
struct sockaddr ifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmap ifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char * ifr_data;
};
};
*/