Как сделать libpcap / pcap_loop неблокирующим?

В настоящее время я использую libpcap для прослушивания трафика в случайном режиме

int main()
{
// some stuff
printf("Opening device: %s\n", devname.c_str());

handle = pcap_open_live(devname.c_str(), 65536 , 1 , 0 , errbuf);

if (handle == NULL)
{
fprintf(stderr, "Couldn't open device %s : %s..." , devname.c_str(), errbuf);
return 1;
}
printf(" Done\n");

pcap_loop(handle , -1 , process_packet , NULL);
// here run a thread to do some stuff. however, pcap_loop is blocking
return 0;
}

Я хотел бы добавить внешний поток, чтобы сделать некоторые другие вещи. Как мне изменить код выше, чтобы сделать его неблокирующим?

2

Решение

Когда вы используете неблокирующий режим в libpcap, вы должны использовать pcap_dispatch, но обратите внимание, pcap_dispatch может работать в блокирующем или неблокирующем режиме, это зависит от того, как вы установили libpcap, чтобы установить libpcap для работы в неблокирующем режиме, используйте функцию pcap_setnonblock:

int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf);

Разница между блокированием и неблокированием заключается не в цикле, который выполняется вечно, а в блокировании функции. pcap_dispatch ожидает пакет и возвращается только тогда, когда этот пакет получен, однако в неблокирующем режиме функция немедленно возвращается, и обратный вызов должен обработать пакет.

В «неблокирующем» режиме попытка чтения из захвата
дескриптор с pcap_dispatch () будет, если в данный момент нет пакетов
доступны для чтения, вернуть 0 сразу, а не блокировать
ожидание пакетов, чтобы прибыть. pcap_loop () и pcap_next () не будут
работа в «неблокирующем» режиме.

http://www.tcpdump.org/manpages/pcap_setnonblock.3pcap.html

3

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

pcap_loop предназначен для продолжения, пока не закончится весь ввод. Если вы не хотите такого поведения, вместо этого вызовите pcap_dispatch в цикле. По определению pcap_loop никогда не вернется, это означает, что он всегда ищет больше данных.

0

я использую pcap_next_ex Возвращает результат, указывающий, прочитан ли пакет. Таким образом, я управляю приобретением своей собственной темы. См пример Вот. read_timeout в pcap_open также влияет на эту функцию.

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