版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告題目:解析EthernetARP數(shù)據(jù)包問題描述通過編制程序,獲取網(wǎng)絡(luò)中的ARP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫入日志文件。程序的具體要求如下所示:1,以命令行的形式運(yùn)行,如下所示:arparp.log其中,arp為程序名arp.log為日志文件名。2,程序輸出內(nèi)容如下所示:源IP地址源MAC地址目的IP地址目的MC地址操作時(shí)間各部分的說明如下所示:源IP地址:輸出ARP消息格式中的源IP地址字段源MAC地址:輸出ARP消息格式中的源物理地址字段目的IP地址:輸出ARP消息格式中的目的IP地址字段目的MAC地址:輸出ARP消息格式中的目的物理地址字段操作:輸出ARP消息格式中的操作字段,若為ARP請(qǐng)求,則為1,若為ARP應(yīng)答,則為2,時(shí)間:該ARP包產(chǎn)生的時(shí)間3,當(dāng)程序接收到鍵盤輸入Ctrl+C時(shí)字段退出。概要設(shè)計(jì)首先取得當(dāng)前網(wǎng)卡設(shè)備列表,利用PCAP提供的PCAP_findalldevs()函數(shù)實(shí)現(xiàn)此功能.其次選擇Ethernet網(wǎng)卡并打開,注意判斷所選網(wǎng)卡是否為實(shí)際存在的可用網(wǎng)卡。然后設(shè)置過濾器,使其只捕獲ARP包.過濾函數(shù)PCAP_complie和PCAP_setfilter.設(shè)置函數(shù)為PCAP_setfilter().最后捕獲數(shù)據(jù)包并進(jìn)行處理(包括輸出各IP地址,物理地址,操作類型以及時(shí)間)。由于要記錄日志文件,為了便于輸出流參數(shù),使pcap_next_ex()函數(shù)。ARP數(shù)據(jù)結(jié)構(gòu)及流程圖如下。ARP數(shù)據(jù)包結(jié)構(gòu)structarppkt{unsignedshorthdtyp;//硬件地址值0001表示其為Ethernet unsignedshortprotyp;/協(xié)議類型值0800表示上層協(xié)議為IP unsignedcharhdsize;//硬件地址長(zhǎng)度 unsignedcharprosize;//協(xié)議地址長(zhǎng)度 unsignedshortop;//操作值 u_charsmac[6];//源MAC地址 u_charsip[4];//源IP地址 u_chardmac[6];//目的MAC地址 u_chardip[4];//目的IP地址};詳細(xì)設(shè)計(jì)voidpacket_handler(constpcap_pkthdr*header,constu_char*pkt_data,ostream&);voidmain(){ char*argv="arp.log"; pcap_if_t*alldevs;//網(wǎng)絡(luò)設(shè)備結(jié)構(gòu) pcap_if_t*d; pcap_t*adhandle; charerrbuf[PCAP_ERRBUF_SIZE];//錯(cuò)誤信息 u_intnetmask;//子網(wǎng)掩碼 charpacket_filter[]="etherproto\\arp";//過濾,選擇ARP協(xié)議 structbpf_programfcode; structpcap_pkthdr*header; constu_char*pkt_data; //獲取本機(jī)網(wǎng)卡列表 if(pcap_findalldevs(&alldevs,errbuf)==-1) { cout<<"Errorinpcap_findalldevs:"<<errbuf; return; } inti=0; cout<<"本機(jī)網(wǎng)卡列表如下:"<<endl; //打印網(wǎng)卡列表 for(d=alldevs;d!=NULL;d=d->next) { printf("%d.%s",++i,d->name); if(d->description) printf("(%s)\n",d->description); else printf("(沒有可用的網(wǎng)絡(luò)設(shè)備)\n"); } if(i==0) { printf("\nNointerfacesfound!MakesureWinPcapisinstalled.\n"); return; } //選擇一個(gè)Ethernetka卡 intinum; printf("Entertheinterfacenumber(1-%d):",i); scanf("%d",&inum);for(;inum<1||inum>i;) { printf("\nInterfacenumberoutofrange.\n"); printf("Pleaseinput'Ctrl+C'finishthisoperationOr\nEntertheinterfacenumber(1-%d):",i); scanf("%d",&inum); } //跳轉(zhuǎn)到選中的適配器 for(d=alldevs,i=0;i<inum-1;d=d->next,i++); //以混雜模式打開網(wǎng)卡,接受所有的幀 if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { cout<<"\nUnabletoopentheadapter."; pcap_freealldevs(alldevs);//釋放設(shè)備列表 return; } if(!(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL))//檢查數(shù)據(jù)鏈路是否為Ethernet(DLT_EN10MB) { cout<<"Error"<<endl; return; } //獲得子網(wǎng)掩碼 netmask=((sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr; //調(diào)試過濾器,只捕獲ARP包 if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) { cout<<"\nUnabletocompilethepacketfilter.Checkthesyntax.\n"; pcap_freealldevs(alldevs); return; } //設(shè)置過濾器 if(pcap_setfilter(adhandle,&fcode)<0) { cout<<"\nErrorsettingthefilter.\n"; pcap_freealldevs(alldevs); return; } cout<<"\t\tlisteningon"<<d->description<<"..."<<endl<<endl; ofstreamfout(argv,ios::app);//日志記錄文件 //加入日期記錄 time_tt; time(&t); fout.seekp(0,ios::end); if(int(fout.tellp())!=0) fout<<endl; fout<<"\t\tARPrequest(1)/replay(2)on"<<ctime(&t); cout<<"sourIPAddr"<<""<<"SourMACAddress" <<""<<"DesIPAddr"<<""<<"DesMACAddress" <<""<<"OP"<<""<<"Time"<<endl; fout<<"SourIPAddr"<<""<<"SourMACAddress" <<""<<"DesIPAddr"<<""<<"DesMACAddress" <<""<<"OP"<<""<<"Time"<<endl; //釋放設(shè)備列表 pcap_freealldevs(alldevs); //開始捕獲MAC幀 intresult;//時(shí)間到返回結(jié)果 while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0) { if(result==0) continue; packet_handler(header,pkt_data,cout);//解析ARP包,輸出結(jié)果 packet_handler(header,pkt_data,fout);//輸出到文件 }}voidpacket_handler(constpcap_pkthdr*header,constu_char*pkt_data,ostream&out){ inti; //從截獲的數(shù)據(jù)幀中找到arp包頭的位置 arppkt*arph=(arppkt*)(pkt_data+14);//14為Ethernet幀頭的長(zhǎng)度 //輸出源IP地址 for(i=0;i<3;i++) out<<int(arph->sip[i])<<'.'; out.setf(ios::left); out<<setw(3)<<int(arph->sip[3])<<""; out.unsetf(ios::left); //輸出源MAC地址 charoldfillchar=out.fill('0'); out.setf(ios::uppercase);//MAC地址以分開'-'的大寫字符表示 for(i=0;i<5;i++) out<<hex<<setw(2)<<int(arph->smac[i])<<'_'; out<<hex<<setw(2)<<int(arph->smac[5])<<""; out.fill(oldfillchar); //輸出目的的IP地址 out.unsetf(ios::hex|ios::uppercase); for(i=0;i<3;i++) out<<int(arph->dip[i])<<'.'; out.setf(ios::left); out<<setw(3)<<int(arph->dip[3])<<""; out.unsetf(ios::left); //輸出目的MAC地址 out.fill('0'); out.setf(ios::uppercase); for(i=0;i<5;i++) out<<hex<<setw(2)<<int(arph->dmac[i])<<'_'; out<<hex<<setw(2)<<int(arph->dmac[5])<<""; out.fill(oldfillchar); out.unsetf(ios::hex|ios::uppercase); out<<ntohs(arph->op)<<"";//輸出的操作類型,注意網(wǎng)絡(luò)字節(jié)間的轉(zhuǎn)換 structtm*ltime;//時(shí)間longtime=(long)header->ts.tv_sec; ltime=localtime(&time); out.fill('0'); out<<ltime->tm_hour<<':'<<setw(2)<<ltime->tm_min<<':'<<setw(2)<<ltime->tm_sec; out.fill(oldfillchar); out<<endl;}調(diào)試分析在最開始運(yùn)行該程序時(shí),出現(xiàn)了很多問題。比如:沒有正確的導(dǎo)入本程序所需要的數(shù)據(jù)庫(kù);重復(fù)定義一個(gè)變量;運(yùn)行界面不夠美觀。對(duì)于沒能正確導(dǎo)入數(shù)據(jù)庫(kù),我們充分發(fā)揮了網(wǎng)絡(luò)的功能,下載、安裝并導(dǎo)入了數(shù)據(jù)庫(kù)。將程序改動(dòng)后,重復(fù)定義變量和運(yùn)行界面不夠美觀的問題也解決了。五、心得體會(huì)本次課程設(shè)計(jì),完成了解析ARP數(shù)據(jù)包的編寫。在此期間我們查閱了大量的案例,學(xué)到了很多知識(shí),使我們對(duì)計(jì)算機(jī)網(wǎng)絡(luò)有了更深入的了解。在具體實(shí)現(xiàn)獲取網(wǎng)絡(luò)中的ARP數(shù)據(jù)包解析數(shù)據(jù)包的內(nèi)容,并將其寫入日志文件的過程中,是我們更加清楚物理地址、IP地址的關(guān)聯(lián),源地址與目的地址的關(guān)系,以及二者對(duì)數(shù)據(jù)類型的格式要求。最重要的是通過這次的實(shí)際訓(xùn)練讓我們對(duì)ARP協(xié)議更加理解。課程設(shè)計(jì)是培養(yǎng)我們綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn)、提出、分析和解決實(shí)際問題,鍛煉實(shí)踐能力的重要環(huán)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年離婚財(cái)產(chǎn)分割及孩子撫養(yǎng)協(xié)議書
- 施工勞務(wù)承包合同協(xié)議書樣本
- 產(chǎn)業(yè)孵化基地入住協(xié)議
- 使用授權(quán)協(xié)議書要點(diǎn)解析
- 房屋互換合同格式
- 員工實(shí)習(xí)期勞務(wù)協(xié)議
- 中外專有技術(shù)轉(zhuǎn)讓協(xié)議
- 標(biāo)準(zhǔn)版委托檢驗(yàn)檢測(cè)協(xié)議書
- 5.2 凝聚價(jià)值追求 (大單元教學(xué)設(shè)計(jì)) 2024-2025學(xué)年統(tǒng)編版道德與法治九年級(jí)上冊(cè)
- 建筑項(xiàng)目施工合同書范本
- 浮動(dòng)碼頭施工方案
- Poka-Yoke防錯(cuò)技術(shù)(完整版)
- 保安交接班記錄表(2)
- 神明—EZflame火焰檢測(cè)系統(tǒng)
- 個(gè)人簡(jiǎn)歷求職簡(jiǎn)歷課件.ppt
- 2018年江蘇高考滿分作文:在母語(yǔ)的屋檐下
- 新青島版五四制2021-2022四年級(jí)科學(xué)上冊(cè)實(shí)驗(yàn)指導(dǎo)
- 小學(xué)四年級(jí)音樂課程標(biāo)準(zhǔn)
- 民用機(jī)場(chǎng)竣工驗(yàn)收質(zhì)量評(píng)定標(biāo)準(zhǔn)
- 雙向細(xì)目表和單元測(cè)試卷及組卷說明
- 離子色譜法測(cè)定空氣中二氧化硫
評(píng)論
0/150
提交評(píng)論