Нулевой порядковый номер при чтении пакетов из NFQueue

Я пытаюсь прочитать порядковый номер TCP из пакета, который находится в очереди в NFQueue с использованием C ++. Но когда я распечатывал порядковые номера, я заметил, что иногда я получаю ноль в качестве порядкового номера. Я проверил с Wireshark, но нет никаких порядковых номеров, которые равны нулю. Все порядковые номера в порядке.

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <iomanip>
#include <netinet/in.h>
extern "C" {
#include <linux/netfilter.h>  /* Defines verdicts (NF_ACCEPT, etc) */
#include <libnetfilter_queue/libnetfilter_queue.h>
#include <linux/tcp.h>
#include <linux/ip.h>
}

using namespace std;

static int Callback(nfq_q_handle *myQueue, struct nfgenmsg *msg,
nfq_data *pkt, void *cbData) {

uint32_t id, tSeq;
unsigned char *pktData;
nfqnl_msg_packet_hdr *header;

header = nfq_get_msg_packet_hdr(pkt);
struct iphdr *iph = ((struct iphdr *) pktData);
id = ntohl(header->packet_id);

nfq_get_payload(pkt, &pktData);
struct tcphdr *tcp = ((struct tcphdr *) (pktData + (iph->ihl << 2)));
tSeq = ntohl(tcp->seq);

printf("%u\n", tSeq);

}

int main(int argc, char **argv) {

int fd, res;
char buf[262124];
struct nfq_handle *nfqHandle;
struct nfq_q_handle *myQueue;
struct nfnl_handle *netlinkHandle;

nfqHandle = nfq_open();
nfq_unbind_pf(nfqHandle, AF_INET);
nfq_bind_pf(nfqHandle, AF_INET);

myQueue = nfq_create_queue(nfqHandle,  0, &Callback, NULL);
nfq_set_mode(myQueue, NFQNL_COPY_PACKET, 0xffff);

netlinkHandle = nfq_nfnlh(nfqHandle);
fd = nfnl_fd(netlinkHandle);

while(true){
res = recv(fd, buf, sizeof(buf), 0);
nfq_handle_packet(nfqHandle, buf, res);
}

nfq_destroy_queue(myQueue);
nfq_close(nfqHandle);
return 0;
}

Мне нужно получить правильный порядковый номер для других целей. Я действительно хочу знать причину нулевой последовательности. Любая помощь будет оценена.

0

Решение

Я просто переключил порядок двух операторов в вашей функции обратного вызова.

static int Callback(nfq_q_handle *myQueue, struct nfgenmsg *msg,
nfq_data *pkt, void *cbData) {

uint32_t id, tSeq;
unsigned char *pktData = NULL;
nfqnl_msg_packet_hdr *header;

header = nfq_get_msg_packet_hdr(pkt);
nfq_get_payload(pkt, &pktData);
struct iphdr *iph = ((struct iphdr *) pktData);

id = ntohl(header->packet_id);
struct tcphdr *tcp = ((struct tcphdr *) (pktData + (iph->ihl << 2)));
tSeq = ntohl(tcp->seq);

printf("%u\n", tSeq);

}

Значение iph из pktData, но вы назначили pktData в iph перед инициализацией pktDataВероятно, поэтому ваша программа получает порядковый номер 0. Я тестировал на своей машине. Дайте мне знать, если это не работает для вас.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]