下面的代码是打印出我在区域文件中的TXT资源记录。
当我只使用BLOCK 1(BLOCK 2不存在)执行代码时,我得到了每个3 TXT RR的名称,类型,类,TTL和数据长度。
但是当我仅使用BLOCK 2执行代码时,我只得到第一个TXT RR的答案,然后是错误消息:ns_parserr:消息为long。
有人可以帮我解决这个问题
提前谢谢。
int rrnum; /* resource record number */
ns_rr rr; /* expanded resource record */
for(rrnum = 0; rrnum < ns_msg_count(handle, ns_s_an); rrnum++)
{
//from section ns_s_an(ANSWER) take out answer number rrnum and put it in rr
if (ns_parserr(&handle, ns_s_an, rrnum, &rr)) {
fprintf(stderr, "ns_parserr: %s\n", strerror(errno));
}
if (ns_rr_type(rr)==ns_t_txt){
//BLOCK 1
char *cp;
cp=(char *)ns_rr_name(rr);
printf("CP->%s\n",(char *)cp);
int i1=ns_rr_type(rr);
printf("Type->%d\n", i1);
int i2=ns_rr_class(rr);
printf("Class->%d\n", i2);
int i3=ns_rr_ttl(rr);
printf("TTL->%d\n", i3);
int i4=ns_rr_rdlen(rr);
printf("Data Length->%d\n\n", i4);
//BLOCK 2
u_char const *rdata=ns_rr_rdata(rr);
printf("Data->%s\n",(u_char *)rdata);
char *rdatatemp;
rdatatemp=(char *)rdata;
int len=strlen(rdata);
printf("%d\n",len);
rdatatemp[strlen(rdata)-2]='\0';
printf("Data->%s\n",(u_char *)rdatatemp);
}
}
这是我得到两个街区的结果:
vanco @ vanco-laptop:〜/ Desktop $ gcc d2ip.c /usr/lib/libresolv.a
vanco @ vanco-laptop:〜/ Desktop $ ./a.out www.example.com
CP-&GT; www.example.com
型 - &GT; 16个
讲座→1个
TTL-&GT; 10800个
数据长度 - > 41
数据 - &gt;(ver = dgw1 pre = 8 id = 0 name =www.example.com
43个
数据 - &gt;(ver = dgw1 pre = 8 id = 0 name = www.example.com
ns_parserr:消息太长了
答案 0 :(得分:0)
您正在修改u_char const *
返回的ns_rr_rdata(rr);
指向的内存,通过使用投射来绕过const
u_char const *rdata=ns_rr_rdata(rr);
...
char *rdatatemp;
rdatatemp=(char *)rdata;
...
rdatatemp[strlen(rdata)-2]='\0';
您需要从rdata