计算机网络课程设计(第六章)解析ARP数据包(完整程序代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据包的结构,对

课程设计的内容和要求通过编

制程序

显示在标准输出上计算机网络课程设计

——机械工业出版社

第6章:解析ARP数据包

课程设计目的:

本课程设计的主要目的是对网络上的ARP数据包

进行解析,从而熟悉ARP

ARP协议有更好的理解和认识。

获取网络中的ARP数据包解析数据包的内容将结果并同时写入日志文件。

程序的具体要求如下所示

1、以命令行的形式运行arp arp.log

其中arp为程序名arp.log为日志文件名。

2、程序输出内容如下所示

源IP地址源MAC地址目的IP地址操作时间

各部分的说明如下所示

源IP地址输出ARP消息格式中的源IP地址字段

源MAC地址输出ARP消息格式中的源物理地址字段

目的IP地址输出ARP消息格式中的目的IP地址字段。

目的MAC地址输出ARP消息格式中的目的物理地址字段

操作输出ARP消息格式中的操作字段若为ARP请求则为1

若为ARP应答则为2

时间该ARP包产生的时间

3、当程序接收到键盘输入Ctrl+C时字段

完整程序代码:

#in cludevc oni o.h>

#in clude #i ncludevioma nip.h>

#in clude "pcap.h"

#i ncludevwi nsock2.h> #pragma comme nt(lib,"ws2_32 .l ib")

#pragma comme nt(lib,"wpcap.lib") struct arppkt

{

un sig ned short hdtyp; un sig ned short protyp; unsigned char hdsize;

unsigned char prosize;

unsigned short op;

u_char smac[6];

u_char sip[4];

u_char dmac[6];

u_char dip[4];

};

void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream &out) {

arppkt* arph=(arppkt*)(pkt_data+14);

for(int i=0;i<3;i++)

out<sip[i])<<'.';

out.setf(ios::left);

out<sip[3])<<" ";

out.unsetf(ios::left);

char oldfillchar=out.fill('0');

out.setf(ios::uppercase);

for(i=0;i<5;i++)

out<smac[i])<<'-';

out<smac[5])<<" "; out.fill(oldfillchar);

out.unsetf(ios::hex|ios::uppercase);

for(i=0;i<3;i++)

out<dip[i])<<'.';

out.setf(ios::left);

out<dip[3])<<" ";

out.unsetf(ios::left);

out.fill('0');

out.setf(ios::uppercase);

for(i=0;i<5;i++)

out<dmac[i])<<'-';

out<dmac[5])<<" "; out.fill(oldfillchar);

out.unsetf(ios::hex|ios::uppercase);

out<op)<<" "; struct tm *ltime; ltime=localtime(&header-

>_sec); out.fill('0');

out<tm_hour<<':'<tm_min<<':'<

>tm_sec;

out.fill(oldfillchar); out<

}

void main(int argc,char *argv[])

{

if(argc!=2) { cout<<"please input command: parsearp output_file"<

return;

}

pcap_if_t *alldevs;

pcap_if_t *d; pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; u_int

netmask;

char packet_filter[]="ether proto \\arp"; struct bpf_program fcode; struct pcap_pkthdr *header; u_char *pkt_data;

// 获取网络设备列表

if (pcap_findalldevs(&alldevs,errbuf)==-1)

{

cout<<"error in pcap_find all devs:"<

return;

}

// 选择一个ethernet 网卡for(d=alldevs;d;d=d->next)

{ if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { cout<<"Unable to open ther adapter."; pcap_freealldevs(alldevs); return;

} if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL) break;

} if(d==NULL)

{

cout<<"No interface found!Make sure WinPcap is installed."; return;

}

netmask=((sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;

if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)

{

cout<<"Unable to compile the packet filter.Check the syntax.";

pcap_freealldevs(alldevs);

return;

} if(pcap_setfilter(adhandle,&fcode)<0)

{

cout<<"Error setting the filter."; pcap_freealldevs(alldevs); return;

相关文档
最新文档