【问题标题】:getnameinfo fails to perform a reverse DNSgetnameinfo 无法执行反向 DNS
【发布时间】:2019-09-30 18:00:53
【问题描述】:

目标:返回给定 sockaddr 的 FQDN

我正在尝试使用 getnameinfo 执行反向 DNS 查找并返回 example.com 的 FQDN,但是下面的代码无法打印 FQDN 并出现错误 EAI_NONAME (8)。在运行下面的代码之前,我在浏览器中打开 example.com 以确保 DNS 缓存包含 domain_name 到 ip_address 的映射,但下面的代码似乎无法返回“example.com”作为 FQDN。我错过了什么吗?我正在使用 macOS 10.14.4 并使用 gcc "filename.c" 编译代码

#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>

int main()
{
    const char* EXAMPLE_COM_IP_ADDR = "93.184.216.34"; // check this with `ping example.com`
    struct sockaddr_in sa = {0};
    char host[NI_MAXHOST] = "";
    char serv[NI_MAXSERV] = "";
    int rc = 0;

    // fill sockaddr_in with data - https://beej.us/guide/bgnet/html/multi/sockaddr_inman.html
    sa.sin_family = AF_INET;
    sa.sin_port = htons(80);
    rc = inet_pton(AF_INET, EXAMPLE_COM_IP_ADDR, &(sa.sin_addr));
    if (rc != 1)
        printf("inet_pton rc = %d\n", rc);

    // translate sockaddr to host + service - https://beej.us/guide/bgnet/html/multi/getnameinfoman.html
    printf("getnameinfo with NI_NAMEREQD flag:\n");
    rc = getnameinfo((struct sockaddr*)(&sa), sizeof(sa), host, sizeof(host), serv, sizeof(serv), NI_NAMEREQD);
    if (rc != 0)
        printf("getnameinfo rc = %d, err= %s\n", rc, gai_strerror(rc));
    printf("host: %s\n", host); // should print - "www.example.com"
    printf("serv: %s\n", serv); // should print - "http"

    return 0;
}

【问题讨论】:

    标签: c macos networking dns ip


    【解决方案1】:

    反向查找不使用 DNS 缓存。相反,它使用rDNS lookup,即in-addr.arpa 伪域。好吧,事实证明:

    % host 93.184.216.34
    Host 34.216.184.93.in-addr.arpa. not found: 3(NXDOMAIN)
    

    该 IP 地址没有反向 PTR 记录。

    如果你用8.8.8.8替换地址,比如说,你得到

    % ./a.out           
    getnameinfo with NI_NAMEREQD flag:
    host: google-public-dns-a.google.com
    serv: http
    

    这仅仅是因为:

    % host 8.8.8.8      
    8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com.
    

    【讨论】:

    • 哦,快!所以在这种情况下,似乎 getnameinfo 不会像我想的那样做。在给定 sockaddr 结构的情况下,我还能在 C 中使用什么来返回 FQDN?
    • @Unglued 好我怀疑有没有好的选择。更糟糕的是,在当前虚拟主机时代,一个 IP 地址在名称缓存中可能有无数个名称......它要么是 rDNS 之一,要么是 您的用户 或类似提供给的那个程序。
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2012-02-14
    相关资源
    最近更新 更多