2011-05-18 126 views
3

此問題與此問題完全相同:How to get MAC address of your machine using a C program?如何使用C程序獲取機器的MAC地址?

「我正在使用Ubuntu。我如何獲得我的機器的MAC地址或使用C程序的eth0接口。」


現在,我通常不碰C ......但在這種情況下,我必須。由於我不知道下面的代碼中發生了什麼,因此我需要一些幫助。

#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <linux/if.h> 
#include <netdb.h> 
#include <stdio.h> 

int main() 
{ 
    struct ifreq s; 
    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

    strcpy(s.ifr_name, "eth0"); 
    if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { 
    int i; 
    for (i = 0; i < 6; ++i) 
     printf(" %02x", (unsigned char) s.ifr_addr.sa_data[i]); 
    puts("\n"); 
    return 0; 
    } 
    return 1; 
} 

而不是打印的MAC地址,我需要返回作爲一個字符串的函數的函數。你知道,像這樣:

const char * gettaStringFromNativeCode(void) 
{ 
    return "This is a string"; 
} 

這是與Mozilla Chromeless,它使用Firefox的新JCTYPES像this使用。

基本上,我希望做這樣的事情(從C#借用):

// Using "string" here because its pseudo-code and I don't know what i'm doing. :-) 
string getMAC() 
{ 
    struct ifreq s; 
    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

    strcpy(s.ifr_name, "eth0"); 
    var macAddress = string.Empty; // yah, this is actually C# 
    if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { 
    int i; 
    for (i = 0; i < 6; ++i) 
     // yah, this is a bit of C# too. 
     macAddress += string.Format(" %02x", (unsigned char) s.ifr_addr.sa_data[i])); 
    } 
    return macAddress; 
} 

回答

4
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <linux/if.h> 
#include <netdb.h> 
#include <stdio.h> 

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

int main() 
{ 
    char *mac = getmac("eth0"); 
    printf("%s\n",mac); 
    free(mac); 
} 
+0

非常感謝。這很好用! – 2011-05-19 00:27:18

3
int getMac(char mac[6]) 
{ 
    struct ifreq s; 
    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

    strcpy(s.ifr_name, "eth0"); 
    if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { 
    int i; 
    for (i = 0; i < 6; ++i) 
     mac[i] = s.ifr_addr.sa_data[i]; 
    close(fd); 
    return 0; 
    } 
    close(fd); 
    return 1; 
} 
+2

這看起來再好,你可能會考慮的memcpy(MAC,s.ifr_addr.sa_data ,6)而不是你的循環。 – jedwards 2011-05-19 00:22:09

+1

這不僅僅是返回1還是0?我需要將地址作爲字符串返回。 – 2011-05-19 13:56:03

+0

你需要MAC地址,它不只是字符串,它恰好是6個字節。成功返回值爲0,否則返回1。函數參數是您在外部分配的輸出緩衝區(最可能是靜態的)。 – 2011-05-20 22:57:53