2012-05-15 17 views
7

これは愚かな質問かもしれませんが、既にここで取り上げられている場合はお詫びしますが、大したことはありません。私はCでインターフェイスのハードウェアアドレスを取得しようとしており、OS X(x86-64)を使用しています。私はifconfigでそれを得る方法を知っていますが、自分のプログラムが自動的にすべてのコンピュータ、つまり少なくともOS Xのコンピュータで取得されるようにしたいと思います。私はこれを投稿した別のスレッドを見つけました。linkいくつかの変更を加えてほしいものがほとんどありますが、iokit関数のリンクを(私のコンパイラはgcc)にできません。 gccコマンドラインにフラグ-lIOKit-framework IOKitを追加しようとしましたが、同じリンクエラーが発生します。私のコードへのリンクはheadersourceです。OS XのインターフェースからのMACアドレス

+0

int len;を変更する必要がありますか? –

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

あなたは、しかし、私はいつもノー...パブロフの犬を持っていたと考えsize_t len;

+0

ありがとう、それはまさに私が欲しかったものです。 –