Stack_Over_Flow 2015-03-30 03:22 采纳率: 0%
浏览 2587

关于pcap_dump_close出现Segmentation fault

最近在维护上届学长的一个应用协议识别毕业设计项目。很大一部分内容使用C++写的。其中有个协议的过滤,之前一直使用挺好的,但是数据只要超过30M就出现Segmentation fault(core dump)错误。
使用gdb查看的信息如下: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;
}
  • 写回答

1条回答 默认 最新

  • 微软技术分享 全栈领域优质创作者 2024-03-08 15:00
    关注

    此类情况通常是由于内存溢出导致的,你试试吧

    pcap_close(pp_read_flow);
    pcap_close(pp_read_pack);
    

    这两段放入到while循环的最后面能行吗,不确定是不是因为每次循环没关闭导致溢出了。

    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?