【发布时间】:2016-06-25 01:11:22
【问题描述】:
我想读取目标的 MAC 地址。所以我使用下面的代码
TS32 get_mac_address(TU8 ** aps8Mac)
{
TS32 fd;
struct ifreq ifr;
CHAR *iface = "eth0";
TU8 *mac;
fd = socket(AF_INET, SOCK_DGRAM, 0);
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
ioctl(fd, SIOCGIFHWADDR, &ifr);
close(fd);
mac = (unsigned char *)ifr.ifr_hwaddr.sa_data;
*aps8Mac = mac;
return 0;
}
int main(int argc, char **argv)
{
TU8 *s8Mac = NULL;
get_mac_address(&s8Mac);
fprintf(stdout, "MAC address : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n" , s8Mac[0], s8Mac[1], s8Mac[2], s8Mac[3], s8Mac[4], s8Mac[5]);
fprintf(stdout, "MAC address : %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n" , s8Mac[0], s8Mac[1], s8Mac[2], s8Mac[3], s8Mac[4], s8Mac[5]);
return 0;
}
一旦在我得到的目标上执行:
MAC 地址:00:01:02:03:00:76
MAC地址:FE:76:9C:8C:AB:7E
为什么我不读书
MAC 地址:00:01:02:03:00:76
MAC地址:00:01:02:03:00:76
编辑 1: get_mac_address 根据作为答案给出的建议修改
TS32 get_mac_address(TU8 ** aps8Mac)
{
TS32 fd;
struct ifreq ifr;
CHAR *iface = "eth0";
TU8 *mac = malloc(sizeof(TU8) * 17);
fd = socket(AF_INET, SOCK_DGRAM, 0);
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
ioctl(fd, SIOCGIFHWADDR, &ifr);
close(fd);
mac = (TU8 *)ifr.ifr_hwaddr.sa_data;
*aps8Mac = mac;
return 0;
}
【问题讨论】:
-
你在哪里分配空间来保存 MAC 地址?
-
@DavidSchwartz 我已经修改了主题以包含修改后的功能。但是,我仍然获得相同的行为
-
您丢弃了从
malloc获得的值,但仍然返回指向临时对象的指针。mac = (TU8 *)ifr.ifr_hwaddr.sa_data; *aps8Mac = mac;只是设置*aps8Mac等于ifr.ifr_hwaddr.sa_data的一种迂回方式。
标签: c linux sockets ethernet mac-address