새소식

Programming

[network] 정보 ioctl 명령으로 확인하기

  • -

참고

네트워크 ip 주소를 얻어오는 방법이 여러가지가 있지만 인터페이스에 직접 ioctl 명령을 사용해서 다양한 정보를 얻어오는 방법을 사용할 수 있습니다.

C의 경우 <sys/ioctl.h> 파일과 <net/if.h> 를 include 해서 사용할 수 있습니다. 결과값은 struct ifreq 구조체로 넘어오는데 요청마다 값의 형태가 다릅니다. 일단은 위의 man page 도움말을 참고하시고 아래 형태와 같이 필요에 따라 변환을 해야 합니다.

참고로 ioctl 명령 이름 뜻은 아래 주석에 표시해놨습니다. 아래 상수 값이 항상 고정인지 특정 상황에 바뀔 수 있는지는 모르겠네요 어떤 소스 보니까 Linux 인지 BSD 인지 구분하는 경우도 있어서 os에 따라 달라질 수 있겠다는 생각도 듭니다.

struct ifreq i;
char ip[50];
int sock = socket (AF_INET, SOCK_DGRAM, 0);
strcpy (i.ifr_name, "eth0");
if (ioctl (sock, SIOGIFADDR, &i) == -1) {
    printf ("ERROR: SIOGIFADDR\n");
    return -1;
}
inet_ntop (AF_INET, ifr.ifr_addr.sa_data + 2, ip, sizeof(struct sockaddr));
printf ("ip=%s\n", ip);

/*
S(ocket) IOC(tl) G(et) IF XXXX
S(ocket) IOC(tl) S(et) IF XXXX

From linux/sockios.h
SIOCGIFCONF = 0x8912
SIOCGIFINDEX = 0x8933
SIOCGIFFLAGS =  0x8913
SIOCSIFFLAGS =  0x8914
SIOCGIFHWADDR = 0x8927
SIOCSIFHWADDR = 0x8924
SIOCGIFADDR = 0x8915
SIOCSIFADDR = 0x8916
SIOCGIFNETMASK = 0x891B
SIOCSIFNETMASK = 0x891C
SIOCETHTOOL = 0x8946

struct ifreq {
       char ifr_name[IFNAMSIZ];
       union {
           struct sockaddr ifr_addr;
           struct sockaddr ifr_dstaddr;
           struct sockaddr ifr_broadaddr;
           struct sockaddr ifr_netmask;
           struct sockaddr ifr_hwaddr;
           short           ifr_flags;
           int             ifr_ifindex;
           int             ifr_metric;
           int             ifr_mtu;
           struct ifmap    ifr_map;
           char            ifr_slave[IFNAMSIZ];
           char            ifr_newname[IFNAMSIZ];
           char           *ifr_data;
       };
};
*/

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.