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上编译运行结果如下: