2012-05-15 37 views
7

這可能是一個愚蠢的問題,我很抱歉,如果它已經在這裏解決,但我已經搜索了很多,沒有多少運氣。我試圖讓我的界面的硬件地址在C中,我正在使用OS X(x86-64)。我知道如何通過ifconfig獲得它,但我希望我的程序能夠爲任何計算機自動獲取它,至少OS X電腦。我發現另一個線程發佈link這幾乎做我想做的(有一些修改),但我不能使ld(我的編譯器是gcciokit函數鏈接。我嘗試將標記-lIOKit-framework IOKit添加到gcc命令行,但我仍然收到相同的鏈接錯誤。這是我的代碼的鏈接:headersource來自OS X界面的MAC地址(C)

+0

我一直以爲巴甫洛夫有一隻狗......不是嗎? – 2012-05-15 03:37:41

+1

是的,我的名字只是一句話而已。 –

回答

6

This little program將在OSX上無需更改即可使用。

代碼:(從FreeBSD的名單學分Alecs王)

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

你應該,但是,改變int len;size_t len;

+0

謝謝,那正是我想要的。 –