이 글에서는 C 언어를 사용해 로컬 시스템의 호스트 이름(Host Name)과 IP 주소를 간단하게 조회하는 방법을 알아봅니다. 몇 가지 표준 네트워크 함수만 활용하면 누구나 쉽게 구현할 수 있습니다.
주요 함수 소개
프로그램에서 사용되는 핵심 함수들은 각각 다음과 같은 역할을 담당합니다.
| 함수 | 설명 |
|---|---|
| gethostname() | 로컬 컴퓨터의 표준 호스트 이름을 가져옵니다. |
| gethostbyname() | 호스트 데이터베이스에서 호스트 이름에 해당하는 호스트 정보를 찾습니다. |
| inet_ntoa() | IPv4 인터넷 네트워크 주소를 점으로 구분된 십진수(dotted decimal) 형식의 ASCII 문자열로 변환합니다. |
예제 코드
아래 예제는 위 세 가지 함수를 사용해 현재 시스템의 호스트 이름과 IP 주소를 출력하는 전체 코드입니다. 각 단계마다 오류 검사용 헬퍼 함수를 두어 안정성을 높였습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void check_host_name(int hostname) { // 로컬 컴퓨터의 호스트 이름 반환
if (hostname == -1) {
perror("gethostname");
exit(1);
}
}
void check_host_entry(struct hostent * hostentry) { // 호스트 이름으로 호스트 정보 조회
if (hostentry == NULL) {
perror("gethostbyname");
exit(1);
}
}
void IP_formatter(char *IPbuffer) { // IP 문자열을 dotted decimal 형식으로 변환
if (NULL == IPbuffer) {
perror("inet_ntoa");
exit(1);
}
}
main() {
char host[256];
char *IP;
struct hostent *host_entry;
int hostname;
hostname = gethostname(host, sizeof(host)); // 호스트 이름 조회
check_host_name(hostname);
host_entry = gethostbyname(host); // 호스트 정보 조회
check_host_entry(host_entry);
IP = inet_ntoa(*((struct in_addr*) host_entry->h_addr_list[0])); // IP 문자열로 변환
printf("Current Host Name: %s\n", host);
printf("Host IP: %s\n", IP);
}실행 결과
프로그램을 컴파일하여 실행하면 다음과 같이 현재 시스템의 호스트 이름과 IP 주소가 출력됩니다.
Current Host Name: soumyadeep-VirtualBox Host IP: 127.0.1.1
동작 원리 정리
전체 흐름은 다음과 같습니다.
① gethostname()으로 로컬 시스템의 호스트 이름을 버퍼에 저장합니다.
② gethostbyname()에 호스트 이름을 전달해 hostent 구조체 형태의 상세 정보를 얻습니다.
③ h_addr_list[0]에서 첫 번째 네트워크 주소를 꺼내 inet_ntoa()로 사람이 읽기 쉬운 문자열 형태의 IP로 변환한 뒤 화면에 출력합니다.
참고로 실행 결과의 127.0.1.1은 루프백(loopback) 계열의 로컬 주소로, 실제 환경에 따라 공인 IP나 사설 IP가 다르게 표시될 수 있습니다.