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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、 ushort checksum; /校驗(yàn)和 ushort id; /icmp報(bào)文id號(hào) ushort seq; /icmp數(shù)據(jù)報(bào)的序列號(hào)icmpheader;2.3 系統(tǒng)流程圖2.3.1主流程圖 (圖1) 開 始構(gòu)造原始套接字,并初始化建立并初始化木的主機(jī)的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號(hào)為當(dāng)前線程號(hào) datapart=icmp_data+s

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

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報(bào)文之后,應(yīng)在icmp報(bào)文之前加上ip報(bào)頭并發(fā)送出去??烧{(diào)用下面的代碼發(fā)送數(shù)據(jù)包。注意,這里的dest是填入目的主機(jī)的ip地址的一個(gè)sockaddr_in數(shù)據(jù)結(jié)構(gòu),ip_string是目的的主機(jī)的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的目的主機(jī)存在,那么它會(huì)發(fā)出一個(gè)回送應(yīng)答包。這是一個(gè)ip包,受到后解析此數(shù)據(jù)包并獲得其中的icmp信息。根據(jù)ip報(bào)頭信息中的ip報(bào)頭長度字段,就可以得到icmp報(bào)文的真實(shí)地址。icmp數(shù)據(jù)包中的ip地址就是活動(dòng)主機(jī)的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報(bào)頭的長度 icmphdr=(icmpheader *)(buf+iphdrlen); /跳過ip頭 /數(shù)據(jù)包太短 丟棄 if(bytestype!=icmp_echo_reply) return; /id不相符,丟棄if(icmphdr-id!=(ushort)getcurrentthreadid() return; /輸出正在使用的ip地址 cout活動(dòng)主機(jī)sin_addr)endl;4 測試結(jié)果4.1 遇到問題1 找不到頭文件。因?yàn)轭^文件存放位置錯(cuò)誤。2 變量沒有定義。因?yàn)樽兞繘]

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

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

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

17、學(xué)習(xí)都有一種巨大的幫助,在此再次感謝劉老師耐心的耐心輔導(dǎo)。參考文獻(xiàn)1吳功宜,胡曉英等著.計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì).北京:機(jī)械工業(yè)出版社。20052周明天等,tcp/ip網(wǎng)絡(luò)原理與技術(shù).北京:清華大學(xué)出版社.3陳堅(jiān),陳偉.visual c+網(wǎng)絡(luò)高級(jí)編程m.北京:人民郵電出版社,2001.4方路平,曹平,林毅,等采用ip多址廣播技術(shù)的應(yīng)用系統(tǒng)開發(fā)j.計(jì)算機(jī)系統(tǒng)應(yīng)用,20015蔣東興.windowssockets網(wǎng)絡(luò)程序設(shè)計(jì)大全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版本號(hào) unsigned char tos; /服務(wù)類型unsigned short totallen; /ip包總長度unsigned short id; /ip號(hào)unsigned short flag; /標(biāo)記unsigned char ttl; /生存時(shí)間u

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

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

21、t); /填充icmp包ushort checksum(ushort *,int); /校驗(yàn)和函數(shù)void decode_resp(char*,int,struct sockaddr_in *); /找到此數(shù)據(jù)報(bào)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輸入格式錯(cuò)誤: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è)置讀取延時(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活動(dòng)主機(jī)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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論