專業課程設計方案報告發現網絡中的活動主機_第1頁
專業課程設計方案報告發現網絡中的活動主機_第2頁
專業課程設計方案報告發現網絡中的活動主機_第3頁
專業課程設計方案報告發現網絡中的活動主機_第4頁
專業課程設計方案報告發現網絡中的活動主機_第5頁
已閱讀5頁,還剩18頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

重慶交通大學信息科學和工程學院課程設計試驗匯報專業:12級通信工程(2)班學號:姓名:試驗所屬課程:通信網綜合課程設計指導教師:譚晉一、程設計目標和意義在網絡管理中,常常要確定目前網絡中處于活動狀態主機,這時能夠經過使用ICMP協議回送請求(Ping請求)和回送響應(Ping應答)消息來完成本工作。本課程設計目標是編制程序,利用ICMP數據包,發覺制訂網段中活動主機。IP協議優點是簡練,但缺乏差錯控制和查詢機制,而網際控制報文協議(ICMP)含有補充IP功效作用。在網絡管理中,常常要確定目前網絡中處于活動狀態主機,這時能夠經過使用ICMP回送和回送響應消息來完成這項工作。本課程設計目標就是編制程序,利用ICMP數據包,發覺指定網段中活動主機。經過課程設計,使學生愈加熟悉ICMP報文結構,對ICMP協議有愈加好了解和認識。二、課程設計條件計算機,Matlab、C/C++或JAVA編程軟件或其它通信網仿真軟件(如NS2、OMNET++等)、嵌入式開發板、編程器等。三、程設計內容和要求本程序功效是發送ICMP數據包,以獲取指定網段中活動主機,并將結果顯示到屏幕上。程序要求1)不許可在程序中直接調用Ping,而是用程序實現Ping功效。2)以命令形式運行:程序名Start_ipEnd_ip,其中,Start_IP為起始IP地址;End_IP為結束IP地址。3)輸出格式為:活動主機1IP地址活動主機2IP地址……四、課程設計相關技術IP協議是一個不可靠協議,無法進行差錯控制。但IP協議能夠借助其它協議來實現這一功效,如ICMP。ICMP(InternetControlMessagesProtocol,網間控制報文協議)許可主機或路由器匯報差錯情況和提供相關異常情況匯報。通常來說,ICMP報文提供針對網絡層錯誤診療、擁塞控制、路徑控制和查詢服務四項大功效。如,當一個分組無法抵達目標站點或TTL超時后,路由器就會丟棄此分組,并向源站點返回一個目標站點不可抵達ICMP報文。編制程序前首先要對ICMP報文格式有一定了解,ICMP報文是在IP數據報內部傳輸,其結構圖10-1所表示。IP數據報IP首部ICMP報文圖10-1ICMP封裝在IP內部078151631(位)類型字段代碼字段校驗和字段(不一樣類型和代碼有不一樣內容)圖10-2ICMP報文ICMP報文格式圖10-2所表示。全部報文前4個字節全部是一樣,不過其它字節則互不相同。其中類型字段能夠有15個不一樣值,以描述特定類型ICMP報文,一些ICMP報文還使用代碼字段值來深入描述不用條件。按驗和字段為2字節,校驗范圍是整個ICMP報文。檢驗和是必需,其計算方法和IP協議頭部校驗和計算方法一樣。多種類型ICMP報文圖10-3所表示(ICMP報文類型),不一樣類型由報文中類型字段和代碼字段來共同決定。類型代碼描述00回送響應(PING應答)目標不可達網絡不可達主機不可達協議不可達端口不可達需要進行分片但設置了嚴禁分片比特源主機選擇路由失敗無法識別目標網絡無法識別目標主機源主機被隔離目標網絡被嚴禁目標主機被嚴禁因為服務類型(TOS),網絡不可達因為服務類型(TOS),主機不可達因為過濾,通信被強行嚴禁主機越權優先權終止生效40源端被關閉(基礎流控制)5重定向對網絡重定向對主機重定向對服務類型和網絡重定向對服務類型和主機重定向80回送請求(PING請求)90路由器通告100路由器請求超時傳輸期間生存期減為0數據報組裝期間生存期減為0參數問題多種IP頭部錯誤缺乏必需選項130時間戳請求140時間戳應答150信息請求(已作廢)160信息應答(已作廢)170地址掩碼請求180地址掩碼應答10-3ICMP報文類型本課程設計目標是發覺網絡中活動主機,就是使用ICMP回送和回送響應消息發覺網絡中活動主機,即Ping消息請求和應答。那幺,發送ICMP數據包類型設置為回送請求(類型號為8)。五、課程設計過程本程序使用原始套接字(SOCK_RAW)生成ICMP報文來進行活動主機探查,這個程序使用是回送請求和應答信息。程序大致思想:把ICMP數據包類型設置為回送請求(Ping請求,類型號為8),將它發送給網絡上一個IP地址,假如這個IP地址已經被占用,那么使用該IP地址主機,從而返回一個ICMP回送響應(類型號為0)信息。信息封裝在一個IP包中,需要解析該IP包,找到ICMP數據信息(類型為0,表示為對方應答,證實對方IP地址是活動),假如這個IP地址沒有些人使用,則發送ICMP回送請求(Ping請求)在設定延時時間內不可能得到響應。初始化原始套接字后(SOCK_RAW)后,本程序就開始在一個IP網段內尋求活動主機,因為要尋求主機較多,能夠采取多線程技術4.1、分析ICMP協議類型和程序實現方法創建ICMP數據報內容格式,把ICMP數據包類型設置為回送請求(Ping請求,類型號為8)。具體實現代碼以下://IP報頭數據結構typedefstructiphdr{unsignedintheadlen:4;//IP頭長度unsignedintversion:4;//IP版本號unsignedchartos;//服務類型unsignedshorttotallen;//IP包總長度unsignedshortid;;//ID號unsignedshortflag;//標識unsignedcharttl;//生存時間unsignedcharprot;//協議(UDPTCP)unsignedshortchecksum;//校驗和unsignedintsourceIP;//源IPunsignedintdestIP;//目標IP}IpHeader;//ICMP頭部數據結構typedefstructicmphdr{BYTEtype;//ICMP類型碼,回送請求類型碼為8BYTEcode;//子類型碼,保留和特定ICMP報文類型相關細節信息USHORTchecksum;//校驗和USHORTid;//ICMP報文ID號(通常見進程號作ID)USHORTseg;//ICMP數據報序列號}IcmpHeader;WSAStartup函數本函數必需是應用程序或DLL調用第一個WindowsSockets函數.它許可應用程序或DLL指明WindowsSocketsAPI版本號及取得特定WindowsSockets實現細節.應用程序或DLL只能在一次成功WSAStartup()調用以后才能調用深入WindowsSocketsAPI函數。具體應用:MAKEWORD函數本函數用于進行對Socket版本指定和協商,具體應用實例以下:4.2、實例化ICMP數據報格式并創建Socket套接字程序使用原始套接字(SOCK_RAW)生成ICMP報文來進行活動主機探查,這個程序使用是回送請求和應答信息。具體實現代碼以下:#defineICMP_RCHO8//請求回送#defineDEF_PACKET_SIZE32//缺省數據報長度#defineMAX_PACKET1024//最大數據塊長度#defineICMP_MIN8//ICMP報文頭長度(最小ICMP報文長度)#defineICMP_RCHO_REPLY0#defineSTATUS_FAILED0xFFFF#defineMAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader))voidfill_icmp_data(char*,int);USHORTchecksum(USHORT*,int);voiddecode_resp(char*,int,structsockaddr_in*);DWORDWINAPIFindIP(LPVOIDpIPAddrTemp);WSADATAwsaData;SOCKETsockRaw;//為了實現發送/監聽ICMP報文,必需使用原始套接字,創建原始套接字structsockaddr_indest,from,end;intfromlen=sizeof(from);//from是一個sockaddr_in數據結構,用于保留響應目標主機地址char*recvbuf=newchar[MAX_PING_PACKET_SIZE];//確保大和發送包大小4.3、創建多個線程線程是進程內部一個實施單元。系統創建好進程后,實際上就開啟實施了該進程主實施線程,主實施線程以函數地址形式,比如說main或WinMain函數,將程序開啟點提供給Windows系統。主實施線程終止了,進程也就隨之終止。因為要尋求主機較多,能夠采取多線程技術(多線程函數為:CreateThread())。具體實現代碼以下:intfromlen=sizeof(from);//from是一個sockaddr_in數據結構,用于保留響應目標主機地址char*recvbuf=newchar[MAX_PING_PACKET_SIZE];//確保大和發送包大小unsignedintaddr=0;longThreadNumCounter=0,ThreadNumLimit=20;long*aa=&ThreadNumCounter;voidmain(intargc,char*argv[]){ if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0) { cout<<"WASStartupfailed"<<GetLastError()<<endl; ExitProcess(STATUS_FAILED); } sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED;4.4、解析數據包假如所Ping目標主機所在,那么它會發送一個回送應答包。這是一個IP包,收到后解析此數據包并獲取其中ICMP信息。依據IP報頭信息中IP報頭長度字段,就能夠得到ICMP報文真實地址。ICMP數據包中IP地址就是活動主機IP。代碼以下:#defineICMP_MIN8//ICMP報文頭長度(最小ICMP報文長度)#defineMAX_PING_PACKET_SIZE(MAX_PACKET+SIZEOF(IPHeader))char*recvbuf=newchar[MAX_PING_PACKET_SIZE];//確保大和發送包大小//from是一個sockaddr_in數據結構,用于保留響應目標主機地址structsockaddr_infrom;intfromlen=sizeof(from);intbytes=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(strucksockaddr*)&from),&fromlen);IpHeader*iphdr;IcmpHeader*icmphdr;unsignedshortiphdrlen;iphdr=(Ipheader*)buf;iphdrlen=iphdr->headlen*4;//IP報頭長度icmphdr=(Icmpheader*)(buf+iphdrlen);//跳過IP報頭//數據包太短,丟棄if(bytes<iphdrlen+ICMP_MIN)return;//不是回送響應(Ping應答),丟棄if(icmphdr->type!=ICMP_ECHO_REPLY)return;//Id號不相符,丟棄if(icmphdr->id!=(USHOT)GetCurrentThreadId())return;//輸出正在使用IP地址。Cout<<”活動主機:”<<inet_ntoa(from->sin_addr)<<endl;4.5、程序步驟圖一個用多線程實現程序在課程設計過程第三部分中給出,以下分別是主程序步驟圖和子程序步驟圖:開始將Start_IP添入到dest中起始IP地址→Start_IP開始將Start_IP添入到dest中起始IP地址→Start_IP結束IP地址→End_IP建立并初始化目標主機Sockaddr_in數據結構dest結構原始套接字,并初始化Start_IP≤End_IP?Start_IP≤End_IP?YY線程數目太多?線程數目太多?等候一定時間等候一定時間N創建一個線程并實施創建一個線程并實施Start_IP++Start_IP++Y還有線程在實施?還有線程在實施?等候一定時間等候一定時間N結束結束 圖1主程序步驟圖開始開始填充ICMP數據報填充ICMP數據報發送數據報發送數據報接收數報接收數報去掉IP報頭,去掉IP報頭,獲取ICMP信息數據包太短?Y數據包太短?N不是回送響應?Y不是回送響應?NID不符合?YID不符合?N輸出數據報中IP地址輸出數據報中IP地址結束結束圖2子程序步驟圖六、程序運行結果七、課程設計小結這次課程設計是在毫無準備尷尬情況下進行,在此之前,即使學習了很多相關計算機網路和通信原理知識,不過全部是基于理論教學。至于將網絡協議應用到編程過程中,這還是頭一次,所以在設計過程中碰到很多難題。在閱讀設計要求時,一個概念困擾很久,多線程編程在之前并沒有接觸過,不過經過網絡查詢資料后得以了解其含義和作用。在計算機中,一個應用程序在運行狀態能夠看做一個進程,不過這就像做一項及其關鍵過程是同一個道理,在實際生活中,為了實現高效率工作模式,通常是多個人同時來完成一項工作,或說是大家做同一樣事情,結果是一樣時間能夠實現大批量工作。在這個過程當中,參與該事件人全部能夠使用現有資源,這就是多線程共享進程資源原理。不過,在計算機線程中有一個特殊情況,有線程不能使用一些系統資源,這就稱作鎖,就好比有線程將屬于自己系統資源上了一把鎖,不許可其它線程使用這些資源。總而言之,計算機多線程編程就是為了實現計算機快速、高效率地實施程序。經過此次課程設計,我加深了對ICMP協議了解,鞏固了課堂知識。因為網絡協議比較抽象、難學,自己學得也不夠深入,加上還要把所學知識利用到實踐中來,所以一開始時感覺比較困難,而且在調試過程中難免要出現部分如變量沒有定義、缺乏頭文件、大小寫錯誤和其它問題,經過查閱文件資料、向同學請教和認真地思索和分析,逐一對錯誤進行了調試,才使得程序能正常運行,大致上符合了設計目標和要求。在程序調試過程中,出現問題是正常,關鍵是怎樣去發覺問題根源,然后去處理它。為了能夠快速地確定錯誤原因,立即排除程序錯誤,通常把程序錯誤劃分為三種類型:語法錯誤、運行錯誤和邏輯錯誤。在設計過程中,我們能夠先找出問題,看是屬于哪一類錯誤,然后再將問題一一處理,這么既處理了疑難問題又節省了不少時間。參考文件[1]吳功宜,胡曉英,張仁,何云,王寧編著.計算機網絡課程設計.北京:機械工業出版社,.8[2]吳功宜著.計算機網絡.北京:清華大學出版社,[3]陳堅,陳偉.VisualC++網絡高級編程[M].北京:人民郵電出版社,[4]郭國強.計算機網絡和Internet教程.北京:清華出版社,.11[5]楊豐瑞,楊豐任.實用教程最新計算機網絡.北京:中國鐵道出版社,.7附錄源代碼#pragmapack(4)#pragmacomment(lib,"Ws2_32.lib")#defineWIN32_LEAN_AND_MEAN#include<winsock2.h>#include<stdio.h>#include<stdlib.h>#include<iostream.h>#include<stdio.h>#include<sys/timeb.h>#include<time.h>//IP報頭數據結構typedefstructiphdr{unsignedintheadlen:4;//IP頭長度unsignedintversion:4;//IP版本號unsignedchartos;//服務類型unsignedshorttotallen;//IP包總長度unsignedshortid;;//ID號unsignedshortflag;//標識unsignedcharttl;//生存時間unsignedcharprot;//協議(UDPTCP)unsignedshortchecksum;//校驗和unsignedintsourceIP;//源IPunsignedintdestIP;//目標IP}IpHeader;//ICMP頭部數據結構typedefstructicmphdr{BYTEtype;//ICMP類型碼,回送請求類型碼為8BYTEcode;//子類型碼,保留和特定ICMP報文類型相關細節信息USHORTchecksum;//校驗和USHORTid;//ICMP報文ID號(通常見進程號作ID)USHORTseg;//ICMP數據報序列號}IcmpHeader;#defineICMP_RCHO8//請求回送#defineDEF_PACKET_SIZE32//缺省數據報長度#defineMAX_PACKET1024//最大數據塊長度#defineICMP_MIN8//ICMP報文頭長度(最小ICMP報文長度)#defineICMP_RCHO_REPLY0#defineSTATUS_FAILED0xFFFF#defineMAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader))voidfill_icmp_data(char*,int);USHORTchecksum(USHORT*,int);voiddecode_resp(char*,int,structsockaddr_in*);DWORDWINAPIFindIP(LPVOIDpIPAddrTemp);WSADATAwsaData;SOCKETsockRaw;//為了實現發送/監聽ICMP報文,必需使用原始套接字,創建原始套接字structsockaddr_indest,from,end;intfromlen=sizeof(from);//from是一個sockaddr_in數據結構,用于保留響應目標主機地址char*recvbuf=newchar[MAX_PING_PACKET_SIZE];//確保大和發送包大小unsignedintaddr=0;longThreadNumCounter=0,ThreadNumLimit=20;long*aa=&ThreadNumCounter;voidmain(intargc,char*argv[]){ if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0) { cout<<"WASStartupfailed"<<GetLastError()<<endl; ExitProcess(STATUS_FAILED); } sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); if(sockRaw==INVALID_SOCKET) { cout<<"WASSocketet()falied"<<WSAGetLastError()<<endl; ExitProcess(STATUS_FAILED); } inttimeout=1000; intbread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); if(bread==SOCKET_ERROR) { cout<<"FAILEDTOSEYRECVTIMEOUT"<<WSAGetLastError()<<endl; ExitProcess(STATUS_FAILED); } timeout=1000; bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)); if(bread==SOCKET_ERROR) { cout<<"FAILEDTOSEYRECVTIMEOUT"<<WSAGetLastError()<<endl; ExitProcess(STATUS_FAILED); } memset(&dest,0,sizeof(dest)); unsignedlongstartIP,endIP; dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(argv[1]); startIP=inet_addr(argv[1]); end.sin_family=AF_INET; end.sin_addr.s_addr=inet_addr(argv[2]); endIP=inet_addr(argv[2]); HANDLEhThread; while(htonl(startIP)<=htonl(endIP)) { if(ThreadNumCounter>ThreadNumLimit) { Sleep(5000); continue; } DWORDThreadID; sockaddr_in*pIPAddrTemp=new(sockaddr_in); if(!pIPAddrTemp) { cout<<"memoryallocfailed"<<endl; return; } *pIPAddrTemp=dest; clock_tstart; start=clock(); hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,NULL,&ThreadID); longi=60000000L; while(i--); TerminateThread(hThread,0); InterlockedDecrement(aa); memset(&from,0,sizeof(from)); startIP=htonl(htonl(startIP)+1); dest.sin_addr.s_addr=startIP; } while(ThreadNumCounter!=0) { Sleep(); return; cout<<"error"<<endl; }}voidfill_icmp_data(char*icmp_data,intdatasize)//ICMP報文填充 { IcmpHeader*icmp_hdr; char*datapart; icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr->type=ICMP_RCHO;//設置類型icmp_hdr->id=(USHORT)GetCurrentThreadId();//設置其ID號為目前線程號datapart=icmp_data+sizeof(IcmpHeader);//計算出數據報數據部分memset(datapart,'A',datasize-sizeof(IcmpHeader));//填入數據 }voiddecode_resp(char*buf,intbytes,structsockaddr_in*from) { IpHeader*iphdr; IcmpHeader*icmphdr; unsignedshortiphdrlen; iphdr=(IpHeader*)buf; iphdrlen=iphdr->headlen*4;//IP報頭長度icmphdr=(IcmpHeader*)(buf+iphdrlen);//跳過IP報頭if(bytes<iphdrlen+ICMP_MIN)return;//數據包太短,丟棄if(icmphdr->type!=ICMP_RCHO_REPLY)return;//不是回送響應(Ping應答),丟棄if(icmphdr->id!=(USHORT)GetCurrentThreadId())return;//Id號不相符,丟棄cout<<"活動主機:"<<inet_ntoa(from->sin_addr)<<endl;//輸出正在使用IP地址 cout<<""<<inet_ntoa(from->sin_addr)<<endl; }USHORTchecksum(USHORT*buffer,intsize)////計算校驗和 { unsignedlongcksum=0; while(size>1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR*)buffer; } cksum=(

溫馨提示

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

評論

0/150

提交評論