添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
想表白的打火机  ·  Custom CSS And JS·  5 月前    · 
英姿勃勃的烤面包  ·  Android ...·  5 月前    · 
傲视众生的鞭炮  ·  科研实习 | ...·  10 月前    · 
睿智的海龟  ·  Problem using client ...·  11 月前    · 
getnameinfo ( const struct sockaddr *sa , socklen_t salen , char *host , size_t hostlen , char *serv , size_t servlen , int flags ); DESCRIPTION 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 (3) and getservbyport (3) functions and is the converse of the getaddrinfo (3) function. If a link-layer address or UNIX-domain 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. For a link-layer address, this can be used as a replacement of the legacy link_ntoa (3) function. The sockaddr structure sa should point to either a sockaddr_in , sockaddr_in6 , sockaddr_dl , or sockaddr_un structure (for IPv4, IPv6, link-layer, or UNIX-domain respectively) that is salen bytes long. If salen is shorter than the length corresponding to the specified address family or longer than sizeof ( struct sockaddr_storage ), it returns EAI_FAMILY. Note that sa->sa_len should be consistent with salen though the value of sa->sa_len is not directly used in this function. The host and service names associated with sa are stored in host and serv which have length parameters hostlen and servlen . The maximum value for hostlen is NI_MAXHOST and the maximum value for servlen is NI_MAXSERV, as defined by < netdb.h >. 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 termina- The flags argument is formed by OR'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 (3) , 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 nu- meric form. NI_NUMERICSERV The service name is returned as a digit string rep- resenting the port number. NI_NUMERICSCOPE The scope identifier is returned as a digit string. NI_DGRAM Specifies that the service being looked up is a datagram service, and causes getservbyport (3) 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 RFC 4007. IPv6 link-local address will appear as a string like " fe80::1%ne0 ". Refer to getaddrinfo (3) for more information. RETURN VALUES getnameinfo () returns zero on success or one of the error codes listed in gai_strerror (3) if an error occurs. EXAMPLES The following code tries to get a numeric host name, and service name, for a given socket address. Observe that there is no hardcoded refer- ence 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\n", hbuf, sbuf); The following version checks if the socket address has a reverse ad- dress 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\n", hbuf); SEE ALSO gai_strerror (3) , getaddrinfo (3) , gethostbyaddr (3) , getservbyport (3) , inet_ntop (3) , link_ntoa (3) , resolver (3) , inet (4) , inet6 (4) , unix (4) , hosts (5) , resolv.conf (5) , services (5) , hostname (7) R. Gilligan, S. Thomson, J. Bound, J. McCann, and W. Stevens, Basic Socket Interface Extensions for IPv6 , RFC 3493, February 2003. S. Deering, B. Haberman, T. Jinmei, E. Nordmark, and B. Zill, IPv6 Scoped Address Architecture , RFC 4007, March 2005. Craig Metz, "Protocol Independence Using the Sockets API", Proceedings of the freenix track: 2000 USENIX annual technical conference , June 2000. STANDARDS The getnameinfo () function is defined by the IEEE Std 1003.1-2004 ("POSIX.1") specification and documented in RFC 3493, "Basic Socket Interface Extensions for IPv6". CAVEATS getnameinfo () can return both numeric and FQDN forms of the address specified in sa . There is no return value that indicates whether the string returned in host is a result of binary to numeric-text transla- tion (like inet_ntop (3) ), or is the result of a DNS reverse lookup. Because of this, malicious parties could set up a PTR record as fol- lows: 1.0.0.127.in-addr.arpa. IN PTR 10.1.1.1 and trick the caller of getnameinfo () into believing that sa is 10.1.1.1 when it is actually 127.0.0.1 . To prevent such attacks, the use of NI_NAMEREQD is recommended when the result of getnameinfo () is used for access control purposes: struct sockaddr *sa; socklen_t salen; char addr[NI_MAXHOST]; struct addrinfo hints, *res; int error; error = getnameinfo(sa, salen, addr, sizeof(addr), NULL, 0, NI_NAMEREQD); if (error == 0) { memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_DGRAM; /*dummy*/ hints.ai_flags = AI_NUMERICHOST; if (getaddrinfo(addr, "0", &hints, &res) == 0) { /* malicious PTR record */ freeaddrinfo(res); printf("bogus PTR record\n"); return -1; /* addr is FQDN as a result of PTR lookup */ } else { /* addr is numeric string */ error = getnameinfo(sa, salen, addr, sizeof(addr), NULL, 0, NI_NUMERICHOST); FreeBSD 13.2 June 27, 2022 GETNAMEINFO(3) NAME | SYNOPSIS | DESCRIPTION | RETURN VALUES | EXAMPLES | SEE ALSO | STANDARDS | CAVEATS

Want to link to this manual page? Use this URL:
< https://man.freebsd.org/cgi/man.cgi?query=getnameinfo&sektion=3&manpath=FreeBSD+14.1-RELEASE+and+Ports >

| help