winpcap-とネットワークトラフィックの統計情報を収集します

#define _XKEYCHECK_H
 の#define HAVE_REMOTE 
の#include " pcap.h " 
の#include " リモートext.h " 
の#include <winsock2.h> 
書式#include < 文字列の.h> 
の#include <iostreamの> の#pragmaコメント(libに、「wpcap。 LIB ")
 の#pragmaコメント(libに、 "WS2_32.LIB")使用して名前空間はstdを、 dispatcher_handler(u_char型*、constの構造体 pcap_pkthdrの*、constの u_char型* )。int型のmain(int型のargc、char型



 

 


** ARGV)
{ 
pcap_tの *のFP。
チャーもしerrbuf [PCAP_ERRBUF_SIZE]。
ストラクト体timeval st_tsを。
u_intネットマスク。
構造体bpf_programのfcodeの。

pcap_if_t * alldevs。
pcap_if_t * D;
int型のINUM。
int型私= 0 ; 
pcap_t * adhandle。
チャー packet_filter [] = " IPおよびUDP " 

    / * 获得设备列表* / 
    場合(pcap_findalldevs(&alldevs、もしerrbuf)== - 1 
    { 
        関数fprintf(stderrに、 " pcap_findalldevsでエラーが発生しました:%sのの\ nを" 、errbufに); 
        出口(1 )。
    } 

    / * 打印列表* / 
    (D = alldevs; D; D = D-> 次)
    { 
        のprintf(" %D%のS。"、++ I、D-> 名);
        もし(D-> 説明)
            のprintf(" (%sの)\ n "、D-> 説明)
        
            のprintf(" 利用可能(記述なし)\ N " ); 
    } 

    もし(I ==0 
    {
        のprintf(" \ nこのインターフェースが見つかりました。WinPcapのがインストールされていることを確認してください\ nは!。" );
        戻る - 1 
    } 

    のprintf(" インターフェース番号(1%のD)を入力:" 、I)。
    scanf関数(" %のD "、&INUM)。

    もし(INUM < 1 || INUM> I)
    { 
        のprintf(" \ nInterface番号範囲の外\ N。" );
        / * 释放设备列表* / 
        pcap_freealldevs(alldevs)。
        リターン - 1
    } 

    / * 選択されたデバイスへのジャンプ* / 
    (D = alldevs、私は= 0 ; I <inum- 1 ; D = D->次に、Iは++ ); 


    / * オープン出力アダプタ* / 
    IF((FP = pcap_open (D->名、100、PCAP_OPENFLAG_PROMISCUOUS、1000は、NULL、もしerrbuf))== NULL)
    { 
        関数fprintf(stderrに、" \ nUnableはアダプタ%S \ N-を開きます。" 、もしerrbuf);
         戻り 0 ; 
    } 

    / * ドントケアこのフィルタでは、それは使用されません、マスキング* / 
    ネットマスク = 0xFFFFFFのを; 

    // コンパイラ・フィルタは、
    IF(pcap_compile(FP&FCodeの、" IPおよびUDP "1。 ネットマスク)< 0 
    { 
        fprintfの(stderrに、" 構文の\ N-を確認してください。..パケットフィルタをコンパイルするには、\ nUnable " );
         / * 解放装置リスト* / 
        戻り 0 ; 
    } 

    //は、フィルタを設定
    IF(pcap_setfilter(FP、およびFCodeの)< 0 
    { 
        関数fprintf(stderrに、"\ nエラーフィルタの\ N-設定" ); 
        pcap_close(FP); 
        / * 解放デバイスリスト* / 
        リターン 0 ; 
    } 

    / * 統計パターンにインターフェースを設定する* / 
    IF(pcap_setmode(FP、MODE_STAT)< 0 
    { 
        関数fprintf(stderrに、"\ nエラーMODE \ N-設定" ;)
        Pcap_close(FP)を; 
        / * 解放装置リスト* / 
        リターン 0 ; 
    } 


    のprintf(" TCPトラフィックの概要:\ N- " ); 

    / * メインループの開始* / 
    pcap_loop(FP、0、dispatcher_handler、(PUCHAR)&st_ts); 

    pcap_close(FP); 
    を返す 0 ; 
} 

空隙dispatcher_handler(u_char型*州、CONST  構造体 pcap_pkthdr *ヘッダ、CONST u_char型* pkt_data)
{ 
    構造体体timeval * old_ts =(構造体体timeval * )状態、
    遅延のu_int; 
    LARGE_INTEGER bps単位、PPS、
    構造体(TM)* LTIMEため、
     チャー TIMESTRの[ 16 ]; 
    のtime_t local_tv_sec; 

    / * 時間サンプリングにミリ秒単位の遅延時間* / 
    / * タイムスタンプにサンプリングした値* / 
    遅延 =(header-> ts.tv_sec - old_ts-> tv_secの)* 1000000 - old_ts-> tv_usecのheader- +> ts.tv_usec;
     / *B秒あたりのビット数を取得/ S * / 
    Bps.QuadPart =(((*(* LONGLONG)(+ pkt_data 8))* 8 * 1000000)/ (ディレイ));
     / *                                             ^^ 
                                                  | | 
                                                  | | 
                                                  | | 
                              | -ビットバイトに変換
                                                         | 
                                       遅延はミリ秒である- 
    * / 

    / * 1秒あたりのパケット数を取得する* / 
    Pps.QuadPart=(((*(* LONGLONG)(pkt_data))* 1000000)/ (ディレイ)); 

    / * タイムスタンプフォーマット認識に* / 
    local_tv_sec = header-> ts.tv_sec; 
    LTIMEため = LOCALTIME(&local_tv_sec ); 
    のstrftime(TIMESTRのはsizeof TIMESTRの、" %のH:%のM:%S " 、LTIME用); 

    / * タイムスタンプを印刷する* / 
    のprintf(" %S " TIMESTRの、); 

    / * 印刷サンプリング結果* / 
    のprintf(" =%I64u BPS "Bps.QuadPart); 
    のprintf(" PPS I64u =%\ N- "、Pps.QuadPart)。

    // 存储当前的时间戳 
    old_ts-> tv_secの= header-> ts.tv_sec。
    old_ts - > tv_usecの= header-> ts.tv_usec。
} 


ボイド使用()
{ 

    のprintf(" \第二毎秒パケットあたりのビットに、TCPトラフィック負荷をnShows \ nCopyright(C)2002ロリスDegioanni \ N。。" ); 
    printf(" \ nUsageます:\ n " ); 
    printf(" \ tのtcptopアダプタ\ nを" ); 
    printf(\ tのあなたは使用することができます\」WinDumpの-D \「あなたのアダプタの名前がわからない場合は、\ nは。);
); 
}

 

おすすめ

転載: www.cnblogs.com/almn/p/11302906.html