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 列表: "); 31 int x; 32 for (x = 0; host->h_aliases[x]; x++) { 33 printf("%s ", host->h_aliases[x]); 34 } 35 36 printf("IP列表: "); 37 38 39 for (x = 0; ; x++) 40 //for (x = 0; *host->h_addr_list; x++) //2个for写法一样 41 { 42 printf("IP:[%d][%s] ", 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 }
结果截图