我有以下问题。我用两个线程构建了一个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);
}
答案 0 :(得分:1)
strcpy()
无法按照您的想法运作。
它不分配足够大的缓冲区来保存副本的结果;它假设缓冲区已经存在,如果它太小,它只会覆盖缓冲区末尾的数据。您似乎没有设置finalSaveFileName
的值,在将其作为第一个参数传递给strcpy()
之前, 要做1>}。
在这种情况下,它也不是必要的; 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);