모든 프로토콜에 대해 호스트 이름, 호스트 주소, 포트 번호, 서비스 이름을 소켓 주소 구조체로 변환해준다. 모든 프로토콜에 대해!!!!!!!!
<aside> 💡 네트워크 호스트 정보를 받아서 네트워크 주소 정보(IP address)를 가져오거나 그 반대를 수행하는 함수
</aside>
<aside> 💡 입력한 host와 service(port)에 대응되는 addrinfo 구조체 링크드 리스트를 가리키는 포인터를 반환한다.
</aside>
int getaddrinfo(const char *host, /* Hostname or address */
const char *service, /* Port or service name */
const struct addrinfo *hints,/* Input parameters */
struct addrinfo **result); /* Output linked list */
/* 메모리 누수를 피하기 위해 addrinfo 구조체 리스트를 반환한다. */
void freeaddrinfo(struct addrinfo *result); /* Free linked list */
/* 에러 시에 에러 코드를 메세지로 바꿔준다. */
const char *gai_strerror(int errcode);
host : 도메인 주소 혹은 Dotted Decimal 주소 둘 다 가능
service : 서비스 이름(http....) 혹은 10진수 포트 번호(80, 22,...) 다 가능
<aside> 💡 host와 service 둘 중 하나를 인자로 넣으면 다른 하나는 NULL로 넣는다.
</aside>
구조체 hint : 내가 찾고 싶은 결과가 어떤 유형인지를 알려준다. addrinfo 구조체 result에 대해 희망하는 유형을 알려준다.
memset
을 이용해 우선 구조체를 0으로 초기화한 다음, 원하는 유형들을 선택한다.
ai_family, ai_socktype, ai_protocol, ai_flags 등이 있다.
ai_family
IPv4 주소만 받거나(AF_INET), IPv6 주소만 받거나(AF_INET6), 둘 다 받을 수도(AF_UNSPEC) 있다.
ai_socktype
SOCK_STREAM으로 설정하면 이 소켓 주소를 연결 소켓으로 활용한다는 의미.
ai_protocol
ai_flags
AI_ADDRCONFIG
로컬 호스트가 IPv4로 설정된 경우에만 IPv4를 리턴한다. IPv6의 경우도 마찬가지. 만약 내가 IPv4 시스템을 사용하고 있다면 IPv6 주소를 받으면 에러가 날 것이다. 이를 사전에 방지한다.
AI_CANONNAME
기본 값은 NULL이지만, 설정된다면 getaddrinfo 함수가 addrinfo 구조체의 첫 리스트에 있는 호스트의 canonical(공식적) 이름을 가리키도록 한다.
AI_NUMERICSERV
service 인자가 서비스 이름일때는 받지 않는다. 오로지 포트 넘버만 받는다.
AI_PASSIVE
기본적으로 getaddrinfo 함수는 클라이언트에 적합한 능동적인 소켓을 리턴한다. 만약 이 flag가 켜지고 hostname이 NULL일 경우에는 서버에서 사용할 수 있는 듣기 소켓의 주소, 즉 와일드카드 주소를 반환한다.