Mac Adresse auslesen
-
Hallo,
ich möchte in meinem C Proramm die Mac Adresse auslesen. Da ich keine spezielle Funktion gefunden habe würde ich
system(ifconfig -a | grep HWaddr | awk '{ print $1 ": " $5 }')
benutzen.
Wie kann ich nun die Ausgabe des Script auf ein 2 Dimension Array legen
d.h.
array[0,0} = "1. Device"
array[0,1} = "Mac Adresse vom 1. Device"
array[1,0} = "2. Device"
array[1,1} = "Mac Adresse vom 2. Device"Oder es gibt hier eine Lib direkt in C die die Mac-Adresse auslesen kann ?
Gruß
roger
-
im sys Dateisystem kannst du mit den Treibern kommunizieren, sprich: du kannst u.a. die MAC Adresse auslesen.
Die MAC Adresse vom Gerät eth0 z.B. kannst du in dieser Datei finden:
/sys/class/net/eth0/addressDu willst stattdessen die Adresse von wlan0? Dann verwende die Datei:
/sys/class/net/wlan0/addressls /sys/class/net/ zeigt dir alle Geräte an.
Alternativ kannst du auch mit ioctl die Adresse von einem Socket auslesen.
-
Du kannst mit
strace ifconfig -a
heraus finden, welche Systemaufrufe das Tool macht, um seine Informationen zusammen zu sammeln. Da siehst Du jede menge ioctls, die Du Dir mal in den man-pages anschauen solltest.
system
ist fast immer die falsche Lösung, wie Du es ja offensichtlich bereits erkannt hast.
-
Abend,
ich habe mir nun etwas Programm geschrieben/zusammenkopiert, finde aber den Fehler nicht, das der Vergleich nicht gleich ist, eventuell "Stringendezeichen"
#define devicemac 622601428928 // hex -> dez
zeigt die MAC-Adresse in Dezimal an (sonst könnte ich die Hexadresse aus dem Binärfile des Programms mit jedem Editor auslesen.)Kann hier einmal ein Profi drüber kucken, da ich auch diverse Warnungen habe.
#include <sys/socket.h> #include <sys/ioctl.h> #include <linux/if.h> #include <netdb.h> #include <stdio.h> #include <string.h> /*################################################################################*/ char *uc(char *str) { size_t i, len = strlen(str); for(i = 0; i < len; i++) { str[i] = toupper(str[i]); } return str; } /*################################################################################*/ char *lc(char *str) { size_t i, len = strlen(str); for(i = 0; i < len; i++) { str[i] = tolower(str[i]); } return str; } /*################################################################################*/ 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); } /*################################################################################*/ char *dec_hex(long int num) // Function Definition { long int rem[50],i=0,x=0, length=0; char output[] = "000000000000"; char asc[] = "0"; while(num>0) { rem[i]=num%16; num=num/16; i++; length++; } x = sizeof(output) - length - 1; for(i=length-1;i>=0;i--, x++) { switch(rem[i]) { case 10: output[x] = 'A'; break; case 11: output[x] = 'B'; break; case 12: output[x] = 'C'; break; case 13: output[x] = 'D'; break; case 14: output[x] = 'E'; break; case 15: output[x] = 'F'; break; default : sprintf(&asc[0], "%d", rem[i]); output[x] = asc[0]; } } return(output); } /*################################################################################*/ int main() { #define landevice "eth0" #define devicemac 622601428928 // hex -> dez char *mac = uc(getmac(landevice)); char *nc = uc(dec_hex(devicemac)); if (strcmp(mac, nc) == 0) { printf("gefunden:%s\n", mac); exit(1); } } /*################################################################################*/
Gruß
Der HenryPS: Geschwindigkeit spielt hier keine Rolle, da alles nur einmal beim Start durchlaufen wird.