gethostbyname : 문자열 호스트 이름(도메인 이름)으로 호스트 정보(IP주소 정보 등)를 얻는 함수
inet_addr : IPv4 문자열 주소 형태를 바이너리 주소 형태(network byte order)로 변환하는 함수
inet_aton : IPv4 문자열 주소 형태를 바이너리 주소 형태(network byte order)로 변환하는 함수
inet_pton : IPv4/IPv6 문자열 주소 형태를 바이너리 주소 형태로 변환하는 함수
👉 getaddrinfo : 위의 함수들을 포함하는 함수로, 현재에 와서는 이 함수를 가장 많이 사용한다고 한다.
gethostbyaddr : 바이너리 IP 주소로 호스트 정보를 얻는 함수
inet_ntoa : IPv4 바이너리 주소(network) 형태를 문자열 주소 형태(address)로 변환하는 함수
inet_ntop : IPv4/IPv6 바이너리 주소(network) 형태를 문자열 주소 형태로 변환하는 함수
👉 getnameinfo : 위의 함수들을 포함하는 함수로, 현재에 와서는 이 함수를 가장 많이 사용한다고 한다.
#include <netdb.h>
extern int h_errno;
struct hostent *gethostbyname(const char *name);
#include <sys/socket.h> /* for AF_INET */
struct hostent *gethostbyaddr(cont void *addr, socklen_t len, int type);
hostent 구조체는 에 다음과 같이 정의되어 있다.
struct hostent {
char *h _name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of address */
}
gethostbyname 예제
gethostbyname_example.c 의 코드이다.
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
struct hostent *hp = NULL;
int i;
if (argc < 2) {
printf("Usage: %s <hostname>\n", argv[0]);
exit(EXIT_FAILURE);
}
hp = gethostbyname(argv[1]);
if (!hp) {
printf("gethostbyname error: %s\n", hstrerror(h_errno));
return 0;
}
printf("h_name: %s\n", hp->h_name);
printf("h_length: %d\n", hp->h_length);
for (i = 0; i < hp->h_length && hp->h_addr_list[i]; i++) {
char *addr = (char*)hp->h_addr_list[i];
struct in_addr *in = (struct in_addr*)addr;
printf("h_addr_list[%d]: %s\n", i, inet_ntoa(*in));
}
return 0;
}
실행 결과
getaddrinfo(), getnameinfo()
getaddrinfo() 및 getnameinfo() 함수는 운영 체제의 네트워킹 API를 위해 사람이 읽을 수 있는 텍스트 표현과 구조화 된 이진 형식 간에 도메인 이름, 호스트 이름 및 IP 주소를 변환한다.
두 기능 모두 POSIX 표준 API (Application Programming Interface)에 포함되어있다.
getaddrinfo와 getnameinfo는 서로 역함수 관계이다.
네트워크 프로토콜에 구애 받지 않으며 IPv4와 IPv6을 모두 지원한다.
프로토콜 독립 응용 프로그램을 구축 할 때 이름을 확인하고 레거시 IPv4 코드를 IPv6 인터넷으로 전환하는 데 권장되는 인터페이스이다.
내부적으로 이 함수는 gethostbyname()과 같은 다른 하위 수준 함수를 호출해 DNS를 사용해 확인을 수행한다.
네트워킹 API 내에서 주소와 호스트 이름을 나타내는데 사용되는 C 데이터 구조는 다음과 같다.
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr* ai_addr;
char* ai_canonname; /* canocical name */
struct addrinfo* ai_next; /* this struct can form a linked list */
};
getaddrinfo()는 호스트 이름 또는 IP 주소를 나타내는 사람이 읽을 수 있는 텍스트 문자열을 구조체 addrinfo 구조의 동적으로 할당된 링크 목록으로 변환한다.
19. 주소 변환
주소 변환 관련 주요 함수들
gethostbyname 예제
getaddrinfo(), getnameinfo()
flags
freeaddrinfo()
const char *gai_strerror(int errcode);
주소 변환 실습