在socket编程中,我们一般使用ioctl中的SIOCGIFHWADDR来获得硬件地址,其核心源代码如下:
#include <stdio.h>
#include <linux/if.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
int main()
{
struct ifreq *ifr;
int sock, retval;
char* name;
sock = socket(AF_INET, SOCK_DGRAM, 0);
strcpy(ifr->ifr_name, "eth0");
retval = ioctl(sock,SIOCGIFHWADDR, ifr);
if (retval < 0)
{
perror("ioctl error\n");
exit(0);
}
name = ifr->ifr_hwaddr.sa_data;
printf("%02x:%02x:%02x:%02x:%02x:%02x",name[0], name[1], name[2], name[3], name[4], name[5]);
return 0;
}一开始想直接用printf("%s\n", name);将硬件地址直接输出,但发现是乱码,本来以为这样可能得不到硬件地址,想了很久才明白。其实我已经取得硬件地址了,但是由于固有的编程思想的影响,一遇到char型就想用%s输出,实际上数据在内存中存储时本来就没有固定的意义,完全可以根据需要给予数据特定的意义,所以此处虽然数据是用char型存储的,但是这里只用把它当成是一个单字节的数据就可以了。所以此处将其作为16进制用%x输出。