socket编程之gethostbyname获取IP列表和Host别名列表

gethostbyname 函数原型:

 struct hostent FAR * WSAAPI gethostbyname( _In_z_ const char FAR * name ); 

gethostbyname 参数为一个域名,返回一个指向hostent 的指针

hostent结构体内部包含了主机名、别名、IP地址列表等内容

struct  hostent {
        char    FAR * h_name;           /* official name of host */
        char    FAR * FAR * h_aliases;  /* alias list */
        short   h_addrtype;             /* host address type */
        short   h_length;               /* length of address */
        char    FAR * FAR * h_addr_list; /* list of addresses */
#define h_addr  h_addr_list[0]          /* address, for backward compat */
};

写程序尝试调用它

 1 //#define _WINSOCK_DEPRECATED_NO_WARNINGS
 2 
 3 #define _WINSOCK_DEPRECATED_NO_WARNINGS
 4 #define _CRT_SECURE_NO_WARNINGS
 5 
 6 #include<WinSock2.h>
 7 #include<iostream>
 8 #include <windows.h>
 9 
10 using namespace std;
11 
12 #pragma comment(lib, "ws2_32.lib")
13 
14 int main()
15 {
16 
17     WORD wVersionRequested;
18     WSADATA wsaData;
19     int err;
20 
21     wVersionRequested = MAKEWORD(1, 1);
22 
23     err = WSAStartup(wVersionRequested, &wsaData);
24     if (err != 0) {
25         return 0;
26     }
27 
28     hostent *host = gethostbyname("ueditor.baidu.com");
29 
30     printf("host name alias 列表: \n");
31     int x;
32     for (x = 0; host->h_aliases[x]; x++) {
33         printf("%s\n", host->h_aliases[x]);
34     }
35 
36     printf("IP列表: \n");
37 
38 
39     for (x = 0; ; x++)
40         //for (x = 0; *host->h_addr_list; x++) //2个for写法一样
41     {
42         printf("IP:[%d][%s]\n", x, inet_ntoa(*((in_addr *)host->h_addr_list[x])));
43         if (host->h_addr_list[x] + host->h_length >= host->h_name)
44         {
45             break;
46         }
47     }
48 
49     /*  host->h_addr_list[i]是地址的指针,host->h_length是地址的长度(字节数),
50     两者相加是地址结束的指针,host->h_name在所有地址之后,
51     所以如果host->h_addr_list[i] + host->h_length >= host->h_name,就表示所有地址都取完了。*/
52 
53     getchar();
54 
55     return 0;
56 }

结果截图

 

posted @ 2018-07-16 09:48  淡墨&青衫  阅读(9592)  评论(0编辑  收藏  举报