The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Принудительный выход из блокирующей функции, !*! 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 функции, чтобы иметь возможность выходить из функции в случае отсутствия возникновения таймаутов. При выходе из блокирующей функции программа становится нечувствительной к событиям приема пакетов. То есть мы начинаем терять пакеты. Такой подход заведомо снижает эффективность работы программы.




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

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