We encourage the use of getaddrinfo (Section 11.6(See 8.9.6)) in new programs.
#include <netdb.h>
struct hostent *gethostbyname (const char *hostname);
The non-null pointer returned by this function points to the following hostent structure:
struct hostent {
char *h_name; /* official (canonical) name of host */
char **h_aliases; /* pointer to array of pointers to alias names */
int h_addrtype; /* host address type: AF_INET */
int h_length; /* length of address: 4 */
char **h_addr_list; /* ptr to array of ptrs with IPv4 addrs */
};
gethostbyname differs from the other socket functions that we have described in that it does not set errno when an error occurs. Instead, it sets the global integer h_errno to one of the following constants defined by including <netdb.h>:
- HOST_NOT_FOUND
- TRY_AGAIN
- NO_RECOVERY
- NO_DATA (identical to NO_ADDRESS)
The NO_DATA error means the specified name is valid, but it does not have an A record. An example of this is a hostname with only an MX record.
Most modern resolvers provide the function hstrerror, which takes an h_errno value as its only argument and returns a const char * pointer to a description of the error.
#include "unp.h"
int main(int argc, char **argv)
{
char *ptr, **pptr;
char str[INET_ADDRSTRLEN];
struct hostent *hptr;
while(--argc>0)
{
ptr=*++argv;
if((hptr=gethostbyname(ptr)==NULL)
{
err_msg("gethostbyname error for host: %s: %s",ptr, hstrerror,(h_errno));
}
continue;
}
printf("official hostname: %s\n", hptr->h_name);
for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)
printf("\talias:%s\n", *pptr);
switch(hptr->h_addrtype)
{
case AF_INET:
pptr=hptr->h_addr_list;
for(;*pptr!=NULL;pptr)
{
printf("\taddress: %s\n",Inet_ntop(hptr->h_addrtype,*pptr, str, sizeof(str)));
}
break;
default:
err_ret("unknown address type");
break;
}
return 0;
}
Call gethostbyname and print returned information