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\n");
10         exit(1);
11     }
12     
13     if((s_host = gethostbyname(strParaName)) == NULL)
14     {
15         printf("gethostbyname error\n");
16         exit(1);
17     }
18 
19     for(iloop = 0; iloop < 4; iloop++)
20     {
21         printf("h_addr_list[0][%d] = %d\n", 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\n", inet_ntoa(*((struct in_addr*)s_host->h_addr_list[0])));
27     }
28     
29     return 0;
30 }

 

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

       

 

posted @ 2017-06-28 23:01  落影无痕  阅读(1111)  评论(0编辑  收藏  举报