0

以下のコードは、ゾーンファイルにあるTXTリソースレコードを印刷することを想定しています。
BLOCK 1(BLOCK 2は存在しない)でのみコードを実行すると、3つのTXT RRのそれぞれの名前、タイプ、クラス、TTL、およびデータ長が取得されます。
しかし、BLOCK 2のみを使用してコードを実行すると、最初のTXT RRの回答のみが表示され、次にエラーメッセージが表示されます。ns_parserr:メッセージが長くなります。
誰かがこの問題で私を助けてくれますか?
前もって感謝します。

    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);   
    }
}

これは、次の2つのブロックで得られる結果です: vanco @
vanco-laptop:〜/ Desktop $ gcc d2ip.c /usr/lib/libresolv.a vanco
@vanco-laptop:〜/ Desktop $ ./a.out www .example.comCP-
>www.example.com
タイプ->16
クラス->1TTL-
>10800
データ長->41

データ->(ver = dgw1 pre = 8 id =0name=www.example.com� <br/>
43
データ->(ver = dgw1 pre = 8 id = 0 name = www.example.com
ns_parserr:メッセージが長すぎます

4

1 に答える 1

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';

新しいchar配列を割り当て、からコピーする必要がありますrdata

于 2011-03-12T18:18:45.133 に答える