版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 設(shè)計報告</b></p><p> 課 程 計算機網(wǎng)絡(luò) </p><p> 設(shè)計名稱 幀封裝 </p><p> 專業(yè)班級 </p><p> 同組人姓名 &
2、lt;/p><p><b> 同組人學(xué)號 </b></p><p> 實驗日期 2011-6-9 </p><p> 指導(dǎo)教師 </p><p> 成 績 </p><p&
3、gt; 2011年 6 月 9 日</p><p><b> 一、設(shè)計目的和要求</b></p><p><b> 1、實驗?zāi)康?lt;/b></p><p> 幀是在數(shù)據(jù)鏈路層數(shù)據(jù)進(jìn)行傳輸與交換的基本單位。構(gòu)造幀對于理解網(wǎng)絡(luò)協(xié)議的概念、協(xié)議執(zhí)行過程以及網(wǎng)絡(luò)問題處理的一般方法具有重要的意義。本次課程設(shè)計的目的是應(yīng)用數(shù)據(jù)鏈
4、路層與介質(zhì)訪問控制層的知識,根據(jù)數(shù)據(jù)鏈路層的基本原理,通過構(gòu)造一個具體的Ethernet幀,從而深入理解網(wǎng)絡(luò)協(xié)議的基本概念與網(wǎng)絡(luò)問題處理的一般方法。</p><p><b> 2、實驗要求</b></p><p> 本程序的功能是進(jìn)行幀封裝。</p><p> 以命令行形式運行:framer inputfile outputfile 其中
5、framer為程序名;inputfile為輸入文件;outputfile為輸出文件;成功封裝后顯示“幀文件 outputfile 封裝完成”。</p><p> 二、設(shè)計說明(包括設(shè)計分析,系統(tǒng)運行環(huán)境,設(shè)計中的重點和難點,輸入和輸出條件等)</p><p> 程序共分三個部分:填充幀頭部字段,填充數(shù)據(jù)字段,計算CRC校驗碼并填充。</p><p> 1. 填
6、充幀頭部字段</p><p> 在這一部分需要向輸出文件寫入前導(dǎo)碼、幀前定界符、目的地址、源地址和長度字段。寫入前四個部分十分簡單,而寫入長度字段時需要計算輸入文件的長度。所以計算輸入文件長度的方法如下所示:</p><p> int length=0;</p><p> infile.seekg(0,ios::end);//將讀指針移到文件末尾。</p
7、><p> length=infile.tellg();//計算指針偏移量,即為輸入文件的長度。</p><p> unsigned char* data=new unsigned char[length];//創(chuàng)建字符指針并根據(jù)文件長度初始化。</p><p> infile.seekg(0,ios::beg);//將讀指針移到文件開始。</p>
8、<p> infile.read(data,length);//將文件數(shù)據(jù)讀入到字符指針data中。</p><p> file.put(char(length>>8));</p><p> file.put(char(length&0xff));//將文件長度值按照逆序?qū)懭氲捷敵鑫募拈L度字段中。</p><p> file.
9、write(data,length);//將data內(nèi)容寫入到輸出文件中。</p><p> 這種方法采用的是使用文件流相關(guān)函數(shù)的辦法,簡單明了,可以先獲得文件數(shù)據(jù)長度,再申請相同大小的空間,不會造成空間上的浪費。</p><p><b> 2. 填充數(shù)據(jù)字段</b></p><p> 在數(shù)據(jù)字段中,數(shù)據(jù)字段的最小長度為46B。如果幀的L
10、LC數(shù)據(jù)少于46B,則應(yīng)將數(shù)據(jù)字段填充至46B。填充字符是任意的,不計入長度字段值中。在程序中是用一下方法實現(xiàn)的:</p><p> //如果輸入文件長度不足B,則用補足B</p><p> if(length<46)</p><p><b> {</b></p><p> for(int j=length
11、;j<46;j++)</p><p> file.put(char(0x00));</p><p><b> }</b></p><p> 3.計算CRC校驗碼并填充</p><p> 幀封裝的最后一步就是對數(shù)據(jù)進(jìn)行校驗,并將校驗結(jié)果記入幀校驗字段。本程序中實現(xiàn)的是CRC-8校驗算法,方法如下所示:<
12、/p><p> file.put(char(0x00));//將數(shù)據(jù)字段后添加個</p><p> file.seekg(8,ios::beg);//將讀指針指向目的地址字段,從此處開始CRC計算</p><p> unsigned char ch;//ch用來保存讀入的字符。</p><p> unsigned char crc=cha
13、r(0x00);//余數(shù)初始值為。</p><p> while(1)//進(jìn)行CRC計算</p><p><b> {</b></p><p> file.get(ch);</p><p> if(ch==0xff)//判斷是否到了文件結(jié)尾,如果是,則退出循環(huán)。</p><p><b
14、> break;</b></p><p> for(i=0;i<8;i++)//對入讀入的字符的位分別處理。</p><p><b> {</b></p><p> if(0x80==(crc&(0x80)))//當(dāng)前余數(shù)最高位為,需要進(jìn)行除法運算。</p><p><b&g
15、t; {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補。</p><p> crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)的值遞補到余數(shù)末位。</p><p> crc=crc^(0x07);//進(jìn)行除法運算,即與除數(shù)的低位相異或。</
16、p><p><b> }</b></p><p> else//當(dāng)前余數(shù)的最高位為,不需要進(jìn)行除法運算。</p><p><b> {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補。</p><p>
17、crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)位的值遞補到余數(shù)末位。</p><p><b> }</b></p><p> ch=ch<<1;//讀到的字符左移位,使數(shù)據(jù)下一位作為輸入位。</p><p><b> } } </b></p><p
18、><b> 三、程序流程圖</b></p><p><b> 程序流程圖</b></p><p><b> CRC計算流程圖</b></p><p> 四、程序源代碼及注釋</p><p> #include<iostream.h></p>
19、;<p> #include<fstream.h></p><p> #include<stdlib.h></p><p> void main(int argc,char*argv[])</p><p><b> {</b></p><p> //如果輸入命令行不正確,則
20、輸出提示后退出。</p><p> if(argc!=3)</p><p><b> {</b></p><p> cout<<endl<<"請按以下格式輸入:framer inputfile outputfile"<<endl;</p><p><b&
21、gt; exit(0);</b></p><p><b> }</b></p><p> //打開指定的輸出文件,以二進(jìn)制方式打開并可讀可寫,如文件存在,則清除其內(nèi)容。</p><p> fstream file(argv[2],ios::out|ios::in|ios::binary|ios::trunc,0); <
22、/p><p> for(int i=0;i<7;i++)</p><p> file.put((char)0xaa);</p><p> file.put((char)0xab);//寫入B的前導(dǎo)碼和B的幀前定界符。</p><p> char des_add[]={char(0x00),char(0x00),char(0xE4),
23、char(0x86),char(0x3A),char(0xDC)};</p><p> file.write(des_add,6);//寫入B的目的地址。</p><p> char sor_add[]={char(0x00),char(0x00),char(0x80),char(0x1A),char(0xE6),char(0x65)};</p><p> f
24、ile.write(sor_add,6);//寫入B的源地址。</p><p> //創(chuàng)建輸入文件流并打開指定的輸入文件,以二進(jìn)制方式打開并可讀。</p><p> ifstream infile(argv[1],ios::in|ios::binary,0); </p><p> int length=0;</p><p> infi
25、le.seekg(0,ios::end);//將讀指針移到文件末尾。</p><p> length=infile.tellg();//計算指針偏移量,即為輸入文件的長度。</p><p> unsigned char* data=new unsigned char[length];//創(chuàng)建字符指針并根據(jù)文件長度初始化。</p><p> infile.see
26、kg(0,ios::beg);//將讀指針移到文件開始。</p><p> infile.read(data,length);//將文件數(shù)據(jù)讀入到字符指針data中。</p><p> file.put(char(length>>8));</p><p> file.put(char(length&0xff));//將文件長度值按照逆序?qū)懭?/p>
27、到輸出文件的長度字段中。</p><p> file.write(data,length);//將data內(nèi)容寫入到輸出文件中。</p><p> //如果輸入文件長度不足B,則用補足B。</p><p> if(length<46)</p><p><b> {</b></p><p&
28、gt; for(int j=length;j<46;j++)</p><p> file.put(char(0x00));</p><p><b> }</b></p><p> file.put(char(0x00));//將數(shù)據(jù)字段后添加個</p><p> file.seekg(8,ios::beg
29、);//將讀指針指向目的地址字段,從此處開始CRC計算</p><p> unsigned char ch;//ch用來保存讀入的字符。</p><p> unsigned char crc=char(0x00);//余數(shù)初始值為。</p><p> while(1)//進(jìn)行CRC計算</p><p><b> {</
30、b></p><p> file.get(ch);</p><p> if(ch==0xff)//判斷是否到了文件結(jié)尾,如果是,則退出循環(huán)。</p><p><b> break;</b></p><p> for(i=0;i<8;i++)//對入讀入的字符的位分別處理。</p><
31、;p><b> {</b></p><p> if(0x80==(crc&(0x80)))//當(dāng)前余數(shù)最高位為,需要進(jìn)行除法運算。</p><p><b> {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補。</p>&
32、lt;p> crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)的值遞補到余數(shù)末位。</p><p> crc=crc^(0x07);//進(jìn)行除法運算,即與除數(shù)的低位相異或。</p><p><b> }</b></p><p> else//當(dāng)前余數(shù)的最高位為,不需要進(jìn)行除法運算。</p&g
33、t;<p><b> {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補。</p><p> crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)位的值遞補到余數(shù)末位。</p><p><b> }</b>
34、;</p><p> ch=ch<<1;//讀到的字符左移位,使數(shù)據(jù)下一位作為輸入位。</p><p><b> }</b></p><p><b> }</b></p><p> file.clear();</p><p> file.seekp(-1
35、,ios::end);//將寫指針移到輸出文件的最后。</p><p> file.put(crc);//寫入crc碼。</p><p> file.close();</p><p> infile.close();//關(guān)閉輸入文件和輸出文件。</p><p> cout<<endl<<"數(shù)據(jù)幀文件&
36、quot;<<argv[2]<<" 封裝完成"<<endl;</p><p><b> }</b></p><p> 五、實驗數(shù)據(jù)、結(jié)果分析</p><p><b> 運行結(jié)果</b></p><p><b> 運行結(jié)果如下所
37、示:</b></p><p> 執(zhí)行framer.exe文件的結(jié)果如下所示:</p><p><b> 六、總結(jié)</b></p><p> 在此次的課程設(shè)計中,我做的題目是幀封裝。在最開始兩天收集資料的過程中,我查閱了很多幀的封裝的知識,對幀及其封裝的方法有了一定程度的了解和掌握。從最開始對幀的一個模糊的印象到對幀的結(jié)構(gòu)的七個
38、部分的完全掌握,有了很大的收獲,并且使幀的封裝得以實現(xiàn)。</p><p> 本次的課程設(shè)計為了實現(xiàn)幀的封裝,主要是將幀的七個部分---前導(dǎo)碼、幀前定界符、目的地址、源地址、長度字段、數(shù)據(jù)字段和校驗字段,一個一個按順序封裝的,最后使得一個幀的封裝得以完成。同時,在編寫程序的過程中,用到了很多的函數(shù),這些函數(shù)的運用使得程序簡便而且正確的運行出來。為了正確的實現(xiàn)這些函數(shù),我查閱了很多相關(guān)的資料,從中獲得了大量的有用的
39、信息,收獲也頗豐富。</p><p> 同時,在這近一周的課程設(shè)計中,我的動手能力得到了很大的提高,而且讓你給我將這學(xué)期所學(xué)的網(wǎng)絡(luò)的知識和以前所學(xué)的編程的知識充分的聯(lián)系起來,對這門課的認(rèn)識又提高了一層。除此之外,在做課程設(shè)計的時候也遇到了很多的問題,最后在同學(xué)的幫助下正確的解決了。從最開始的遇到問題到最后的正確解決問題,我懂得了正確出來問題的方法,也知道了自己的不足之處。此次的課程設(shè)計也是一個認(rèn)識自我的好機會。
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機網(wǎng)絡(luò)課程設(shè)計--模擬以太網(wǎng)幀封裝
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 《計算機網(wǎng)絡(luò)》課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 《計算機網(wǎng)絡(luò)》課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 《計算機網(wǎng)絡(luò)課程設(shè)計》
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)互連課程設(shè)計報告
評論
0/150
提交評論