ns_parserr:消息长;使用 BIND 解析器库函数 ns_parserr() 时出现错误消息
下面的代码假设打印出我在区域文件中的 TXT 资源记录。
当我仅使用块 1(块 2 不存在)执行代码时,我获得了我拥有的 3 个 TXT RR 中每一个的名称、类型、类、TTL 和数据长度。
但是,当我仅使用 BLOCK 2 执行代码时,我只得到第一个 TXT RR 的答案,然后是一条错误消息:ns_parserr:Message to 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->www.example.com
类型->16
类->1
TTL->10800
数据长度->41
数据->(ver=dgw1 pre=8 id=0 name=www.example.com�
43
数据->(ver=dgw1 pre=8 id=0 name=www.example.com
ns_parserr:消息太长
The code below is suppose to print out the TXT Resource Records i have in my zone file.
When i execute the code only with BLOCK 1 (BLOCK 2 not present) i get the name, Type, Class,TTL and Data Length for each of the 3 TXT RRs i have.
But when i execute the code only with BLOCK 2, i only get the answer for the first TXT RR and then an error message: ns_parserr: Message to long.
Can somebody plese help me with this problem.
Thanks in advance.
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);
}
}
This is the result i get with the two blocks on:
vanco@vanco-laptop:~/Desktop$ gcc d2ip.c /usr/lib/libresolv.a
vanco@vanco-laptop:~/Desktop$ ./a.out www.example.com
CP->www.example.com
Type->16
Class->1
TTL->10800
Data Length->41
Data->(ver=dgw1 pre=8 id=0 name=www.example.com�
43
Data->(ver=dgw1 pre=8 id=0 name=www.example.com
ns_parserr: Message too long
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您正在修改由
ns_rr_rdata(rr);
返回的u_char const *
指向的内存,方法是使用强制转换绕过const
您需要分配一个新的字符数组并从
rdata
复制You're modifying the memory pointed to by the
u_char const *
returned byns_rr_rdata(rr);
via circumventing theconst
using a castYou need to allocate a new char array and copy from
rdata