




已閱讀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ù)的最大值)。可以看到,對TTL的設(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 錯(cuò)誤!);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ā)送錯(cuò)誤!;return FALSE;if(state DEF_PACKET) m_strInfo = 發(fā)送數(shù)據(jù)錯(cuò)誤!;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=未知錯(cuò)誤!;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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蓬溪縣散裝水泥管理辦法
- 蚌埠市小區(qū)物權(quán)管理辦法
- 衍生品投資管理暫行辦法
- 衢州市工程降水管理辦法
- 西固區(qū)倉庫租賃管理辦法
- 西藏公務(wù)員接待管理辦法
- 設(shè)計(jì)院規(guī)劃管理辦法規(guī)定
- 試用期薪酬待遇管理辦法
- 財(cái)政部企業(yè)合同管理辦法
- 貴州園林給排水管理辦法
- 會診制度培訓(xùn)課件
- 廣東省安全生產(chǎn)管理臺賬表格與說明
- 中建企業(yè)建筑工程項(xiàng)目管理目標(biāo)責(zé)任書(范本)
- 【公開課】植物體的結(jié)構(gòu)層次2024-2025學(xué)年人教版生物七年級上冊
- 重癥醫(yī)學(xué)質(zhì)量控制中心督查評價(jià)標(biāo)準(zhǔn)及評分細(xì)則
- 2024年廣東省英語小升初模擬試卷與參考答案
- 心血管內(nèi)科基礎(chǔ)知識:綜合試題及答案
- 復(fù)方口服避孕藥臨床應(yīng)用中國專家共識
- 代收工程款授權(quán)委托書
- 國家開放大學(xué)專科《辦公室管理》期末紙質(zhì)考試第五大題案例分析總題庫2025版
- 云南省昆明市官渡區(qū)2023-2024學(xué)年五年級下學(xué)期期末考試數(shù)學(xué)試題
評論
0/150
提交評論