Socket address structure to hostname and service name.
#include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags);
The getnameinfo() function is used to convert a sockaddr structure to a pair of host name and service strings. It is a replacement for and provides more flexibility than the gethostbyaddr and getservbyport functions and is the converse of the getaddrinfo function.
If a link-layer address is passed to getnameinfo(), its ASCII representation will be stored in host. The string pointed to by serv will be set to the empty string if non-NULL; flags will always be ignored. This is intended as a replacement for the legacy link_ntoa function.
The structure sa should point to either a sockaddr_in, sockaddr_in6, or sockaddr_dl structure (for IPv4, IPv6 or link-layer respectively) that is salen bytes long.
The host and service names associated with sa are stored in host and serv which have length parameters hostlen and servlen. The maximum v alue for hostlen is NI_MAXHOST and the maximum value for servlen is NI_MAXSERV, as defined by If a length parameter is zero, no string will be stored. Otherwise, enough space must be provided to store the host name or service string plus a byte for the NUL terminator.
The flags argument is formed by OR Ns 'ing the following values:
NI_NOFQDN |
A fully qualified domain name is not required for local hosts. The local part of the fully qualified domain name is returned instead. |
NI_NUMERICHOST |
Return the address in numeric form, as if calling inet_ntop, instead of a host name. |
NI_NAMEREQD |
A name is required. If the host name cannot be found in DNS and this flag is set, a non-zero error code is returned. If the host name is not found and the flag is not set, the address is returned in numeric form. |
NI_NUMERICSERV |
The service name is returned as a digit string representing the port number. |
NI_DGRAM |
Specifies that the service being looked up is a datagram service, and causes getservbyport to be called with a second argument of "udp" instead of its default of "tcp". This is required for the few ports (512-514) that have different services for UDP and TCP. |
This implementation allows numeric IPv6 address notation with scope identifier, as documented in chapter 11 of draft-ietf-ipv6-scoping-arch-02.txt. IPv6 link-local address will appear as a string like "fe80::1%ne0" "." Refer to getaddrinfo for more information.
The following code tries to get a numeric host name, and service name, for a given socket address. Observe that there is no hardcoded reference to a particular address family.
struct sockaddr *sa; /* input */ char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; if (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) { errx(1, "could not get numeric hostname"); /*NOTREACHED*/ } printf("host=%s, serv=%s\en", hbuf, sbuf);
The following version checks if the socket address has a reverse address mapping:
struct sockaddr *sa; /* input */ char hbuf[NI_MAXHOST]; if (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD)) { errx(1, "could not resolve hostname"); /*NOTREACHED*/ } printf("host=%s\en", hbuf);
Versions | Link to |
---|---|
INtime 4.0 | netlib.lib |
Basic Socket Interface Extensions for IPv6 RFC 2553 March 1999 "IPv6 Scoped Address Architecture" internet draft draft-ietf-ipv6-scoping-arch-02.txt Protocol Independence Using the Sockets API, "Proceedings of the freenix track: 2000 USENIX annual technical conference" June 2000