我可以用popen()解析ngrep的输出吗?

问题描述:

我试着运行这段代码,但没有任何显示。 (是的,我把它作为根运行)如果我不能得到ngrep的输出我想我会试图找出如何使用libpcap与c + +,虽然我一直没能找到任何好的例子。我可以用popen()解析ngrep的输出吗?

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

那么这段代码是什么原因导致什么是表演,你有什么建议可以轻松解析的ngrep的输出,或捕获GET请求的一些其他的方式,可能与libpcap的

我看到可能的潜力问题:

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

你也应该知道,该管完全由默认的缓冲,所以你可能无法得到任何信息,直到缓冲区已满。 “

+0

”您还应该意识到,管道默认情况下已完全缓冲,因此在缓冲区满之前您可能无法获得任何信息。“我怎样才能得到每个字符,因为它是由ngrep输出的?瞬间,不必等待缓冲区已满。 – vilive