我正在尝试使用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
库的信息很少。
谢谢大家的支持,谢谢。
答案 0 :(得分:2)
您必须自己解析ns_rr
中的资源记录数据;格式在rfc1035中进行了说明(请参见here,A rdata格式在3.4.1节中)
例如,在您的[WHAT TO DO HERE?]
中,您可以解析Ardata并打印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));
如果要支持其他资源记录类型,则必须熟悉其特定格式。