销毁libtrace_out_t数组的问题*

时间:2014-01-28 10:09:51

标签: c++ pcap

任务是从一个跟踪器读取数据包并写入许多跟踪器。

我使用libtrace_out_t **作为输出跟踪器 初始化:

uint16_t size = 10;
libtrace_out_t** array = libtrace_out_t*[size];
for(uint16_t i = 0; i < size; ++i) {
   array[i] = trace_create_output(uri); // created OK
   trace_start_output(outTracers_[i]); // started OK
}

// writing packets

使用tracer数组的元素创建,启动和写入数据包都很好 当我在循环中销毁输出跟踪器时,trace_destroy_output()会导致问题:

for(uint16_t i = 0; i < size; ++i)  
{  
  if(outTracers_[i])  
     trace_destroy_output(outTracers_[i]);  
}

在第一次迭代中,输出跟踪器正在破坏 但是在第二次它失败了

中的分段错误
pcap_close(pcap_t* p)

因为指针p的值为0x0。

有人可以解释一下为什么会发生这种事情或者如何正确销毁它?

2 个答案:

答案 0 :(得分:0)

我认为你的代码中有一个超出范围的访问权限

uint16_t size = 5; /// number of tracers
for(uint16_t i = 0; i != size; ++i)  
{  
  if(outTracers_[i])  
     trace_destroy_output(outTracers_[i]);  
}

转换为

for(uint16_t i = 0; i <= 5; ++i)  
{  
  ...
}

outTracers_ [5]不是数组中的有效元素

答案 1 :(得分:0)

从您发布的代码中,看起来您正在使用相同的URI创建10个输出跟踪。所以,基本上,你已经创建了10个输出文件,所有文件都具有相同的文件名,这可能不是你想要的。

当需要销毁输出跟踪时,第一个destroy会关闭与您提供的名称匹配的文件,并将对该文件的引用设置为NULL。由于引用现在为NULL,因此任何后续破坏该文件的尝试都将导致分段错误。

确保更改您创建的每个新输出跟踪的URI,并且应该解决问题。

示例:

/* I prefer pcapfile: over pcap: */
const char *base="pcapfile:output";
uint16_t size = 10;
libtrace_out_t* array[size];
for (uint16_t i = 0; i < size; ++i) {
    char myuri[1024];
    /* First output file will be called output-1.pcap
     * Second output file will be called output-2.pcap
     * And so on...
     */
    snprintf(myuri, 1023, "%s-%u.pcap", base, i);
    array[i] = trace_create_output(uri);
    /* TODO Check for errors here */
    if (trace_start_output(array[i])) {
        /* TODO Handle error case */
    }
}

另一个提示:libtrace已经包含一个名为tracesplit的工具,它接受输入源并根据某些标准(例如,数据包数量,输出文件大小,时间间隔)将数据包拆分为多个输出跟踪。这个工具可能已经做了你想要的而不必编写代码,或者至少在编写你自己的代码时它会作为一个很好的例子。