winpcapを使用してネットワークパッケージツールを開発する


前言:winpcap(windows packet capture)はwindowsプラットフォームの次の無料、公共のネットワークアクセスシステムです.winpcapというプロジェクトを開発する目的は、win 32アプリケーションにネットワークの下位層にアクセスする能力を提供することです.Windowsシステムの下で直接的なネットワークプログラミングに使用されます.ネットの方面の学習を行ったことがあるのはすべて知っていて、wiresharkソフトウェアはwinpcapに基づいて、winpcapは直接ネットワークの底層のプロトコルに基づくアプリケーションを開発することができて、例えばarp、後で1篇のarpの開発、応用と防御の機能の需要を書きます:1、ホストAがホストBに送るメッセージを切り取ります2、メッセージをファイルに保存します3、メッセージをホストB 4に下へ送ります、ホストBのメッセージを切り取ります5、メッセージをファイル6に保存しますメッセージをホストAプログラム設計1に転送し、winpcapはNICによるデータ取得であるため、まず正しいNIC 2を取得し、選択したNICデバイスを開いてホストAメッセージを取得するスレッドとホストBメッセージを取得するスレッドを設計する.関連インタフェース紹介1、int pcap_findalldevs(pcap_if_t **, char *);// , pcap_if_t 2、void pcap_freealldevs(pcap_if_t *); // 3、pcap_t *pcap_open(const char *source, //
int snaplen, //
int flags, //
int read_timeout,//
struct pcap_rmtauth *auth, //
char *errbuf);//
4、void pcap_close(pcap_t *);// 5、int pcap_compile(//
pcap_t *,
const char *,
int,
bpf_u_int32);
6、int pcap_setfilter(pcap_t *, struct bpf_program *);// 7、int pcap_next_ex(// interface
pcap_t *,
struct pcap_pkthdr **, // , mac
const u_char **);//
プログラム設計cpp
#include "pcap.h"
#include "vector"

using namespace std;

int main()
{
    vector<string> vecDevName;
    vecDevName.clear();
    pcap_if_t *alldevs;
    char errbuf[PCAP_ERRBUF_SIZE];

    /*      */
    if(pcap_findalldevs(&alldevs, errbuf) == -1)
    {       
        /* At this point, we don't need any more the device list. Free it */
        pcap_freealldevs(alldevs);
        return -1;  
    }
    while (alldevs->next != NULL)
    {
        printf("%s:%s 
"
, alldevs->name, alldevs->description); vecDevName.push_back(alldevs->name); alldevs = alldevs->next; } // pcap_t *adhandle; /* Open the device */ /* */ if ( (adhandle= pcap_open(vecDevName[0].c_str(), // 65536, // // 65535 PCAP_OPENFLAG_PROMISCUOUS, // 1000, // NULL, // errbuf // ) ) == NULL) { // fprintf(stderr,"
Unable to open the adapter. %s is not supported by WinPcap
", d->name);
return -1; } // bpf_u_int32 NetMask=0xffffff; struct bpf_program fcode; char szFilter[256]; sprintf(szFilter, "ip host 192.168.1.254"); //compile the filter if(pcap_compile(adhandle, &fcode, szFilter, 1, NetMask) < 0) { //strTip.Format("Error compiling filter: wrong syntax:%s", szFilter); pcap_close(adhandle); return -3; } // if(pcap_setfilter(adhandle, &fcode) < 0) { pcap_close(adhandle); return -4; } int res; struct pcap_pkthdr *header; const u_char *pkt_data; time_t local_tv_sec; struct tm *ltime; char timestr[16]; while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0) { if(res == 0) continue; /* */ local_tv_sec = header->ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s,%.6d len:%d
"
, timestr, header->ts.tv_usec, header->len); } return 0; }