《網(wǎng)絡(luò)協(xié)議編程》課程設(shè)計報告ICMP掃描程序的設(shè)計與實現(xiàn)_第1頁
《網(wǎng)絡(luò)協(xié)議編程》課程設(shè)計報告ICMP掃描程序的設(shè)計與實現(xiàn)_第2頁
《網(wǎng)絡(luò)協(xié)議編程》課程設(shè)計報告ICMP掃描程序的設(shè)計與實現(xiàn)_第3頁
《網(wǎng)絡(luò)協(xié)議編程》課程設(shè)計報告ICMP掃描程序的設(shè)計與實現(xiàn)_第4頁
《網(wǎng)絡(luò)協(xié)議編程》課程設(shè)計報告ICMP掃描程序的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、長沙理工大學(xué)網(wǎng)絡(luò)協(xié)議編程課程設(shè)計報告帥哥 學(xué) 院 計通學(xué)院 專 業(yè) 網(wǎng)絡(luò)工程 班 級 網(wǎng)絡(luò)08-02班 學(xué) 號 200858080110 學(xué)生姓名 帥 哥 指導(dǎo)教師 劉 青 課程成績 完成日期 2011年6月15日 課程設(shè)計成績評定學(xué) 院 計通學(xué)院 專 業(yè) 網(wǎng)絡(luò)工程 班 級 網(wǎng)絡(luò)08-02班 學(xué) 號 200858080110 學(xué)生姓名 帥哥 指導(dǎo)教師 劉 青 完成日期 2011年7月2日 指導(dǎo)教師對學(xué)生在課程設(shè)計中的評價評分項目優(yōu)良中及格不及格課程設(shè)計中的創(chuàng)造性成果學(xué)生掌握課程內(nèi)容的程度課程設(shè)計完成情況課程設(shè)計動手能力文字表達(dá)學(xué)習(xí)態(tài)度規(guī)范要求課程設(shè)計論文的質(zhì)量指導(dǎo)教師對課程設(shè)計的評定意見綜合成

2、績 指導(dǎo)教師簽字 2011年 月 日課程設(shè)計任務(wù)書計算機與通信工程學(xué)院 網(wǎng)絡(luò)工程專業(yè) 課程名稱網(wǎng)絡(luò)技術(shù)課程設(shè)計時間20102011學(xué)年第二學(xué)期1718周學(xué)生姓名帥哥指導(dǎo)老師劉青題 目icmp掃描程序的設(shè)計與實現(xiàn)主要內(nèi)容:(1)了解icmp協(xié)議,知道icmp協(xié)議的概念,內(nèi)容,重要性等。(2) 學(xué)會編寫icmp掃描程序。要求:(1)綜合運用計算機網(wǎng)絡(luò)基本理論和編程語言設(shè)計本系統(tǒng)。(2)學(xué)會文獻(xiàn)檢索的基本方法和綜合運用文獻(xiàn)的能力。(3)通過課程設(shè)計培養(yǎng)嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)和團(tuán)隊協(xié)作精神。應(yīng)當(dāng)提交的文件:(1)課程設(shè)計學(xué)年論文。(2)課程設(shè)計附件(相關(guān)圖紙、設(shè)備配置清單、報告等)。icmp掃

3、描程序的設(shè)計與實現(xiàn)學(xué)生姓名:帥哥 指導(dǎo)教師:劉青摘要:我們常用ping程序來判斷一個特定的主機是否處于活動狀態(tài).該程序發(fā)送一個icmp回應(yīng)請求報文給主機,然后等待返回的icmp報文回應(yīng)應(yīng)答就可以知道自己是否能成功的訪問到那臺機器.本次課程設(shè)計涉及到mfc的應(yīng)用,要在充分了解套接字的實現(xiàn)以及ip,icmp的格式,功能等的基礎(chǔ)上才能實現(xiàn)此設(shè)計。關(guān)鍵字:icmp;掃描;程序;協(xié)議;目 錄1 引言31.1 課程設(shè)計目的31.2 課程設(shè)計要求32 概要設(shè)計42.1 設(shè)計原理42.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計42.3 系統(tǒng)流程圖63 詳細(xì)設(shè)計83.1 icmp報文分析83.2 程序功能分析94 測試結(jié)果124.1 遇

4、到問題124.2 測試結(jié)果125 結(jié)束語13參考文獻(xiàn)14附錄及源代碼151 引言1.1 課程設(shè)計目的ip協(xié)議的優(yōu)點是簡單,但缺少差錯控制和查詢機制,而網(wǎng)際控制報文協(xié)議(icmp具有補充ip功能的作用。在網(wǎng)絡(luò)管理中,常常要確定當(dāng)前網(wǎng)絡(luò)在紅處于活動狀態(tài)的主機,這時可以通過icmp的回送和回送響應(yīng)消息來完成這項工作。這課程設(shè)計的目的就是編制程序,利用icmp數(shù)據(jù)包,發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機,即ping消息的請求和應(yīng)答。通過課程設(shè)計,熟悉icmp報文的結(jié)構(gòu),對icmp協(xié)議有更好的理解和認(rèn)識,培養(yǎng)綜合運用網(wǎng)絡(luò)知識解決實際問題能力。1.2 課程設(shè)計要求設(shè)計程序,其功能是發(fā)送icmp數(shù)據(jù)包,以獲取指定望段中的活

5、動主機,并將結(jié)果顯示在標(biāo)準(zhǔn)輸出設(shè)備上程序的具體要求如下:1用命令形式運行scanhost為程序名;start_ip為被搜索網(wǎng)段;end_ip為被搜索網(wǎng)段的結(jié)束ip地址。如在命令行輸入 scanhost 192.168.0.1 192.168.0.1002輸出格式活動主機1的ip地址活動主機2的ip地址 活動主機 n的ip地址2 概要設(shè)計2.1 設(shè)計原理本程序使用的原始套接字生成icmp請求/應(yīng)答報文來進(jìn)行活動主機的探查。這個程序使用的是回送請求和應(yīng)答消息。程序的大致思想是把icmp的數(shù)據(jù)報類型設(shè)置為回送請求,將它發(fā)送給網(wǎng)絡(luò)上的一個ip地址,如果這個ip地址已經(jīng)被占用的話,那么使用位于這個ip地

6、址的主機上的tcp/ip軟件就能接受到這個icmp回送請求,從而返回一個icmp回送請求(類型號為0)信息。信息封裝在一個ip包中,我們需要解析該ip包,從中找到icmp數(shù)據(jù)信息,相反,如果這個ip地址沒有人使用,那么發(fā)送的icmp回送請求在設(shè)定的延時內(nèi)就不可能得到響應(yīng)。2.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計 2.2.1ip頭部數(shù)據(jù)結(jié)構(gòu)typedef struct iphdr unsigned int headlen:4; /ip頭長度 unsigned int wersion:4; /ip版本號 unsigned char tos; /服務(wù)類型unsigned short totallen; /ip包總長度u

7、nsigned short id; /ip號unsigned short flag; /標(biāo)記unsigned char ttl; /生存時間unsigned char prot; /協(xié)議(udp tcp)unsigned short checksum; /校驗和unsigned int sourceip; /源ipunsigned int destip; /目的ipipheader;2.2.2icmp頭部數(shù)據(jù)結(jié)構(gòu) typedef struct icmphdr byte type; /icmp類型碼,回送請求的類型碼為8 byte code; /子類型碼,保存與特定icmp報文類型相關(guān)的細(xì)節(jié)信息

8、 ushort checksum; /校驗和 ushort id; /icmp報文id號 ushort seq; /icmp數(shù)據(jù)報的序列號icmpheader;2.3 系統(tǒng)流程圖2.3.1主流程圖 (圖1) 開 始構(gòu)造原始套接字,并初始化建立并初始化木的主機的sockaddr_in數(shù)據(jù)結(jié)構(gòu)dest起始ip地址-start_ip結(jié)束ip地址-end ip將start_ip填入到dest中start_iptype=icmp_echo; /設(shè)置類型 icmp_hdr-id=(ushort)getcurrentthreadid(); /設(shè)置其id號為當(dāng)前線程號 datapart=icmp_data+s

9、izeof(icmpheader); /計算出icmp數(shù)據(jù)報的數(shù)據(jù)部分memset(datapart,a,datasize-sizeof(icmphearder); /填入數(shù)據(jù) ((icmpheader*)icmp_data)-seq=0; /序列號 ((icmpheader*)icmp_data)-check_sum=0; /先將檢驗和置0((icmphead*)icmp_data)-checksum=checksum(ushort*) icmp_data,data_size);checksum 為計算校驗和的函數(shù),設(shè)校驗和初值為0,然后對數(shù)據(jù)每16位求異或,結(jié)果取反,便得校驗和。其代碼如下

10、:unsinged long cksum=0;while (size1)cksum+=*buffer+;size-=sizeof(ushort);if(size)cksum+=*(uchar)buffer;cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return (ushort)(cksum); 填充icmp報文之后,應(yīng)在icmp報文之前加上ip報頭并發(fā)送出去。可調(diào)用下面的代碼發(fā)送數(shù)據(jù)包。注意,這里的dest是填入目的主機的ip地址的一個sockaddr_in數(shù)據(jù)結(jié)構(gòu),ip_string是目的的主機的ip地址字符串。 struct socka

11、ddr_in_dest; dest.sin_family=af_inet; dest.sin_addr.s_addr=inet_addr(ip_string); sendto(sockraw,icmp_data,datasize,0,(sockaddr*)&dest,size of(dest);3.2.4解析數(shù)據(jù)包 如果所ping的目的主機存在,那么它會發(fā)出一個回送應(yīng)答包。這是一個ip包,受到后解析此數(shù)據(jù)包并獲得其中的icmp信息。根據(jù)ip報頭信息中的ip報頭長度字段,就可以得到icmp報文的真實地址。icmp數(shù)據(jù)包中的ip地址就是活動主機的ip。代碼分析如下: #define icmp_mi

12、n 8 #define max_ping_packet_size(max_packet+sizeof(ipheader) char *recvbuf=newmax_ping_packet_size; struct sockaddr_in dest,from,end;int formlen=sizeof(from); int bytes=recvfrom(sockraw,recvbuf,max_packet,0,(struct sockaddr*)&from,&fromlen) ipheader *iphdr; icmpheader *icmphdr; unsigned short iphdrl

13、en; iphdr=(ipheader*)buf; iphdrlen=iphdr-headlen*4; /ip報頭的長度 icmphdr=(icmpheader *)(buf+iphdrlen); /跳過ip頭 /數(shù)據(jù)包太短 丟棄 if(bytestype!=icmp_echo_reply) return; /id不相符,丟棄if(icmphdr-id!=(ushort)getcurrentthreadid() return; /輸出正在使用的ip地址 cout活動主機sin_addr)endl;4 測試結(jié)果4.1 遇到問題1 找不到頭文件。因為頭文件存放位置錯誤。2 變量沒有定義。因為變量沒

14、有定義和變量名書寫寫錯。3 指針書寫錯誤。4 宏參數(shù)列表錯誤。5 結(jié)構(gòu)體指針傳遞錯誤。cannot covert from struct iphdr * to struct icmphar * ip ipheader * iphdr.因為缺少成員運算符”.”。4.2 測試結(jié)果 經(jīng)反復(fù)調(diào)試,運行正常,運行結(jié)果如下(圖5)5 結(jié)束語回顧過去的一個星期,有緊張,有忙碌,有苦惱,也有歡笑,在不斷的改進(jìn)與努力中,終于可以實現(xiàn)利用icmp發(fā)現(xiàn)網(wǎng)絡(luò)上的活動主機。通過這次課程設(shè)計,我加深了對icmp協(xié)議的理解,鞏固了課堂知識,為以后學(xué)習(xí)網(wǎng)絡(luò)協(xié)議打下基礎(chǔ)。在課程設(shè)計中,我和搭檔李寶詳配合的很融洽,相互幫助,共同

15、進(jìn)步。在調(diào)試過程中難免要出現(xiàn)一些問題,為了能夠快速地確定錯誤的原因,盡快的排除程序邏輯錯誤,通常把程序錯誤劃分為三種類型:語法錯誤、運行錯誤和邏輯錯誤。在這次網(wǎng)絡(luò)課程設(shè)計中,也發(fā)生了這樣那樣的錯誤,如變量沒有定義、缺少頭文件。通過查閱文獻(xiàn)資料、請教老師和同學(xué)討論,以及自己認(rèn)真地分析與思考,逐一對錯誤進(jìn)行了調(diào)試,使程序基本能正常運行,大體上符合了設(shè)計的意圖和設(shè)計的要求。由于網(wǎng)絡(luò)協(xié)議比較抽象,比較難學(xué),也學(xué)得不深入,何況還要把所學(xué)知識運用到實踐中來,真是一大難題,所以一開始時,真是有點一籌莫展,網(wǎng)上查有關(guān)資料卻總覺得不搭干。通過這次課程設(shè)計,我明白做什么事都要沉得下心,在搞任何研發(fā)工作時,遇到問題

16、沉著冷靜是特別重要的,千萬不能有半點浮躁的心情。在程序的調(diào)試過程中,出現(xiàn)問題是正常的,關(guān)鍵是如何去發(fā)現(xiàn)問題的根源,然后去解決它。其實寫程序并不是很花時間,改錯才是最花時間的的事情。還有一點特別重要的是,在設(shè)計過程中或者是改錯的過程中遇到棘手的問題時,借助網(wǎng)絡(luò)去解決的確是一種很好的選擇。一個星期的課程設(shè)計,我過的很充實,感覺每天都在學(xué)習(xí),每天都在進(jìn)步,在課程設(shè)計完成之際,我在此向所有關(guān)心我?guī)椭业膭⒗蠋熀屯瑢W(xué)們致以最真誠的感謝。在這次課程設(shè)計中,我從劉老師身上學(xué)到了很多東西,他認(rèn)真負(fù)責(zé),知識豐富,要求嚴(yán)格,無論在理論上還是在系統(tǒng)調(diào)試中,都給與我很大的幫助,使我得到很大的提高,這對于我以后的工作和

17、學(xué)習(xí)都有一種巨大的幫助,在此再次感謝劉老師耐心的耐心輔導(dǎo)。參考文獻(xiàn)1吳功宜,胡曉英等著.計算機網(wǎng)絡(luò)課程設(shè)計.北京:機械工業(yè)出版社。20052周明天等,tcp/ip網(wǎng)絡(luò)原理與技術(shù).北京:清華大學(xué)出版社.3陳堅,陳偉.visual c+網(wǎng)絡(luò)高級編程m.北京:人民郵電出版社,2001.4方路平,曹平,林毅,等采用ip多址廣播技術(shù)的應(yīng)用系統(tǒng)開發(fā)j.計算機系統(tǒng)應(yīng)用,20015蔣東興.windowssockets網(wǎng)絡(luò)程序設(shè)計大全m.北京:清華大學(xué)出版社,1999.附錄及源代碼 1. scanhost.h#pragma pack(4)#pragma comment(lib,ws2_32.lib)#defin

18、e win32_lean_and_mean#include #include #include #include #include #include /the ip headertypedef struct iphdr unsigned int headlen:4; /ip頭長度 unsigned int wersion:4; /ip版本號 unsigned char tos; /服務(wù)類型unsigned short totallen; /ip包總長度unsigned short id; /ip號unsigned short flag; /標(biāo)記unsigned char ttl; /生存時間u

19、nsigned char prot; /協(xié)議(udp tcp)unsigned short checksum; /校驗和unsigned int sourceip; /源ipunsigned int destip; /目的ipipheader;/icmp headertypedef struct icmphdr byte type; /icmp類型碼,回送請求的類型碼為8 byte code; /子類型碼,保存與特定icmp報文類型相關(guān)的/節(jié)信息 ushort checksum; /校驗和 ushort id; /icmp報文id號 ushort seq; /icmp數(shù)據(jù)報的序列號icmphe

20、ader;#define icmp_echo 8 /請求回送#define icmp_echo_reply 0 /請求回應(yīng)#define icmp_min 8 /icmp包頭長度(最小icmp包長度)#define status_failed 0xffff /錯誤碼#define def_packet_size 32 /缺省數(shù)據(jù)報長度#define max_packet 1024 /最大數(shù)據(jù)報長度#define max_ping_packet_size (max_packet + sizeof(ipheader) /最大接受數(shù)據(jù)報長度void fill_icmp_date(char * ,in

21、t); /填充icmp包ushort checksum(ushort *,int); /校驗和函數(shù)void decode_resp(char*,int,struct sockaddr_in *); /找到此數(shù)據(jù)報ip地址dword winapi findip(lpvoid pipaddrtemp); /線程調(diào)用子函數(shù)2. scanhost.cpp #include scanhost.hwsadata wsadata;socket sockraw;struct sockaddr_in dest,from,end;int fromlen=sizeof(from);char * recvbuf=ne

22、w charmax_ping_packet_size;unsigned int addr=0;long threadnumcounter=0,threadnumlimit=20;long *aa=&threadnumcounter;void main(int argc,char *argv)if(argc!=3)cout輸入格式錯誤:scanhost start_ip end_ipendl;return;if(wsastartup(makeword(2,1),&wsadata)!=0)coutwsastartup failed:getlasterror()endl;exitprocess(st

23、atus_failed);/創(chuàng)建原始套接字sockraw=wsasocket(af_inet,sock_raw,ipproto_icmp,null,0,wsa_flag_overlapped);if(sockraw=invalid_socket)coutwsasocket() failed:wsagetlasterror()endl;exitprocess(status_failed); /設(shè)置讀取延時 int timeout=1000; int bread=setsockopt(sockraw,sol_socket,so_rcvtimeo,(char*)&timeout,sizeof(tim

24、eout); if(bread=socket_error) coutfail to set recv timeout:wsagetlasterror()endl; exitprocess(status_failed); timeout=1000; bread=setsockopt(sockraw,sol_socket,so_rcvtimeo,(char*)&timeout,sizeof(timeout); if(bread=socket_error) coutfailed to set send timeout:wsagetlasterror()endl; exitprocess(status

25、_failed); memset(&dest,0,sizeof(dest); unsigned long startip,endip; dest.sin_family=af_inet; dest.sin_addr.s_addr=inet_addr(argv1); startip=inet_addr(argv1); end.sin_family=af_inet; end.sin_addr.s_addr=inet_addr(argv2); endip=inet_addr(argv2); handle hthread; while(htonl(startip)threadnumlimit) slee

26、p(5000); continue; dword threadid; sockaddr_in * pipaddrtemp=new(sockaddr_in); if(!pipaddrtemp) coutmemory alloc failedtype = icmp_echo;icmp_hdr-id=(ushort)getcurrentthreadid();datapart=icmp_data+sizeof(icmpheader);memset(datapart,a,datasize-sizeof(icmpheader);void decode_resp(char *buf,int bytes,st

27、ruct sockaddr_in *from)ipheader *iphdr;icmpheader *icmphdr;unsigned short iphdrlen;iphdr=(ipheader *)buf;iphdrlen=iphdr-headlen * 4;icmphdr=(icmpheader *)(buf+iphdrlen); /數(shù)據(jù)包太短 丟棄if(bytestype!=icmp_echo_reply) return;if(icmphdr-id!=(ushort)getcurrentthreadid() return;cout活動主機sin_addr)1)cksum+=*buffer+; size-=sizeof(ushort); if(size)cksum+=*(uchar*)buffer; cksum=(cksum16)+(cksum & 0xffff); cksum+=(cksum16); return (ushort)(cksum);dword winapi findip(lpvoid pipaddrtemp)interlockedincrement(aa); char icmp_datamax_packe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論