發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機報告及源代碼(共25頁)_第1頁
發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機報告及源代碼(共25頁)_第2頁
發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機報告及源代碼(共25頁)_第3頁
發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機報告及源代碼(共25頁)_第4頁
發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機報告及源代碼(共25頁)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上目 錄 一課程設(shè)計目的2二. 課程設(shè)計要求2三相關(guān)知識2四課程設(shè)計分析4五程序流程圖7六程序運行結(jié)果截圖10七. 課程設(shè)計心得10八.附錄:參考文獻(xiàn) 11一課程設(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)段中的活動主機。通過課程設(shè)計,使學(xué)生更加熟悉ICMP報文的結(jié)構(gòu),對ICMP協(xié)議有更好的理解和認(rèn)識。二課程設(shè)計要求: 設(shè)計程序,

2、其功能是發(fā)送ICMP數(shù)據(jù)包,以獲取指定網(wǎng)段中的活動主機,并將結(jié)果顯示在標(biāo)準(zhǔn)輸出上。 程序的具體要求如下:1) 用命令行形式運行: scanhost Start_IP End_IP其中scanhost為程序名;Start_IP為被搜索網(wǎng)段的開始IP地址;End_IP為被搜索網(wǎng)段的結(jié)束IP地址。2)輸出格式為: 活動主機1 活動主機2 三相關(guān)知識:編制程序前首先要對ICMP報文的格式有一定的了解,ICMP報文是在IP數(shù)據(jù)報內(nèi)部傳輸?shù)?,其結(jié)構(gòu)如圖10-1所示: IP數(shù)據(jù)報 IP首部 ICMP報文ICMP報文的格式如圖10-2所示:0 7 8 15 16 31(位)類型字段代碼字段校驗和字段(不同類型

3、和代碼有不同內(nèi)容)所有報文的前4個字節(jié)都是一樣的,但是其它字節(jié)則互不相同。其中類型字段可以有15個不同的值,以描述特定類型的ICMP報文,某些ICMP報文還使用代碼字段的值來進(jìn)一步描述不用的條件。按驗和字段為2字節(jié),校驗的范圍是整個ICMP報文。檢驗和是必須的,其計算方法與IP協(xié)議頭部校驗和的計算方法一樣。 各種類型的ICMP報文如圖10-3所示(ICMP報文類型),不同類型由報文中的類型字段和代碼字段來共同決定。類 型 代 碼 描 述 0 0 回送響應(yīng)(PING應(yīng)答)3 目的不可達(dá)0 網(wǎng)絡(luò)不可達(dá)1 主機不可達(dá)2 協(xié)議不可達(dá)3 端口不可達(dá)4 需要進(jìn)行分片但設(shè)置了禁止分片比特5 源主機選擇路由失

4、敗6 無法識別目的網(wǎng)絡(luò)7 無法識別目的主機8 源主機被隔離9 目的網(wǎng)絡(luò)被禁止10 目的主機被禁止11 由于服務(wù)類型(TOS),網(wǎng)絡(luò)不可達(dá)12 由于服務(wù)類型(TOS),主機不可達(dá)13 由于過濾,通信被強行禁止14 主機越權(quán)15 優(yōu)先權(quán)終止生效 4 0 源端被關(guān)閉(基本流控制)5 重定向0 對網(wǎng)絡(luò)重定向1 對主機重定向2 對服務(wù)類型和網(wǎng)絡(luò)重定向3 對服務(wù)類型和主機重定向 8 0 回送請求(PING請求)9 0 路由器通告10 0 路由器請求11 超時0 傳輸期間生存期減為01 數(shù)據(jù)報組裝期間生存期減為012 參數(shù)問題0 各種IP頭部錯誤1 缺少必須的選項13 0 時間戳請求14 0 時間戳應(yīng)答15

5、 0 信息請求(已作廢)16 0 信息應(yīng)答(已作廢)17 0 地址掩碼請求18 0 地址掩碼應(yīng)答10-3 ICMP報文類型本課程設(shè)計的目的是發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機,就是使用ICMP的回送和回送響應(yīng)消息發(fā)現(xiàn)網(wǎng)絡(luò)中的活動主機,即Ping消息的請求和應(yīng)答。那幺,發(fā)送的ICMP的數(shù)據(jù)包類型設(shè)置為回送請求(類型號為8)。四課程設(shè)計分析: 本程序使用原始套接字生成ICMP報文來進(jìn)行活動主機的探查。這個程序使用的是回送請求與應(yīng)答消息。程序的大致思想是把ICMP的數(shù)據(jù)包類型設(shè)置為回送請求,將它發(fā)送給網(wǎng)絡(luò)上的一個IP地址,如果這個IP地址已經(jīng)被占用的話,那幺使用位于這個IP地址的主機上的TCP/IP軟件就能夠接收

6、到這個ICMP回送請求,從而返回一個ICMP回送響應(yīng)(類型號為0)信息。信息封裝在一個IP包中,我們需要解析該IP包,從中找到ICMP數(shù)據(jù)信息。相反,如果這個IP地址沒有人使用,那幺發(fā)送的ICMP回送請求在設(shè)定的延時內(nèi)就不可能得到響應(yīng)。 在初始化原始套接字之后,本程序就要開始在一個IP網(wǎng)段內(nèi)尋找活動主機。因為要尋找的主機可能很多,為節(jié)省時間可以采用多線程編程。下面接結(jié)合核心代碼對程序的具體實現(xiàn)進(jìn)行講解,同時為使程序流程更加清晰,去掉了錯誤檢查等保護(hù)性代碼。1.使用原始套接字 為了實現(xiàn)發(fā)送/監(jiān)聽ICMP報文,必須使用原始套接字,創(chuàng)建原始套接字的代碼如下: socket sockRaw; sock

7、Raw = WSAocket (AF_INET, sock_Raw, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED); 在WSASocket函數(shù)中,我們使用IPPROTO_ICMP表示接收ICMP數(shù)據(jù)包,為了使用發(fā)送超時設(shè)置(設(shè)置SO_RCVTIMEO或SO_SNDTIMEO),必須將標(biāo)志位置為WSA_FLAG_OVERLAPPED。然后調(diào)用setsockopt函數(shù)設(shè)置讀取延遲。 Int timeout=1000;Setsockopt(sockRaw,SQL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(ti

8、meout);setsockopt(sockRaw,SQL_socket,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout) 在setsockopt函數(shù)中,sockRaw是之前創(chuàng)建的原始套接字,設(shè)置SQL_SOCKET表明使用基本套接字處理ICMP報文。設(shè)置SO_RCVTIMEO表示使用接收超時設(shè)置,SO_SNDTIMEO表示使用發(fā)送超時設(shè)置,在這里,超時時間均設(shè)置為1000ms。 2定義IP頭部和ICMP頭部的數(shù)據(jù)結(jié)構(gòu) 由于socket發(fā)送/捕獲的是IP包,因此要分別定義IP頭部的數(shù)據(jù)結(jié)構(gòu)ICMP頭部數(shù)據(jù)結(jié)構(gòu)。 /IP報頭的數(shù)據(jù)結(jié)構(gòu) typedef

9、 struct iphdrunsigned int headlen:4; /IP頭長度unsigned int version:4; /IP版本號unsigned char tos; /服務(wù)類型unsigned short totallen; /IP包總長度 unsigned short id; /ID號unsigned short flag; /標(biāo)記unsigned char ttl; /生存時間unsigned char prot; /協(xié)議(UDP TCP)nsigned short checksum; /校驗和unsigned int sourceIP; /源IPunsigned int

10、 destIP; /目的IPIpHeader;/ICMP頭部的數(shù)據(jù)結(jié)構(gòu)typedef struct icmphdr BYTE type; /ICMP類型碼,回送請求的類型碼為8 BYTE code; /子類型碼,保存與特定ICMP報文類型相關(guān)細(xì)節(jié)信息 USHORT checksum; /校驗和 USHORT id; /ICMP報文ID號(一般用進(jìn)程號作ID) USHORT seq; /ICMP數(shù)據(jù)報的序列號IcmpHeader;3填充并發(fā)送回送請求類型的ICMP報文 為了使收到數(shù)據(jù)包的目的主機發(fā)送響應(yīng),我們需要向目的主機發(fā)送回送請求類型的ICMP報文。從圖10-3中可知,回送請求的類型號為8。

11、因此ICMP報文的填充代碼如下:#define ICNP_ECHO 8 /請求回送#define DEF_PACKET_SIZE 32 /缺省數(shù)據(jù)報長度#define MAX_PACKET 1024 /最大數(shù)據(jù)塊長度char icmp_dataMAX_PACKET; /ICMP數(shù)據(jù)報最大可能的長度memset(icmp_data,0,MAX_PACKET); /將數(shù)據(jù)報清空初始化int datasize=DEF_PACKET_SIZE; /ICMP數(shù)據(jù)報報文體的缺省長度datasize+=sizeof(IcmpHeader); /再加上ICMP頭部的長度IcmpHeader*icmp_hdr:

12、Char *datapart;Icmp_hdr = (IcmpHeader*)icmp_data;Icmp_hdr->type = ICMP_ECHO; /設(shè)置類型Icmp_hdr->id = (USHORT)GetCurrentThreadId(); /設(shè)置其ID號為當(dāng)前線程號Datapart = icmp_data + sizeof(IcmpHeader); /計算出數(shù)據(jù)報的數(shù)據(jù)部分Memset(datapart,A,datasize-sizeof(IcmpHeader); /填入數(shù)據(jù)(IcmpHeader*)icmp_data)->seq= 0; /序列號為0(Icmp

13、Header*)icmp_data)->checksum = 0; /先將校驗和置0(IcmpHeader*)icmp_data)->checksum = checksum(USHORT*)icmp_data,datasize);checksum為校驗和的函數(shù),設(shè)校驗和初值為0 ,然后對數(shù)據(jù)每16為求異或,結(jié)果取反,便得校驗和。其代碼如下: USHORT checksum(USHORT *buffer, int size) 計算校驗和 unsigned long cksum = 0; while(size>1) cksum+=*buffer+; size -=sizeof(U

14、SHORT);if(size) cksum += (UCHAR*)buffer; cksum = (cksum >> 16)+(cksum & 0xffff);cksum +=(cksum >> 16);return(USHORT)(-cksum); 填充ICMP報文之后,應(yīng)在ICMP報文之前加上IP報頭并發(fā)送出去。可調(diào)用下面的代碼發(fā)送數(shù)據(jù)包。注意,這里的DEST是填入目的主機IP地址的一個sockaddr_in數(shù)據(jù)結(jié)構(gòu),IPSTRING是目的主機的IP地址字符串。 Struct sockaddr_in dest; dest.sin_family = AF_IN

15、ET; dest.sin_addr.s_addr = inet_addr(IP_STRING); /填入搜索的IP地址 sendto(sockRaw,icmp_data,datasize,0,(sockaddr*)&dest,sizeof(dest);4.解析數(shù)據(jù)包如果所Ping的目的主機所在,那么它會發(fā)送一個回送應(yīng)答包。這是一個IP包,收到后解析此數(shù)據(jù)包并獲取其中的ICMP信息。根據(jù)IP報頭信息中的IP報頭長度字段,就可以得到ICMP報文的真實地址。ICMP數(shù)據(jù)包中的IP地址就是活動主機的IP。代碼如下: #define ICMP_MIN 8 /ICMP報文頭長度(最小ICMP報文長

16、度) #define MAX_PING_PACKET_SIZE (MAX_PACKET + SIZEOF(IPHeader) char *recvbuf=new charMAX_PING_PACKET_SIZE; /保證大與發(fā)送包的大小 /from是一個sockaddr_in數(shù)據(jù)結(jié)構(gòu),用于保存響應(yīng)的目的的主機的地址 struct sockaddr_in from; int fromlen = sizeof(from); int bytes = recvfrom(sockRaw,recvbuf,MAX_PACKET, 0,(struck sockaddr*)&from),&fro

17、mlen); IpHeader *iphdr; IcmpHeader *icmphdr; Unsigned short iphdrlen; Iphdr=(Ipheader *)buf; Iphdrlen = iphdr->headlen*4 ; /IP報頭的長度 Icmphdr=(Icmpheader *)(buf+iphdrlen); /跳過IP報頭 /數(shù)據(jù)包太短,丟棄 if(bytes<iphdrlen+ICMP_MIN) return; /不是回送響應(yīng)(Ping應(yīng)答),丟棄 if(icmphdr->type !=ICMP_ECHO_REPLY) return; /Id號

18、不相符,丟棄 if(icmphdr->id!=(USHOT)GetCurrentThreadId() return; /輸出正在使用的IP地址。 Cout<<”活動主機:”<<inet_ntoa(from->sin_addr)<<endl;五程序流程圖:一個用多線程實現(xiàn)的程序在第三部分中給出(課程設(shè)計分析中的第三部分),以下分別是子程序流程圖和主程序流程圖(程序見附錄):1子程序流程圖:開 始填充ICMP數(shù)據(jù)報發(fā)送數(shù)據(jù)報接收數(shù)報去掉IP報頭,獲取ICMP信息數(shù)據(jù)包太短? Y N不是回送響應(yīng)? Y NID不符合? Y N輸出數(shù)據(jù)報中的IP地址 結(jié)

19、束 圖1.子程序流程圖2主程序流程圖:開 始將Start_IP添入到dest中起始IP地址Start_IP結(jié)束IP地址End_IP建立并初始化目的主機的Sockaddr_in數(shù)據(jù)結(jié)構(gòu)dest構(gòu)造原始套接字,并初始化Start_IPEnd_IP? N Y Y線程數(shù)目太多?等待一定時間 N創(chuàng)建一個線程并執(zhí)行Start_IP+ Y 還有線程在執(zhí)行?等待一定時間 N結(jié) 束 圖2.主程序流程圖六程序運行結(jié)果截圖: 圖3.運行結(jié)果七課程設(shè)計心得:附錄:參考文獻(xiàn)1 吳功宜、胡曉英等.計算機網(wǎng)絡(luò)課程設(shè)計,北京:機械工業(yè)出版社,2007.122 胡曉英等;計算機網(wǎng)絡(luò)課程設(shè)計;北京:機械工業(yè)出版社,2005.93

20、 郭國強等;計算機網(wǎng)絡(luò)與Internet教程;北京:清華出版社,2006.114 楊豐瑞 楊豐任;實用教程最新計算機網(wǎng)絡(luò);北京:中國鐵道出版社,2001.7源代碼:#pragma pack(4)/#include "stdafx.h"#pragma comment (lib,"Ws2_32.lib")#define WIN32_LEAN_AND_MEAN#include <winsock2.h>#include <stdio.h>#include <stdlib.h>#include <iostream.h>

21、;#include <stdio.h>#include <sys/timeb.h>#include <time.h>typedef struct iphdrunsigned int headlen:4;unsigned int version:4;unsigned char tos;unsigned short totallen;unsigned short id;unsigned short falg;unsigned char ttl;unsigned char prot;unsigned short checksum;unsigned int sour

22、ceIP;unsigned int destIP;IpHeader;typedef struct icmphdrBYTE type;BYTE code;USHORT checksum;USHORT id;USHORT seg;IcmpHeader;#define ICMP_RCHO 8#define ICMP_RCHO_REPLY 0#defineICMP_MIN 8#define STATUS_FAILED 0xFFFF#defineDEF_PACKET_SIZE 32#define MAX_PACKET 1024#define MAX_PING_PACKET_SIZE (MAX_PACKE

23、T+sizeof(IpHeader)void fill_icmp_data(char *,int);USHORT checksum(USHORT *,int);void decode_resp(char *,int,struct sockaddr_in *);DWORD WINAPI FindIP(LPVOID pIPAddrTemp);WSADATA wsaData;SOCKET sockRaw;struct sockaddr_in dest,from,end;int fromlen =sizeof(from);char *recvbuf=new charMAX_PING_PACKET_SI

24、ZE;unsigned int addr=0;long ThreadNumCounter=0,ThreadNumLimit=20;long *aa=&ThreadNumCounter;void main(int argc,char *argv)/*if(argc!=3)cout<<"輸入格式錯誤: start_ip end_ip"<<endl;return;*/if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0)cout<<"WASStartup failed"<&l

25、t;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);int timeout=1000;int bread=setsoc

26、kopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)cout<<"FAILED TO SEY RECV TIMEOUT"<<WSAGetLastError()<<endl;ExitProcess(STATUS_FAILED); timeout=1000; bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof

27、(timeout); if(bread=SOCKET_ERROR)cout<<"FAILED TO SEY RECV TIMEOUT"<<WSAGetLastError()<<endl;ExitProcess(STATUS_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.s

28、in_family=AF_INET;end.sin_addr.s_addr=inet_addr(argv2);endIP=inet_addr(argv2);HANDLE hThread;while(htonl(startIP)<=htonl(endIP)if(ThreadNumCounter>ThreadNumLimit)Sleep(5000);continue;DWORD ThreadID;sockaddr_in *pIPAddrTemp=new (sockaddr_in);if(!pIPAddrTemp)cout<<"memory alloc failed

29、"<<endl;return ;*pIPAddrTemp=dest;clock_t start;start=clock();hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,NULL,&ThreadID);long i=L;while(i-);TerminateThread(hThread,0);InterlockedDecrement(aa);memset(&from,0,sizeof(from);startIP=htonl(htonl(startIP)+1);dest.sin_addr.

30、s_addr=startIP;while(ThreadNumCounter!=0)Sleep(2000);return;cout<<"error"<<endl;void fill_icmp_data(char *icmp_data,int datasize)IcmpHeader *icmp_hdr;char *datapart;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr->type=ICMP_RCHO;icmp_hdr->id=(USHORT)GetCurrentThreadId();datapart

31、=icmp_data+sizeof(IcmpHeader);memset(datapart,'A',datasize-sizeof(IcmpHeader);void decode_resp(char *buf,int bytes,struct sockaddr_in *from)IpHeader *iphdr;IcmpHeader *icmphdr;unsigned short iphdrlen;iphdr=(IpHeader*) buf;iphdrlen=iphdr->headlen*4;icmphdr=(IcmpHeader *)(buf+iphdrlen);if(b

32、ytes<iphdrlen+ICMP_MIN)return;if(icmphdr->type!=ICMP_RCHO_REPLY)return;if(icmphdr->id!=(USHORT)GetCurrentThreadId()return;cout<<"活動主機: "<<endl;cout<<" "<<inet_ntoa(from->sin_addr)<<endl;USHORT checksum(USHORT *buffer,int size)unsigned lon

33、g cksum=0;while(size>1)cksum+=*buffer+;size-=sizeof(USHORT);if(size)cksum+=*(UCHAR*)buffer;cksum=(cksum>>16)+(cksum& 0xffff);cksum+=(cksum>>16);return (USHORT)(cksum);DWORD WINAPI FindIP(LPVOID pIPAddrTemp)InterlockedIncrement(aa);char icmp_dataMAX_PACKET;memset(icmp_data,0,MAX_PACKET);int datasize=DEF_PACKET_SIZE;datasize+=sizeof(IcmpHeader);fill_icmp_data(icmp_data

溫馨提示

  • 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

提交評論