Асинхронный libpcap :теряет пакеты?

У меня есть программа, которая отправляет набор пакетов TCP SYN на хост (с использованием исходных сокетов )и используетlibpcap(с фильтром )для получения ответов. Я пытаюсь реализовать это в инфраструктуре асинхронного ввода-вывода, но кажется, что libpcapотсутствуют некоторые ответы (, а именно первые пакеты серии, когда требуется менее 100 microsecondsмежду TCP SYN и ответ ). Дескриптор pcap настроен следующим образом:

pcap_t* pcap = pcap_open_live(NULL, -1, false, -1, errorBuffer);
pcap_setnonblock(pcap, true, errorBuffer);

Затем я добавляю фильтр (, содержащийся в строке filterExpression ):

struct bpf_program filter;
pcap_compile(pcap, &filter, filterExpression.c_str(), false, 0);
pcap_setfilter(pcap, &filter);
pcap_freecode(&filter);

. И в цикле после отправки каждого пакета я использую select, чтобы узнать, могу ли я читать из libpcap:

int pcapFd = pcap_get_selectable_fd(pcap);
fd_set fdRead;
FD_ZERO(&fdRead);
FD_SET(pcapFd, &fdRead);
select(pcapFd + 1, &fdRead, NULL, NULL, &selectTimeout);

И прочитайте:

if (FD_ISSET(pcapFd, &fdRead)) {
     struct pcap_pkthdr* pktHeader;
     const u_char* pktData;
     if (pcap_next_ex(pcap, &pktHeader, &pktData) > 0) {
         // Process received response.
     }
     else {
         // Nothing to receive (or error).
     }
}

Как я уже говорил, часть пакетов пропущена (, попадая в состояние «нечего принимать» else ). Я знаю, что эти пакеты есть, потому что я могу захватить их синхронно (, используя tcpdumpили работающий поток pcap_loop).. Я пропустил какую-то деталь здесь? Или это проблема с libpcap?

6
задан bruno nery 24 July 2012 в 18:39
поделиться