zoukankan      html  css  js  c++  java
  • socket编程基础1——hostent、in_addr、gethostbyname、inet_ntoa

    1. struct 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] 
    }; 

      h_name         地址的正式名称。 
      h_aliases       预备名称(别名)的指针。 
      h_addrtype    地址类型; 通常是AF_INET。  
      h_length        地址的比特长度。 
      h_addr_list    主机网络地址指针。网络字节顺序。 
      h_addr           h_addr_list中的第一地址。

    2. in_addr结构体

    #include <arpa/inet.h>
    typedef struct in_addr {  
            union {  
                    struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;  
                    struct { USHORT s_w1,s_w2; } S_un_w;  
                    ULONG S_addr;  
            } S_un;  
    #define s_addr  S_un.S_addr        /* can be used for most tcp & ip code */  
    #define s_host  S_un.S_un_b.s_b2    // host on imp  
    #define s_net   S_un.S_un_b.s_b1    // network  
    #define s_imp   S_un.S_un_w.s_w2    // imp  
    #define s_impno S_un.S_un_b.s_b4    // imp #  
    #define s_lh    S_un.S_un_b.s_b3    // logical host  
    } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

    3. gethostbyname()函数

    #include <netdb.h>
    #include <sys/socket.h>
    
    struct hostent *gethostbyname(const char *name);

      此函数调用入参为主机名或者域名,例如www.google.com,wpc等等。函数返回一个指向struct hostent结构类型的指针,如果调用失败,就返回一个NULL。

    返回的struct  hostent结构体中的h_addr_list是一个指针数组,数组中的每个元素可以看作是指向in_addr型的指针。之所以定义为char**,是因为hostent结构支持

    多种地址类型。

      通过gethostbyname("www.baidu.com")得到hostent之后可以打印出如下内容:

    host->h_addr_list[0][0] = 14
    host->h_addr_list[0][1] = 215
    host->h_addr_list[0][2] = 177
    host->h_addr_list[0][3] = 37 

    4. inet_ntoa ()函数

    #include <arpa/inet.h>
    char *inet_ntoa (struct in_addr);

      函数的功能是将网络字节序的地址转化为带“.”格式的IP地址字符串。

    5. code 

     1 int main (int argc, char* argv[])
     2 {
     3     char  iloop =0;
     4     char* strParaName = argv[1];
     5     struct hostent* s_host = NULL;
     6 
     7     if(argc != 2)
     8     {
     9         printf("INVALID PARA
    ");
    10         exit(1);
    11     }
    12     
    13     if((s_host = gethostbyname(strParaName)) == NULL)
    14     {
    15         printf("gethostbyname error
    ");
    16         exit(1);
    17     }
    18 
    19     for(iloop = 0; iloop < 4; iloop++)
    20     {
    21         printf("h_addr_list[0][%d] = %d
    ", iloop, (unsigned char)s_host->h_addr_list[0][iloop]);
    22     }
    23 
    24     for(iloop = 0; s_host->h_addr_list[iloop] != NULL; iloop++)
    25     {
    26         printf("h_addr_list[0] = %s
    ", inet_ntoa(*((struct in_addr*)s_host->h_addr_list[0])));
    27     }
    28     
    29     return 0;
    30 }

      代码在linux上编译运行结果如下:

           

  • 相关阅读:
    完美解决header,footer等HTML5标签在IE(IE6/IE7/IE8)无效的方法
    div图片垂直居中 如何使div中图片垂直居中
    为了美观当网页图片不存在时不显示叉叉图片
    谷歌HTML/CSS规范
    201521123029《Java程序设计》第十二周学习总结
    201521123029《Java程序设计》第十一周学习总结
    201521123029《Java程序设计》第十周学习总结
    201521123029《Java程序设计》第九周学习总结
    201521123029《Java程序设计》第八周学习总结
    201521123029《Java程序设计》第七周学习总结
  • 原文地址:https://www.cnblogs.com/fangyan5218/p/7092064.html
Copyright © 2011-2022 走看看