gethostbyname() -- 用域名或主机名获取IP地址

摘要:
#include<netdb.h>#include<sys/socket。h˃ structhostent*gethostbyname;此函数的输入值是域名或主机名,例如“www.google.cn”。传出值是主机结构。结构主机{char*h_name;char**h-aliases;inth_addrtype;inth_length;char**h_addr_list;#defineh_addr_list[0]};hostent-˃hName表示主机的规范名称。hostent-˃h_Addrtype表示主机IP地址的类型,无论是ipv4还是pv6host-˃h_Length表示主机IP的长度host-˃h_addr_Lisst表示主机的IP地址。请注意,这是以网络字节顺序存储的。因此,如果您确实需要打印IP,则需要调用inet_nntop()constchar*inet_Ntop:此函数用于将af类型的网络地址结构src转换为主机序列的字符串形式,并将其存储在长度为cnt的字符串中。返回指向dst的指针。

#include <netdb.h>
    #include <sys/socket.h>

    struct hostent *gethostbyname(const char *name);
    这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent的结构。如果函数调用失败,将返回NULL。

    struct hostent
    {
        char    *h_name;                
        char    **h_aliases; 
        int     h_addrtype;
        int     h_length;
        char    **h_addr_list; 
        #define h_addr h_addr_list[0] 
    }; 

    hostent->h_name
    表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。
    hostent->h_aliases
    表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
    hostent->h_addrtype     
    表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)
    hostent->h_length       
    表示的是主机ip地址的长度
    hostent->h_addr_lisst 
    表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。

    const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
    这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。返回指向dst的一个指针。如果函数调用错误,返回值是NULL。


#include <netdb.h>
#include <sys/socket.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    char   *ptr, **pptr;
    struct hostent *hptr;
    char   str[32];
    ptr = argv[1];

    if((hptr = gethostbyname(ptr)) == NULL)
    {
        printf(" gethostbyname error for host:%s ", ptr);
        return 0; 
    }

    printf("official hostname:%s ",hptr->h_name);
    for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
        printf(" alias:%s ",*pptr);

    switch(hptr->h_addrtype)
    {
        case AF_INET:
        case AF_INET6:
            pptr=hptr->h_addr_list;
            for(; *pptr!=NULL; pptr++)
                printf(" address:%s ", 
                       inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
            printf(" first address: %s ", 
                       inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));
        break;
        default:
            printf("unknown address type ");
        break;
    }

    return 0;
}



编译运行
-----------------------------
# gcc test.c
# ./a.out www.baidu.com
official hostname:www.a.shifen.com
alias:www.baidu.com
address:121.14.88.11
address:121.14.89.11
first address: 121.14.88.11

免责声明:文章转载自《gethostbyname() -- 用域名或主机名获取IP地址》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇多线程之线程同步(3)C#工具箱-容器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信支付方式区分

第一: JSAPI支付     https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1 使用场景:JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模块完成收款 使用实例 A:线下实例   B:公众号场景   C:PC网站场景            A: ...

【Linux网络基础】 DNS:介绍、作用、解析原理

1. DNS是什么? DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去+·记住能够被机器直接读取的IP数串。 通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。 DNS协议运行在UDP协议之上,使用端口号53。 访问网站的...

Ubuntu之修改主机名和 User与root用户相互切换

1 Ubuntu显示主机名    终端窗口,在命令提示符中可以看到主机名,主机名通常位于"@"符号后;   在终端窗口中输入命令:hostname或uname –n,均可    2 如何修改Ubuntu主机名?   Ubuntu默认登陆用户为用户定义的用户,不是默认的root用户。需要修改系统文件时,必须是root用户才能修改。      1) root权...

物理机与虚拟机IP互ping通,而互ping主机名不通

问题描述:虚拟机信息:VMware-workstation 10安装RHEL5.8操作系统、hostname:rhel201.com IP:192.168.1.201物理机系统:windows 7主机名:rusky-PC IP: 192.168.1.123 两者能够互相ping通对方的IP地址,但是互ping对方主机名失败。 处理方法:1、虚拟机linux...

【计算机网络】应用层

目录 网络应用模型 客户/服务器模型 P2P模型 域名系统(DNS) 层次域名空间 域名服务器 域名解析 文件传输协议(FTP) 工作原理 连接 电子邮件 电子邮件系统的组成结构 多用途网络邮件扩充(MIME) 简单邮件传输协议(SMTP) 邮局协议(POP3) 网际报文存取协议(IMAP) 基于万维网的电子邮件 万维网(WW...

mysql db [Warning] IP address 'xxxx' could not be resolved: Name or service not known

mysql 使用版本:mysql 8.0 异常现象:每次访问,mysql server 的日志都会打印出如下内容,[Warning] IP address 'xxxx' could not be resolved: Name or service not known 异常分析:默认情况下,mysql 总会对访问者使用的 IP 或主机名进行 DNS 反向...