The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Принудительный выход из блокирующей функции"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (GUI, XWindow, Qt, GTK)
Изначальное сообщение [ Отслеживать ]

"Принудительный выход из блокирующей функции"  +/
Сообщение от goodfornothing email(ok) on 28-Янв-12, 18:09 
Здравствуйте!

Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных, приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap. В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета. Например, поток висит в функции и в это время пользователь решает изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо, чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную задачу?

Спасибо!

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Принудительный выход из блокирующей функции"  –1 +/
Сообщение от dima (??) on 29-Янв-12, 04:31 
> Здравствуйте!
> Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных,
> приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap.
> В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо
> обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета.
> Например, поток висит в функции и в это время пользователь решает
> изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо,
> чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную
> задачу?
> Спасибо!

давно уже есть Ethereal


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Принудительный выход из блокирующей функции"  +/
Сообщение от goodfornothing email(ok) on 04-Фев-12, 13:16 
>[оверквотинг удален]
>> Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных,
>> приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap.
>> В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо
>> обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета.
>> Например, поток висит в функции и в это время пользователь решает
>> изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо,
>> чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную
>> задачу?
>> Спасибо!
> давно уже есть Ethereal

А подробнее можно?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Принудительный выход из блокирующей функции"  +/
Сообщение от fork (??) on 05-Фев-12, 01:05 
Предлагается использовать Etheral вместо Libpcap, насколько я понял. Не знаком ни с  Libpcap ни с Etheral, но думаю можно добавить таймаут в ту блокирующую функцию, чтобы периодически её запускать во время работы, но и обрабатывать различные ситуации вроде той, когда пользователь решит изменить выражение фильтра. Либо добавить(использовать) управление заданием той самой функции из другого потока.


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Принудительный выход из блокирующей функции"  +/
Сообщение от goodfornothing email(ok) on 05-Фев-12, 14:58 
>  Предлагается использовать Etheral вместо Libpcap, насколько я понял. Не знаком ни
> с  Libpcap ни с Etheral, но думаю можно добавить таймаут
> в ту блокирующую функцию, чтобы периодически её запускать во время работы,
> но и обрабатывать различные ситуации вроде той, когда пользователь решит изменить
> выражение фильтра. Либо добавить(использовать) управление заданием той самой функции
> из другого потока.

"Предлагается использовать Etheral". Это не решение проблемы, а попытка от нее уйти. Менять что-то в кишках блокирующей функции я не могу, поскольку она библиотечная. По-видимому, придется принудительно завершать поток, в котором вызвана функция и перезапускать его

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Принудительный выход из блокирующей функции"  +/
Сообщение от fork (??) on 05-Фев-12, 22:12 
> принудительно завершать поток, в котором вызвана функция и перезапускать его

Это не решение, а костыль, и очень опасный. Возможно вам стоит получше изучить документацию,  то, что я вам предложил в библиотеке скорее всего реализовано.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Принудительный выход из блокирующей функции"  +/
Сообщение от fork (??) on 05-Фев-12, 22:25 
>принудительно завершать поток, в котором вызвана функция и перезапускать его

Вы знаете на каком месте поток остановится и какие ресурсы он может занять, но не успеть освободить и кроме того вы готовы постоянно плодить новые потоки? Почитайте документацию, например эту http://www.tcpdump.org/pcap.html  ,либо дождитесь завершения потока.

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. И никаких блокировок не будет


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Принудительный выход из блокирующей функции"  +/
Сообщение от goodfornothing email(ok) on 07-Фев-12, 22:23 
> 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 функции, чтобы иметь возможность выходить из функции в случае отсутствия возникновения таймаутов. При выходе из блокирующей функции программа становится нечувствительной к событиям приема пакетов. То есть мы начинаем терять пакеты. Такой подход заведомо снижает эффективность работы программы.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Принудительный выход из блокирующей функции"  +/
Сообщение от fork (??) on 08-Фев-12, 02:07 
Да, я предполагал, что, возможно, это приведет к потере пакетов, скорость может быть огромная. Вы проверяли это? В любом случае в библиотеке должны быть механизмы, решающие эту проблему без потери пакетов, хотя, может быть, и на более мощном железе. Как бы логично, что опрос тех пакетов никак не может помешать проверить в этой же функции один единственный флаг о необходимости завершить этот опрос, в том же коллбэке больше операций выполняется.
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру