gethostname()与gethostbyname()的联系

gethostname得到本机主机名或者域名。有两个参数,一个是用来存放主机名或者域名的变量,一个是缓冲区的大小。

gethostbyname通过域名或者主机命返回IP地址,传进去的参数是一个域名或者主机名,返回值是一个hostent指针结构。(如果传进去的是一个空字符串,那么返回的是本机的主机名与IP地址)

 

1.gethostname()

(1)功能;返回本地主机的标准主机名

(2)头文件:#include<Winsock2.h>

(3)函数原型:intPASCAL FAR gethostname(char FAR *name, int namelen);

(4)参数:

name: 一个指向将要存放主机名的缓冲区指针

namelen:缓冲区的长度。

(5返回值:

如果没有错误发生,gethostname()返回0,否则返回SOCKET_ERROR。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码

该函数把本地主机名存放入由name参数指定的缓冲区中。返回的主机名是一个以NULL结束的字符串。主机名的形式取决于Windows Socket实现-它可能是一个简单的主机名,或者是一个域名。然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。

2.gethostbyname()

(1)功能:返回对应于给定主机名的主机信息。

(2)头文件:#include <Winsock2.h>

(3)函数原型: struct hostent*gethostbyname(const char *name);

(4)参数:name是指向主机名的指针

(5)返回值:如果没有错误发生,gethostbyname()返回如上所述的一个指向hostent结构的指针,否则,返回一个空指针。应用程序可以通过WSAGetLastError()来得到一个特定的错误代码

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

需要注意的是gethostbyname()函数属于WinSock API库,而在使用WinSock API之前,必须调用WSA-Startup函数,只有该函数成功返回(表示应用程序与WinSock库成功地建立起连接),应用程序才可以调用其他Windows Sockets DLL中的函数。当程序将要结束时,又必须调用WSACleanup 函数进行清理工作,以便释放其占用的资源。WSACleanup 函数用来结束Windows Sockets DLL的使用。

 返回hostent结构体类型指针
    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_list

    表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的!所以到真正需要打印出这个IP的话,需要调用inet_ntop()或者inet_ntoa()

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

eg1

 

    char   *ptr, **pptr;
    struct hostent*hptr;
    char   str[32];
    ptr = argv[1];
 
    if((hptr =gethostbyname(ptr)) == NULL)
    {
        printf(" gethostbyname error for host:%s\n", ptr);
        return 0;
    }
 
   printf("official hostname:%s\n",hptr->h_name);
    for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
       printf(" alias:%s\n",*pptr);
 
   switch(hptr->h_addrtype)
    {
        caseAF_INET:
        caseAF_INET6:
           pptr=hptr->h_addr_list;
            for(; *pptr!=NULL; pptr++)
               printf(" address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
           printf(" first address: %s\n", inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));
        break;
        default:
           printf("unknown address type\n");
        break;
    } char   *ptr, **pptr;
    struct hostent*hptr;
    char   str[32];
    ptr = argv[1];
 
    if((hptr =gethostbyname(ptr)) == NULL)
    {
        printf(" gethostbyname error for host:%s\n", ptr);
        return 0;
    }
 
   printf("official hostname:%s\n",hptr->h_name);
    for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
       printf(" alias:%s\n",*pptr);
 
   switch(hptr->h_addrtype)
    {
        caseAF_INET:
        caseAF_INET6:
           pptr=hptr->h_addr_list;
            for(; *pptr!=NULL; pptr++)
               printf(" address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
           printf(" first address: %s\n", inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));
        break;
        default:
           printf("unknown address type\n");
        break;
    }

 

 

 

结果:

officialhostname:www.a.shifen.com
  alias:www.baidu.com
  address:121.14.88.11
  address:121.14.89.11
  first address: 121.14.88.11

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值