私はpcap_next_exでパケットをキャプチャするためのループを持っており、各iteractionではパケットを処理するために多くの関数呼び出しを行います。このものは、ループ内のSleep()呼び出しによってシミュレートすることができます。それから、私はpcap_next_ex()ループでSleepを呼び出します。Winpcapコード - キャプチャがループでパケットを失う
pcap_pkthdr* header = NULL;
UCHAR* content = NULL;
pcap = pcap_open(adapterName.c_str(), 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, NULL);
//Set to nonblock mode?
while (INT res = pcap_next_ex(pcap, &header, const_cast<const UCHAR**>(&content)) >= 0)
{
if (res != FALSE)
{
if (content)
{
//Here i do the stuff which I will simulate with a Sleep() call
Sleep(200);
}
}
}
私はpcap_next_exを使用し、別のスレッドで、後でそれらを扱うために、ベクターにパケットを保存するコードを見てきました、この方法は、特にものの時間が短縮されますが、私に多くのことを説得しません。私はこの方法を使うのか?
"非ブロッキング"モードでパケットをキャプチャし、各パケットのイベントを呼び出す他のwinpcap関数を使用したいと思います... winpcapでパケットを失わない最良の方法は何ですか?
ご協力いただければ幸いです。よろしく。
あなたの答えをありがとう、私はあなたが "pcap_loop"または "pcap_dispatch"についてどう思いますか知りたいと思います。彼らは問題を解決することができますか?それ以外の場合は、「pcap_next_ex」をより頻繁に呼び出すか、パケットを処理するために他のスレッドを作成する必要があります。 – KaxperdayTrolling
WinPcapのソースを見ると、 'pcap_loop'(または' pcap_dispatch')に渡されるコールバックは 'pcap_loop'を呼び出した同じスレッドで呼び出されます。つまり' pcap_loop'の専用スレッドが必要です。できるだけ早くリングバッファを読み込む作業に戻ることができます。 – kaitoy