the service to a port number. hints can be either NULL or an addrinfo structure with the type of service requested. res is a pointer that points to a new addrinfo structure with the information requested after successful completion of the function. The function returns 0 upon success and non-zero error value if it fails. Although implementations vary among platforms, the function first attempts to obtain a port number usually by branching on service. If the string value is a number, it converts it to an integer and calls htons(). If it is a service name, such as www, the service is looked up with getservbyname(), using the protocol derived from hints->ai_socktype as the second parameter to that function. Then, if hostname is given (not NULL), a call to gethostbyname() resolves it, or otherwise the address 0.0.0.0 is used, if hints->ai_flags is set to AI_PASSIVE, and 127.0.0.1 otherwise. It allocated a new addrinfo structure filled with the appropriate sockaddr_in in one of these conditions and also adds the port retrieved at the beginning to it. Finally, the **res parameter is dereferenced to make it point to a newly allocated addrinfo structure. In some implementations, such as the Unix version for Mac OS, the hints->ai_protocol overrides the hints->ai_socktype value while in others it is the opposite, so both need to be defined with equivalent values for the code to be work across multiple platforms. freeaddrinfo() This function frees the memory allocated by function getaddrinfo(). As the result of the latter is a linked list of addrinfo structures starting at the address ai, freeaddrinfo() loops through the list and frees each one in turn. void freeaddrinfo(struct addrinfo *ai); getnameinfo() The function getnameinfo() converts the internal binary representation of an IP address in the form of a pointer to a struct sockaddr into text strings consisting of the hostname or, if the address cannot be resolved into a name, a textual IP address representation, as well as the service port name or number. The function prototype is specified as follows: int getnameinfo(const struct sockaddr* sa, socklen_t salen, char* host, size_t hostlen, char* serv, size_t servlen, int flags); Example The following example uses getaddrinfo() to resolve the domain name www.example.com into its list of addresses and then calls getnameinfo() on each result to return the canonical name for the address. In general, this produces the original hostname, unless the particular address has multiple names,