问题描述
- 关于pcap_dump_close出现Segmentation fault
-
最近在维护上届学长的一个应用协议识别毕业设计项目。很大一部分内容使用C++写的。其中有个协议的过滤,之前一直使用挺好的,但是数据只要超过30M就出现Segmentation fault(core dump)错误。
使用gdb查看的信息如下:
其中main.cpp内容如下:
这个方法的主要作用就是从一个流文件(pcap格式,经过协议识别处理后,每一条流记录都由一个特殊的数据报文头表示,其中32字节代表一种应用协议的编号)读取某种应用协议的数据报文然后再写入到一个pcap中去。这样子就将某种协议的数据报文给过滤出来了。
由于之前一直都只在做java和php的东西,C++这些可以看得懂,但是很少能写。周边的同学也基本上都不怎么会C++, 恳请有会的给出个大致解决思路。谢谢了。//读取流文件并处理 void readFile(string &flowDir, string &confDir, string &rstDir, string &application) { //定义类Compute Fliter *fliter = new Fliter(flowDir, confDir, rstDir, application); //将目录下的所有文件名存放到文件ls.txt中 string cmd = "ls " + flowDir + " >ls.txt"; system(cmd.c_str()); ifstream files("ls.txt"); assert(files); string pcapdir = rstDir + "pcap/"; string creatdir_cmd = "mkdir " + rstDir + "pcap"; system(creatdir_cmd.c_str()); pcap_dumper_t *pp_write = NULL; char pcapFile[256]; sprintf(pcapFile, "%s%s.pcap", pcapdir.c_str(), application.c_str()); cout <<"pcap file:" <<pcapFile <<endl; //依次读取文件 u_llong fileNum = 0; while(!files.eof()) { //获取文件名 string filename; getline(files, filename); if(filename.empty()) break; string inFile = flowDir + filename; cout <<"read file:" <<inFile <<endl; fileNum++; //打开pcap文件 char errbuf[128]; pcap_t *pp_read_flow = pcap_open_offline(inFile.c_str(), errbuf); assert(pp_read_flow); pcap_t *pp_read_pack = pcap_open_offline(inFile.c_str(), errbuf); assert(pp_read_pack); //读pcap文件 struct pcap_pkthdr ppHdr; //pcap数据包头,16字节 const u_char *pkt; while((pkt = pcap_next(pp_read_flow, &ppHdr)) != NULL) { if(0 == ppHdr.ts.tv_sec) //此条数据为流记录 { // 对应协议与提交任务一致 // pkt[31]处存放的协议号 if((*(u_short*)&pkt[31]) == fliter->convert_application(application)) { if(pp_write == NULL) pp_write = pcap_dump_open(pp_read_flow, pcapFile); assert(pp_write); pcap_dump((u_char*)pp_write, &ppHdr, pkt); while((pkt = pcap_next(pp_read_pack, &ppHdr)) != NULL) { if(ppHdr.ts.tv_sec != 0) { pcap_dump((u_char*)pp_write, &ppHdr, pkt); } else // 到达了下一条流记录 break; } } } } pcap_close(pp_read_flow); pcap_close(pp_read_pack); } ** pcap_dump_close(pp_write);** // 第94行 files.close(); cout <<"ntotal files:" <<fileNum <<endl; }
解决方案
设置一下堆栈大小,使用ulimit设置
时间: 2025-01-21 15:50:47