Node:Host Names, Previous:Host Address Functions, Up:Host Addresses
Besides the standard numbers-and-dots notation for Internet addresses,
you can also refer to a host by a symbolic name.  The advantage of a
symbolic name is that it is usually easier to remember.  For example,
the machine with Internet address 158.121.106.19 is also known as
alpha.gnu.org; and other machines in the gnu.org
domain can refer to it simply as alpha.
Internally, the system uses a database to keep track of the mapping
between host names and host numbers.  This database is usually either
the file /etc/hosts or an equivalent provided by a name server. 
The functions and other symbols for accessing this database are declared
in netdb.h.  They are BSD features, defined unconditionally if
you include netdb.h.
| struct hostent | Data Type | 
| This data type is used to represent an entry in the hosts database.  It
has the following members: 
 | 
As far as the host database is concerned, each address is just a block
of memory h_length bytes long.  But in other contexts there is an
implicit assumption that you can convert IPv4 addresses to a
struct in_addr or an uint32_t.  Host addresses in
a struct hostent structure are always given in network byte
order; see Byte Order.
You can use gethostbyname, gethostbyname2 or
gethostbyaddr to search the hosts database for information about
a particular host.  The information is returned in a
statically-allocated structure; you must copy the information if you
need to save it across calls.  You can also use getaddrinfo and
getnameinfo to obtain this information.
| struct hostent * gethostbyname (const char *name) | Function | 
| The gethostbynamefunction returns information about the host
named name.  If the lookup fails, it returns a null pointer. | 
| struct hostent * gethostbyname2 (const char *name, int af) | Function | 
| The gethostbyname2function is likegethostbyname, but
allows the caller to specify the desired address family (e.g.AF_INETorAF_INET6) of the result. | 
| struct hostent * gethostbyaddr (const char *addr, size_t length, int format) | Function | 
| The gethostbyaddrfunction returns information about the host
with Internet address addr.  The parameter addr is not
really a pointer to char - it can be a pointer to an IPv4 or an IPv6
address. The length argument is the size (in bytes) of the address
at addr.  format specifies the address format; for an IPv4
Internet address, specify a value ofAF_INET; for an IPv6
Internet address, useAF_INET6.If the lookup fails,  | 
If the name lookup by gethostbyname or gethostbyaddr
fails, you can find out the reason by looking at the value of the
variable h_errno.  (It would be cleaner design for these
functions to set errno, but use of h_errno is compatible
with other systems.)
Here are the error codes that you may find in h_errno:
HOST_NOT_FOUND
TRY_AGAIN
NO_RECOVERY
NO_ADDRESS
The lookup functions above all have one in common: they are not reentrant and therefore unusable in multi-threaded applications. Therefore provides the GNU C library a new set of functions which can be used in this context.
| int gethostbyname_r (const char *restrict name, struct hostent *restrict result_buf, char *restrict buf, size_t buflen, struct hostent **restrict result, int *restrict h_errnop) | Function | 
| The gethostbyname_rfunction returns information about the host
named name.  The caller must pass a pointer to an object of typestruct hostentin the result_buf parameter.  In addition
the function may need extra buffer space and the caller must pass an
pointer and the size of the buffer in the buf and buflen
parameters.A pointer to the buffer, in which the result is stored, is available in
 Here's a small example:
 struct hostent *
gethostname (char *host)
{
  struct hostent hostbuf, *hp;
  size_t hstbuflen;
  char *tmphstbuf;
  int res;
  int herr;
  hstbuflen = 1024;
  /* Allocate buffer, remember to free it to avoid memory leakage.  */
  tmphstbuf = malloc (hstbuflen);
  while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen,
                                 &hp, &herr)) == ERANGE)
    {
      /* Enlarge the buffer.  */
      hstbuflen *= 2;
      tmphstbuf = realloc (tmphstbuf, hstbuflen);
    }
  /*  Check for errors.  */
  if (res || hp == NULL)
    return NULL;
  return hp;
}
 | 
| int gethostbyname2_r (const char *name, int af, struct hostent *restrict result_buf, char *restrict buf, size_t buflen, struct hostent **restrict result, int *restrict h_errnop) | Function | 
| The gethostbyname2_rfunction is likegethostbyname_r, but
allows the caller to specify the desired address family (e.g.AF_INETorAF_INET6) for the result. | 
| int gethostbyaddr_r (const char *addr, size_t length, int format, struct hostent *restrict result_buf, char *restrict buf, size_t buflen, struct hostent **restrict result, int *restrict h_errnop) | Function | 
| The gethostbyaddr_rfunction returns information about the host
with Internet address addr.  The parameter addr is not
really a pointer to char - it can be a pointer to an IPv4 or an IPv6
address. The length argument is the size (in bytes) of the address
at addr.  format specifies the address format; for an IPv4
Internet address, specify a value ofAF_INET; for an IPv6
Internet address, useAF_INET6.Similar to the  | 
You can also scan the entire hosts database one entry at a time using
sethostent, gethostent and endhostent.  Be careful
when using these functions because they are not reentrant.
| void sethostent (int stayopen) | Function | 
| This function opens the hosts database to begin scanning it.  You can
then call gethostentto read the entries.If the stayopen argument is nonzero, this sets a flag so that
subsequent calls to  | 
| struct hostent * gethostent (void) | Function | 
| This function returns the next entry in the hosts database. It returns a null pointer if there are no more entries. | 
| void endhostent (void) | Function | 
| This function closes the hosts database. |