使用windows socket域名解析主要用到了两个函数:gethostbyname()和inet_ntoa(),其中struct hostent *gethostbyname(
const
char
*name)函数
返回对应于给定主机名的包含主机名字和地址信息的hostent结构的指针,参数name需要填入域名;char *inet_ntoa(struct in_addr in);将一个32位网络字节序的二进制IP地址转换成相应的点分十进制的IP地址(返回点分十进制的字符串在静态内存中的指针)。
下面的程序演示解析百度的域名:
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
bool Dns(char *domain)
{
hostent *hostEntry = NULL;
char **ppAlias = NULL; // 主机别名
char **ppAddr = NULL; // 点分十进制ip地址
sockaddr_in sin;
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0) {
return false;
}
hostEntry = gethostbyname(domain);
if (hostEntry == NULL) {
cout << "get host by name failed!\n";
return false;
}
cout << hostEntry->h_name << endl; // 主机名
// 主机别名
for (ppAlias = hostEntry->h_aliases; *ppAlias != NULL; ++ppAlias) {
cout << *ppAlias << endl;
}
// 解析出的ip
for (ppAddr = hostEntry->h_addr_list; *ppAddr != NULL; ++ppAddr) {
memcpy(&sin.sin_addr, *ppAddr, sizeof(*ppAddr));
cout << inet_ntoa(sin.sin_addr) << endl;
}
return true;
}
int main(int argc, char* argv[])
{
char ip[256] = "www.baidu.com";
Dns(ip);
return 0;
}
解析结果: