getaddrinfo 서브루틴
용도
프로토콜에 독립적인 호스트 이름에서 주소로의 변환.
라이브러리
라이브러리libc.a
구문
#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo (hostname, servname, hints, res)
const char *hostname;
const char *servname;
const struct addrinfo *hints;
struct addrinfo **res;설명
호스트 이름 및 서버 이름 매개변수는 참조할 호스트 이름 및/또는 서비스 이름을 설명합니다. 이 인수 중 0 또는 하나는 NULL일 수 있습니다. NULL이 아닌 호스트 이름은 호스트 이름 또는 숫자 호스트 주소 문자열( IPv4 경우 점으로 구분된 10진수, IPv6 경우 16진수)일 수 있습니다. NULL이 아닌 서버 이름은 서비스 이름 또는 십진수 포트 번호일 수 있습니다.
힌트 매개변수는 원하는 반환 정보에 대한 힌트를 지정합니다. 호스트 이름 및 서버 이름 매개 변수는 널로 끝나는 문자열 또는 NULL에 대한 포인터입니다. 이 인자 중 하나 또는 둘 모두 NULL이 아닌 포인터여야 합니다. 일반 클라이언트 시나리오에서는 호스트 이름 과 서버 이름 매개 변수가 모두 지정됩니다. 일반 서버 시나리오에서는 서버 이름 매개변수만 지정됩니다. NULL이 아닌 호스트 이름 문자열은 호스트 이름 또는 숫자 호스트 주소 문자열(예: 점으로 구분된 10진수 IPv4 주소 또는 IPv6 16진수 주소)일 수 있습니다. NULL이 아닌 서버 이름 문자열은 서비스 이름 또는 10진수 포트 번호일 수 있습니다.
호출자는 선택적으로 호출자가 지원하는 소켓 유형에 관한 힌트를 제공하기 위해 hints 매개변수가 가리키는 addrinfo 구조를 전달할 수 있습니다. 이 힌트 구조에서 ai_flags, ai_eflags ai_family, ai_socktype 및 ai_protocol을 제외한 모든 멤버는 0이거나 NULL 포인터여야 합니다. Ai_family에 대한 PF_UNSPEC 값은 호출자가 모든 프로토콜 패밀리를 수락한다는 의미입니다. Ai_socktype의 값이 0이면 호출자가 모든 소켓 유형을 허용한다는 의미입니다. Ai_protocol의 값이 0이면 호출자가 모든 프로토콜을 수락한다는 의미입니다. 예를 들어 호출자가 UDP가 아닌 TCP만 처리하는 경우, getaddrinfo 서브루틴이 호출될 때 힌트 구조의 ai_socktype 멤버를 SOCK_STREAM으로 설정해야 합니다. 호출자가 IPv6 아닌 IPv4 처리하는 경우, getaddrinfo가 호출될 때 힌트 구조의 ai_family 멤버가 PF_INET으로 설정되어야 합니다. Getaddrinfo의 힌트 매개변수가 NULL 포인터인 경우, 호출자가 ai_family를 PF_UNSPEC으로 설정하여 0으로 초기화된 addrinfo 구조를 채우는 것과 동일합니다.
성공적으로 반환되면 하나 이상의 addrinfo 구조의 링크된 목록에 대한 포인터가 res 매개변수를 통해 반환됩니다. 호출자는 NULL 포인터가 발견될 때까지 ai_next 포인터를 따라 이 목록의 각 addrinfo 구조를 처리할 수 있습니다. 반환된 각 addrinfo 구조체에서 ai_family, ai_socktype, ai_protocol의 세 멤버는 소켓 서브루틴 호출에 해당하는 인자입니다. 각 addrinfo 구조에서 ai_addr 멤버는 ai_addrlen 멤버가 길이를 지정하는 채워진 소켓 주소 구조를 가리킵니다.
힌트 구조체의 ai_flags 멤버에 AI_PASSIVE 비트가 설정되어 있으면 호출자는 바인드 서브루틴 호출에서 반환된 소켓 주소 구조를 사용할 계획입니다. 호스트 이름 매개변수가 NULL 포인터인 경우, 소켓 주소 구조의 IP 주소 부분은 IPv4 주소의 경우 INADDR_ANY로, IPv6 주소의 경우 IN6ADDR_ANY_INIT 설정됩니다.
힌트 구조체의 ai_flags 멤버에 AI_PASSIVE 비트가 설정되지 않은 경우, 반환된 소켓 주소 구조체는 연결 지향 프로토콜의 경우 connect 서브루틴 또는 연결이 없는 프로토콜의 경우 connect, sendto 또는 sendmsg 서브루틴을 호출할 준비가 된 상태입니다. 호스트 이름 매개변수가 NULL 포인터인 경우 소켓 주소 구조의 IP 주소 부분은 루프백 주소로 설정됩니다.
힌트 구조체의 ai_flags 멤버에 AI_CANONNAME 비트가 설정되어 있으면 성공적으로 반환되면 연결된 목록의 첫 번째 addrinfo 구조체의 ai_canonname 멤버가 지정된 호스트 이름의 정식 이름이 포함된 NULL로 끝나는 문자열을 가리킵니다.
AI_NUMERICHOST 플래그를 지정한 경우, 제공된 NULL이 아닌 노드 이름 문자열은 숫자 호스트 주소 문자열입니다. 그렇지 않으면 (EAI_NONAME) 오류가 반환됩니다. 이 플래그를 사용하면 모든 유형의 이름 확인 서비스(예: DNS)가 호출되지 않습니다.
AI_NUMERICSERV 플래그를 지정한 경우, 제공된 NULL이 아닌 서버 이름 문자열은 숫자 포트 문자열입니다. 그렇지 않으면 (EAI_NONAME) 오류가 반환됩니다. 이 플래그를 사용하면 모든 유형의 이름 확인 서비스가 호출되지 않습니다.
AI_V4MAPPED 플래그가 AF_INET6 ai_family 값과 함께 지정되면, 일치하는 IPv6 주소가 없을 때(ai_addrlen은 16) getaddrinfo 서브루틴은 IPv4-mapped IPv6 주소를 반환합니다. 예를 들어 DNS를 사용할 때 AAAA 또는 A6 레코드가 발견되지 않으면 A 레코드에 대한 쿼리가 수행됩니다. 발견된 모든 항목은 IPv4-mapped IPv6 주소로 반환됩니다. Ai_family가 AF_INET6 같지 않으면 AI_V4MAPPED 플래그는 무시됩니다.
힌트 구조의 ai_flags 멤버에 AI_EXTFLAGS가 지정되고 ai_eflags가 0이 아닌 값으로 지정되면 주소 선택 알고리즘이 영향을 받습니다. 주소 선택 알고리즘은 각 addrinfo 구조체의 ai_addr 멤버에 포함된 주소와 이 주소에 도달할 수 있는 소스 주소를 고려하여 일련의 정렬된 규칙(RFC 3484)을 사용하여 반환된 addrinfo 구조체 목록을 정렬합니다. Ai_eflags는 이전에 상위 규칙이 주소 집합을 정렬하지 않은 경우 아래에 설명된 규칙이 적용됨을 의미하는 기본 설정을 표현합니다.
Ai_eflags는 다음 플래그의 조합으로 설정할 수 있습니다:
- IPV6_PREFER_SRC_HOME: 홈 소스 주소에서 연결할 수 있는 주소를 선호합니다
- IPV6_PREFER_SRC_COA: 케어 오브 소스 주소에서 연결할 수 있는 주소를 선호합니다
- IPV6_PREFER_SRC_TMP: 임시 주소에서 연결할 수 있는 주소를 선호합니다
- IPV6_PREFER_SRC_PUBLIC: 공개 소스 주소에서 연결할 수 있는 기본 설정 주소입니다
- IPV6_PREFER_SRC_CGA: 암호로 생성된 주소(CGA) 소스 주소에서 연결할 수 있는 기본 설정 주소입니다
- IPV6_PREFER_SRC_NONCGA: 비-CGA 소스 주소에서 연결할 수 있는 기본 주소
예를 들어, 주소 선택 알고리즘이 임시 주소에서 도달할 수 있는 주소가 있는 addrinfo 구조를 가능한 한 공개 주소에서 도달할 수 있는 주소보다 먼저 반환한다는 의미의 IPV6_PREFER_SRC_TMP ai_eflags는 임시 주소에서 도달할 수 있는 주소가 있는 구조의 순서를 지정합니다. 모순되는 플래그(예: IPV6_PREFER_SRC_TMP 및 IPV6_PREFER_SRC_PUBLIC)를 동시에 설정하면 오류 EINVAL이 발생합니다.
AI_ADDRCONFIG 플래그가 지정된 경우, 노드에 하나 이상의 IPv6 소스 주소가 구성된 경우에만 AAAA 또는 A6 레코드에 대한 쿼리가 수행되어야 합니다. A 레코드에 대한 쿼리는 노드에 하나 이상의 IPv4 소스 주소가 구성된 경우에만 발생해야 합니다. 루프백 주소는 구성된 소스 주소로 유효하지 않은 것으로 간주됩니다.
Getaddrinfo 서브루틴이 반환하는 모든 정보는 동적으로 할당됩니다: addrinfo 구조체, 소켓 주소 구조체, addrinfo 구조체가 가리키는 표준 호스트 이름 문자열입니다. 이 정보를 시스템에 반환하기 위해 freeaddrinfo 하위 루틴이 호출됩니다.
Addrinfo 구조는 다음과 같이 정의됩니다:
struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
int ai_family; /* PF_xxx */
int ai_socktype; /* SOCK_xxx */
int ai_protocol; /* 0 or IP=PROTO_xxx for IPv4 and IPv6 */
size_t ai_addrlen; /* length of ai_addr */
char *ai_canonname; /* canoncial name for hostname */
struct sockaddr *ai_addr; /* binary address */
struct addrinfo *ai_next; /* next structure in linked list */
int ai_eflags; /* Extended flags for special usage */
}리턴 값
쿼리가 성공하면 res 매개변수를 통해 하나 이상의 addrinfo 구조의 링크된 목록에 대한 포인터가 반환됩니다. 반환 값이 0이면 성공입니다. 쿼리가 실패하면 0이 아닌 오류 코드가 반환됩니다.
오류 코드
다음은 0이 아닌 오류 코드의 이름입니다. 자세한 정의는 netdb.h 참조하세요.
| 항목 | 설명 |
|---|---|
| EAI_ADDRFAMILY | 호스트명에 대한 주소 패밀리가 지원되지 않음 |
| EAI_AGAIN | 이름 분석의 일시적 장애 |
| EAI_BADFLAGS | Ai_flags의 값이 잘못되었습니다 |
| EAI_FAIL | 이름 분석의 회복 불능 장애 |
| EAI_FAMILY | aI_FAMILY 지원되지 않음 |
| EAI_MEMORY | 메모리 할당 실패 |
| EAI_NODATA | 호스트 이름과 연결된 주소가 없습니다 |
| EAI_이름없음 | 호스트 이름 또는 서버 이름이 제공되지 않았거나 알 수 없음 |
| EAI_서비스 | aI_SOCKTYPE에 지원되지 않는 서버 이름 |
| EAI_SOCKTYPE | aI_SOCKTYPE 지원되지 않음 |
| EAI_SYSTEM | 시스템 오류가 errno에 리턴됨 |
| EAI_BADEXTFLAGS | Ai_eflags에 잘못된 값이 있습니다 |