2013-08-01 3 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

:

대신 당신은 operator precedence 문제를 방지하기 위해 괄호를 사용해야합니까? –

+0

@JoachimPileborg 나는 그것을 고치지 만, 아무 것도 바꿀 수 없다. – Horstinator

답변

6

문제는 아주 명백해야한다 :

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

은 위의 sock비교의 결과를 할당하고, 물론 그것은 유효한 소켓이 아니다. 당신은`ifr.ifr_name`의 인터페이스 이름보다 훨씬 더 많은 복사 알고 있습니다

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

덕분에, 나는 완전히 그걸 놓쳤다. = / – Horstinator