【问题标题】:ns_parserr: Message to long; error message when using BIND resolver library function ns_parserr()ns_parserr: 长消息;使用 BIND 解析器库函数 ns_parserr() 时出现错误消息
【发布时间】:2011-03-12 17:46:23
【问题描述】:

下面的代码假设打印出我在我的区域文件中的 TXT 资源记录。
当我仅使用 BLOCK 1(不存在 BLOCK 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: 消息太长

【问题讨论】:

    标签: c parsing bind text-files rr


    【解决方案1】:

    您正在修改 ns_rr_rdata(rr); 返回的 u_char const * 指向的内存,方法是使用强制转换绕过 const

    u_char const *rdata=ns_rr_rdata(rr);
    ...
    char *rdatatemp;
    rdatatemp=(char *)rdata;
    ...
    rdatatemp[strlen(rdata)-2]='\0';
    

    你需要分配一个新的char数组并从rdata复制

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 2021-06-17
      相关资源
      最近更新 更多