0

我尝试运行此代码,但没有显示任何内容。(是的,我以 root 身份运行它)如果我无法获得 ngrep 的输出,我想我会尝试弄清楚如何在 c++ 中使用 libpcap,尽管我无法找到任何好的示例。

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

那么这段代码会导致什么都不显示,你有什么建议可以轻松解析 ngrep 的输出,或者其他一些捕获 GET 请求的方式,可能是使用 libpcap

4

1 回答 1

1

我看到了可能的潜在问题:

  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;
}

您还应该知道,管道默认情况下是完全缓冲的,因此在缓冲区满之前您可能无法获得任何信息。

于 2011-06-22T04:19:36.840 回答