gethostbyname函数的作用是通过一个IPv4的地址来获取主机信息,并存放在hostent结构体中
先来一小段代码测试一下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winSock2.h>
#pragma comment(lib, "ws2_32.lib")
void ErrorHandling(char *message);
int main(int argc,char *argv[]){
WSADATA wsaData;
int i;
struct hostent *host;
SOCKADDR_IN addr;
if(argc!=2)
{
printf("Usage : %s <IP>\n", argv[0]);
exit(1);
}
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
ErrorHandling("WSAStartup() error!");
memset(&addr, 0, sizeof(addr));
addr.sin_addr.s_addr = inet_addr(argv[1]);
host = gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET);
if(!host)
ErrorHandling("gethost....error");
printf("Official name: %s \n", host->h_name);
for (i = 0; host->h_aliases[i];i++)
printf("Aliases %d: %s \n", i + 1, host->h_aliases[i]);
printf("Address type : %s \n",(host->h_addrtype==AF_INET)?"AF_INET":"AF_INET6");
for (i = 0; host->h_addr_list[i];i++)
printf("IP addr %d: %s \n", i + 1, inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));
WSACleanup();
return 0;
}
void ErrorHandling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
VSCode文件及目录如下,ws2_32.dll是从C:\Windows\System32\这个目录下复制过来放在lib目录下的
通过在目录的命令行下使用gcc gethostbyaddr_win.c -o HostbyAddr lib/ws2_32.dll(需要预先配置好CMake)
通过ping www.baidu.com,我们可以知道此时百度服务器的IP地址,我当前ping得的结果为 180.101.49.11(不同时段可能会变,IP地址存在服务器间的迁移)
但是终端输入.\HostbyAddr 180.101.49.11并没有返回Official name:www.baidu.com
查了资料发现调用gethostbyaddr不会向DNS请求域名解析服务(或者是受限?),而是向本地的C:\Windows\System32\drivers\etc下的hosts文件查找对应的域名解析。
在hosts文件下添加如下字段
再在终端输入.\HostbyAddr 180.101.49.11就出现结果了
既然IP地址随着服务器的迁移在变动,存入在hosts文件的信息在另一个时间段会失效,要想正确使用gethostbyaddr必须在使用之前通过脚本返回ping得的IP地址每次写入hosts文件了。
不知道正确的处理思路是不是这样。。。