拼多多网站首页,宁波做网站的专业公司,软件技术用什么软件,深圳高端网站制作费用tcpdump正在运行的时候#xff0c;他写入的pcap可能是不完整的#xff0c;通常我们要结束掉tcpdump才能拿到完整的pcap#xff0c;否则wireshark打开的时候会提示#xff1a;The capture file appears to have been cut short in the middle of a packet。这可能是因为tcpd…tcpdump正在运行的时候他写入的pcap可能是不完整的通常我们要结束掉tcpdump才能拿到完整的pcap否则wireshark打开的时候会提示The capture file appears to have been cut short in the middle of a packet。这可能是因为tcpdump有缓存机制没有实时将每一个抓到的报文立即写入到磁盘
那么如何在不结束tcpdump的情况下拿到完整的pcap文件呢如果有一种机制可以通知tcpdump立即写入挂起的报文就好了。尝试过sync不行因为sync只能导出文件系统缓存。tcpdump可能有自己的缓存机制。
查询tcpdump源代码果然发现了相关的代码如下
#if defined(HAVE_PCAP_DUMP_FLUSH) defined(SIGUSR2)
#define SIGNAL_FLUSH_PCAP SIGUSR2
#endif#ifdef SIGNAL_FLUSH_PCAP(void)setsignal(SIGNAL_FLUSH_PCAP, flushpcap);
#endif#ifdef SIGNAL_FLUSH_PCAP
static void
flushpcap(int signo _U_)
{if (pdd ! NULL)pcap_dump_flush(pdd);
}
看起来这个功能是可选的需要编译时配置搜索 SIGNAL_FLUSH_PCAP 的定义找到 HAVE_PCAP_DUMP_FLUSH也就是说只有配置了 HAVE_PCAP_DUMP_FLUSH 才能启用这个功能。如果已经启用了这个功能只需要使用kill发送信号给他触发 flushpcap 即可
kill -SIGUSR2 [tcpdump_pid]