2013-08-01 51 views
1

我嘗試獲取我想要使用的接口的mac地址。原始套接字:不適當的ioctl

我使用此代碼這樣做,但我總是得到錯誤信息「的設備 不適當的ioctl」

我已經使用了不同的插座,即AF_INET與SOCK_DGRAM(試過,雖然我需要原始套接字以後使用)沒有任何區別。

#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <linux/if_ether.h> 
#include <net/if.h> 

int main() 
{ 
    char if_name[] = "eth0"; 

    char mac[ETH_ALEN]; 
    struct ifreq ifr; 
    int sock; 

    if(sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)) < 0) 
    { 
     perror("SOCKET"); 
     return 1; 
    } 

    // get mac address of our interface 
    memset(&ifr, 0, sizeof(struct ifreq)); 
    memcpy(ifr.ifr_name, if_name, 4); 
    if(ioctl(sock, SIOCGIFHWADDR, &ifr) == -1) 
    { 
     perror("SIOCGIFHWADDR"); 
     return 1; 
    } 
    memcpy(mac, ifr.ifr_hwaddr.sa_data, ETH_ALEN); 
    printf("%x.%x.%x.%x.%x.%x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 
} 
+1

您知道您複製大於接口名稱爲'ifr.ifr_name'得多? –

+0

@JoachimPileborg我現在,修復它,但它沒有改變任何東西 – Horstinator

回答

6

的問題應該是很明顯的,如果你打開更多的警告:

if(sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)) < 0) 

比較的結果,上述分配給sock,當然它不是有效的套接字。

相反,你需要使用括號來避免operator precedence問題:

if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) < 0) 
+0

謝謝,我完全錯過了...... = / – Horstinator