課程設計報告-發(fā)現(xiàn)網絡中的活動主機_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設計實驗報告</b></p><p>  專 業(yè): 12級通信工程(2)班 </p><p>  學 號: </p><p>  姓 名: </p><p>  實驗所屬課程:通信網綜合課程設計</

2、p><p>  一、程設計的目的和意義</p><p>  在網絡管理中,經常要確定當前網絡中處于活動狀態(tài)的主機,這時可以通過使用 ICMP協(xié)議的回送請求(Ping請求)和回送響應(Ping應答)消息來完成本工作。</p><p>  本課程設計的目的是編制程序,利用ICMP數(shù)據包,發(fā)現(xiàn)制定網段中的活動主機。</p><p>  IP協(xié)議的優(yōu)點是

3、簡潔,但缺少差錯控制和查詢機制,而網際控制報文協(xié)議(ICMP)具有補充IP功能的作用。在網絡管理中,常常要確定當前網絡中處于活動狀態(tài)的主機,這時可以通過使用ICMP的回送和回送響應消息來完成這項工作。本課程設計的目的就是編制程序,利用ICMP數(shù)據包,發(fā)現(xiàn)指定網段中的活動主機。通過課程設計,使學生更加熟悉ICMP報文的結構,對ICMP協(xié)議有更好的理解和認識。</p><p><b>  二、課程設計條件&

4、lt;/b></p><p>  計算機,Matlab、C/C++或JAVA編程軟件或者其他通信網仿真軟件(如NS2、OMNET++等)、嵌入式開發(fā)板、編程器等。</p><p>  三、程設計的內容和要求</p><p>  本程序的功能是發(fā)送ICMP數(shù)據包,以獲取指定網段中的活動主機,并將結果顯示到屏幕上。</p><p><

5、b>  程序的要求</b></p><p>  1) 不允許在程序中直接調用Ping,而是用程序實現(xiàn)Ping的功能。</p><p>  2) 以命令形式運行:程序名 Start_ip End_ip, 其中,Start_IP為起始IP地址;End_IP為結束IP地址。</p><p><b>  3) 輸出格式為:</b>&

6、lt;/p><p>  活動主機1的IP地址</p><p>  活動主機2的IP地址</p><p><b>  ……</b></p><p>  四、課程設計的相關技術</p><p>  IP 協(xié)議是一種不可靠的協(xié)議,無法進行差錯控制。但IP 協(xié)議可以借助其他協(xié)議來實現(xiàn)這一功能,</p&g

7、t;<p>  如ICMP。ICMP(Internet Control Messages Protocol, 網間控制報文協(xié)議)允許主機或路由器報告差錯情況和提供有關異常情況的報告。一般來說,ICMP 報文提供針對網絡層的錯誤診斷、擁塞控制、路徑控制和查詢服務四項大的功能。如,當一個分組無法到達目的站點或TTL 超時后,路由器就會丟棄此分組,并向源站點返回一個目的站點不可到達的ICMP 報文。</p><

8、;p>  編制程序前首先要對ICMP報文的格式有一定的了解,ICMP報文是在IP數(shù)據報內部傳輸?shù)?,其結構如圖10-1所示。</p><p><b>  IP數(shù)據報</b></p><p>  IP首部 ICMP報文</p><p>  圖10-1 ICMP封裝在IP內部</p><p&

9、gt;  0 7 8 15 16 31(位)</p><p>  圖10-2 ICMP報文</p><p>  ICMP報文的格式如圖10-2所示。所有報文的前4個字節(jié)都是一樣的,但是其它字節(jié)則互不相同。其中類型字段可以有15個不同的值,以描述特定類型的ICMP報文,某些ICMP報文還使

10、用代碼字段的值來進一步描述不用的條件。按驗和字段為2字節(jié),校驗的范圍是整個ICMP報文。檢驗和是必須的,其計算方法與IP協(xié)議頭部校驗和的計算方法一樣。</p><p>  各種類型的ICMP報文如圖10-3所示(ICMP報文類型),不同類型由報文中的類型字段和代碼字段來共同決定。</p><p>  10-3 ICMP報文類型</p><p>  本課程設計的目的

11、是發(fā)現(xiàn)網絡中的活動主機,就是使用ICMP的回送和回送響應消息發(fā)現(xiàn)網絡中的活動主機,即Ping消息的請求和應答。那幺,發(fā)送的ICMP的數(shù)據包類型設置為回送請求(類型號為8)。</p><p><b>  五、課程設計過程</b></p><p>  本程序使用原始套接字(SOCK_RAW)生成ICMP報文來進行活動主機的探查,這個程序使用的是回送請求與應答信息。<

12、/p><p>  程序的大致思想:把ICMP的數(shù)據包類型設置為回送請求(Ping請求,類型號為8),將它發(fā)送給網絡上的一個IP地址,如果這個IP地址已經被占用,那么使用該IP地址的主機的,從而返回一個ICMP回送響應(類型號為0)的信息。信息封裝在一個IP包中,需要解析該IP包,找到ICMP數(shù)據信息(類型為0,表示為對方的應答,證明對方IP地址是活動的),如果這個IP地址沒有人使用,則發(fā)送的ICMP回送請求(Ping

13、請求)在設定的延時時間內不可能得到響應。</p><p>  初始化原始套接字后(SOCK_RAW)后,本程序就開始在一個IP網段內尋找活動主機,由于要尋找的主機較多,可以采用多線程技術</p><p>  4.1、分析ICMP協(xié)議類型和程序實現(xiàn)方法</p><p>  創(chuàng)建ICMP數(shù)據報的內容格式,把ICMP的數(shù)據包類型設置為回送請求(Ping請求,類型號為8)。

14、具體實現(xiàn)代碼如下:</p><p>  //IP報頭的數(shù)據結構</p><p>  typedef struct iphdr{</p><p>  unsigned int headlen:4; //IP頭長度</p><p>  unsigned int version:4;

15、//IP版本號</p><p>  unsigned char tos; //服務類型</p><p>  unsigned short totallen; //IP包總長度</p><p>  unsigned short id;; //ID號</

16、p><p>  unsigned short flag; //標記</p><p>  unsigned char ttl; //生存時間</p><p>  unsigned char prot; //協(xié)議(UDP TCP)</p>&

17、lt;p>  unsigned short checksum; //校驗和</p><p>  unsigned int sourceIP; //源IP</p><p>  unsigned int destIP; //目的IP</p><p>  }IpHe

18、ader;</p><p>  //ICMP頭部的數(shù)據結構</p><p>  typedef struct icmphdr{</p><p>  BYTE type; //ICMP類型碼,回送請求的類型碼為8</p><p>  BYTE code; //子類型碼,保存與特定ICMP報文類

19、型相關細節(jié)信息</p><p>  USHORT checksum; //校驗和</p><p>  USHORT id; //ICMP報文ID號(一般用進程號作ID)</p><p>  USHORT seg; //ICMP數(shù)據報的序列號</p><

20、p>  }IcmpHeader;</p><p>  WSAStartup函數(shù)</p><p>  本函數(shù)必須是應用程序或DLL調用的第一個Windows Sockets函數(shù).它允許應用程序或DLL指明Windows Sockets API的版本號及獲得特定Windows Sockets實現(xiàn)的細節(jié).應用程序或DLL只能在一次成功的WSAStartup()調用之后才能調用進一步的Win

21、dows Sockets API函數(shù)。具體應用:</p><p>  MAKEWORD函數(shù)</p><p>  本函數(shù)用于進行對Socket版本的指定和協(xié)商,具體應用實例如下:</p><p>  4.2、實例化ICMP數(shù)據報格式并創(chuàng)建Socket套接字</p><p>  程序使用原始套接字(SOCK_RAW)生成ICMP報文來進行活動主機

22、的探查,這個程序使用的是回送請求與應答信息。具體實現(xiàn)代碼如下:#define ICMP_RCHO 8 //請求回送</p><p>  #define DEF_PACKET_SIZE 32 //缺省數(shù)據報長度</p><p>  #define MAX_PACKET 1024 //最大數(shù)據塊長度</p&g

23、t;<p>  #define ICMP_MIN 8 //ICMP報文頭長度(最小ICMP報文長度)</p><p>  #define ICMP_RCHO_REPLY 0</p><p>  #define STATUS_FAILED 0xFFFF</p><p>  #define MAX_PING_PACKET_SIZE (MA

24、X_PACKET+sizeof(IpHeader))</p><p>  void fill_icmp_data(char *,int);</p><p>  USHORT checksum(USHORT *,int);</p><p>  void decode_resp(char *,int,struct sockaddr_in *);</p>&

25、lt;p>  DWORD WINAPI FindIP(LPVOID pIPAddrTemp);</p><p>  WSADATA wsaData;</p><p>  SOCKET sockRaw;//為了實現(xiàn)發(fā)送/監(jiān)聽ICMP報文,必須使用原始套接字,創(chuàng)建原始套接字</p><p>  struct sockaddr_in dest,from,end;&l

26、t;/p><p>  int fromlen =sizeof(from);//from是一個sockaddr_in數(shù)據結構,用于保存響應的目的的主機的地址</p><p>  char *recvbuf=new char[MAX_PING_PACKET_SIZE];//保證大與發(fā)送包的大小</p><p>  4.3、創(chuàng)建多個線程</p><p>

27、;  線程是進程內部的一個執(zhí)行單元。系統(tǒng)創(chuàng)建好進程后,實際上就啟動執(zhí)行了該進程的主執(zhí)行線程,主執(zhí)行線程以函數(shù)地址形式,比如說main或WinMain函數(shù),將程序的啟動點提供給Windows系統(tǒng)。主執(zhí)行線程終止了,進程也就隨之終止。由于要尋找的主機較多,可以采用多線程技術( 多線程的函數(shù)為:CreateThread() )。具體實現(xiàn)代碼如下:</p><p>  int fromlen =sizeof(from);

28、//from是一個sockaddr_in數(shù)據結構,用于保存響應的目的的主機的地址</p><p>  char *recvbuf=new char[MAX_PING_PACKET_SIZE];//保證大與發(fā)送包的大小</p><p>  unsigned int addr=0;</p><p>  long ThreadNumCounter=0,ThreadNumL

29、imit=20;</p><p>  long *aa=&ThreadNumCounter;</p><p>  void main(int argc,char *argv[])</p><p><b>  {</b></p><p>  if(WSAStartup(MAKEWORD(2,1),&wsaD

30、ata)!=0)</p><p><b>  {</b></p><p>  cout<<"WASStartup failed"<<GetLastError()<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p><p>

31、;<b>  }</b></p><p>  sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED;</p><p><b>  4.4、解析數(shù)據包</b></p><p>  如果所Ping的目的主機所在,那么它會發(fā)送一個回送

32、應答包。這是一個IP包,收到后解析此數(shù)據包并獲取其中的ICMP信息。根據IP報頭信息中的IP報頭長度字段,就可以得到ICMP報文的真實地址。ICMP數(shù)據包中的IP地址就是活動主機的IP。代碼如下:</p><p>  #define ICMP_MIN 8 //ICMP報文頭長度(最小ICMP報文長度)</p><p>  #define MAX_PING_PACKET_S

33、IZE (MAX_PACKET + SIZEOF(IPHeader))</p><p>  char *recvbuf=new char[MAX_PING_PACKET_SIZE]; //保證大與發(fā)送包的大小</p><p>  //from是一個sockaddr_in數(shù)據結構,用于保存響應的目的的主機的地址</p><p>  struct sockaddr_

34、in from;</p><p>  int fromlen = sizeof(from);</p><p>  int bytes = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(strucksockaddr*</p><p>  )& from),&fromlen);</p><p>  

35、IpHeader *iphdr;</p><p>  IcmpHeader *icmphdr;</p><p>  unsigned short iphdrlen;</p><p>  iphdr=(Ipheader *)buf;</p><p>  iphdrlen = iphdr->headlen*4 ; //I

36、P報頭的長度</p><p>  icmphdr=(Icmpheader *)(buf+iphdrlen); //跳過IP報頭</p><p>  //數(shù)據包太短,丟棄</p><p>  if(bytes<iphdrlen+ICMP_MIN) return;</p><p>  //不是回送響應(Ping應答),丟棄</p&

37、gt;<p>  if(icmphdr->type !=ICMP_ECHO_REPLY) return;</p><p>  //Id號不相符,丟棄</p><p>  if(icmphdr->id!=(USHOT)GetCurrentThreadId()) return;</p><p>  //輸出正在使用的IP地址。</p>

38、;<p>  Cout<<”活動主機:”<<inet_ntoa(from->sin_addr)<<endl;</p><p><b>  4.5、程序流程圖</b></p><p>  一個用多線程實現(xiàn)的程序在課程設計過程的第三部分中給出,以下分別是主程序流程圖和子程序流程圖:</p><p&

39、gt;<b>  N</b></p><p>  Y Y</p><p><b>  N</b></p><p><b>  Y </b></p><p><b>  N</b></p><p>&

40、lt;b>  圖1 主程序流程圖</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y </b></p><p><b>  N</b></p><p&

41、gt;<b>  Y </b></p><p><b>  N</b></p><p><b>  圖2 子程序流程圖</b></p><p><b>  六、程序運行結果</b></p><p><b>  七、課程設計小結</b>

42、</p><p>  這次課程設計是在毫無準備的尷尬情況下進行的,在此之前,雖然學習了許多有關計算機網路以及通信原理的知識,但是都是基于理論教學的。至于將網絡協(xié)議應用到編程過程中,這還是頭一次,因此在設計的過程中遇到許多難題。在閱讀設計要求時,一個概念困擾很久,多線程編程在之前并沒有接觸過,但是通過網絡查詢資料后得以理解其含義和作用。在計算機中,一個應用程序在運行狀態(tài)可以看做一個進程,但是這就像做一項及其重要的過

43、程是同一個道理,在實際生活中,為了實現(xiàn)高效率的工作模式,通常是多個人同時來完成一項工作,或者說是很多人做同一樣事情,結果是同樣的時間可以實現(xiàn)大批量的工作。在這個過程當中,參與該事件的人都可以使用現(xiàn)有的資源,這就是多線程共享進程資源的原理。但是,在計算機線程中有一種特殊的情況,有的線程不能使用某些系統(tǒng)資源,這就稱作鎖,就好比有的線程將屬于自己的系統(tǒng)資源上了一把鎖,不允許其他線程使用這些資源??傊嬎銠C多線程編程就是為了實現(xiàn)計算機快速、高

44、效率地執(zhí)行程序。</p><p>  通過此次課程設計,我加深了對ICMP協(xié)議的理解,鞏固了課堂知識。由于網絡協(xié)議比較抽象、難學,自己學得也不夠深入,加上還要把所學知識運用到實踐中來,所以一開始時感覺比較困難,而且在調試過程中難免要出現(xiàn)一些如變量沒有定義、缺少頭文件、大小寫錯誤以及其它問題,通過查閱文獻資料、向同學請教以及認真地思考與分析,逐一對錯誤進行了調試,才使得程序能正常運行,大體上符合了設計的目的和要求。

45、</p><p>  在程序的調試過程中,出現(xiàn)問題是正常的,關鍵是如何去發(fā)現(xiàn)問題的根源,然后去解決它。為了能夠快速地確定錯誤的原因,盡快的排除程序錯誤,通常把程序錯誤劃分為三種類型:語法錯誤、運行錯誤和邏輯錯誤。在設計過程中,我們可以先找出問題,看是屬于哪一類錯誤,然后再將問題一一解決,這樣既解決了疑難問題又節(jié)省了不少時間。</p><p><b>  參考文獻</b>

46、;</p><p>  [1] 吳功宜, 胡曉英, 張仁, 何云, 王寧編著. 計算機網絡課程設計. 北京:機械工業(yè)出版社, 2010.8</p><p>  [2] 吳功宜著. 計算機網絡. 北京:清華大學出版社, 2004</p><p>  [3] 陳堅, 陳偉. Visual C++網絡高級編程[M]. 北京: 人民郵電出版社,2001</p>

47、<p>  [4] 郭國強. 計算機網絡與Internet教程. 北京: 清華出版社,2006.11</p><p>  [5] 楊豐瑞, 楊豐任. 實用教程最新計算機網絡. 北京: 中國鐵道出版社,2001.7</p><p><b>  附錄 源代碼</b></p><p>  #pragma pack(4)</p>

48、<p>  #pragma comment (lib,"Ws2_32.lib")</p><p>  #define WIN32_LEAN_AND_MEAN</p><p>  #include <winsock2.h></p><p>  #include <stdio.h></p><

49、p>  #include <stdlib.h></p><p>  #include <iostream.h></p><p>  #include <stdio.h></p><p>  #include <sys/timeb.h></p><p>  #include <time

50、.h></p><p>  //IP報頭的數(shù)據結構</p><p>  typedef struct iphdr{</p><p>  unsigned int headlen:4; //IP頭長度</p><p>  unsigned int version:4; //I

51、P版本號</p><p>  unsigned char tos; //服務類型</p><p>  unsigned short totallen; //IP包總長度</p><p>  unsigned short id;; //ID號</p&g

52、t;<p>  unsigned short flag; //標記</p><p>  unsigned char ttl; //生存時間</p><p>  unsigned char prot; //協(xié)議(UDP TCP)</p><

53、p>  unsigned short checksum; //校驗和</p><p>  unsigned int sourceIP; //源IP</p><p>  unsigned int destIP; //目的IP</p><p>  }IpHeade

54、r;</p><p>  //ICMP頭部的數(shù)據結構</p><p>  typedef struct icmphdr{</p><p>  BYTE type; //ICMP類型碼,回送請求的類型碼為8</p><p>  BYTE code; //子類型碼,保存與特定ICMP報文類型相關

55、細節(jié)信息</p><p>  USHORT checksum; //校驗和</p><p>  USHORT id; //ICMP報文ID號(一般用進程號作ID)</p><p>  USHORT seg; //ICMP數(shù)據報的序列號</p><p&g

56、t;  }IcmpHeader;</p><p>  #define ICMP_RCHO 8 //請求回送</p><p>  #define DEF_PACKET_SIZE 32 //缺省數(shù)據報長度</p><p>  #define MAX_PACKET 1024 //最大數(shù)據塊長度

57、</p><p>  #define ICMP_MIN 8 //ICMP報文頭長度(最小ICMP報文長度)</p><p>  #define ICMP_RCHO_REPLY 0</p><p>  #define STATUS_FAILED 0xFFFF</p><p>  #define MAX_PING_PACKET_

58、SIZE (MAX_PACKET+sizeof(IpHeader))</p><p>  void fill_icmp_data(char *,int);</p><p>  USHORT checksum(USHORT *,int);</p><p>  void decode_resp(char *,int,struct sockaddr_in *);</

59、p><p>  DWORD WINAPI FindIP(LPVOID pIPAddrTemp);</p><p>  WSADATA wsaData;</p><p>  SOCKET sockRaw;//為了實現(xiàn)發(fā)送/監(jiān)聽ICMP報文,必須使用原始套接字,創(chuàng)建原始套接字</p><p>  struct sockaddr_in dest,fro

60、m,end;</p><p>  int fromlen =sizeof(from);//from是一個sockaddr_in數(shù)據結構,用于保存響應的目的的主機的地址</p><p>  char *recvbuf=new char[MAX_PING_PACKET_SIZE];//保證大與發(fā)送包的大小</p><p>  unsigned int addr=0;&l

61、t;/p><p>  long ThreadNumCounter=0,ThreadNumLimit=20;</p><p>  long *aa=&ThreadNumCounter;</p><p>  void main(int argc,char *argv[])</p><p><b>  {</b></

62、p><p>  if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0)</p><p><b>  {</b></p><p>  cout<<"WASStartup failed"<<GetLastError()<<endl;</p><

63、;p>  ExitProcess(STATUS_FAILED);</p><p><b>  }</b></p><p>  sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);</p><p>  if(sockRaw==INVALID_

64、SOCKET)</p><p><b>  {</b></p><p>  cout<<"WASSocketet() falied"<<WSAGetLastError()<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p><

65、;p><b>  }</b></p><p>  int timeout=1000;</p><p>  int bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout));</p><p>  if(bread==SOCKET

66、_ERROR)</p><p><b>  {</b></p><p>  cout<<"FAILED TO SEY RECV TIMEOUT"<<WSAGetLastError()<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p>

67、;<p><b>  }</b></p><p>  timeout=1000;</p><p>  bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout));</p><p>  if(bread==SOCKET_E

68、RROR)</p><p><b>  {</b></p><p>  cout<<"FAILED TO SEY RECV TIMEOUT"<<WSAGetLastError()<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p>

69、<p><b>  }</b></p><p>  memset(&dest,0,sizeof(dest));</p><p>  unsigned long startIP,endIP;</p><p>  dest.sin_family=AF_INET;</p><p>  dest.sin_ad

70、dr.s_addr=inet_addr(argv[1]);</p><p>  startIP=inet_addr(argv[1]);</p><p>  end.sin_family=AF_INET;</p><p>  end.sin_addr.s_addr=inet_addr(argv[2]);</p><p>  endIP=inet

71、_addr(argv[2]);</p><p>  HANDLE hThread;</p><p>  while(htonl(startIP)<=htonl(endIP))</p><p><b>  {</b></p><p>  if(ThreadNumCounter>ThreadNumLimit)&l

72、t;/p><p><b>  {</b></p><p>  Sleep(5000);</p><p><b>  continue;</b></p><p><b>  }</b></p><p>  DWORD ThreadID;</p>

73、<p>  sockaddr_in *pIPAddrTemp=new (sockaddr_in);</p><p>  if(!pIPAddrTemp)</p><p><b>  {</b></p><p>  cout<<"memory alloc failed"<<endl;</

74、p><p><b>  return ;</b></p><p><b>  }</b></p><p>  *pIPAddrTemp=dest;</p><p>  clock_t start;</p><p>  start=clock();</p><p

75、>  hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,NULL,&ThreadID);</p><p>  long i=60000000L;</p><p>  while(i--);</p><p>  TerminateThread(hThread,0);</p>

76、<p>  InterlockedDecrement(aa);</p><p>  memset(&from,0,sizeof(from));</p><p>  startIP=htonl(htonl(startIP)+1);</p><p>  dest.sin_addr.s_addr=startIP;</p><p>

77、<b>  }</b></p><p>  while(ThreadNumCounter!=0)</p><p><b>  {</b></p><p>  Sleep(2000);</p><p><b>  return;</b></p><p> 

78、 cout<<"error"<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void fill_icmp_data(char *icmp_data,int datasize)//ICMP報文的填充</p&g

79、t;<p><b>  {</b></p><p>  IcmpHeader *icmp_hdr;</p><p>  char *datapart;</p><p>  icmp_hdr = (IcmpHeader*)icmp_data;</p><p>  icmp_hdr->type = ICM

80、P_RCHO; //設置類型</p><p>  icmp_hdr->id = (USHORT)GetCurrentThreadId(); //設置其ID號為當前線程號</p><p>  datapart = icmp_data + sizeof(IcmpHeader); //計算出數(shù)據報的數(shù)據部分</p><p>

81、;  memset(datapart,'A',datasize-sizeof(IcmpHeader)); //填入數(shù)據</p><p><b>  }</b></p><p>  void decode_resp(char *buf,int bytes,struct sockaddr_in *from)</p><p><

82、;b>  {</b></p><p>  IpHeader *iphdr;</p><p>  IcmpHeader *icmphdr;</p><p>  unsigned short iphdrlen;</p><p>  iphdr=(IpHeader*) buf;</p><p>  iphd

83、rlen = iphdr->headlen*4 ; //IP報頭的長度</p><p>  icmphdr=(IcmpHeader *)(buf+iphdrlen); //跳過IP報頭 </p><p>  if(bytes<iphdrlen+ICMP_MIN) return; //數(shù)據包太短,丟棄 </p><p>  if

84、(icmphdr->type !=ICMP_RCHO_REPLY) return;//不是回送響應(Ping應答),丟棄 </p><p>  if(icmphdr->id!=(USHORT)GetCurrentThreadId()) return; //Id號不相符,丟棄 </p><p>  cout<<"活動主機:"<<

85、inet_ntoa(from->sin_addr)<<endl;//輸出正在使用的IP地址</p><p>  cout<<" "<<inet_ntoa(from->sin_addr)<<endl;</p><p><b>  }</b></p><p>

86、;  USHORT checksum(USHORT *buffer,int size) // //計算校驗和</p><p><b>  {</b></p><p>  unsigned long cksum=0;</p><p>  while(size>1)</p><p><b>  {</b

87、></p><p>  cksum+=*buffer++;</p><p>  size-=sizeof(USHORT);</p><p><b>  }</b></p><p><b>  if(size)</b></p><p><b>  {</b

88、></p><p>  cksum+=*(UCHAR*)buffer;</p><p><b>  }</b></p><p>  cksum=(cksum>>16)+(cksum& 0xffff);</p><p>  cksum+=(cksum>>16);</p>

89、<p>  return (USHORT)(~cksum);</p><p><b>  }</b></p><p>  DWORD WINAPI FindIP(LPVOID pIPAddrTemp)</p><p><b>  {</b></p><p>  InterlockedInc

90、rement(aa);</p><p>  char icmp_data[MAX_PACKET];//ICMP數(shù)據報最大可能的長度</p><p>  memset(icmp_data,0,MAX_PACKET); //將數(shù)據報清空初始化</p><p>  int datasize=DEF_PACKET_SIZE;//ICMP數(shù)據報報文體的缺省長度</p&g

91、t;<p>  datasize+=sizeof(IcmpHeader); //再加上ICMP頭部的長度</p><p>  fill_icmp_data(icmp_data,datasize);</p><p>  ((IcmpHeader*)icmp_data)->seg= 0; //序列號為0</p><p>

92、  ((IcmpHeader*)icmp_data)->checksum = 0; //先將校驗和置0</p><p>  ((IcmpHeader*)icmp_data)->checksum=checksum((USHORT*)icmp_data,datasize);</p><p>  int bwrote=sendto(sockRaw,icmp_data

93、,datasize,0,(struct sockaddr *)pIPAddrTemp,sizeof(dest));</p><p><b>  int n=0;</b></p><p>  if(bwrote==SOCKET_ERROR)</p><p><b>  {</b></p><p>  

94、if(WSAGetLastError()==WSAETIMEDOUT)</p><p><b>  {</b></p><p>  cout<<"timed out"<<endl;</p><p><b>  }</b></p><p>  cout<

95、;<"sendto failies"<<WSAGetLastError()<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p><p><b>  n=1;</b></p><p><b>  }</b></p>

96、<p>  if(WSAGetLastError()==WSAETIMEDOUT)</p><p><b>  {</b></p><p>  cout<<"timed out"<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p>

97、<p><b>  n=1;</b></p><p><b>  }</b></p><p>  if(bwrote<datasize)</p><p><b>  {</b></p><p>  cout<<"Worte"<

98、;<bwrote<<"bytes"<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p><p><b>  n=1;</b></p><p><b>  }</b></p><p>  int bread

99、=recvfrom(sockRaw,recvbuf,MAX_PING_PACKET_SIZE,0,(struct sockaddr *)&from,&fromlen);</p><p>  if(bread==SOCKET_ERROR)</p><p><b>  {</b></p><p>  if(WSAGetLastErr

100、or()==WSAETIMEDOUT)</p><p><b>  {</b></p><p>  cout<<"timed out"<<endl;</p><p><b>  }</b></p><p>  cout<<"recvf

101、rom falied"<<WSAGetLastError()<<endl;</p><p>  ExitProcess(STATUS_FAILED);</p><p><b>  n=1;</b></p><p><b>  }</b></p><p><b&

102、gt;  if(n==0)</b></p><p><b>  {</b></p><p>  decode_resp(recvbuf,bread,&from);</p><p>  InterlockedDecrement(aa);</p><p><b>  }</b><

溫馨提示

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

評論

0/150

提交評論