Почему я получаю дополнительные биты в моих вызовах recv () с libnfqueue? - PullRequest
1 голос
/ 08 августа 2011

У меня проблемы со следующим кодом. Я получаю свои данные без проблем, однако эти данные загружаются посторонними битами! Например, следующий код захватывает весь трафик, направленный на него из 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, и они там тоже не отображаются.

1 Ответ

2 голосов
/ 08 августа 2011

Похоже, что в буфере содержится символ со значением, превышающим 128, и возникает ошибка преобразования со знаком / без знака.

Я вычислил значение вашего байта - это 164. Попробуйте преобразовать ваши байты в без знакасимволы перед передачей их в printf:

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