版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 設(shè)計(jì)報(bào)告</b></p><p> 課 程 計(jì)算機(jī)網(wǎng)絡(luò) </p><p> 設(shè)計(jì)名稱 幀封裝 </p><p> 專業(yè)班級(jí) </p><p> 同組人姓名 &
2、lt;/p><p><b> 同組人學(xué)號(hào) </b></p><p> 實(shí)驗(yàn)日期 2011-6-9 </p><p> 指導(dǎo)教師 </p><p> 成 績 </p><p&
3、gt; 2011年 6 月 9 日</p><p><b> 一、設(shè)計(jì)目的和要求</b></p><p><b> 1、實(shí)驗(yàn)?zāi)康?lt;/b></p><p> 幀是在數(shù)據(jù)鏈路層數(shù)據(jù)進(jìn)行傳輸與交換的基本單位。構(gòu)造幀對(duì)于理解網(wǎng)絡(luò)協(xié)議的概念、協(xié)議執(zhí)行過程以及網(wǎng)絡(luò)問題處理的一般方法具有重要的意義。本次課程設(shè)計(jì)的目的是應(yīng)用數(shù)據(jù)鏈
4、路層與介質(zhì)訪問控制層的知識(shí),根據(jù)數(shù)據(jù)鏈路層的基本原理,通過構(gòu)造一個(gè)具體的Ethernet幀,從而深入理解網(wǎng)絡(luò)協(xié)議的基本概念與網(wǎng)絡(luò)問題處理的一般方法。</p><p><b> 2、實(shí)驗(yàn)要求</b></p><p> 本程序的功能是進(jìn)行幀封裝。</p><p> 以命令行形式運(yùn)行:framer inputfile outputfile 其中
5、framer為程序名;inputfile為輸入文件;outputfile為輸出文件;成功封裝后顯示“幀文件 outputfile 封裝完成”。</p><p> 二、設(shè)計(jì)說明(包括設(shè)計(jì)分析,系統(tǒng)運(yùn)行環(huán)境,設(shè)計(jì)中的重點(diǎn)和難點(diǎn),輸入和輸出條件等)</p><p> 程序共分三個(gè)部分:填充幀頭部字段,填充數(shù)據(jù)字段,計(jì)算CRC校驗(yàn)碼并填充。</p><p> 1. 填
6、充幀頭部字段</p><p> 在這一部分需要向輸出文件寫入前導(dǎo)碼、幀前定界符、目的地址、源地址和長度字段。寫入前四個(gè)部分十分簡單,而寫入長度字段時(shí)需要計(jì)算輸入文件的長度。所以計(jì)算輸入文件長度的方法如下所示:</p><p> int length=0;</p><p> infile.seekg(0,ios::end);//將讀指針移到文件末尾。</p
7、><p> length=infile.tellg();//計(jì)算指針偏移量,即為輸入文件的長度。</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ù)長度,再申請(qǐng)相同大小的空間,不會(huì)造成空間上的浪費(fèi)。</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。填充字符是任意的,不計(jì)入長度字段值中。在程序中是用一下方法實(shí)現(xiàn)的:</p><p> //如果輸入文件長度不足B,則用補(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.計(jì)算CRC校驗(yàn)碼并填充</p><p> 幀封裝的最后一步就是對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),并將校驗(yàn)結(jié)果記入幀校驗(yàn)字段。本程序中實(shí)現(xiàn)的是CRC-8校驗(yàn)算法,方法如下所示:<
12、/p><p> file.put(char(0x00));//將數(shù)據(jù)字段后添加個(gè)</p><p> file.seekg(8,ios::beg);//將讀指針指向目的地址字段,從此處開始CRC計(jì)算</p><p> unsigned char ch;//ch用來保存讀入的字符。</p><p> unsigned char crc=cha
13、r(0x00);//余數(shù)初始值為。</p><p> while(1)//進(jìn)行CRC計(jì)算</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++)//對(duì)入讀入的字符的位分別處理。</p><p><b> {</b></p><p> if(0x80==(crc&(0x80)))//當(dāng)前余數(shù)最高位為,需要進(jìn)行除法運(yùn)算。</p><p><b&g
15、t; {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補(bǔ)。</p><p> crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)的值遞補(bǔ)到余數(shù)末位。</p><p> crc=crc^(0x07);//進(jìn)行除法運(yùn)算,即與除數(shù)的低位相異或。</
16、p><p><b> }</b></p><p> else//當(dāng)前余數(shù)的最高位為,不需要進(jìn)行除法運(yùn)算。</p><p><b> {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補(bǔ)。</p><p>
17、crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(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計(jì)算流程圖</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<<"請(qǐng)按以下格式輸入: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();//計(jì)算指針偏移量,即為輸入文件的長度。</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ǔ)足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ù)字段后添加個(gè)</p><p> file.seekg(8,ios::beg
29、);//將讀指針指向目的地址字段,從此處開始CRC計(jì)算</p><p> unsigned char ch;//ch用來保存讀入的字符。</p><p> unsigned char crc=char(0x00);//余數(shù)初始值為。</p><p> while(1)//進(jìn)行CRC計(jì)算</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++)//對(duì)入讀入的字符的位分別處理。</p><
31、;p><b> {</b></p><p> if(0x80==(crc&(0x80)))//當(dāng)前余數(shù)最高位為,需要進(jìn)行除法運(yùn)算。</p><p><b> {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補(bǔ)。</p>&
32、lt;p> crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)的值遞補(bǔ)到余數(shù)末位。</p><p> crc=crc^(0x07);//進(jìn)行除法運(yùn)算,即與除數(shù)的低位相異或。</p><p><b> }</b></p><p> else//當(dāng)前余數(shù)的最高位為,不需要進(jìn)行除法運(yùn)算。</p&g
33、t;<p><b> {</b></p><p> crc=(crc<<1)&(0xff);//crc左移位,最低位補(bǔ)。</p><p> crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(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í)驗(yàn)數(shù)據(jù)、結(jié)果分析</p><p><b> 運(yùn)行結(jié)果</b></p><p><b> 運(yùn)行結(jié)果如下所
37、示:</b></p><p> 執(zhí)行framer.exe文件的結(jié)果如下所示:</p><p><b> 六、總結(jié)</b></p><p> 在此次的課程設(shè)計(jì)中,我做的題目是幀封裝。在最開始兩天收集資料的過程中,我查閱了很多幀的封裝的知識(shí),對(duì)幀及其封裝的方法有了一定程度的了解和掌握。從最開始對(duì)幀的一個(gè)模糊的印象到對(duì)幀的結(jié)構(gòu)的七個(gè)
38、部分的完全掌握,有了很大的收獲,并且使幀的封裝得以實(shí)現(xiàn)。</p><p> 本次的課程設(shè)計(jì)為了實(shí)現(xiàn)幀的封裝,主要是將幀的七個(gè)部分---前導(dǎo)碼、幀前定界符、目的地址、源地址、長度字段、數(shù)據(jù)字段和校驗(yàn)字段,一個(gè)一個(gè)按順序封裝的,最后使得一個(gè)幀的封裝得以完成。同時(shí),在編寫程序的過程中,用到了很多的函數(shù),這些函數(shù)的運(yùn)用使得程序簡便而且正確的運(yùn)行出來。為了正確的實(shí)現(xiàn)這些函數(shù),我查閱了很多相關(guān)的資料,從中獲得了大量的有用的
39、信息,收獲也頗豐富。</p><p> 同時(shí),在這近一周的課程設(shè)計(jì)中,我的動(dòng)手能力得到了很大的提高,而且讓你給我將這學(xué)期所學(xué)的網(wǎng)絡(luò)的知識(shí)和以前所學(xué)的編程的知識(shí)充分的聯(lián)系起來,對(duì)這門課的認(rèn)識(shí)又提高了一層。除此之外,在做課程設(shè)計(jì)的時(shí)候也遇到了很多的問題,最后在同學(xué)的幫助下正確的解決了。從最開始的遇到問題到最后的正確解決問題,我懂得了正確出來問題的方法,也知道了自己的不足之處。此次的課程設(shè)計(jì)也是一個(gè)認(rèn)識(shí)自我的好機(jī)會(huì)。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--模擬以太網(wǎng)幀封裝
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 《計(jì)算機(jī)網(wǎng)絡(luò)》課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 《計(jì)算機(jī)網(wǎng)絡(luò)》課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)》
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)互連課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論