#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は。」); ); }