<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Принудительный выход из блокирующей функции</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html</link>
    <description>Здравствуйте!&lt;br&gt;&lt;br&gt;Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных, приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap. В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета. Например, поток висит в функции и в это время пользователь решает изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо, чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную задачу?&lt;br&gt;&lt;br&gt;Спасибо!&lt;br&gt;</description>

<item>
    <title>Принудительный выход из блокирующей функции (fork)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#8</link>
    <pubDate>Tue, 07 Feb 2012 22:07:23 GMT</pubDate>
    <description>Да, я предполагал, что, возможно, это приведет к потере пакетов, скорость может быть огромная. Вы проверяли это? В любом случае в библиотеке должны быть механизмы, решающие эту проблему без потери пакетов, хотя, может быть, и на более мощном железе. Как бы логично, что опрос тех пакетов никак не может помешать проверить в этой же функции один единственный флаг о необходимости завершить этот опрос, в том же коллбэке больше операций выполняется. &lt;br&gt;</description>
</item>

<item>
    <title>Принудительный выход из блокирующей функции (goodfornothing)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#7</link>
    <pubDate>Tue, 07 Feb 2012 18:23:34 GMT</pubDate>
    <description>&amp;gt; int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) &lt;br&gt;&amp;gt; Второй аргумент &lt;br&gt;&amp;gt; Following that is an integer that tells pcap_loop() how many packets it &lt;br&gt;&amp;gt; should sniff for before returning (a negative value means it should &lt;br&gt;&amp;gt; sniff until an error occurs).&lt;br&gt;&amp;gt; Устанавливайте количество, переменную cnt, после чего запускайте обработчик ввода пользователя &lt;br&gt;&amp;gt; и снова pcap_loop. И никаких блокировок не будет &lt;br&gt;&lt;br&gt;Даже если я вызову pcap_loop со значением cnt равным &quot;1&quot;, поток будет висеть в этой функции до скончания века, если данный пакет не будет принят по каким-то причинам. Как Вы предлагаете в данном случае выйти из pcap_loop?&lt;br&gt;&lt;br&gt;Теперь по поводу таймаута. Действительно, в библиотеке есть возможность задать таймаут. Но решение задачи выходом из блокирующей функции по таймауту не является оптимальным. Можно сделать, как Вы предложили: вываливаться из функции по таймауту, проверять управляющую информацию и возвращаться обратно. Такую же проверку нужно делать и в callback функции, чтобы иметь воз</description>
</item>

<item>
    <title>Принудительный выход из блокирующей функции (fork)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#6</link>
    <pubDate>Sun, 05 Feb 2012 18:25:54 GMT</pubDate>
    <description>&amp;gt;принудительно завершать поток, в котором вызвана функция и перезапускать его&lt;br&gt;&lt;br&gt;Вы знаете на каком месте поток остановится и какие ресурсы он может занять, но не успеть освободить и кроме того вы готовы постоянно плодить новые потоки? Почитайте документацию, например эту http://www.tcpdump.org/pcap.html  ,либо дождитесь завершения потока.&lt;br&gt;&lt;br&gt;int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)&lt;br&gt;&lt;br&gt;Второй аргумент &lt;br&gt;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).&lt;br&gt;&lt;br&gt;Устанавливайте количество, переменную cnt, после чего запускайте обработчик ввода пользователя и снова pcap_loop. И никаких блокировок не будет&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Принудительный выход из блокирующей функции (fork)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#5</link>
    <pubDate>Sun, 05 Feb 2012 18:12:20 GMT</pubDate>
    <description>&amp;gt; принудительно завершать поток, в котором вызвана функция и перезапускать его&lt;br&gt;&lt;br&gt;Это не решение, а костыль, и очень опасный. Возможно вам стоит получше изучить документацию,  то, что я вам предложил в библиотеке скорее всего реализовано.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Принудительный выход из блокирующей функции (goodfornothing)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#4</link>
    <pubDate>Sun, 05 Feb 2012 10:58:02 GMT</pubDate>
    <description>&amp;gt;  Предлагается использовать Etheral вместо Libpcap, насколько я понял. Не знаком ни &lt;br&gt;&amp;gt; с  Libpcap ни с Etheral, но думаю можно добавить таймаут &lt;br&gt;&amp;gt; в ту блокирующую функцию, чтобы периодически её запускать во время работы, &lt;br&gt;&amp;gt; но и обрабатывать различные ситуации вроде той, когда пользователь решит изменить &lt;br&gt;&amp;gt; выражение фильтра. Либо добавить(использовать) управление заданием той самой функции &lt;br&gt;&amp;gt; из другого потока.&lt;br&gt;&lt;br&gt;&quot;Предлагается использовать Etheral&quot;. Это не решение проблемы, а попытка от нее уйти. Менять что-то в кишках блокирующей функции я не могу, поскольку она библиотечная. По-видимому, придется принудительно завершать поток, в котором вызвана функция и перезапускать его&lt;br&gt;</description>
</item>

<item>
    <title>Принудительный выход из блокирующей функции (fork)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#3</link>
    <pubDate>Sat, 04 Feb 2012 21:05:20 GMT</pubDate>
    <description> Предлагается использовать Etheral вместо Libpcap, насколько я понял. Не знаком ни с  Libpcap ни с Etheral, но думаю можно добавить таймаут в ту блокирующую функцию, чтобы периодически её запускать во время работы, но и обрабатывать различные ситуации вроде той, когда пользователь решит изменить выражение фильтра. Либо добавить(использовать) управление заданием той самой функции из другого потока. &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Принудительный выход из блокирующей функции (goodfornothing)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#2</link>
    <pubDate>Sat, 04 Feb 2012 09:16:00 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt; Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных, &lt;br&gt;&amp;gt;&amp;gt; приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap.&lt;br&gt;&amp;gt;&amp;gt; В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо &lt;br&gt;&amp;gt;&amp;gt; обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета.&lt;br&gt;&amp;gt;&amp;gt; Например, поток висит в функции и в это время пользователь решает &lt;br&gt;&amp;gt;&amp;gt; изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо, &lt;br&gt;&amp;gt;&amp;gt; чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную &lt;br&gt;&amp;gt;&amp;gt; задачу?&lt;br&gt;&amp;gt;&amp;gt; Спасибо!&lt;br&gt;&amp;gt; давно уже есть Ethereal &lt;br&gt;&lt;br&gt;А подробнее можно?&lt;br&gt;</description>
</item>

<item>
    <title>Принудительный выход из блокирующей функции (dima)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9367.html#1</link>
    <pubDate>Sun, 29 Jan 2012 00:31:45 GMT</pubDate>
    <description>&amp;gt; Здравствуйте!&lt;br&gt;&amp;gt; Пишу приложение с использованием Qt. Имеется поток назначение которого, - захват данных, &lt;br&gt;&amp;gt; приходящих на сетевой интерфейс компьютера. Для захвата используется библиотека Libpcap. &lt;br&gt;&amp;gt; В потоке вызывается блокирующая функция захвата пакетов, например, pcap_loop. Необходимо &lt;br&gt;&amp;gt; обеспечить возможность выхода из данной функции, не дожидаясь события захвата пакета. &lt;br&gt;&amp;gt; Например, поток висит в функции и в это время пользователь решает &lt;br&gt;&amp;gt; изменить выражение фильтра. Чтобы заново скомпилировать выражение фильтра, необходимо, &lt;br&gt;&amp;gt; чтобы блокирующая функция вернула управление потоку. Каким образом можно решить данную &lt;br&gt;&amp;gt; задачу?&lt;br&gt;&amp;gt; Спасибо!&lt;br&gt;&lt;br&gt;давно уже есть Ethereal&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
