1

次のコードに問題があります。問題なくデータを受信しましたが、そのデータには無関係なビットがロードされています! たとえば、次のコードは、nfqueue から送信されたすべてのトラフィックを取得し、各バイトの後に改行を出力します。

最初は、データはまさに私が期待していたものですが、4 バイトのように見える行があります。

int main(int argc, char** argv) {
    int fd;
    ssize_t rv;
    char buf[4096];
    struct nfq_handle* h;
    struct nfq_q_handle* qh;

    h = nfq_open();
    if (!h) {
        fprintf(stderr, "error during nfq_open()\n");
        exit(1);
    }

    if (nfq_unbind_pf(h, AF_INET) < 0) {
        fprintf(stderr, "error during nfq_unbind_pf()\n");
        exit(1);
    }

    if (nfq_bind_pf(h, AF_INET) < 0) {
        fprintf(stderr, "error during nfq_bind_pf()\n");
        exit(1);
    }

    printf("Binding to queue 0...\n");
    qh = nfq_create_queue(h, 0, &cb, NULL);
    if (!qh) {
        fprintf(stderr, "error during nfq_create_queue()\n");
        exit(1);
    }

    printf("Copying packets...\n");
    if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {
        fprintf(stderr, "error during nfq_set_mode()\n");
        exit(1);
    }

    fd = nfq_fd(h);

    memset(buf, 0, 4096);
    while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {
    for (int i = 0; i < rv; i++) printf("%02x\n", *(buf+i));
    printf("\n\n");
        nfq_handle_packet(h, buf, rv);
    }

    nfq_destroy_queue(qh);
    nfq_close(h);
}

出力:

...
50
10
39
08
48
ffffffa4
00
00
...

インターネット上でも、この問題に似たバグトラッカーでも何も見つかりませんでした。どこから診断を開始できますか? データにこれらすべての余分なビットがあるのはなぜですか? どうすれば修正できますか?

tcpdump の出力と比較しましたが、そこにも表示されていません。

4

1 に答える 1

2

buffer に 128 を超える値の char が含まれているようで、signed/unsigned 変換エラーが発生します。

バイトの値を計算しました - 164 です。printf に渡す前にバイトを unsigned char に変換してみてください:

printf("%02x\n", *(unsigned char*)(buf+i));
于 2011-08-08T00:26:10.217 に答える