본문으로 바로가기

Local IP 알아내기

category 개발일기/팁 & 테크 2018.09.19 09:51

LXC Container 환경에서 내부 브릿지 네트워크 환경을 설정할 경우 network interface 기준으로 IP을 확인해야 한다. 그렇지 않으면 정상적인 IP를 얻을 수 없다.


단일 환경이고 시스템의 DNS 설정이 되어 있다면 gethostbyname() 함수를 이용하여 IP를 얻을 수 있으나, 전제 조건으로 시스템이 이미 인터넷 환경에 연결이 되어 있어야 한다. 인터넷이 연결된 상태가 아닌 경우라면 아래 소스를 참고하면 interface 별로 IP를 확인 할 수 있다.

#include <netdb.h>
#include <ifaddrs.h>
#include <sys/types.h>
#include <sys/socket.h>

int main(int argc, char *argv[])
{
	int s;

	char host[NI_MAXHOST];
	struct ifaddrs *ifaddr, *ifa;

	if(getifaddrs(&ifaddr) < 0)
	{
		printf("ERROR :: %s() : getifaddrs()\n", __FUNCTION__);
		return -1;
	}

	memset(host, 0x00, sizeof(host));
	for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) 
	{
		if(ifa->ifa_addr == NULL)
			continue;  

		s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

		if(ifa->ifa_addr->sa_family == AF_INET)
		{
			if(strcmp(ifa->ifa_name, "lxcbr0") == 0 || strcmp(ifa->ifa_name, "mnet0") == 0 || strcmp(ifa->ifa_name,"anet0") == 0)
			{
				if(s != 0)
				{
					printf("getnameinfo() failed: %s\n", gai_strerror(s));
					freeifaddrs(ifaddr);
					return -1;
				}

				printf("\tInterface : <%s>\n", ifa->ifa_name);
				printf("\tAddress   : <%s>\n", host); 
			}
		}
	}
	freeifaddrs(ifaddr);
}

위의 코드에서 아래의 조건식을 제거할 경우, 시스템의 모든 interface에 대해 IP 정보를 출력한다.

if(strcmp(ifa->ifa_name, "lxcbr0") == 0 || strcmp(ifa->ifa_name, "mnet0") == 0 || strcmp(ifa->ifa_name,"anet0") == 0)

위의 조건식은 내가 원하는 interface만 출력하기 위해 조건식을 설정한 것이다.

'개발일기 > 팁 & 테크' 카테고리의 다른 글

Binary to C - bin2c  (0) 2018.12.06
Local IP 알아내기  (0) 2018.09.19
우분투 18.04 개발 환경 구성  (0) 2018.08.23
데몬에서 강제 프린트 방법  (0) 2018.08.09
GStreamer 1.0 개발환경 구성  (0) 2018.08.05
lirc - ir record 방법  (0) 2018.06.29

댓글을 달아 주세요