Windows下gethostbyaddr函数无法生效

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文件了。

不知道正确的处理思路是不是这样。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值