Pare de usar gethostbyname()
. Você deveria estar usando getaddrinfo()
, e deveria ter sido por anos agora. A página man ainda te avisa disso.
The gethostbyname*(), gethostbyaddr*(), herror(), and hstrerror() functions are obsolete. Applications should use getaddrinfo(3), getnameinfo(3), and gai_strerror(3) instead.
Aqui está um programa de amostra rápido em C que demonstra a procura apenas de registros para um nome, e uma captura Wireshark mostrando que somente Um registro de pesquisas passou pela rede .
Em particular, você precisa definir ai_family
a AF_INET
se desejar apenas uma pesquisa de registros. Este programa de amostra apenas imprime os endereços IP retornados. Veja a página getaddrinfo()
man para um exemplo mais completo de como fazer conexões de saída.
Na captura do Wireshark , o 172.25.50.3 é o resolvedor de DNS local; a captura foi feita lá, então você também vê suas consultas e respostas de saída. Note que apenas um registro A foi solicitado. Nenhuma pesquisa AAAA foi feita.
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <stdio.h>
int main(void) {
struct addrinfo hints;
struct addrinfo *result, *rp;
int s;
char host[256];
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
s = getaddrinfo("www.facebook.com", NULL, &hints, &result);
if (s != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
for (rp = result; rp != NULL; rp = rp->ai_next) {
getnameinfo(rp->ai_addr, rp->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
printf("%s\n", host);
}
freeaddrinfo(result);
}