




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實用文案課程設計——解析 IP數據包長沙理工大學目錄1、課程設計目的....................................................22、課程設計要求....................................................23、程序設計分析.....................................................23.1網卡設置.....................................................23.2.1使用套接字.................................................33.2.2接收數據包.................................................33.3定義IP頭部的數據結構........................................43.4IP包的解析..................................................43.5協議的定義...................................................53.6捕獲處理.....................................................54、運行結果........................................................65、總結............................................................66、課程設計參考資料................................................77、源程序代碼......................................................7標準文檔實用文案1、課程設計目的本章課程設計的目的就是設計一個解析 IP數據包的程序,并根據這個程序,明確課程設計的目的和重要性, 認真領會課程設計的題目, 讀懂課程設計指導書的要求, 學會設計的基本方法與步驟, 學會如何運用前修知識與收集、 歸納相關資料解決具體問題的方法。嚴格要求自己,要獨立思考,按時、獨立完成能力拓展訓練任務。 設計報告:要求層次清楚,整潔,規范,不得相互抄襲。2、課程設計要求1、用兩個線程 a和b來模擬Ethernet 上的兩臺主機。2、用一個雙字類型變量 Bus來模擬總線(將其初始化為“ \0”,并且總線等于“ \0”時表示總線空閑)。3、兩個子線程向總線發送自己的數據。數據用該線程的線程號進行模擬,發送數據用線程號和Bus的“或”操作進行模擬(即Bus=Bus|ID,ID為該線程的線程號)。4、每臺主機需向總線上成功發送 10次數據,如果其中某次數據發送失敗,則該線程結束。5、發送流程必須遵循 CSMA/CD。隨即延遲算法中的沖突窗口取 0.005。在數據發送成功 3、程序設計分析3.1網卡設置為了獲取網絡中的 IP數據包,必須對網卡進行編程,在這里使用套接字(socket) 進行編程。但是,在通常情況下,網絡通信的套接字程序只能響應與自己硬件地址相匹配的數據包或是以廣播形式發出的數據包。 對于其他形式的數據包,如已到達網絡接口,但卻不是發送到此地址的數據包, 網絡接口在騅投遞地址并非自身地址之后將不引起響應, 也就是說應用程序無法收取與自己無關的數據包。我們要想獲取網絡設備的所有數據包,就是需要將網卡設置為混雜模式。 使用套接字套接字分為三種,即流套接字 (Streamsocket) 、數據報套接字(DatagramSocket)標準文檔實用文案和原始套接字(RawSocket)。要進行IP層數據包的接收和發送,應使用原始套接字。創建原始套接字的代碼如下:Socketsock:Sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_TP,NULL,0,WSA_FLAG_OVERLAPPED);本設計不用考慮超時情況。創建套接后,IP頭就會包含在接收數據包中。然后,我可以設置IP頭操作選項,調用setsockopt 函數。其中flag 設置為true,并設定IP-HDRINCL選項,表明用戶可以親自對 IP頭進行處理。最后使用 bind()函數將socket綁定到本地網卡上。綁定網卡后,需用 WSAIoctl()函數把網卡設置為混雜模式,使網卡能夠接收所有的網絡數據。如果接收的數據包中的協議類型和定義的原始套接字匹配,那么接收的數據就拷貝到套接字中,因此,網卡就可以接收所有經過的 IP包。 接收數據包在程序中可使用recv()函數接收經過的IP包。該函數有四個參數,第一個參數接收操作所用的套接字描述符;第二個參數接收緩沖區的地址;第三個參數接收緩沖區的大小,也就是所要接收的字節數;第四個參數是一個附加標志,如果對所發送的數據沒特殊要求,直接設為0。因為IP數據包的最大長度是65535B,因此緩沖區的大小不能小于65535B。設置緩沖區后,可利用循環來反復監聽接收IP包,用recv()函數實現接收功能。3.3定義IP頭部的數據結構程序需要定義一個數據結構表示 IP頭部。其代碼如下:標準文檔實用文案inti=0;//發送成功次數intCollisionCounter=16;//沖突計數器初始值為16doubleCollisionWindow=0.005;//沖突窗口值取值0.005intrandNum=rand()%3;//隨機數loop:if(Bus==0)//總線空閑{Bus=Bus|ID1; // 模擬發送包Sleep(12);if(Bus==ID1) // 無沖突{printf("%dSendSuccess\n\n",ID1); // 發送成功Bus=0; // 內存清零CollisionCounter=16; // 復原沖突計數器Sleep(rand()%10); // 隨即延時i++;printf(" 主機a發送成功次數=%d\n\n",i);if(i<10)goto loop; // 發送次數不夠10次,開始下一次發送}else{printf("%dSendCollision\n\n",ID1); // 發生沖突CollisionCounter--;Bus=0 ;
3.4IP 包的解析解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段(或子字段)時,可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數的字段(或子字段)時,可以利用C語言中的移位以人、及與、或操作完成。3.5協議的定義(包含相應的頭文件#include#include ):DWORDdwIoControlCode=SIO_RCVALL,/*接收所有的IP包*/dwProtocol=IPPROTO_IP;/*協議類型為IP*/3.6捕獲處理標準文檔實用文案加載Winsock;創建一個接收原始IP包的socket連接;綁定到一個接口;進行WSAIoctl設置,接收所有的IP數據包。代碼如下:if(WSAIoctl(s,dwIoControlCode,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL,NULL)==SOCKET_ERROR)接著設定一個線程進行捕獲:1)創建一個接收IP包的鏈表頭;2)設置一個標識,為真,則不斷進行IP包的捕獲;3)建立一個新的結點,將捕獲的數據包加入到該結點;4)如果鏈表的長度達到指定的長度,創建一個線程對該鏈表的IP包進行解析;再設置一個在IP數據包鏈表不足給定的長度,而又中止IP捕獲時,對鏈表的處理;5)為下一個IP包鏈表創建一個鏈表頭。建立一個進行IP包解析并顯示的線程,進行解析IP數據包,然后顯示IP數據包。4、運行結果截獲IP數據包程序運行結果如下:標準文檔實用文案5、總結這次計算機網絡課程設計是解析 IP數據包,通過這次上機充分應用了所學的計算機網絡和 C語言的知識,并上網搜索一部分相當資料,粗略設計出該程序。通過本次課程設計,首先認識到了自己的不足。在編碼的過程中認識到了自己細節方面的不足,在以后計算機網絡的學習過程中在理解的同時還要做到對細節的注重; 當然在本次課設中最終還是實現了題目要求。同時,覺得本次課設是十分有意義的,使自己所學的只是有了實踐的地方。6、課程設計參考資料《計算機網絡(第四版)》 主編:謝希仁 出版社:電子工業出版社 出版時間:2004年7月《計算機網絡課程設計》 主編:吳功宜 胡曉英張仁何云王寧出版社:機械工業出版社標準文檔實用文案出版或修訂時間:2005年9月《計算機網絡設計》主編:易建勛 出版社:人民郵電出版社 出版或修訂時間:2007年10月7、源程序代碼#include"winsock2.h"#include"ws2tcpip.h"#include"iostream"#include"stdio.h"#pragma comment(lib,"ws2_32.lib")typedefstruct_IP_HEADER// 定義IP頭{union{BYTEVersion; // 版本(前4位)BYTEHdrLen; //IHL (后4位),報頭標長};BYTEServiceType; // 服務類型WORDTotalLen; // 總長WORDID; // 標識union{WORDFlags; // 標志(前3位)WORDFragOff; // 分段偏移(后13位)};BYTETimeToLive; // 生命期BYTEProtocol; // 協議WORDHdrChksum; // 頭校驗和DWORDSrcAddr; // 源地址標準文檔實用文案DWORDDstAddr; // 目的地址BYTEOptions; // 選項}IP_HEADER;逐位解析IP頭中的信息voidgetVersion(BYTEb,BYTE&version){version=b>>4; // 右移4位,獲取版本字段}voidgetIHL(BYTEb,BYTE&result){result=(b&0x0f)*4; // 獲取頭部長度字段}char*parseServiceType_getProcedence(BYTEb){switch(b>>5) // 獲取服務類型字段中優先級子域{case7:return"NetworkControl";break;case6:return"InternetworkControl";break;case5:return"CRITIC/ECP";break;case4:return"FlashOverride";break;case3:return"Flsah";break;標準文檔實用文案case2:return"Immediate";break;case1:return"Priority";break;case0:return"Routine";break;default:return"Unknow";break;}}char*parseServiceType_getTOS(BYTEb){b=(b>>1)&0x0f; // 獲取服務類型字段中的 TOS子域switch(b){case0:return"Normalservice";break;case1:return"Minimizemonetarycost";break;case2:return"Maximizereliability";break;#include<unistd.h>#include<stdio.h>#include<sys/wait.h>#include<sys/ipc.h>標準文檔實用文案#include<sys/shm.h>#include<sys/types.h>#include<error.h>#include<time.h>#include<stdlib.h>#defineERROR_SHMGET-1#defineERROR_SHMAT-2#defineERROR_WAIT-3#defineERROR_FORK-4#defineSLOT_TIME0.005/*截止二進制指數退避算法的實現該算法可以表示為:t=2*τ*r為結點重新發送需要的后退延遲時間;2*τ為沖突窗口值;r為隨機數,r的取值范圍為[0,2^k-1],k=Min[重傳次數,10];當重傳16次仍不成功時,則丟棄該幀.*/staticunsignedlongget_backoff(constintn)//計算重傳推遲時間{intk=n;k=16-k;if(k>10)// 如果重傳次數大于 10時,重傳次數置為10k=10;return(random()%(1<<k))*SLOT_TIME;// 返回重傳推遲時間}/*發送數據流程*/staticvoidsend_msg(constvoid*addr,constpid_tpid,charch){pid_t*bus=(pid_t*)addr;intcollision;// 沖突計數器intk=0;//發送成功的次數for(inti=0;i<10;i++){collision=16;do{while(*bus!=0);//總線不空閑,循環等待直到總線空閑.usleep(SLOT_TIME/2);//檢測到總線為空閑時就開始發送數據,因為線程A和B共享總線變量bus,所以在τ時間以內,另一個線程收不到數據,所以要進行此操作*bus|=pid;//表示另一個進程受收到模擬數據.usleep(SLOT_TIME/2);//從模擬數據發送后經過2τ時間之后進行判斷.判斷是否沖突,共享內存與寫入內存比較,若相同則無沖突,否則發生沖突.if(*bus!=pid){*bus=0;// 復原總線為0標準文檔實用文案collision--;if(collision>0){printf("%dsendcollision.\n",pid);usleep(get_backoff(collision));//隨機延時}else{printf("%dsendfailure.\n",pid);//發送失敗break;}}else{*bus=0;break;}}while(1);if(collision>0){k++;printf("%dsendsuccess.\n",pid);printf("%csendsuccess=%d.\n",ch,k);}usleep(random()%1024);}}/*主函數*/intmain(){pid_tpid=0;intbus=0;/*共享內存的ID,用來模擬總線*/void*addr=0;/*指向模擬總線的首地址*/bus=shmget(IPC_PRIVATE,sizeof(pid_t),SHM_R|SHM_W);//獲取共享內存if(bus==-1)/*如果申請內存失敗*/{perror("shmgeterror.");returnERROR_SHMGET;}if((pid=fork())<0)// 創建子進程a{perror("forkerror.");標準文檔實用文案returnERROR_FORK;}elseif(pid==0){pid=getpid();// 獲取子進程IDaddr=shmat(bus,0,0);// 初始化共享內存為 \0if(addr==(void*)-1){perror("shmaterror");/*shmctl(shmid,IPC_RMID0)是釋放共享內存區,shmid,,這只有在所有進程中的都已經無效化后才會進行IPC_RMID0)如果shmid0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 業務變更合同樣本
- 農村收購 商機合同樣本
- 2025年西寧城市職業技術學院單招職業適應性測試題庫及答案1套
- 思想哲學考試題目及答案
- 輔導員考試內容及關鍵試題
- 2025年西安電力高等專科學校單招職業技能考試題庫及參考答案1套
- 2024年農藝師考試知識點釋義試題及答案
- 園藝師教育與培訓體系試題及答案
- 2025年西安培華學院單招職業技能測試題庫附答案
- 2025年西南財經大學天府學院單招職業技能考試題庫參考答案
- GIS分析-第3章-空間量測與計箣
- 田徑運動會各種記錄表格
- TSG-T7001-2023電梯監督檢驗和定期檢驗規則宣貫解讀
- 煤礦各崗位應知應會明白卡集合
- 大數據時代企業會計信息化風險分析與防范探究-以中茂建筑為例1
- 退役士兵創業培訓課件模板
- 醫療器械的清潔與消毒指南
- 江西兄弟連水鉆有限公司年產14000t玻璃珠生產項且環境影響報告書
- 2024年江蘇建筑職業技術學院高職單招(英語/數學/語文)筆試歷年參考題庫含答案解析
- 中國煙草公司招聘筆試試題
- 【工商管理專業畢業綜合訓練報告2600字(論文)】
評論
0/150
提交評論