網(wǎng)絡(luò)編程課程設(shè)計(jì)-網(wǎng)路嗅探器_第1頁
已閱讀1頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目 錄</b></p><p><b>  1 設(shè)計(jì)目的1</b></p><p><b>  2 設(shè)計(jì)內(nèi)容2</b></p><p><b>  3 程序流程2</b></p><p><b>  4 設(shè)計(jì)步

2、驟3</b></p><p><b>  5 設(shè)計(jì)總結(jié)10</b></p><p><b>  1 設(shè)計(jì)目的</b></p><p>  網(wǎng)絡(luò)通信課程設(shè)計(jì)是網(wǎng)絡(luò)工程專業(yè)的大型作業(yè)課。是培養(yǎng)計(jì)算機(jī)領(lǐng)域從事網(wǎng)絡(luò)技術(shù)及應(yīng)用工作的高級工程技術(shù)人才的必修課程。</p><p>  本課的主要任

3、務(wù)是使學(xué)生隊(duì)所學(xué)的《計(jì)算機(jī)網(wǎng)絡(luò)》知識從實(shí)踐上有一個(gè)較清晰的了解。對當(dāng)前計(jì)算機(jī)網(wǎng)絡(luò)的主要種類和常用的網(wǎng)絡(luò)協(xié)議有更進(jìn)一步的深入認(rèn)識。學(xué)會(huì)計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)和日常管理及維護(hù)的最基本方法。</p><p>  網(wǎng)絡(luò)編程簡單的理解就兩臺計(jì)算機(jī)相互通訊數(shù)據(jù),通過使用套接字來達(dá)到進(jìn)程通信目的編程就是網(wǎng)絡(luò)編程。網(wǎng)絡(luò)編程最主要工作就是在發(fā)送端把信息通過規(guī)定好的協(xié)議進(jìn)行組包,在接收端按照規(guī)定好的協(xié)議把包進(jìn)行解析,從而提取出相應(yīng)的信息,達(dá)

4、到通信的目的。中間最主要的就是數(shù)據(jù)包的組裝,數(shù)據(jù)包的過濾,數(shù)據(jù)包的捕獲,數(shù)據(jù)包的分析,當(dāng)然最后再做一些處理。</p><p>  本次實(shí)驗(yàn)運(yùn)用C++的網(wǎng)絡(luò)編程相關(guān)知識,通過學(xué)習(xí)了解了TCP和UDP協(xié)議的基本知識和SOCKET編程的基本概念,完成tracert程序,實(shí)現(xiàn)ping功能和路由追蹤功能。</p><p><b>  2 設(shè)計(jì)內(nèi)容</b></p>

5、<p><b>  一、學(xué)習(xí)實(shí)踐要求</b></p><p>  1.對計(jì)算機(jī)網(wǎng)絡(luò)的物理構(gòu)成有清晰的了解;</p><p>  2.理解計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)的內(nèi)涵;</p><p>  3.熟悉計(jì)算機(jī)網(wǎng)絡(luò)的分類及常用的網(wǎng)絡(luò)協(xié)議;</p><p>  4.基于掌握計(jì)算機(jī)網(wǎng)絡(luò)軟件的開發(fā)方法;</p>&

6、lt;p>  5.具備管理計(jì)算機(jī)網(wǎng)絡(luò)的基本知識及技能。</p><p><b>  二、模塊功能</b></p><p> ?。?)pin功能:發(fā)送ICMP數(shù)據(jù)包到計(jì)算機(jī),如有返回,顯示相應(yīng)時(shí)間等。</p><p> ?。?)路由探測功能:依次ping途經(jīng)的路由器或網(wǎng)關(guān)設(shè)備,依次顯示途經(jīng)路由器的響應(yīng)時(shí)間。</p><p

7、><b>  3 程序流程</b></p><p><b>  圖1 流程圖</b></p><p><b>  4 設(shè)計(jì)步驟</b></p><p>  一、程序運(yùn)行結(jié)果相關(guān)截圖</p><p><b>  圖2 運(yùn)行結(jié)果</b></p&

8、gt;<p><b>  圖3 運(yùn)行結(jié)果</b></p><p><b>  圖4 運(yùn)行結(jié)果</b></p><p><b>  圖5 運(yùn)行結(jié)果</b></p><p><b>  二、程序源代碼</b></p><p>  #incl

9、ude <iostream></p><p>  #include <winsock2.h></p><p>  #include <ws2tcpip.h></p><p>  using namespace std;</p><p>  #pragma comment(lib, "Ws2_32.

10、lib")</p><p><b>  //IP報(bào)頭</b></p><p>  typedef struct</p><p><b>  {</b></p><p>  unsigned char hdr_len:4; //4位頭部長度</p><p&g

11、t;  unsigned char version:4; //4位版本號</p><p>  unsigned char tos; //8位服務(wù)類型</p><p>  unsigned short total_len; //16位總長度</p><p>  unsigned short identifier

12、; //16位標(biāo)識符</p><p>  unsigned short frag_and_flags; //3位標(biāo)志加13位片偏移</p><p>  unsigned char ttl; //8位生存時(shí)間</p><p>  unsigned char protocol; //8位上層協(xié)議號&

13、lt;/p><p>  unsigned short checksum; //16位校驗(yàn)和</p><p>  unsigned long sourceIP; //32位源IP地址</p><p>  unsigned long destIP; //32位目的IP地址</p><p>  

14、} IP_HEADER;</p><p><b>  //ICMP報(bào)頭</b></p><p>  typedef struct</p><p><b>  {</b></p><p>  BYTE type; //8位類型字段</p><p>  BYTE c

15、ode; //8位代碼字段</p><p>  USHORT cksum; //16位校驗(yàn)和</p><p>  USHORT id; //16位標(biāo)識符</p><p>  USHORT seq; //16位序列號</p><p>  } ICMP_HEADER;</p><

16、p><b>  //報(bào)文解碼結(jié)構(gòu)</b></p><p>  typedef struct</p><p><b>  {</b></p><p>  USHORT usSeqNo; //序列號</p><p>  DWORD dwRoundTripTime; //

17、往返時(shí)間</p><p>  in_addr dwIPaddr; //返回報(bào)文的IP地址</p><p>  }DECODE_RESULT;</p><p>  //計(jì)算網(wǎng)際校驗(yàn)和函數(shù)</p><p>  USHORT checksum(USHORT *pBuf,int iSize)</p><p>&l

18、t;b>  {</b></p><p>  unsigned long cksum=0;</p><p>  while(iSize>1)</p><p><b>  {</b></p><p>  cksum+=*pBuf++;</p><p>  iSize-=size

19、of(USHORT);</p><p><b>  }</b></p><p><b>  if(iSize)</b></p><p><b>  {</b></p><p>  cksum+=*(UCHAR *)pBuf;</p><p><b&

20、gt;  }</b></p><p>  cksum=(cksum>>16)+(cksum&0xffff);</p><p>  cksum+=(cksum>>16);</p><p>  return (USHORT)(~cksum);</p><p><b>  }</b>

21、</p><p>  //對數(shù)據(jù)包進(jìn)行解碼</p><p>  BOOL DecodeIcmpResponse(char * pBuf,int iPacketSize,DECODE_RESULT &DecodeResult,BYTE ICMP_ECHO_REPLY,BYTE ICMP_TIMEOUT)</p><p><b>  {</b&

22、gt;</p><p>  //檢查數(shù)據(jù)報(bào)大小的合法性</p><p>  IP_HEADER* pIpHdr = (IP_HEADER*)pBuf;</p><p>  int iIpHdrLen = pIpHdr->hdr_len * 4;</p><p>  if (iPacketSize < (int)(iIpHdrLen

23、+sizeof(ICMP_HEADER)))</p><p>  return FALSE;</p><p>  //根據(jù)ICMP報(bào)文類型提取ID字段和序列號字段</p><p>  ICMP_HEADER *pIcmpHdr=(ICMP_HEADER *)(pBuf+iIpHdrLen);</p><p>  USHORT usID,usS

24、quNo;</p><p>  if(pIcmpHdr->type==ICMP_ECHO_REPLY) //ICMP回顯應(yīng)答報(bào)文</p><p><b>  {</b></p><p>  usID=pIcmpHdr->id; //報(bào)文ID</p><p>  usSquNo=pI

25、cmpHdr->seq; //報(bào)文序列號</p><p><b>  }</b></p><p>  else if(pIcmpHdr->type==ICMP_TIMEOUT) //ICMP超時(shí)差錯(cuò)報(bào)文</p><p><b>  {</b></p><p>  char *

26、 pInnerIpHdr=pBuf+iIpHdrLen+sizeof(ICMP_HEADER); //載荷中的IP頭</p><p>  int iInnerIPHdrLen=((IP_HEADER *)pInnerIpHdr)->hdr_len*4; //載荷中的IP頭長</p><p>  ICMP_HEADER

27、 * pInnerIcmpHdr=(ICMP_HEADER *)(pInnerIpHdr+iInnerIPHdrLen);//載荷中的ICMP頭</p><p>  usID=pInnerIcmpHdr->id; //報(bào)文ID</p><p>  usSquNo=pInnerIcmpHdr->seq; //序列號</p><p>&l

28、t;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  return false;</p><p><b>  }</b></p><p>  //檢查ID和序列

29、號以確定收到期待數(shù)據(jù)報(bào)</p><p>  if(usID!=(USHORT)GetCurrentProcessId()||usSquNo!=DecodeResult.usSeqNo)</p><p><b>  {</b></p><p>  return false;</p><p><b>  }<

30、/b></p><p>  //記錄IP地址并計(jì)算往返時(shí)間</p><p>  DecodeResult.dwIPaddr.s_addr=pIpHdr->sourceIP;</p><p>  DecodeResult.dwRoundTripTime=GetTickCount()-DecodeResult.dwRoundTripTime;</p&g

31、t;<p>  //處理正確收到的ICMP數(shù)據(jù)報(bào)</p><p>  if (pIcmpHdr->type == ICMP_ECHO_REPLY ||pIcmpHdr->type == ICMP_TIMEOUT)</p><p><b>  {</b></p><p>  //輸出往返時(shí)間信息</p>&

32、lt;p>  if(DecodeResult.dwRoundTripTime)</p><p>  cout<<" "<<DecodeResult.dwRoundTripTime<<"ms"<<flush;</p><p><b>  else</b></p&

33、gt;<p>  cout<<" "<<"<1ms"<<flush;</p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p>

34、<p>  void main()</p><p><b>  {</b></p><p>  //初始化Windows sockets網(wǎng)絡(luò)環(huán)境</p><p>  WSADATA wsa;</p><p>  WSAStartup(MAKEWORD(2,2),&wsa);</p><

35、;p>  char IpAddress[255];</p><p>  cout<<"請輸入一個(gè)IP地址或域名:";</p><p>  cin>>IpAddress;</p><p><b>  //得到IP地址</b></p><p>  u_long ulDestI

36、P=inet_addr(IpAddress);</p><p>  //轉(zhuǎn)換不成功時(shí)按域名解析</p><p>  if(ulDestIP==INADDR_NONE)</p><p><b>  {</b></p><p>  hostent * pHostent=gethostbyname(IpAddress);<

37、;/p><p>  if(pHostent)</p><p><b>  {</b></p><p>  ulDestIP=(*(in_addr*)pHostent->h_addr).s_addr;</p><p><b>  }</b></p><p><b>

38、  else</b></p><p><b>  {</b></p><p>  cout<<"輸入的IP地址或域名無效!"<<endl;</p><p>  WSACleanup();</p><p><b>  return;</b><

39、;/p><p><b>  }</b></p><p><b>  }</b></p><p>  cout<<"Tracing roote to "<<IpAddress<<" with a maximum of 30 hops.\n"<<

40、;endl;</p><p>  //填充目地端socket地址</p><p>  sockaddr_in destSockAddr;</p><p>  ZeroMemory(&destSockAddr,sizeof(sockaddr_in));</p><p>  destSockAddr.sin_family=AF_INET;

41、</p><p>  destSockAddr.sin_addr.s_addr=ulDestIP;</p><p><b>  //創(chuàng)建原始套接字</b></p><p>  SOCKET sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);&l

42、t;/p><p><b>  //超時(shí)時(shí)間</b></p><p>  int iTimeout=3000;</p><p><b>  //接收超時(shí)</b></p><p>  setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&iTimeou

43、t,sizeof(iTimeout));</p><p><b>  //發(fā)送超時(shí)</b></p><p>  setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&iTimeout,sizeof(iTimeout));</p><p>  //構(gòu)造ICMP回顯請求消息,并以TTL遞增的順

44、序發(fā)送報(bào)文</p><p>  //ICMP類型字段</p><p>  const BYTE ICMP_ECHO_REQUEST=8; //請求回顯</p><p>  const BYTE ICMP_ECHO_REPLY=0; //回顯應(yīng)答</p><p>  const BYTE ICMP_TIMEOUT=11;

45、 //傳輸超時(shí)</p><p><b>  //其他常量定義</b></p><p>  const int DEF_ICMP_DATA_SIZE=32; //ICMP報(bào)文默認(rèn)數(shù)據(jù)字段長度</p><p>  const int MAX_ICMP_PACKET_SIZE=1024;//ICMP報(bào)文最大長度(包括報(bào)頭)</p>

46、<p>  const DWORD DEF_ICMP_TIMEOUT=3000; //回顯應(yīng)答超時(shí)時(shí)間</p><p>  const int DEF_MAX_HOP=30; //最大跳站數(shù)</p><p>  //填充ICMP報(bào)文中每次發(fā)送時(shí)不變的字段</p><p>  char IcmpSendBuf[sizeof(I

47、CMP_HEADER)+DEF_ICMP_DATA_SIZE]; //發(fā)送緩沖區(qū)</p><p>  memset(IcmpSendBuf, 0, sizeof(IcmpSendBuf)); //初始化發(fā)送緩沖區(qū)</p><p>  char IcmpRecvBuf[MAX_ICMP_PACKET_SIZE];

48、 //接收緩沖區(qū)</p><p>  memset(IcmpRecvBuf, 0, sizeof(IcmpRecvBuf)); //初始化接收緩沖區(qū)</p><p>  ICMP_HEADER * pIcmpHeader=(ICMP_HEADER*)IcmpSendBuf;</p><p>  pIcmpHeader->type

49、=ICMP_ECHO_REQUEST; //類型為請求回顯</p><p>  pIcmpHeader->code=0; //代碼字段為0</p><p>  pIcmpHeader->id=(USHORT)GetCurrentProcessId(); //ID字段為當(dāng)前進(jìn)程號</p>

50、<p>  memset(IcmpSendBuf+sizeof(ICMP_HEADER),'E',DEF_ICMP_DATA_SIZE);//數(shù)據(jù)字段</p><p>  USHORT usSeqNo=0; //ICMP報(bào)文序列號</p><p>  int iTTL=1; //TTL初始值為1<

51、;/p><p>  BOOL bReachDestHost=FALSE; //循環(huán)退出標(biāo)志</p><p>  int iMaxHot=DEF_MAX_HOP; //循環(huán)的最大次數(shù)</p><p>  DECODE_RESULT DecodeResult; //傳遞給報(bào)文解碼函數(shù)的結(jié)構(gòu)化參數(shù)</p><p>  while(!b

52、ReachDestHost&&iMaxHot--)</p><p><b>  {</b></p><p>  //設(shè)置IP報(bào)頭的TTL字段</p><p>  setsockopt(sockRaw,IPPROTO_IP,IP_TTL,(char *)&iTTL,sizeof(iTTL));</p><

53、;p>  cout<<iTTL<<flush; //輸出當(dāng)前序號</p><p>  //填充ICMP報(bào)文中每次發(fā)送變化的字段</p><p>  ((ICMP_HEADER *)IcmpSendBuf)->cksum=0; //校驗(yàn)和先置為0</p><p>  ((ICMP_HEADER *)IcmpSendBuf

54、)->seq=htons(usSeqNo++); //填充序列號</p><p>  ((ICMP_HEADER *)IcmpSendBuf)->cksum=checksum((USHORT *)IcmpSendBuf,sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE); //計(jì)算校驗(yàn)和</p><p>  //記錄序列號和當(dāng)前時(shí)間<

55、;/p><p>  DecodeResult.usSeqNo=((ICMP_HEADER*)IcmpSendBuf)->seq; //當(dāng)前序號</p><p>  DecodeResult.dwRoundTripTime=GetTickCount(); //當(dāng)前時(shí)間</p><p>  //發(fā)送TCP回顯請求信息</p>

56、<p>  sendto(sockRaw,IcmpSendBuf,sizeof(IcmpSendBuf),0,(sockaddr*)&destSockAddr,sizeof(destSockAddr));</p><p>  //接收ICMP差錯(cuò)報(bào)文并進(jìn)行解析處理</p><p>  sockaddr_in from; //對端socket地址<

57、;/p><p>  int iFromLen=sizeof(from); //地址結(jié)構(gòu)大小</p><p>  int iReadDataLen; //接收數(shù)據(jù)長度</p><p><b>  while(1)</b></p><p><b>  {</b></p>

58、;<p><b>  //接收數(shù)據(jù)</b></p><p>  iReadDataLen=recvfrom(sockRaw,IcmpRecvBuf,MAX_ICMP_PACKET_SIZE,0,(sockaddr*)&from,&iFromLen);</p><p>  if(iReadDataLen!=SOCKET_ERROR)

59、//有數(shù)據(jù)到達(dá)</p><p><b>  {</b></p><p>  //對數(shù)據(jù)包進(jìn)行解碼</p><p>  if(DecodeIcmpResponse(IcmpRecvBuf,iReadDataLen,DecodeResult,ICMP_ECHO_REPLY,ICMP_TIMEOUT))</p><p><

60、;b>  {</b></p><p>  //到達(dá)目的地,退出循環(huán)</p><p>  if(DecodeResult.dwIPaddr.s_addr==destSockAddr.sin_addr.s_addr)</p><p>  bReachDestHost=true;</p><p><b>  //輸出IP

61、地址</b></p><p>  cout<<'\t'<<inet_ntoa(DecodeResult.dwIPaddr)<<endl;</p><p><b>  break;</b></p><p><b>  }</b></p><p

62、><b>  }</b></p><p>  else if(WSAGetLastError()==WSAETIMEDOUT) //接收超時(shí),輸出*號</p><p><b>  {</b></p><p>  cout<<" *"<<'\t&

63、#39;<<"Request timed out."<<endl;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b&g

64、t;  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  iTTL++; //遞增TTL值</p><p><b>

65、;  }</b></p><p><b>  }</b></p><p><b>  5 設(shè)計(jì)總結(jié)</b></p><p>  通過這次課程設(shè)計(jì),讓我受益匪淺,使我掌握了網(wǎng)絡(luò)通信編程的基本思想。實(shí)習(xí)的時(shí)候遇到很多不會(huì)的東西,通過問老師同學(xué),上網(wǎng)自己搜索得到答案,解決問題。畫流程圖,剛開始怎么都不會(huì),畫好后每次改

溫馨提示

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

最新文檔

評論

0/150

提交評論