2012-05-15 9 views
7

Dies könnte eine dumme Frage sein und ich entschuldige mich, wenn es hier bereits angesprochen wurde, aber ich habe ziemlich viel ohne viel Glück gesucht. Ich versuche, die Hardware-Adresse meiner Schnittstelle in C zu bekommen, und ich benutze OS X (x86-64). Ich weiß, wie man es mit ifconfig bekommt, aber ich möchte, dass mein Programm es automatisch für jeden Computer, gut, mindestens OS X Computer bekommt. Ich habe einen anderen Thread gefunden, der diese link gepostet hat, was ziemlich genau das tut, was ich möchte (mit einigen Modifikationen), aber ich kann nicht die iokit Funktionen Link in ld machen (mein Compiler ist gcc). Ich habe versucht, die Flags -lIOKit und -framework IOKit in die gcc-Befehlszeile hinzuzufügen, aber ich bekomme immer noch die gleichen Link-Fehler. Hier ist ein Link zu meinem Code: header und source.MAC-Adresse von der Schnittstelle auf OS X (C)

+0

Ich dachte immer, dass Pavlov einen Hund hatte ... nein? –

+1

Ja, mein Name ist nur ein Wortspiel. –

Antwort

6

This little program wird ohne Änderungen auf OSX funktionieren.

Code: (Kredite an Alecs König von freebsd Liste)

#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <sys/sysctl.h> 
#include <net/if.h> 
#include <net/if_dl.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int   mib[6], len; 
    char   *buf; 
    unsigned char  *ptr; 
    struct if_msghdr *ifm; 
    struct sockaddr_dl *sdl; 

    if (argc != 2) { 
     fprintf(stderr, "Usage: getmac <interface>\n"); 
     return 1; 
    } 

    mib[0] = CTL_NET; 
    mib[1] = AF_ROUTE; 
    mib[2] = 0; 
    mib[3] = AF_LINK; 
    mib[4] = NET_RT_IFLIST; 
    if ((mib[5] = if_nametoindex(argv[1])) == 0) { 
     perror("if_nametoindex error"); 
     exit(2); 
    } 

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { 
     perror("sysctl 1 error"); 
     exit(3); 
    } 

    if ((buf = malloc(len)) == NULL) { 
     perror("malloc error"); 
     exit(4); 
    } 

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { 
     perror("sysctl 2 error"); 
     exit(5); 
    } 

    ifm = (struct if_msghdr *)buf; 
    sdl = (struct sockaddr_dl *)(ifm + 1); 
    ptr = (unsigned char *)LLADDR(sdl); 
    printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *ptr, *(ptr+1), *(ptr+2), 
      *(ptr+3), *(ptr+4), *(ptr+5)); 

    return 0; 
} 

Sie sollten jedoch ändern int len;-size_t len;

+0

Danke, das ist genau das, was ich wollte. –