创建pcap文件

创建pcap文件,c,linux,udp,pcap,libpcap,C,Linux,Udp,Pcap,Libpcap,我需要将UDP数据包保存到一个文件中,并希望使用pcap格式重用各种可用工具(wireshark、tcpdump等)。 中有一些信息,但我找不到如何编写全局文件头“struct pcap_file_header” pcap_t* pd = pcap_open_dead(DLT_RAW, 65535); pcap_dumper_t* pdumper = pcap_dump_open(pd, filename); struct pcap_file_header file_hdr; file_hdr

我需要将UDP数据包保存到一个文件中,并希望使用pcap格式重用各种可用工具(wireshark、tcpdump等)。 中有一些信息,但我找不到如何编写全局文件头“struct pcap_file_header”

pcap_t* pd = pcap_open_dead(DLT_RAW, 65535);
pcap_dumper_t* pdumper = pcap_dump_open(pd, filename);

struct pcap_file_header file_hdr;
file_hdr.magic_number = 0xa1b2c3d4;
file_hdr.version_major = 2;
file_hdr.version_minor = 4;
file_hdr.thiszone = 0;
file_hdr.sigfigs = 0;
file_hdr.snaplen = 65535;
file_hdr.linktype = 1;

// How do I write file_hdr to m_pdumper?

while( (len = recvmsg(sd, &msg_hdr, 0)) > 0 )
  pcap_dump((u_char*)m_pdumper, &m_pcap_pkthdr, (const u_char*)&data);
如何写入全局文件头?
如果没有特定的pcap函数可用,我如何使用write()检索文件描述符以插入标头?

您不需要写入该标头,
pcap\u open\u dead
应该为您执行此操作。如果您想直接写入文件,而不是使用
pcap\u dump
和friends,您只需要自己填写并写入该头文件。这里有一个简单程序的例子,用这些函数写出一个pcap文件


关于直接写入文件的原始答案

我记不清它是如何工作的,但我不久前在
redir
上写了一个补丁,可以写出pcap文件,你可以用它作为例子

你可以找到它的附件。(错误链接已修复。)


其中一些用于伪造以太网和IP报头,可能不适用于您正在使用
pcap\u dump\u open
pcap\u dump
的情况,因为上面链接的补丁程序在不使用任何库的情况下写出了
pcap
文件,但我还是把它留在这里,以防万一。如果你只对UDP和TCP感兴趣,你应该使用
DLT\U EN10MB
而不是
DLT\U RAW
(cf)


在WireShak中编辑时效果更好。

谢谢,但看起来您已经使用常规的file write()调用完成了所有操作。我正在使用pcap_dump(),无法确定从何处获取文件描述符。@RobertKubrick已在上面更新。我保留了原来的答案,因为即使使用
pcap\u dump
您仍然需要伪造IP头,上面链接的补丁可能会有帮助。是的,不需要写入全局文件头,我只是验证了。使用pcap\u fileno()从pcap\u t*获取文件描述符。但是,您可以直接调用pcap_dump()将数据包写入pcap_t