1

ここにすべてのソースをコピーせずに、pcap_callbackから関数をヒットしていますpcap_dispatch。はcaplen正しい長さを示しているように見えますが (常に何かであるということです)、len は常に 0 です。このフィールドはもう入力されていませんか? これはおそらく、私がキャプチャしていないエラー状態ですか?

ここにスニペットがあります...

void myCallback ( const struct pcap_pkthdr *header, const u_char *packet, void* buffer )
{
   if ( (uint16_t)(header->len) != (uint16_t)(header->caplen) )
       /* Some Error */
        streamObj << "Caplen (" <<  (uint16_t)(header->caplen) <<  " != "
        << ") Packet Len (" << (uint16_t)(header->len) << ")";
   ...
}

値はheader->len常にゼロとして返されます。さらに情報が必要な場合は、お知らせください。

これは、2.6.32 カーネルで libpcap.so.0.9.8 を実行している SUSE Linux 11SP1 サーバーで見つかりました。この問題は、libpcap.so.0.9.3 を使用して SUSE Linux 10SP3 からアップグレードした後にのみ発生します。

編集: これは、libpcap.so.0.9.8 のみの問題のようです。/usr/lib/ のリンクを libpcap.so.0.9.3 を使用するように再指定すると、問題はなくなりました。

4

1 に答える 1

0

for のコールバック関数への 3 つの引数pcap_dispatch()は次のとおりです。

  1. に渡される「ユーザー データ」ポインターpcap_dispatch()
  2. へのポインタstruct pcap_pkthdr;
  3. 生のパケット データへのポインター。

したがって、myCallbackは有効なコールバック関数ではなく、最初の引数がstruct pcap_pkthdr. 適切な引数で呼び出される実際のコールバックである別の関数がない限りmyCallback、問題のコードは機能せず、少なくとも C または C++ コンパイラから警告を受け取るはずです。

于 2011-10-19T08:12:18.127 に答える