为什么我在使用libnfqueue的recv()调用中获得额外的位?

时间:2011-08-08 00:17:07

标签: c linux network-programming iptables

我遇到以下代码问题。我收到的数据没有任何问题,但是数据加载了多余的内容!例如,以下代码从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
...

我在互联网上找不到任何东西,或者在类似这个问题的bug追踪器中找不到任何东西。我在哪里可以开始诊断它?为什么我的数据中有所有这些额外的位?我该如何解决?

我与tcpdump的输出进行了比较,它们也没有出现在那里。

1 个答案:

答案 0 :(得分:2)

似乎缓冲区包含值超过128的char,并且发生了有符号/无符号转换错误。

我已计算出你的字节值 - 它是164.尝试将字节转换为无符号字符,然后再将它们传递给printf:

printf("%02x\n", *(unsigned char*)(buf+i));