네트워크 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;
};
};
*/
'IT' 카테고리의 다른 글
[barrier] ERROR: ipc connection error, connection refused 오류 발생시 (0) | 2022.02.24 |
---|---|
[google] 사진 무제한 업로드 서비스 종료 예고 (0) | 2020.11.12 |
AbstractSpoon ToDoList 한글 번역 파일 공개 (0) | 2020.07.06 |
matplotlib 에서 한글과 '-' 동시에 표시하기 (0) | 2019.11.12 |
dereferencing pointer to incomplete type 오류시 체크 사항 (0) | 2018.10.12 |