winpcapを使用してネットワークパッケージツールを開発する
6151 ワード
前言: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;
}