網(wǎng)絡(luò)通信程序設(shè)計(jì)實(shí)驗(yàn)二路由跟蹤.doc_第1頁
網(wǎng)絡(luò)通信程序設(shè)計(jì)實(shí)驗(yàn)二路由跟蹤.doc_第2頁
網(wǎng)絡(luò)通信程序設(shè)計(jì)實(shí)驗(yàn)二路由跟蹤.doc_第3頁
網(wǎng)絡(luò)通信程序設(shè)計(jì)實(shí)驗(yàn)二路由跟蹤.doc_第4頁
網(wǎng)絡(luò)通信程序設(shè)計(jì)實(shí)驗(yàn)二路由跟蹤.doc_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實(shí) 驗(yàn) 報(bào) 告 課程名稱 網(wǎng)絡(luò)通信程序設(shè)計(jì) 實(shí)驗(yàn)儀器 計(jì)算機(jī) 實(shí)驗(yàn)名稱 路由跟蹤 系 別 _計(jì)算機(jī)學(xué)院_ 專 業(yè) _ 班級/學(xué)號_ _學(xué)生姓名 實(shí)驗(yàn)日期 2014年4月6日 成 績 _ 指導(dǎo)教師 焦健 實(shí)驗(yàn)二 路由跟蹤實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?學(xué)習(xí)分析程序功能結(jié)構(gòu)。熟悉ICMP協(xié)議的工作原理和路由跟蹤的原理。掌握VC6.0下程序調(diào)試、運(yùn)行的基本方法。二、實(shí)驗(yàn)原理路由跟蹤的實(shí)現(xiàn)就是巧妙地利用了ICMP報(bào)文的TTL超時(shí)報(bào)文。其實(shí)現(xiàn)過程如下:源主機(jī)先向目的主機(jī)發(fā)送一個(gè)回應(yīng)請求報(bào)文(類型8),TTL值設(shè)為1,第一個(gè)路由器收到后將TTL減1,這樣TTL變?yōu)?,分組被廢除。同時(shí)路由器向源主機(jī)發(fā)送一個(gè)TTL超時(shí)報(bào)文(類型為11),報(bào)文的IP包頭中的源IP地址就是第一個(gè)路由器的地址,源主機(jī)就可以通過對該報(bào)文進(jìn)行分析,得到第一個(gè)路由器的地址。接著發(fā)送TTL等于2的報(bào)文得到第二個(gè)路由器地址,再發(fā)TTL等于3的報(bào)文。如此下去直到收到目的主機(jī)的回應(yīng)應(yīng)答報(bào)文(類型為0)或目的不可達(dá)報(bào)文(類型為3),或者到了最大跳數(shù)(要檢測路由器個(gè)數(shù)的最大值)??梢钥吹剑瑢TL的設(shè)置是實(shí)現(xiàn)跟蹤的關(guān)鍵,使用函數(shù)setsockopt(m_Sock, IPPROTO_IP, IP_TTL,(LPSTR)&TTL,sizeof(int) 可以對其進(jìn)行設(shè)置,m_Sock是所創(chuàng)建的套接字,IP_TTL說明是進(jìn)行TTL設(shè)置,TTL即是要設(shè)置的TTL值,為一個(gè)整形數(shù)值 。其實(shí)現(xiàn)流程如圖1所示:圖 1路由跟蹤流程圖三、實(shí)驗(yàn)內(nèi)容 1、按照附錄內(nèi)容給RouteTrace程序添加代碼,增加注釋,調(diào)試程序通過。源代碼:RouteTrace.cpp/ RouteTrace.cpp : Defines the class behaviors for the application.#include stdafx.h#include RouteTrace.h#include RouteTraceDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CRouteTraceAppBEGIN_MESSAGE_MAP(CRouteTraceApp, CWinApp)/AFX_MSG_MAP(CRouteTraceApp)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSGON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()/ CRouteTraceApp constructionCRouteTraceApp:CRouteTraceApp()/ TODO: add construction code here,/ Place all significant initialization in InitInstance/ The one and only CRouteTraceApp objectCRouteTraceApp theApp;/ CRouteTraceApp initializationBOOL CRouteTraceApp:InitInstance()AfxEnableControlContainer();/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();/ Call this when using MFC in a shared DLL#elseEnable3dControlsStatic();/ Call this when linking to MFC statically#endifCRouteTraceDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK) / TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the applications message pump.return FALSE;源代碼:ICMP.cpp / ICMP.cpp: implementation of the CICMP class.#include stdafx.h#include RouteTrace.h#include ICMP.h#include ws2tcpip.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction/CICMP:CICMP()winsock = 0;m_pIp = NULL;m_pIcmp = NULL;m_pIp = (IP_HEAD *)new BYTEMAX_PACKET;m_pIcmp = (ICMP_HEAD *)new BYTEMAX_PACKET;CICMP:CICMP()delete m_pIp;delete m_pIcmp;BOOL CICMP:Initialize()WSADATA wsadata;if( WSAStartup(MAKEWORD(2, 1),&wsadata) ) AfxMessageBox(WSAStartup初始化失敗!);return FALSE;winsock= WSASocket (AF_INET, /建立socket SOCK_RAW, IPPROTO_ICMP, NULL, 0,0);if(!winsock)AfxMessageBox( Socket創(chuàng)建失敗!);return FALSE;int timeout =5000;setsockopt(winsock,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout, /設(shè)置接收超時(shí)sizeof(timeout);timeout = 5000;setsockopt(winsock,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout, /設(shè)置發(fā)送超時(shí)sizeof(timeout);return TRUE;void CICMP:Uninitialize() /釋放Socketif(winsock)closesocket(winsock);WSACleanup();USHORT CICMP:CheckSum(USHORT *buffer, int size) /計(jì)算校驗(yàn)和 unsigned long 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);BOOL CICMP:SendICMPPack(char *pAddr)sockaddr_in sockAddr;memset(void *)&sockAddr,0,sizeof(sockAddr);sockAddr.sin_family = AF_INET;sockAddr.sin_port = 0;sockAddr.sin_addr.S_un.S_addr=inet_addr(pAddr);return SendICMPPack(&sockAddr);/-設(shè)置TTL-int CICMP:SetTTL(int TTL)int nRet=setsockopt(winsock, IPPROTO_IP, IP_TTL,(LPSTR)&TTL,sizeof(int); if(nRet=SOCKET_ERROR) CString ttlerr;ttlerr.Format(設(shè)置 TTL 錯誤!);AfxMessageBox(ttlerr);return 0;return 1;/-發(fā)送-BOOL CICMP:SendICMPPack(sockaddr_in *pAddr)/填充ICMP數(shù)據(jù)各項(xiàng)int state;char *p_data;m_pIcmp-type = ICMP_ECHO;m_pIcmp-code = 0;m_pIcmp-ID = (USHORT)GetCurrentProcessId();m_pIcmp-number = 0;m_pIcmp-time = GetTickCount();m_pIcmp-cksum = 0;/填充數(shù)據(jù)p_data = (char *)m_pIcmp + sizeof(ICMP_HEAD);memset(char *)p_data,0,DEF_PACKET);/檢查和m_pIcmp-cksum = CheckSum(USHORT *)m_pIcmp,DEF_PACKET+sizeof(ICMP_HEAD);/發(fā)送數(shù)據(jù)state = sendto(winsock,(char *)m_pIcmp,DEF_PACKET+sizeof(ICMP_HEAD),NULL,(struct sockaddr *)pAddr,sizeof(sockaddr);if(state = SOCKET_ERROR) if(GetLastError()=WSAETIMEDOUT)m_strInfo = 連接超時(shí)!(發(fā)送);elsem_strInfo=出現(xiàn)未知發(fā)送錯誤!;return FALSE;if(state DEF_PACKET) m_strInfo = 發(fā)送數(shù)據(jù)錯誤!;return FALSE;memcpy(void *)&m_sockAddr,(void *)pAddr,sizeof(sockaddr_in);return TRUE;/-接收數(shù)據(jù)-BOOL CICMP:RecvICMPPack()int state;int len = sizeof(sockaddr_in);char * addr; struct hostent *lpHostent = NULL; int Maxfd = 1; / 監(jiān)視的最大的文件描述符值+1 fd_set readFdSet; / 設(shè)置文件描述符 struct timeval Timeout; addr = inet_ntoa(m_sockAddr.sin_addr); FD_ZERO(&readFdSet); FD_SET(winsock, &readFdSet); Maxfd = max(Maxfd, winsock) + 1; Timeout.tv_sec = 10; / 設(shè)置響應(yīng)時(shí)間限制 Timeout.tv_usec = 0; int e = :select(Maxfd, &readFdSet, NULL, NULL, &Timeout); /獲取多路復(fù)用套接字的響應(yīng)結(jié)果 if(e HeadLen * 4 ;if (state type)case ICMP_ECHOREPLY: /收到正?;仫@m_strInfo.Format(接收到%s %d字節(jié)響應(yīng)數(shù)據(jù),響應(yīng)時(shí)間:%dms.,inet_ntoa(m_sockAddr.sin_addr),len,GetTickCount()-p_icmprev-time);routeaddr=addr;routestate=0; RouteState=到達(dá)目的主機(jī)!; return TRUE;break;case ICMP_TTLOUT: / TTL超時(shí) routeaddr=inet_ntoa(m_sockAddr.sin_addr); routestate=1;RouteState=測試到路由器!;return TRUE;break;case ICMP_DESUNREACH: /目的不可達(dá)m_strInfo = 目的不可達(dá)!; routestate=0;RouteState=目的不可達(dá);return TRUE;break;default : routestate=0;routeaddr=*;m_strInfo=未知錯誤!;RouteState=不明狀態(tài)!; return TRUE;2、命令行窗口下運(yùn)行:tracert 命令,記錄運(yùn)行結(jié)果和網(wǎng)

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論