如何使用C程序获取机器的MAC地址?

这个问题就像这个问题: 如何使用C程序获得您的机器的MAC地址?

“我正在Ubuntu上工作,我怎样才能得到我的机器的MAC地址或接口eth0使用C程序。”


现在,我通常不碰C ……但在这种情况下,我必须。 由于我不知道下面的代码是从上面的链接中得到的,所以我需要一些帮助。

#include <sys/socket.h> #include <sys/ioctl.h> #include <linux/if.h> #include <netdb.h> #include <stdio.h> int main() { struct ifreq s; int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); strcpy(s.ifr_name, "eth0"); if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { int i; for (i = 0; i < 6; ++i) printf(" %02x", (unsigned char) s.ifr_addr.sa_data[i]); puts("\n"); return 0; } return 1; } 

而不是一个打印MAC地址的函数,我需要一个函数,它返回一个string。 你知道,像这样:

 const char * gettaStringFromNativeCode(void) { return "This is a string"; } 

这是Mozilla Chromeless的使用,它使用Firefox的新的JCTYPES这样的。

基本上,我正在做这样的事情(从C#借用):

 // Using "string" here because its pseudo-code and I don't know what i'm doing. :-) string getMAC() { struct ifreq s; int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); strcpy(s.ifr_name, "eth0"); var macAddress = string.Empty; // yah, this is actually C# if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { int i; for (i = 0; i < 6; ++i) // yah, this is a bit of C# too. macAddress += string.Format(" %02x", (unsigned char) s.ifr_addr.sa_data[i]) ); } return macAddress; } 

Solutions Collecting From Web of "如何使用C程序获取机器的MAC地址?"

 #include <sys/socket.h> #include <sys/ioctl.h> #include <linux/if.h> #include <netdb.h> #include <stdio.h> char *getmac(char *iface) { #define MAC_STRING_LENGTH 13 char *ret = malloc(MAC_STRING_LENGTH); struct ifreq s; int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); strcpy(s.ifr_name, iface); if (fd >= 0 && ret && 0 == ioctl(fd, SIOCGIFHWADDR, &s)) { int i; for (i = 0; i < 6; ++i) snprintf(ret+i*2,MAC_STRING_LENGTH-i*2,"%02x",(unsigned char) s.ifr_addr.sa_data[i]); } else { perror("malloc/socket/ioctl failed"); exit(1); } return(ret); } int main() { char *mac = getmac("eth0"); printf("%s\n",mac); free(mac); } 
 int getMac(char mac[6]) { struct ifreq s; int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); strcpy(s.ifr_name, "eth0"); if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { int i; for (i = 0; i < 6; ++i) mac[i] = s.ifr_addr.sa_data[i]; close(fd); return 0; } close(fd); return 1; }