2012-04-11 127 views
4

我需要將UDP數據包保存到一個文件,並且希望使用pcap格式來重用可用的各種工具(wireshark,tcpdump,...)。 this thread有一些信息,但我找不到如何編寫全局文件頭'struct pcap_file_header'。創建一個pcap文件

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()插入標頭?

回答

3

你不應該寫這個頭,pcap_open_dead應該爲你做。如果你想直接寫文件而不是使用pcap_dump和朋友,你只需要自己填寫並寫上這個頭文件。有一個示例程序here用這些函數寫出一個pcap文件。


原來的答案,就直接寫入文件:

我不記得這是怎樣工作的,但我剛纔寫了一個補丁redir會寫出PCAP文件,你可能可以用它作爲例子。

你可以找到它連接到this debian bug。 (錯誤鏈接固定。)

有的則是僞造的以太網和IP報頭,並且你正在使用pcap_dump_openpcap_dump其中在如上鍊接的補丁寫出pcap文件,而無需使用任何庫可能不適用,但是我會在這裏留下這個以防萬一它有幫助。

+0

謝謝,但它看起來像使用普通文件write()調用完成了所有操作。我正在使用pcap_dump()並且無法確定獲取文件描述符的位置。 – 2012-04-11 21:11:13

+0

@RobertKubrick更新以上。我已經離開了原來的答案,即使使用'pcap_dump',你仍然需要僞造一個IP頭,上面鏈接的補丁可能會有幫助。 – je4d 2012-04-11 21:22:42

+0

的確,不需要寫全局文件頭,我只是驗證過。 – 2012-04-11 21:37:29