我正在使用带有 c++ 的 libpcap。我想将捕获保存到文件中,我使用它:
if ((pcount = pcap_loop (p, -1, &pcap_dump, (char *) pd)) < 0)
{
pcap_perror (p, prestr);
}
如何在需要时停止捕获并保存数据?
谢谢。
您的问题分为两个部分:如何停止和如何保存。让我们依次处理。
如何“停止”捕获
简而言之:您不会“停止”捕获 - 您捕获的数量有限,并检查是否足够。
pcap
文档表明第二个参数是要捕获的数据包数。通过指定-1
,您是在告诉系统捕获直到出错。
如果您要检查其他一些条件(例如,由系统的其他部分设置的变量),可能pcap_loop
带有参数 of-1
是不合适的。pcap
文档中的其他选项看起来更合适:
pcap_next
只会抓取下一个数据包,因此您可以在每个数据包之后检查,或者
pcap_dispatch
将处理一批数据包
鉴于您正在尝试保存输出,pcap_dispatch
这可能是更好的选择。所以像:
while (something_tells_me_to_keep_going) {
// process one buffer-full (error handling removed for brevity)
pcap_dispatch(p, -1, &pcap_dump, (char*) pd);
// possibly update something_tells_me_to_keep_going, based on time or whatever
}
如何保存数据
您已经指定了回调处理程序pcap_dump
,该处理程序旨在将数据包数据转储到先前使用pcap_dump_open
. 因此,在您致电pcap_loop
(或pcap_dispatch
)之前,您可能已经(或将需要)这样的东西:
pcap_dumper_t *pd = pcap_dump_open(p, "my_save_file.pcap");
...您使用等创建p
的pcap_t*
流在哪里?pcap_open_live
(请参阅libcap 作者的注释,阐明此功能的使用)。
最后,完成后,使用以下命令关闭文件:
pcap_dump_close(pd);
参考: