This function takes a service location (nodename) or a service name (servname), or both, and returns a pointer to a linked list of one or more structures of type addrinfo. Its members specify data obtained from the local hosts database TCPIP$ETC:IPNODES.DAT file, the local TCPIP$HOSTS.DAT file, or one of the files distributed by DNS/BIND. The NETDB.H header file defines the addrinfo structure. If the hints argument is non-NULL, all addrinfo structure members other than the following members must be zero or a NULL pointer: o ai_flags Controls the processing behavior of getaddrinfo(). See Member Values for a complete description of the flags. o ai_family Specifies to return addresses for use with a specific protocol family. - If you specify a value of AF_UNSPEC, getaddrinfo() returns addresses for any protocol family that can be used with nodename or servname. - If the value is not AF_UNSPEC and ai_protocol is not zero, getaddrinfo() returns addresses for use only with the specified protocol family and protocol. - If the application handles only IPv4, set this member of the hints structure to PF_INET. o ai_socktype Specifies a socket type for the given service. If you specify a value of 0, you will accept any socket type. This resolves the service name for all socket types and returns all successful results. o ai_protocol Specifies a network protocol. If you specify a value of 0, you will accept any protocol. If the application handles only TCP, set this member to IPPROTO_TCP. Member Values describes the values for ai_flags members. Table 4-1 ai_flags Member Values Flag Value Description AI_V4MAPPED If ai_family is AF_INET, the flag is ignored. If ai_family is AF_INET6, getaddrinfo() searches for AAAA records. The lookup sequence is: 1. Local hosts database 2. TCPIP$ETC:IPNODES.DAT 3. BIND database The lookup for a particular type of record, for example an AAAA record, will be performed in each database before moving on to perform a lookup for the next type of record. o If AAAA records are found, returns IPv6 addresses; no search for A records is performed. o If no AAAA records are found, searches for A records. o If A records found, returns IPv4-mapped IPv6 addresses. o If no A records found, returns a NULL pointer. AI_ALL| If ai_family is AF_INET, the flag is ignored. AI_V4MAPPED If the ai_family is AF_INET6, getaddrinfo() searches for AAAA records. The lookup sequence is: 1. Local hosts database 2. TCPIP$ETC:IPNODES.DAT 3. BIND database The lookup for a particular type of record, for example an AAAA record, will be performed in each database before moving on to perform a lookup for the next type of record. o If AAAA records are found, IPv6 addresses will be included with the returned addresses. o If A records are found, returns IPv4-mapped IPv6 addresses and also any IPv6 addresses that were found with the AAAA record search. o If no A records found, returns a NULL pointer. AI_CANONNAME If the nodename argument is not NULL, the function searches for the specified node's canonical name. Upon successful completion, the ai_canonname member of the first addrinfo structure in the linked list points to a null-terminated string containing the canonical name of the specified node name. If the nodename argument is an address literal, the ai_cannonname member will refer to the nodename argument that has been converted to its numeric binary form, in network byte order. If the canonical name is not available, the ai_ canonname member refers to the nodename argument or to a string with the same contents. The ai_flags field contents are undefined. AI_NUMERICHOST A non-NULL node name string must be a numeric host address string. Resolution of the service name is not performed. AI_NUMERICSERV A non-NULL service name string must be a numeric port string. Resolution of the service name is not performed. AI_PASSIVE Returns a socket address structure that your application can use in a call to bind(). If the nodename parameter is a NULL pointer, the IP address portion of the socket address structure is set to INADDR_ANY (for an IPv4 address) or IN6ADDR_ANY_INIT (for an IPv6 address). If not set, returns a socket address structure that your application can use to call connect() (for a connection-oriented protocol) or either connect(), sendto(), or sendmsg() (for a connectionless protocol). If the nodename argument is a NULL pointer, the IP address portion of the socket address structure is set to the loopback address. AI_ADDRCONFIG Used in combination with other flags, modifies the search based on the source address or addresses configured on the system. You can use the flags in any combination to achieve finer control of the translation process. Many applications use the combination of the AI_ADDRCONFIG and AI_V4MAPPED flags to control their search. o If the value of ai_family is AF_INET, and an IPv4 source address is configured on the system, getaddrinfo() searches for A records only. If found, getaddrinfo() returns IPv4 addresses. If not, getaddrinfo() returns a NULL pointer. o If the value of ai_family is AF_INET6 and an IPv6 source address is configured on the system, getaddrinfo() searches for AAAA records. If found, getaddrinfo() returns IPv6 addresses. If not, and if an IPv4 address is configured on the system, getaddrinfo() searches for A records. If found, getaddrinfo() returns IPv4-mapped IPv6 addresses. If not, getaddrinfo() returns a NULL pointer. These flags are defined in the NETDB.H header file. addrinfo Structure Processing Upon successful return, getaddrinfo() returns a pointer to a linked list of one or more addrinfo structures. The application can process each addrinfo structure in the list by following the ai_next pointer until a NULL pointer is encountered. In each returned addrinfo structure, the ai_family, ai_socktype, and ai_ protocol members are the corresponding arguments for a call to the socket() function. The ai_addr member points to a filled-in socket address structure whose length is specified by the ai_ addrlen member.