Unix Network Programming Episode 76

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

相关推荐
Tim风声(网络工程师)4 小时前
排查内网互联网访问流程
运维·服务器·网络
陈葛杰5 小时前
Axure RP 10.0安装教程(傻瓜版)
windows·开源软件·axure
坚持就完事了5 小时前
Linux中如何添加环境变量
linux·运维·服务器
白緢6 小时前
一、Linux 基础入门
linux·运维·服务器
随风,奔跑7 小时前
Nginx
服务器·后端·nginx·web
仰望星空的打工人7 小时前
cypht无法获取163、126邮件
服务器·网易邮箱大师
xhbh6667 小时前
Windows端口转发完全教程:netsh命令详解与实战案例
服务器·网络·ip·流量转发·端口流量转发
团象科技8 小时前
2026出海趋势观察:国际云服务器推荐重构企业全球化经营底盘
运维·服务器·重构
mzhan0179 小时前
Linux: coredump产生对程序退出的影响
linux·运维·服务器
利来利往10 小时前
ubuntu设置永不休眠
运维·服务器