Могу ли я проанализировать вывод ngrep с помощью popen ()? - PullRequest
0 голосов
/ 22 июня 2011

Я пытался запустить этот код, но ничего не отображается. (Да, я запустил его как root). Если я не могу получить вывод ngrep, думаю, я попытаюсь выяснить, как использовать libpcap с c ++, хотя я не смог найти хороших примеров.

int main(void)
{
    FILE* fproc = popen("ngrep -d wlan0 GET");
    char c;
    do {
        printf("%c", fgetc(fproc));
    } while (c!=EOF);
}

Так что в этом коде ничего не отображается, и что вы предлагаете для простого анализа вывода ngrep или другого способа захвата GET-запросов, возможно, с помощью libpcap

1 Ответ

1 голос
/ 22 июня 2011

Я вижу возможные потенциальные проблемы:

  1. У вас нет открытого режима для вызова popen? Отключение этого параметра может привести к тому, что дамп ядра или случайное значение стека будут решаться, будет ли это канал чтения или записи.

  2. Переменная c должна быть int, а не char, поскольку она должна содержать все символы плюс EOF.

  3. И вы на самом деле не присваиваете что-либо для c, что приведет к выходу из цикла.

  4. С помощью этого цикла do вы пытаетесь вывести EOF в выходной поток в конце. Не знаю с головы до головы, если это плохо, но это, конечно, не нужно.

Попробуйте это:

int main(void) {
    int ch;
    FILE* fproc;

    if ((fproc = popen("ngrep -d wlan0 GET", "r")) < 0) {
        fprintf (stderr, "Cannot open pipe\n");
        return 1;
    }

    while ((ch = fgetc (fproc)) != EOF) {
        printf ("%c", ch);
    };

    pclose (fproc);

    return 0;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...