yitaiwang

*
 *程序1.
 *程序名:AnalyzeETH_WinPcap.cpp
 *本程序通过使用WinPcap来捕获以太帧包,并解析以太帧头
 */
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>


#include <pcap.h>


#include <winsock2.h>
#pragma comment(lib,"ws2_32")
#pragma comment(lib,"wpcap")

//以太帧头结构体
typedef struct ether_header {
	unsigned char ether_dhost[6];
	unsigned char ether_shost[6];
	unsigned short ether_type;
}ETHHEADER,*PETHHEADER;

void InitAdapter();                                                //初始化网络适配器 
void dispatcher_handler(u_char*,const pcap_pkthdr*,const u_char *);//解析以太帧头
void print_hwadd(u_char *hwadd);                                   //打印出MAC地址
void CloseAdapter();                                               //关闭网络适配器

FILE *fp;
pcap_if_t *alldevs,*d;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *adhandle;

void main() {
	int count=0,number;
	cout<<"Please enter the number of packet sended:"<<endl;
	cin>>number;
    InitAdatper();
	fp=fopen("f://000//eth.txt","w");
	while(count<=number) {
	    pcap_loop(adhandle,1,dispatcher_handler,NULL);      //捕获数据报
		count++;
	}
	CloseAdapter();
}

void InitAdapter() {
	int i;
	if(pcap_findalldevs(&alldevs,errbuf)==-1) {         //寻找网络适配器
		cout<<"Error in pcap_findalldevs!";
		return;
	}
	for(d=alldevs,i=0;i<0;d=d->next,i++);

	if((adhandle=pcap_open_live(d->name,65535,1,20,errbuf))==NULL) {//打开选取的网络适配器
		cout<<"Unable to open the adapter!";
		pcap_freealldevs(alldevs);
		return;
	}
	if(pcap_datalink(adhandle)!=DLT_EN10MB) {                      //判断网络是否为10MB以太网
		cout<<"This program works only on Ethernet network!";
		pcap_freealldevs(alldevs);
		return;
	}
}

void dispatcher_handler(u_char *,const pcap_pkthdr *header,const u_char *p) {
	PETHHEADER eth=(PETHHEADER)p;
	fprintf(fp,"源MAC:");
	for(int i = 0;i < 5; i ++)                        //源MAC地址
        fprintf(fp,"%02X-",eth->ether_shost[i]);         
    fprintf(fp,"%02X  ",eth->ether_shost[5]);	
	fprintf(fp,"->  ");
	fprintf(fp,"目的MAC:");                           //目的MAC地址
	for(i = 0;i < 5; i ++)
        fprintf(fp,"%02X-",eth->ether_dhost[i]);
    fprintf(fp,"%02X  ",eth->ether_dhost[5]);
	fprintf(fp,"协议类型:");                           //上层协议类型
    fprintf(fp,"%02X\n", htons(eth->ether_type));
}

void CloseAdapter() {
	fclose(fp);
	pcap_freealldevs(alldevs);
	pcap_close(adhandle);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值