版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)課程設(shè)計(jì)---使用vc++編程實(shí)現(xiàn)網(wǎng)絡(luò)嗅探器
- 網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 課程設(shè)計(jì):網(wǎng)絡(luò)嗅探器設(shè)計(jì) sniffer vc++平臺
- 信息安全課程設(shè)計(jì)---網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)--基于c#的網(wǎng)絡(luò)嗅探器的設(shè)計(jì)和實(shí)現(xiàn)
- ip網(wǎng)絡(luò)數(shù)據(jù)嗅探器設(shè)計(jì)
- 網(wǎng)絡(luò)嗅探器-計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)說明書
- 網(wǎng)絡(luò)嗅探器畢業(yè)論文
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--圖片瀏覽器
- 嗅探器和網(wǎng)絡(luò)監(jiān)聽器外文翻譯
- 網(wǎng)絡(luò)信息安全概況課程基于c#的網(wǎng)絡(luò)嗅探器的和實(shí)現(xiàn)
- 網(wǎng)絡(luò)協(xié)議編程應(yīng)用課程設(shè)計(jì)
- 基于LINUX的網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 上機(jī)1:基于winpcap的網(wǎng)絡(luò)嗅探器設(shè)計(jì)與實(shí)現(xiàn)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- 基于c#的網(wǎng)絡(luò)嗅探器設(shè)計(jì)與實(shí)現(xiàn)【開題報(bào)告】
- atm網(wǎng)絡(luò)編程cs課程設(shè)計(jì)--模擬atm機(jī)網(wǎng)絡(luò)編程
- web課程設(shè)計(jì) 《web網(wǎng)絡(luò)編程技術(shù)》課程設(shè)計(jì)報(bào)告
- 基于c#的網(wǎng)絡(luò)嗅探器設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)】
- 基于c#的網(wǎng)絡(luò)嗅探器設(shè)計(jì)與實(shí)現(xiàn)【文獻(xiàn)綜述】
評論
0/150
提交評論