ZBLOG

使用getnameinfo获取到的主机名是logon或者是本地的而不是我想要查询的IP的

使用 getnameinfo 函数获取主机名时,如果返回的是“logon”或“本地”的名称而不是你想查询的 IP 地址对应的主机名,可能有几个原因。以下是一些可能的原因及解决方案:

1. DNS 配置问题

确保你的 DNS 服务器配置正确,并能够解析外部 IP 地址。

  • 检查 /etc/resolv.conf 文件(在 Linux 上)或者网络适配器设置(在 Windows 上),确保使用了有效的公共 DNS 服务器(例如 Google 的 8.8.8.88.8.4.4)。

2. 使用正确的参数

在调用 getnameinfo 时,确保你传入了正确的地址结构体。如果你用的是 IPv4,确保使用的是 sockaddr_in;如果是 IPv6,则使用 sockaddr_in6

struct sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(80); // 端口号,例如 HTTP 的 80
inet_pton(AF_INET, "目标IP地址", &(sa.sin_addr)); // 将 IP 地址转为网络字节顺序

char host[NI_MAXHOST];
char service[NI_MAXSERV];

int result = getnameinfo((struct sockaddr*)&sa, sizeof(sa), host, sizeof(host), service, sizeof(service), NI_NUMERICHOST);
if (result != 0) {
    printf("getnameinfo: %s\n", gai_strerror(result));
} else {
    printf("Host: %s\nService: %s\n", host, service);
}

3. 本地缓存和服务

有时操作系统会缓存主机名与 IP 地址之间的映射。如果你正在尝试查询一个没有被全局 DNS 服务知晓的本地设备,操作系统可能会优先返回已知本地名称。

  • 尝试重启你的计算机以清空 DNS 缓存。
  • 在 Windows 中,你可以打开命令提示符并输入:ipconfig /flushdns

4. 防火墙或安全软件

某些防火墙或安全软件可能会拦截 DNS 查询请求,导致无法获得预期结果。

  • 检查您的防火墙设置以确定是否允许对外发起 DNS 查询。
  • 暂时禁用任何安全软件以测试它们是否影响到 DNS 查询。

5. 使用其他工具进行验证

尝试使用其他工具来验证该 IP 地址是否能正确解析到期望的主机名,比如:

nslookup <目标IP地址>

或者

dig -x <目标IP地址>

这些工具能够直接从DNS服务器查询并提供更多信息,有助于确认问题出在哪里。

总结

如果经过以上步骤仍然无法解决问题,请确认您希望解析的 IP 是否确实存在一个可公开访问的反向 DNS 条目,并且您的网络设置未受到限制。如有其他疑问,请随时询问!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=5962

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?