我尝试运行此代码,但没有显示任何内容。 (是的,我以 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)
最佳答案
我看到了可能存在的潜在问题:
您没有用于
popen
调用的打开模式吗?关闭此选项可能会导致核心转储或堆栈的随机值决定它是读管道还是写管道。c
变量应该是int
而不是char
,因为它必须能够保存所有字符加上一个EOF
指示器。而且,您实际上并没有为
c
分配任何东西,这会导致循环退出。通过该
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;
}
您还应该注意,默认情况下管道是完全缓冲的,因此在缓冲区已满之前您可能无法获取任何信息。
关于我可以用 popen() 解析 ngrep 的输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434804/