getnameinfo 无法执行反向 DNS
getnameinfo fails to perform a reverse DNS
目标:return FQDN 给定 sockaddr
我正在尝试使用 getnameinfo 执行反向 DNS 查找和 return example.com 的 FQDN,但是下面的代码无法打印错误为 EAI_NONAME (8) 的 FQDN。在 运行 下面的代码之前,我在浏览器中打开 example.com 以确保 DNS 缓存包含 domain_name 到 [=27 的映射=],但下面的代码似乎无法将 return "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;
}
反向查找不使用DNS缓存。相反,它使用 rDNS lookup,即 in-addr.arpa
pseudo-domain。嗯,结果是:
% 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.
目标:return FQDN 给定 sockaddr
我正在尝试使用 getnameinfo 执行反向 DNS 查找和 return example.com 的 FQDN,但是下面的代码无法打印错误为 EAI_NONAME (8) 的 FQDN。在 运行 下面的代码之前,我在浏览器中打开 example.com 以确保 DNS 缓存包含 domain_name 到 [=27 的映射=],但下面的代码似乎无法将 return "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;
}
反向查找不使用DNS缓存。相反,它使用 rDNS lookup,即 in-addr.arpa
pseudo-domain。嗯,结果是:
% 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.