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/address

    Du willst stattdessen die Adresse von wlan0? Dann verwende die Datei:
    /sys/class/net/wlan0/address

    ls /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 Henry

    PS: Geschwindigkeit spielt hier keine Rolle, da alles nur einmal beim Start durchlaufen wird.


Anmelden zum Antworten