В настоящее время я использую 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;
}
Я хотел бы добавить внешний поток, чтобы сделать некоторые другие вещи. Как мне изменить код выше, чтобы сделать его неблокирующим?
Когда вы используете неблокирующий режим в 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 () не будут
работа в «неблокирующем» режиме.
pcap_loop предназначен для продолжения, пока не закончится весь ввод. Если вы не хотите такого поведения, вместо этого вызовите pcap_dispatch в цикле. По определению pcap_loop никогда не вернется, это означает, что он всегда ищет больше данных.
я использую pcap_next_ex
Возвращает результат, указывающий, прочитан ли пакет. Таким образом, я управляю приобретением своей собственной темы. См пример Вот. read_timeout
в pcap_open
также влияет на эту функцию.