2011-07-13 123 views
0

我有MAC地址作爲下。獲取MAC地址問題Linux(Ubuntu)

struct ifreq ifr; 
struct ifreq *IFR; 
struct ifconf ifc; 
char buf[1024]; 
int s, i; 
int ok = 0; 
string macAddr = ""; 

s = socket(AF_INET, SOCK_DGRAM, 0); 
if (s==-1) { 
    return; 
} 

ifc.ifc_len = sizeof(buf); 
ifc.ifc_buf = buf; 
ioctl(s, SIOCGIFCONF, &ifc); 

IFR = ifc.ifc_req; 
for (i = ifc.ifc_len/sizeof(struct ifreq); --i >= 0; IFR++) { 

    strcpy(ifr.ifr_name, IFR->ifr_name); 
    if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) { 
     if (! (ifr.ifr_flags & IFF_LOOPBACK)) { 
      if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) { 
       ok = 1; 
       break; 
      } 
     } 
    } 
} 

close(s); 

int p = sizeof(ifr.ifr_hwaddr.sa_data); 

cout<<"\n Size:"<<p<<"\n"; 

for(int i = 0; i < p; i++) 
    macAddr += ifr.ifr_hwaddr.sa_data[i]; 

cout<<"\n MAC Address:"<<macAddr<<"\n"; 

ifr.ifr_hwaddr.sa_data數據正確的,但是當我打印出來,我沒有得到應有的價值。可能是什麼問題呢。

回答

1

sa_data中的地址不是文本格式,而是原始二進制格式,因此您需要自己格式化爲十六進制格式。您也不能使用sizeof來獲取地址的大小,因爲sa_data是一個通用大小的數組 - 您需要查看sa_len成員以獲取此地址的長度。在C你想要這樣的事情:

char *separator = ""; 

for (int i = 0; i < ifr.ifr_hwaddr.sa_len; i++) 
{ 
    printf("%s%02x", separator, ifr.ifr_hwaddr.sa_data[i]); 
    separator = ":"; 
} 

printf("\n");