[windows] работа с fpopen и ngrер

Тема в разделе "PHP", создана пользователем modelsonline, 4 мар 2011.

Модераторы: latteo
  1. modelsonline

    modelsonline Постоялец

    Регистр.:
    18 окт 2010
    Сообщения:
    103
    Симпатии:
    9

    PHP:
    $ngrep 'ngrep.exe -q -W single regexp';
    $handle popen($ngrep'r');
    $read fgets($handle);
    Данный код неработоспособен. Если кто-то не знает почему, можно дальше не читать.

    Требуется:
    1. запустить нгреп в пайп
    2. do
    3. прочитать очередь из пайпа
    4. обработать пакеты, тут возможна пауза 1-2 секунды
    5. while надо
    6. закрыть пайп

    То есть должно быть так, запускается ngrep, приходит нужный пакет, исполняется цикл. Если за это время пришли еще пакеты, их нельзя потерять. Платформа windows xp.

    Недопустимо:
    1. терять пакеты (перезапускать снифер)
    2. обрабатывать пакеты невовремя (читать n байт из очереди)
    3. использовать сниферы отличные от ngrep

    Решение при необходимости оплачивается, можно сразу стучать в личку.

     
  2. satih

    satih

    Регистр.:
    19 сен 2008
    Сообщения:
    429
    Симпатии:
    710
    продублируй в коммерческий раздел если готов заплатить, может быстрей помогут.
     
  3. modelsonline

    modelsonline Постоялец

    Регистр.:
    18 окт 2010
    Сообщения:
    103
    Симпатии:
    9
    Непонятная какая-то ситуация, так работает

    $ngrep = 'ngrep.exe -q -W single port 123';

    а так нет

    $ngrep = 'ngrep.exe -q -W single "regexp" port 123';


    В первом варианте работает как-то странно, пару раз пакеты не отобразила, подавилась или не прочитала фиг знает. Похоже что буфер в пайпе нужно "пробить", тогда если все пакеты отправлять он пробивается (вроде как есть небольшая задержка). Вариант 2 работает, если читать пакеты из файла (видимо, все сразу проходят в конце). В документации об этом ничего нет (
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    PHP не понимает отличия между NO_DATA и CONNECTION_CLOSE для внешних сокетов. Боюсь, ты это никак не поборешь. Разве что самому свой буфер городить через отдельный процесс.