Как использовать pcap_breakloop?

У меня есть функция pcap_loop в другой функции, которая захватывает пакеты до тех пор, пока пользователь не остановит ее, т.е.

void functionA()
{
   signal(SIGINT, terminate_process); 
   pcap_loop(handle, -1, callback, NULL);
   ...

}

void terminate_process(int signum)
{
   pcap_breakloop(handle);
   pcap_close(handle);
} 

Можно ли установить продолжительность захвата пакетов? Что-то типа:

if (time(NULL) - start_time > 100)
   pcap_breakloop(handle);

Но я не знаю, куда это поместить, потому что до сих пор все примеры, которые я видел, использовали pcap_breakloop в обработчике сигналов, что требует вмешательства пользователя. Как будет проверяться условие времени во время работы pcap_loop?

Спасибо.

С уважением, Рейн


person Rayne    schedule 04.03.2010    source источник
comment
Меня интересует параметр handle, который вы передали pcap_breakloop() в terminate_process(), как вы можете его использовать?   -  person Allan Ruin    schedule 20.03.2013


Ответы (1)


Вы можете использовать будильник, чтобы генерировать сигнал через заданное количество секунд. :

void functionA()
{
    signal(SIGALRM, terminate_process); 
    alarm(100);
}
person R Samuel Klatchko    schedule 04.03.2010
comment
Спасибо. Это работает в Linux, но не в Windows, так как SIGALRM не существует. - person Rayne; 04.03.2010
comment
@Rayne - к сожалению, я не эксперт по Windows API, поэтому не знаю, есть ли что-то похожее на alarm. Вы всегда можете запустить поток, который вызывает Sleep, а затем pcap_breakloop. - person R Samuel Klatchko; 05.03.2010