博主今天写代码遇到要解析域名,问度娘,查到 gethostbyname() 函数。
struct hostent* gethostbyname(const char *name)
一开始怎么用都出问题,返回值永远为NULL,之后严重怀疑是不是用错,最后查阅多方材料后,最后搞定。代码贡献如下,博主亲测保证成功。
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32") //加截lib
using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
//构建保存版本号的WORD类型变量
wVersionRequested = MAKEWORD(1, 1);
//加载套接字库
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return 0;
}
//检查加载的套接字库版本和请求的是否一致
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return 0;
}
//域名解析
char *domainName = "www.baidu.com";
HOSTENT* pHS = gethostbyname(domainName);
if (pHS != NULL)
{
sockaddr_in dest;
memcpy(&(dest.sin_addr), pHS->h_addr, pHS->h_length);
dest.sin_family = pHS->h_addrtype;
printf("解析 %s IP地址: %s\n", domainName, inet_ntoa(dest.sin_addr));
}
else
{
WSACleanup();
return 0;
}
}
gethostbyname() 返回的 HOSTENT* pHS 为 NULL 的情况是因为没有事先调用 WSAStartup() 加载套接字库。