4

プロジェクトでこの種のコードが使用されているのを見ました:

while (1)
{
  l_numPkts = pcap_next_ex( m_pcapHandle, &header, &pkt_data);
  //do something
  memcpy(dst,pkt_data,size);    
}

pcap_next_ex が返された後、パケット ステータスは TP_STATUS_KERNEL に設定されます。これは、buf がカーネルに返されたことを意味します。コード:

 /* next packet */
 switch (handle->md.tp_version) {
  case TPACKET_V1:
  h.h1->tp_status = TP_STATUS_KERNEL;
..

一部の高速環境では、メモリの問題が発生しますか?

pcap_next / pcap_next_ex を使用する正しい方法は何ですか?

4

2 に答える 2

1

winpcapy (1.9.2009) と WinPcap 4.1.0.2001を使用して、Python でこの問題を解決しました。

パケットデータ配列のコピーを作成するだけで解決しました(問題のmemcpyで示唆されているように)。

pkt_data = pkt_data[:header.contents.len]

それが正しいかどうかはわかりませんが、現時点ではうまくいきます。

そして、 winpcap papermailでの回答に基づいて、これは pkt_data が参照するものであり、pcap_next_ex (または他のディスパッチ メソッド) の次の呼び出しまで持続する必要があります。1 つのバッファを複数の/すべてのパケットに使用し、他の/最後のパケットに再利用できるため、私が正しければ?

Q.

于 2011-04-05T10:11:30.547 に答える
-1
char errbuff[10000];
pcap_t * handler = pcap_open_offline(argv[1], errbuff);
struct pcap_pkthdr *header;
u_char  *packet;
while (pcap_next_ex(handler, &header, &packet) >= 0)
{
    printf("len %d:\n",header->len);
     ... YOUR CODE


}
于 2015-04-20T07:47:45.683 に答える