2016-04-27 12 views
0

私はpcapファイルをベクトルや配列のようないくつかのデータ構造に読み込み、あとで集めたデータ(パケット長、タイムスタンプのように選択したものだけ)をアプリケーションで使用しようとしています。私はPCAPを読み取るためのいくつかのサンプルアプリケーションを見つけた:pcapファイルをベクトル/配列に読み込む

#include <stdio.h> 
#include <pcap.h> 

#define LINE_LEN 16 

void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *); 

int main(int argc, char **argv) 
{ 
    pcap_t *fp; 
    char errbuf[PCAP_ERRBUF_SIZE]; 

    if(argc != 2) 
    { 
     printf("usage: %s filename", argv[0]); 
     return -1; 

    } 

    /* Open the capture file */ 
    if ((fp = pcap_open_offline(argv[1],   // name of the device 
         errbuf     // error buffer 
         )) == NULL) 
    { 
     fprintf(stderr,"\nUnable to open the file %s.\n", argv[1]); 
     return -1; 
    } 

    /* read and dispatch packets until EOF is reached */ 
    pcap_loop(fp, 0, dispatcher_handler, NULL); 

    pcap_close(fp); 
    return 0; 
} 



void dispatcher_handler(u_char *temp1, 
         const struct pcap_pkthdr *header, 
         const u_char *pkt_data) 
{ 
    u_int i=0; 

    /* 
    * unused variable 
    */ 
    (VOID*)temp1; 

    /* print pkt timestamp and pkt len */ 
    printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len); 

    printf("\n\n"); 

} 

問題がpcap_loop()です。私はこのためにdocumentationを見つけましたが、唯一の情報はファイルの終わりに達するまでこれが全ファイルを読み込んでいるということです。私はFILEとしてファイルを扱おうとしていましたが、whileループではEOFまで読んでいますが、それはうまくいきません。fpFILEとして扱うことはできません。

また、後で取り出すためにpcap_handlerへのポインタを渡す可能性はありません。

誰かが私が他の方法でそれをやり遂げる方法を提案できますか?

答えて

0

私は。次のように一般的な考え方は次のとおりです。

struct pcap_pkthdr *header; 
const u_char *pkt_data; 
int res; 

while((res = pcap_next_ex(fp, &header, &pkt_data)) >= 0) 
{ 
    //Process packet 
} 
0

文書によると、あなたのコードは正しく見えます。 pcap_loopはFILEの読み込みを行うべきです。それをやろうとしないでください。

pcap_loopの古いpcapバージョンでは0が未定義なので、古いバージョンにリンクする場合は-1を使用する方が安全です。私がループしながら、今使用して、行(またはパケットによって、より正確パケット)でラインを読むことができるようにpcap_next_ex()

ありがとう:更なるドキュメントと私は機能を見つけたインターネット調査の後

0

私は単にfpを扱うことができないので、私は、一般的なFILEとしてファイルを扱うためにしよう、とループがEOFまで読みながらでは、それは動作しませんしてきましたFILEとなります。

いいえ、それはないFILEだからです。 (また、組み合わせpcap_open_live()からかpcap_create()/pcap_activate()からpcap_t *を取得し、それはあなたのライブキャプチャのためではなく、ファイルのハンドルを提供します。)

また、私はポインタを渡すためにあらゆる可能性が表示されません後で検索するにはpcap_handlerにしてください。

pcap_loop()の4番目の引数はpcap_handlerに最初の引数として渡されるので、あなたは

pcap_loop(fp, 0, dispatcher_handler, pointer); 

を行い、その後、dispatcher_handler()に、適切な型にtemp1をキャストし、それを使用することができます - それをpointerと同じことを指摘するでしょう。

関連する問題