DNS:使用 resolv.h 检索主机 IP 地址
DNS: retrieving host IP address using resolv.h
我正在尝试使用 BIND 中的 resolv.h
库来理解 DNS 查询。
我正在努力尝试从 ns_parserr()
返回的 RR 中解析 IP 地址。
我可以使用 https://docstore.mik.ua/orelly/networking_2ndEd/dns/ch15_02.htm 提供的代码成功解析权威 NS,但我似乎无法获取 A
类型的记录并 打印它们 。
主要是因为我不知道 IP 地址在 ns_rr
结构中是如何编码的。查看实现,RDATA 是 const u_char *
类型。
如何从该记录中获取 IP?
int main (int argc, char * argv[])
{
union {
HEADER hdr;
u_char buf[NS_PACKETSZ];
} response;
int responseLen;
res_init();
ns_msg handle;
responseLen =res_query(argv[1],ns_c_in,ns_t_a,(u_char *)&response,sizeof(response));
if (responseLen<0)
exit(-1);
if (ns_initparse(response.buf, responseLen, &handle)<0)
{
fprintf(stderr, "ERROR PARSING RESPONSE....");
perror("damn");
exit(-1);
}
ns_rr rr;
int rrnum;
ns_sect section=ns_s_an;
for (rrnum=0;rrnum<(ns_msg_count(handle,section));rrnum++)
{
if (ns_parserr(&handle,ns_s_an,rrnum,&rr)<0)
{
fprintf(stderr, "ERROR PARSING RRs");
exit(-1);
}
if (ns_rr_type(rr)==ns_t_a)
{
[WHAT TO DO HERE?]
}
}
return 0;
}
我通常会尝试自己解决这些问题,但是除了引用的来源外,互联网上关于 resolv.h
库的信息并不多。
谢谢大家的支持,我很感激。
需要自己解析ns_rr
中的资源记录数据;该格式在 rfc1035 中描述(参见 here,A rdata 格式在第 3.4.1 节)
在您的 [WHAT TO DO HERE?]
中,您可以像这样解析 A rdata 并打印 IP:
struct in_addr in;
memcpy(&in.s_addr, ns_rr_rdata(rr), sizeof(in.s_addr));
fprintf(stderr, "%s IN A %s\n", ns_rr_name(rr), inet_ntoa(in));
如果您想支持其他资源记录类型,您必须熟悉它们的特定格式。
我正在尝试使用 BIND 中的 resolv.h
库来理解 DNS 查询。
我正在努力尝试从 ns_parserr()
返回的 RR 中解析 IP 地址。
我可以使用 https://docstore.mik.ua/orelly/networking_2ndEd/dns/ch15_02.htm 提供的代码成功解析权威 NS,但我似乎无法获取 A
类型的记录并 打印它们 。
主要是因为我不知道 IP 地址在 ns_rr
结构中是如何编码的。查看实现,RDATA 是 const u_char *
类型。
如何从该记录中获取 IP?
int main (int argc, char * argv[])
{
union {
HEADER hdr;
u_char buf[NS_PACKETSZ];
} response;
int responseLen;
res_init();
ns_msg handle;
responseLen =res_query(argv[1],ns_c_in,ns_t_a,(u_char *)&response,sizeof(response));
if (responseLen<0)
exit(-1);
if (ns_initparse(response.buf, responseLen, &handle)<0)
{
fprintf(stderr, "ERROR PARSING RESPONSE....");
perror("damn");
exit(-1);
}
ns_rr rr;
int rrnum;
ns_sect section=ns_s_an;
for (rrnum=0;rrnum<(ns_msg_count(handle,section));rrnum++)
{
if (ns_parserr(&handle,ns_s_an,rrnum,&rr)<0)
{
fprintf(stderr, "ERROR PARSING RRs");
exit(-1);
}
if (ns_rr_type(rr)==ns_t_a)
{
[WHAT TO DO HERE?]
}
}
return 0;
}
我通常会尝试自己解决这些问题,但是除了引用的来源外,互联网上关于 resolv.h
库的信息并不多。
谢谢大家的支持,我很感激。
需要自己解析ns_rr
中的资源记录数据;该格式在 rfc1035 中描述(参见 here,A rdata 格式在第 3.4.1 节)
在您的 [WHAT TO DO HERE?]
中,您可以像这样解析 A rdata 并打印 IP:
struct in_addr in;
memcpy(&in.s_addr, ns_rr_rdata(rr), sizeof(in.s_addr));
fprintf(stderr, "%s IN A %s\n", ns_rr_name(rr), inet_ntoa(in));
如果您想支持其他资源记录类型,您必须熟悉它们的特定格式。