首页 > 代码库 > socket编程基础1——hostent、in_addr、gethostbyname、inet_ntoa

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地址字符串。

socket编程基础1——hostent、in_addr、gethostbyname、inet_ntoa