반응형

 

소스코드

ioctl_example.c

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

enum { ARGV_CMD, ARGV_INTERFACE };

int main(int argc, char * argv[])
{
    int sock;
    struct ifreq ifr;
    unsigned char *mac = NULL;

    if(argc != 2){
        printf("%s [Interface name]\n", argv[ARGV_CMD]);
        return 1;
    }

    memset(&ifr, 0x00, sizeof(ifr));
    strcpy(ifr.ifr_name, argv[ARGV_INTERFACE]);

    // Unix 도메인 소켓 하나를 생성한다.
    int fd = socket(AF_UNIX, SOCK_DGRAM, 0);

    if (fd < 0) {
        perror("socket creation error");
        return 1;
    }

    // 이 소켓을 이용해 ifr 을 보낸다.
    // 두번째 파라미터는 request code, 이름은 SIOCGIFHWADDR (이것은 이 code는 device-dependent임)  32     // 세번째 파라미터는, 전달할 매개변수. 이 매개변수 안에 응답한 정보가 들어감.
    if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
        perror("ioctl error");
        return 1;
    }

    // ifr에서 data를 가져옴.
    mac = ifr.ifr_hwaddr.sa_data;

    printf("%s: %02x:%02x:%02x:%02x:%02x:%02x\n", ifr.ifr_name, mac[0],mac[1],mac[2],mac[3],mac[4]    ,mac[5]);

    close(fd);
    return 0;
}

 

실행문

gcc ioctl_example.c

./a.out eth0

 

결과화면

eth0: 00:15:5d:ee:80:83

 

참고하면 좋을 자료

https://stackoverflow.com/questions/2283494/get-ip-address-of-an-interface-on-linux

반응형

'Linux > Code snippet' 카테고리의 다른 글

[Netlink] 넷링크 예제  (0) 2022.06.27