C读取mac地址-未定义的行为
我想读取目标的MAC地址。因此,我使用以下代码C读取mac地址-未定义的行为,c,linux,sockets,ethernet,mac-address,C,Linux,Sockets,Ethernet,Mac Address,我想读取目标的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 , ifac
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:
根据作为答案给出的建议修改\u mac\u地址
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;
}
您正在返回指向本地堆栈变量的指针。这是非法的-一旦函数返回,就不再允许您访问其局部变量。正确的方法是在调用者中分配内存,并让被调用者将结果复制到那里
正确的结果只打印一次的原因是,从C函数返回的结果不会将其堆栈空间归零。这些值在堆栈上仍然是完整的,因此它们被传递给fprintf。然后,fprintf调用使用堆栈执行其工作,将不同的数据放入指向的位置。编辑后,您为mac地址分配了17个字节。 我不确定你为什么想要17个字节。。。一个典型的MAC地址只有6字节长 但是,您没有正确填写该数据 您试图在线填写:
mac = (TU8 *)ifr.ifr_hwaddr.sa_data;
但所做的只是给mac指针提供与sau数据相同的指针,同时泄漏之前分配的内存
我相信您希望将数据从一个结构复制到另一个结构:
// Copy 17 bytes from the sa_data to the allocated, reserved space for mac-address
// After this, ifr-->sa_data can be overwritten or destroyed; we don't care
// We have our own copy of the data in mac.
memcpy(mac, (TU8 *)ifr.ifr_hwaddr.sa_data, 17*sizeof(TU8) );
我将尝试这样重新编写:
TS32 get_mac_address(TU8 ** aps8Mac)
{
TS32 fd;
struct ifreq ifr;
CHAR *iface = "eth0";
const int MAC_SIZE = 6; // MAC addresses are 6-bytes.
*aps8Mac = malloc(sizeof(TU8) * MAC_SIZE);
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);
// Copy the 6-byte address to the output.
memcpy(*aps8Mac, ifr.ifr_hwaddr.sa_data, MAC_SIZE);
return 0;
}
你在哪里分配了空间来存放MAC地址?@DavidSchwartz我修改了这个主题,以便包含修改过的函数。但是,我仍然获得相同的行为,即丢弃从malloc获得的值,仍然返回指向临时值的指针。mac=TU8*ifr.ifr\u hwaddr.sa\u数据*aps8Mac=mac;只是将*aps8Mac设置为等于ifr.ifr_hwaddr.sa_数据的一种迂回方式。我修改了这个问题,以便按照您的建议在调用者中分配内存,但行为仍然相同。我想我弄错了什么。谢谢你的回答,我现在明白了。在您的函数中,有必要指定MAC_大小的类型,不是吗?