次の問題があります。2 つのスレッドで 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);
}