getnameinfo не может выполнить обратный DNS - PullRequest
2 голосов
/ 13 мая 2019

Цель : вернуть полное доменное имя с учетом sockaddr

Я пытаюсь использовать getnameinfo , чтобы выполнить обратный поиск DNS и вернуть полное доменное имя для example.com,однако приведенный ниже код не может распечатать полное доменное имя с ошибкой EAI_NONAME (8).Перед запуском приведенного ниже кода я открываю example.com в браузере, чтобы убедиться, что кэш DNS содержит сопоставление имени_домена с ip_address, но приведенный ниже код, по-видимому, не возвращает «example.com» какполное доменное имя.Я что-то пропустил?Я использую 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;
}

1 Ответ

2 голосов
/ 13 мая 2019

Обратный поиск не использует кэш DNS. Вместо этого он использует rDNS lookup , то есть псевдодомен in-addr.arpa. Ну, получается, что:

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

Нет обратной записи PTR для IP-адреса.

Если вы замените адрес на 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.
...