Принудительный выход из блокирующей функции, goodfornothing, 28-Янв-12, 18:09 [смотреть все]Здравствуйте!Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных, приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap. В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета. Например, поток висит в функции и в это время пользователь решает изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо, чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную задачу? Спасибо!
|
- Принудительный выход из блокирующей функции, dima, 04:31 , 29-Янв-12 (1) –1
- Принудительный выход из блокирующей функции, goodfornothing, 13:16 , 04-Фев-12 (2)
>[оверквотинг удален] >> Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных, >> приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap. >> В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо >> обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета. >> Например, поток висит в функции и в это время пользователь решает >> изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо, >> чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную >> задачу? >> Спасибо! > давно уже есть Ethereal А подробнее можно?
- Принудительный выход из блокирующей функции, fork, 01:05 , 05-Фев-12 (3)
- Принудительный выход из блокирующей функции, goodfornothing, 14:58 , 05-Фев-12 (4)
> Предлагается использовать Etheral вместо Libpcap, насколько я понял. Не знаком ни > с Libpcap ни с Etheral, но думаю можно добавить таймаут > в ту блокирующую функцию, чтобы периодически её запускать во время работы, > но и обрабатывать различные ситуации вроде той, когда пользователь решит изменить > выражение фильтра. Либо добавить(использовать) управление заданием той самой функции > из другого потока."Предлагается использовать Etheral". Это не решение проблемы, а попытка от нее уйти. Менять что-то в кишках блокирующей функции я не могу, поскольку она библиотечная. По-видимому, придется принудительно завершать поток, в котором вызвана функция и перезапускать его
- Принудительный выход из блокирующей функции, fork, 22:12 , 05-Фев-12 (5)
- Принудительный выход из блокирующей функции, fork, 22:25 , 05-Фев-12 (6)
- Принудительный выход из блокирующей функции, goodfornothing, 22:23 , 07-Фев-12 (7)
> int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) > Второй аргумент > Following that is an integer that tells pcap_loop() how many packets it > should sniff for before returning (a negative value means it should > sniff until an error occurs). > Устанавливайте количество, переменную cnt, после чего запускайте обработчик ввода пользователя > и снова pcap_loop. И никаких блокировок не будет Даже если я вызову pcap_loop со значением cnt равным "1", поток будет висеть в этой функции до скончания века, если данный пакет не будет принят по каким-то причинам. Как Вы предлагаете в данном случае выйти из pcap_loop? Теперь по поводу таймаута. Действительно, в библиотеке есть возможность задать таймаут. Но решение задачи выходом из блокирующей функции по таймауту не является оптимальным. Можно сделать, как Вы предложили: вываливаться из функции по таймауту, проверять управляющую информацию и возвращаться обратно. Такую же проверку нужно делать и в callback функции, чтобы иметь возможность выходить из функции в случае отсутствия возникновения таймаутов. При выходе из блокирующей функции программа становится нечувствительной к событиям приема пакетов. То есть мы начинаем терять пакеты. Такой подход заведомо снижает эффективность работы программы.
|