0

我有以下问题。我用两个线程构建了一个 c++ 程序。在父线程上,我发送了一些原始以太网帧,在子线程中,所有 libpcap 的东西都在运行。

对于输出,我使用 ncurses。

现在我有以下问题。我只能使用 pcap_stats 或 pcap_dump_open。

当我注释掉所有 pcap_stats 的东西时,程序会正常运行。所有包都被捕获并保存到一个文件中。

当我注释掉所有保存到文件的东西时,程序会定期运行。

一旦我同时使用两者,我就会在 pcap_dump_open 上遇到分段错误。我错过了什么吗?

void *pcapFunction(void * arg)
{
  optionList *oLT = (optionList*) arg;
  pcap_t *descr;                                              /* session descriptor */
  pcap_dumper_t *fdescr;                                      /* save file descriptor */
  struct pcap_stat ps;
  char errbuf[PCAP_ERRBUF_SIZE];                              /* error string */
  char *finalSaveFileName;
  std::string saveFileName = std::string("../pcapSaveFiles/pcapSaveFile");
  std::stringstream out;
  int capturedPackages = 0;
  time_t t;                                                   /* time structur */
  t = time(0);                                                /* get time */

  // i set up pcap the following way
  descr = pcap_create(oLT->get_deviceName(), errbuf);
  if(descr == NULL)
  {
     mvwprintw(oLT->getTopWin(), oLT->get_writeTopRow(), oLT->get_writeTopCol(), "ERROR: device could not be opend");
     oLT->refreshTopScreen();
     exit(1);
  }
  pcap_set_promisc(descr, 0);
  pcap_set_snaplen(descr, BUFSIZ);
  pcap_set_timeout(descr, 1000);
  pcap_setnonblock(descr, 0, errbuf);
  pcap_activate(descr);

  // some file name building stuff
  ...
  saveFileName = out.str();
  fdescr = pcap_dump_open(descr, strcpy(finalSaveFileName, saveFileName.c_str()));

  while (!oLT->get_stopCapture())
  {
    capturedPackages += pcap_dispatch(descr, 1, &pcap_dump, (unsigned char*) fdescr);
    // here is the problem
    pcap_stats(descr, &ps);
    // this should be the output from ps an not 
    mvwprintw(oLT->getBotWin(), 2, (oLT->get_windowCol()-18)/2, "number of captured %d packages", capturedPackages);
oLT->refreshBotScreen();
  }

  //
  pcap_dump_close(fdescr);
  pcap_close(descr);
  pthread_exit(NULL);
}
4

1 回答 1

1

strcpy()不像你想象的那样工作。

没有分配足够大的缓冲区来保存复制的结果;它假定缓冲区已经存在,如果它太小,它只会覆盖缓冲区末尾的数据。您似乎没有设置 的值finalSaveFileName,在将其作为第一个参数传递给 之前,您必须这样做strcpy()

在这种情况下也没有必要;String的c_str方法返回一个 C 字符串,您可以将该 C 字符串传递给pcap_dump_open().

如果您没有finalSaveFileName在未向我们展示的代码中设置某处的值,那么您的程序在没有调用 的情况下似乎可以工作,这pcap_stats()纯属运气。也许,例如,寄存器或内存位置中发生的任何随机值,所保存的值finalSaveFileName碰巧指向的东西,当被 覆盖时strcpy(),不会立即引起问题,而是碰巧重叠struct pcap_stat ps,所以如果您调用pcap_stats(),字符串被覆盖,并且可能不再有终止符\0,因此对该字符串的引用失败。

要打开输出文件,您需要做的是

fdescr = pcap_dump_open(descr, saveFileName.c_str());

或者,如果您需要finalSaveFileName指向 的 C 字符串值的副本saveFileName,请执行

finalSaveFileName = strdup(saveFileName.c_str());
fdescr = pcap_dump_open(descr, finalSaveFileName);
于 2013-02-23T23:02:58.920 回答