2016-12-16 6 views
0

私は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でパケットを失わない最良の方法は何ですか?

ご協力いただければ幸いです。よろしく。

答えて

1

WinPcapはキャプチャしたパケットをサイズが制限されたリングバッファに格納します。 パケットのバイト数がリングバッファサイズに達すると、古いパケットは破棄され、WinPcapが新しいパケットを格納できるようになります。

したがって、破棄する前にできるだけ多くのパケットを取得できるように、できるだけ頻繁にpcap_next_exを呼び出す必要があります。

pcap_next_exを専用スレッドで呼び出し、別のスレッドでパケットを処理することは、この方法でpcap_next_exを最も頻繁に呼び出すことができるため、良い方法です。

+0

あなたの答えをありがとう、私はあなたが "pcap_loop"または "pcap_dispatch"についてどう思いますか知りたいと思います。彼らは問題を解決することができますか?それ以外の場合は、「pcap_next_ex」をより頻繁に呼び出すか、パケットを処理するために他のスレッドを作成する必要があります。 – KaxperdayTrolling

+0

WinPcapのソースを見ると、 'pcap_loop'(または' pcap_dispatch')に渡されるコールバックは 'pcap_loop'を呼び出した同じスレッドで呼び出されます。つまり' pcap_loop'の専用スレッドが必要です。できるだけ早くリングバッファを読み込む作業に戻ることができます。 – kaitoy

関連する問題