이 글에서는 C/C++ 프로그래밍을 통해 로컬 시스템의 호스트 이름(Host Name)과 IP 주소를 손쉽게 조회하는 방법을 알아봅니다. 소켓 관련 표준 라이브러리 함수 몇 가지만 활용하면 별도의 외부 도구 없이도 자신의 컴퓨터 정보를 코드로 확인할 수 있습니다.
핵심 함수 살펴보기
IP 주소와 호스트 이름을 얻기 위해 사용되는 주요 함수는 다음과 같습니다. 각 함수는 서로 다른 역할을 담당합니다.
| 번호 | 함수 및 설명 |
|---|---|
| 1 | gethostname() 로컬 컴퓨터의 표준 호스트 이름을 조회합니다. |
| 2 | gethostbyname() 호스트 데이터베이스에서 특정 호스트 이름에 해당하는 상세 정보(IP 주소 목록 등)를 검색합니다. |
| 3 | inet_ntoa() IPv4 인터넷 네트워크 주소(바이너리 형태)를 사람이 읽을 수 있는 점(.)으로 구분된 10진수 문자열 형식으로 변환합니다. |
예제 코드
아래는 위 세 가지 함수를 조합하여 호스트 이름과 IP 주소를 출력하는 완전한 C 프로그램입니다. 각 단계마다 오류 검사용 헬퍼 함수를 두어 예외 상황에 대비했습니다.
#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 문자열을 점분리 십진수 형식으로 변환
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
참고 사항
출력 결과의 127.0.1.1은 루프백(loopback) 계열 주소로, 리눅스 환경에서 흔히 볼 수 있는 값입니다. 실제 외부 통신에 사용되는 공인 또는 사설 IP를 확인하려면 네트워크 인터페이스 설정을 함께 참고하는 것이 좋습니다. 또한 이 코드는 POSIX 기반 환경(Linux, macOS)을 기준으로 작성되었으며, Windows에서 실행하려면 winsock2.h와 ws2_32.lib를 사용하도록 일부 수정이 필요합니다.