2012-05-15 25 views
7

पर इंटरफ़ेस से मैक पता यह एक बेवकूफ सवाल हो सकता है और अगर मैं पहले से ही यहां संबोधित किया गया हूं, तो मैं क्षमा चाहता हूं, लेकिन मैंने बहुत भाग्य के बिना काफी कुछ खोजा है। मैं सी में अपना इंटरफ़ेस का हार्डवेयर पता प्राप्त करने का प्रयास कर रहा हूं और मैं ओएस एक्स (x86-64) का उपयोग कर रहा हूं। मुझे पता है कि इसे ifconfig के साथ कैसे प्राप्त किया जाए, लेकिन मैं चाहता हूं कि मेरा प्रोग्राम स्वचालित रूप से किसी भी कंप्यूटर, कम से कम ओएस एक्स कंप्यूटर के लिए इसे प्राप्त करे। मुझे एक और थ्रेड मिला जो इस link को पोस्ट करता है जो कि मैं चाहता हूं (कुछ संशोधनों के साथ), लेकिन मैं iokitld में फ़ंक्शन लिंक नहीं बना सकता (मेरा कंपाइलर gcc है)। मैंने -lIOKit और -framework IOKit को gcc कमांड लाइन में झंडे जोड़ने की कोशिश की, लेकिन मुझे अभी भी वही लिंक त्रुटियां मिलती हैं। यहां मेरे कोड का एक लिंक दिया गया है: header और sourceओएस एक्स (सी)

+0

मैं हमेशा सोचा था कि पावलोव एक कुत्ता था ... कोई करने int len;? –

+1

हाँ, मेरा नाम सिर्फ शब्दों पर एक खेल है। –

उत्तर

6

This little program ओएसएक्स पर बदलाव किए बिना काम करेगा।

कोड: (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

धन्यवाद, यह वही है जो मैं चाहता था। –