Comment obtenir l’adresse MAC de votre machine en utilisant un programme C?

Cette question est exactement comme cette question: Comment obtenir l’adresse MAC de votre machine en utilisant un programme C?

“Je travaille sur Ubuntu. Comment puis-je obtenir l’adresse MAC de ma machine ou une interface, disons eth0, à l’aide du programme C.”


Maintenant, je ne touche généralement pas C … mais dans ce cas, je dois le faire. Puisque je ne sais pas vraiment ce qui se passe dans le code suivant, tiré de la réponse liée à ci-dessus, j’ai besoin d’aide.

#include  #include  #include  #include  #include  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; } 

Au lieu d’une fonction qui imprime l’adresse MAC, j’ai besoin d’une fonction qui la renvoie sous forme de chaîne. Vous savez, comme ça:

 const char * gettaSsortingngFromNativeCode(void) { return "This is a ssortingng"; } 

Ceci doit être utilisé avec Mozilla Chromeless , qui utilise le nouveau JCTYPES de Firefox comme celui-ci .

En gros, je cherche à faire quelque chose comme ceci (emprunt de C #):

 // Using "ssortingng" here because its pseudo-code and I don't know what i'm doing. :-) ssortingng getMAC() { struct ifreq s; int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); strcpy(s.ifr_name, "eth0"); var macAddress = ssortingng.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; } 

 #include  #include  #include  #include  #include  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; }