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 gethostbyname function 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 gethostbyname2 function is like gethostbyname, but
allows the caller to specify the desired address family (e.g.
AF_INET or AF_INET6) of the result.
|
| struct hostent * gethostbyaddr (const char *addr, size_t length, int format) | Function |
The gethostbyaddr function 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 of AF_INET; for an IPv6
Internet address, use AF_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_r function returns information about the host
named name. The caller must pass a pointer to an object of type
struct hostent in 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_r function is like gethostbyname_r, but
allows the caller to specify the desired address family (e.g.
AF_INET or AF_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_r function 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 of AF_INET; for an IPv6
Internet address, use AF_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 gethostent to 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. |