计算机网络课程设计(第六章)解析ARP数据包(完整程序代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#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<
out.setf(ios::left);
out<
out.unsetf(ios::left);
char oldfillchar=out.fill('0');
out.setf(ios::uppercase);
for(i=0;i<5;i++)
out<
out<
out.unsetf(ios::hex|ios::uppercase);
for(i=0;i<3;i++)
out<
out.setf(ios::left);
out<
out.unsetf(ios::left);
out.fill('0');
out.setf(ios::uppercase);
for(i=0;i<5;i++)
out<
out<
out.unsetf(ios::hex|ios::uppercase);
out<
>_sec); out.fill('0');
out<
>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;