【问题标题】:Can I parse ngrep's output with popen()?我可以用 popen() 解析 ngrep 的输出吗?
【发布时间】:2011-06-22 04:12:21
【问题描述】:

我尝试运行此代码,但没有显示任何内容。 (是的,我以 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

【问题讨论】:

    标签: c parsing ngrep


    【解决方案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;
    }
    

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

    【讨论】:

    • "您还应该知道,管道默认情况下是完全缓冲的,因此在缓冲区满之前您可能无法获得任何信息。"如何获取 ngrep 输出的每个字符?立即,无需等待缓冲区已满。
    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多