У меня есть программа, которая отправляет набор пакетов 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
?