蘭州理工大學(xué)以太網(wǎng)幀的封裝與成幀設(shè)計_第1頁
蘭州理工大學(xué)以太網(wǎng)幀的封裝與成幀設(shè)計_第2頁
蘭州理工大學(xué)以太網(wǎng)幀的封裝與成幀設(shè)計_第3頁
蘭州理工大學(xué)以太網(wǎng)幀的封裝與成幀設(shè)計_第4頁
蘭州理工大學(xué)以太網(wǎng)幀的封裝與成幀設(shè)計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、*實(shí)踐教學(xué)* 蘭州理工大學(xué)計算機(jī)與通信學(xué)院2015年秋季學(xué)期 計算機(jī)通信 課程設(shè)計 題 目: 以太網(wǎng)幀的封裝與成幀設(shè)計 專業(yè)班級: 姓 名: 學(xué) 號: 指導(dǎo)教師: 王慧琴 成 績: 摘要本次課程設(shè)計應(yīng)用了計算機(jī)通信技術(shù)中有關(guān)于以太網(wǎng)的幀結(jié)構(gòu)的知識,應(yīng)用數(shù)據(jù)鏈路層的相關(guān)知識,通過對幀中固定的前導(dǎo)碼,源地址,目的地址等寫入,在處理數(shù)據(jù)字段之后與其一起進(jìn)行封裝,構(gòu)造成一個具體的幀。在VC6.0中采用與封裝與解析數(shù)據(jù)包相關(guān)的代碼編寫“工程”,其中利用windsock庫函數(shù)進(jìn)行封裝與解析命令。 關(guān)鍵字: 裝封; 成幀; 以太網(wǎng); 計算機(jī)通信目錄前言1一、基本原理21、以太網(wǎng)工作原理22、以太網(wǎng)幀結(jié)構(gòu)3二

2、、需求分析6三、系統(tǒng)分析71、主流程72、封裝幀83、解析幀14四、分析結(jié)果22五、心得體會23六、參考文獻(xiàn)24前言計算機(jī)網(wǎng)絡(luò)是計算機(jī)技術(shù)與通信技術(shù)相互滲透、密切結(jié)合而形成的一門交叉學(xué)科。計算機(jī)網(wǎng)絡(luò)的應(yīng)用可以大大縮短人與人交往的時間和空間的距離,更進(jìn)一步擴(kuò)大了人類社會群體之間相互與協(xié)作范圍,因此人們一定會很快接受在計算機(jī)網(wǎng)絡(luò)環(huán)境中的工作方式,同時計算機(jī)網(wǎng)絡(luò)也會對社會的進(jìn)步產(chǎn)生不可估量的作用。計算機(jī)網(wǎng)絡(luò)正在改變?nèi)藗兊墓ぷ鞣绞胶蜕罘绞?,網(wǎng)絡(luò)技術(shù)的發(fā)展已成為影響一個國家與地區(qū)政治、經(jīng)濟(jì)、科學(xué)與文化發(fā)展的重要因素之一。以太網(wǎng)是當(dāng)今現(xiàn)有局域網(wǎng)采用的最通用的通信協(xié)議標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)定義了在局域網(wǎng)(LAN)中

3、采用的電纜類型和信號處理方法。以太網(wǎng)在互聯(lián)設(shè)備之間以10-100Mbps的速率傳送信息包,雙絞線電纜10 Base T以太網(wǎng)由于其低成本、高可靠性以及10Mbps的速率而成為應(yīng)用最為廣泛的以太網(wǎng)技術(shù)。許多制造商提供的產(chǎn)品都能采用通用的軟件協(xié)議進(jìn)行通信,開放性最好。目前LAN接入方式就是俗稱的“以太網(wǎng)”,帶寬也達(dá)不到10-100Mbps,不過是2-4Mbps,比ADSL接入稍好一點(diǎn)。一、基本原理1、以太網(wǎng)工作原理 以太網(wǎng)采用共享信道的方法,即多臺主機(jī)共用一個信道進(jìn)行數(shù)據(jù)傳輸。為了解決多個計算機(jī)的信道征用問題,以太網(wǎng)采用IEEE802.3標(biāo)準(zhǔn)規(guī)定的CSMA/CD(載波監(jiān)聽多路訪問/沖突檢測)協(xié)議,

4、它是控制多個用戶共用一條信道的協(xié)議,CSMA/CD的工作原理如下: (1)載波監(jiān)聽(先聽后發(fā))使用CSMA/CD協(xié)議時,總線上各個節(jié)點(diǎn)都在監(jiān)聽總線,即檢測總線上是否有別的節(jié)點(diǎn)發(fā)送數(shù)據(jù)。如果發(fā)現(xiàn)總線是空閑的,既沒有檢測到有信號正在傳送,即可立即發(fā)送數(shù)據(jù);如果監(jiān)聽到總線忙,即檢測到總線上有數(shù)據(jù)正在傳送,這時節(jié)點(diǎn)要持續(xù)等待直到監(jiān)聽到總線空閑時才能將數(shù)據(jù)發(fā)送出去,或等待一個隨機(jī)時間,再從新監(jiān)聽總線,一直到總線空閑再發(fā)送數(shù)據(jù)。載波監(jiān)聽也稱作先聽后發(fā)。(2) 沖突檢測 當(dāng)兩個或兩個以上的節(jié)點(diǎn)同時監(jiān)聽到總線空閑,開始發(fā)送數(shù)據(jù)時,就會發(fā)生碰撞沖突;傳輸延遲可能會使第一個節(jié)點(diǎn)發(fā)送的數(shù)據(jù)還沒有到達(dá)目標(biāo)節(jié)點(diǎn)時,另一

5、個要發(fā)送的數(shù)據(jù)的節(jié)點(diǎn)就已經(jīng)監(jiān)聽到總線空閑,并開始發(fā)送數(shù)據(jù),這也會帶至沖突的產(chǎn)生。當(dāng)兩個幀發(fā)生沖突時,兩個傳輸?shù)膸蜁黄茐?,被損壞幀繼續(xù)傳輸毫無意義,而且信道無法被其他站點(diǎn)使用,對于有限的信道來講,這是很大的浪費(fèi)。如果每個發(fā)送節(jié)點(diǎn)邊發(fā)送邊監(jiān)聽,并在監(jiān)聽到?jīng)_突之后立即停止發(fā)送,就可以提高信道的利用率,當(dāng)節(jié)點(diǎn)檢測到縱向上發(fā)生沖突時,就立即取消傳輸數(shù)據(jù),隨后發(fā)送一個短的干擾信號,一個較強(qiáng)沖突信號,告訴網(wǎng)絡(luò)上的所有的節(jié)點(diǎn),總線已經(jīng)發(fā)生了沖突。在阻塞信號發(fā)生后,等待一個隨機(jī)事件,然后再將要發(fā)送的數(shù)據(jù)發(fā)送一次。如果還有沖突,則重復(fù)監(jiān)聽、等待和重傳操作。 CSMA/CD采用用戶訪問總線時間不確定的隨機(jī)競爭方

6、式,有結(jié)構(gòu)簡單、輕負(fù)載時時延小等特點(diǎn),但當(dāng)網(wǎng)絡(luò)通信負(fù)載增大時,由于沖突增多,網(wǎng)絡(luò)吞吐率下降、傳輸延時增長,網(wǎng)絡(luò)性能會明顯下降。從以上可看出以太網(wǎng)的工作方式就像沒有支持人的座談會中,所有的參會者都通過一個共同的介質(zhì)來互相交談。每個參加會議的人在講話前,都禮貌的等到別人把話講完。如果兩個客人同時開始講話,那么他們都停下來,分別隨機(jī)等待一段時間再開始講話,這是如果兩個客人等待的時間不同,沖突就不會出現(xiàn),如果講話沖過了一次以上,將采用退避指數(shù)加強(qiáng)等待的時間。 2、以太網(wǎng)幀結(jié)構(gòu)幀格式Ethernet II幀格式:-| 前序     | 目的地址 

7、0; | 源地址   | 類型     | 數(shù)據(jù)           | FCS   |        - | 8 byte    |   6 byte  | 6 byte   | 2 byte   | 461500 byte   | 4

8、byte| IEEE802.3一般幀格式       -| 前序     | 幀起始定界符 | 目的地址   | 源地址 | 長度   | 數(shù)據(jù)          | FCS   |        -| 7 byte   |   

9、  1 byte   | 2/6 byte   |2/6 byte| 2 byte | 461500 byte | 4 byte | Ethernet II和IEEE802.3的幀格式比較類似,主要的不同點(diǎn)在于前者定義的2字節(jié)的類型,而后者定義的是2字節(jié)的長度;所幸的是,后者定義的有效長度值與前者定義的有效類型值無一相同,這樣就容易區(qū)分兩種幀格式了。1)前序字段 前序字段由8個(Ethernet II)或7個(IEEE802.3)字節(jié)的交替出現(xiàn)的1和0組成,設(shè)置該字段的目的是指示幀的開始并便于網(wǎng)絡(luò)中的所有接收器均能與到達(dá)幀同步,另外,該字段本身

10、(在Ethernet II中)或與幀起始定界符一起(在IEEE802.3中)能保證各幀之間用于錯誤檢測和恢復(fù)操作的時間間隔不小于9.6毫秒。2)幀起始定界符字段 該字段僅在IEEE802.3標(biāo)準(zhǔn)中有效,它可以被看作前序字段的延續(xù)。實(shí)際上,該字段的組成方式繼續(xù)使用前序字段中的格式,這個一個字節(jié)的字段的前6個比特位置由交替出現(xiàn)的1和0構(gòu)成。該字段的最后兩個比特位置是11,這兩位中斷了同步模式并提醒接收后面跟隨的是幀數(shù)據(jù)。當(dāng)控制器將接收幀送入其緩沖器時,前序字段和幀起始定界符字段均被去除。類似地當(dāng)控制器發(fā)送幀時,它將這兩個字段(如果傳輸?shù)氖荌EEE802.3幀)或一個前序字段(如果傳輸?shù)氖钦嬲囊蕴?/p>

11、網(wǎng)幀)作為前綴加入幀中。3)目的地址字段 目的地址字段確定幀的接收者。兩個字節(jié)的源地址和目的地址可用于IEEE802.3網(wǎng)絡(luò),而6個字節(jié)的源地址和目的地址字段既可用于Ethernet II網(wǎng)絡(luò)又可用于IEEE802.3網(wǎng)絡(luò)。用戶可以選擇兩字節(jié)或六字節(jié)的目的地址字段,但對IEEE802.3設(shè)備來說,局域網(wǎng)中的所有工作站必須使用同樣的地址結(jié)構(gòu)。目前,幾乎所有的802.3網(wǎng)絡(luò)使用6字節(jié)尋址,幀結(jié)構(gòu)中包含兩字節(jié)字段選項(xiàng)主要是用于使用16比特地址字段的早期的局域網(wǎng)。4)源地址字段 源地址字段標(biāo)識發(fā)送幀的工作站。和目前地址字段類似,源地址字段的長度可以是兩個或六個字節(jié)。只有IEEE802.3標(biāo)準(zhǔn)支持兩字節(jié)

12、源地址并要求使用的目的地址。Ethernet II和IEEE802.3標(biāo)準(zhǔn)均支持六個字節(jié)的源地址字段。當(dāng)使用六個字節(jié)的源地址字段時,前三個字節(jié)表示由IEEE分配給廠商的地址,將燒錄在每一塊網(wǎng)絡(luò)接口卡的ROM中。而制造商通常為其每一網(wǎng)絡(luò)接口卡分配后字節(jié)。5)類型字段 兩字節(jié)的類型字段僅用于Ethernet II幀。該字段用于標(biāo)識數(shù)據(jù)字段中包含的高層協(xié)議,也就是說,該字段告訴接收設(shè)備如何解釋數(shù)據(jù)字段。在以太網(wǎng)中,多種協(xié)議可以在局域網(wǎng)中同時共存,例如:類型字段取值為十六進(jìn)制0800的幀將被識別為IP協(xié)議幀,而類型字段取值為十六進(jìn)制8137的幀將被識別為IPX和SPX傳輸協(xié)議幀。因此,在 Ethern

13、et II的類型字段中設(shè)置相應(yīng)的十六進(jìn)制值提供了在局域網(wǎng)中支持多協(xié)議傳輸?shù)臋C(jī)制。6)長度字段 用于IEEE802.3的兩字節(jié)長度字段定義了數(shù)據(jù)字段包含的字節(jié)數(shù)。不論是在Ethernet II還是IEEE802.3標(biāo)準(zhǔn)中,從前序到FCS字段的幀長度最小必須是64字節(jié)。最小幀長度保證有足夠的傳輸時間用于以太網(wǎng)網(wǎng)絡(luò)接口卡精確地檢測沖突?;谧钚L為64字節(jié)和使用六字節(jié)地址字段的要求,意味著每個數(shù)據(jù)字段的最小長度為46字節(jié)。7)數(shù)據(jù)字段 如前所述,數(shù)據(jù)字段的最小長度必須為46字節(jié)以保證幀長至少為64字節(jié),這意味著傳輸一字節(jié)信息也必須使用46字節(jié)的數(shù)據(jù)字段:如果填入該該字段的信息少于46字節(jié),該字段的

14、其余部分也必須進(jìn)行填充。數(shù)據(jù)字段的最大長度為1500字節(jié)。8)校驗(yàn)序列字段 既可用于Ethernet II又可用于IEE802.3標(biāo)準(zhǔn)的幀校驗(yàn)序列字段提供了一種錯誤檢測機(jī)制,每一個發(fā)送器均計算一個包括了地址字段、類型/長度字段和數(shù)據(jù)字段的循環(huán)冗余校驗(yàn)(CRC)碼。發(fā)送器于是將計算出的CRC填入四字節(jié)的FCS字段。二、需求分析依據(jù)以太網(wǎng)數(shù)據(jù)包格式,將前導(dǎo)碼,目的地址,源地址與數(shù)據(jù)字段進(jìn)行填充,對填充的數(shù)據(jù)字段的長度進(jìn)行判斷校驗(yàn),若數(shù)據(jù)過長則封裝成不同的幀進(jìn)行發(fā)送并解析。編寫出程序封裝數(shù)據(jù)包與解析數(shù)據(jù)包,并將解析后各包的頭部與數(shù)據(jù)字段寫入輸入文件。數(shù)據(jù)字段的值從封裝的文件中獲取。三、系統(tǒng)分析運(yùn)行環(huán)

15、境 平臺:Windows XP 環(huán)境:VC6.0運(yùn)行方式 a.點(diǎn)桌面的“開始”菜單->“運(yùn)行”->鍵入“cmd”->進(jìn)入控制臺界面; b.進(jìn)入可執(zhí)行程序所在文件夾并顯示;運(yùn)行界面1、主流程l 幫助命令“EthernetFrame /h”l 解析命令“EthernetFrame /u 數(shù)據(jù)文件名”l 封裝命令 “EthernetFrame /e 數(shù)據(jù)文件名”2、封裝幀執(zhí)行“EthernetFrame -e input”命令,在相應(yīng)位置輸入兩次相同的信息,回車并結(jié)束輸入,以實(shí)現(xiàn)以太網(wǎng)幀的封裝。在進(jìn)行封裝命令之前,首先要將幀結(jié)構(gòu)中的前導(dǎo)碼,幀前定界符,目的地址,源地址等四項(xiàng)內(nèi)容填充

16、,輸入數(shù)據(jù)字段,并對數(shù)據(jù)進(jìn)行校驗(yàn),若數(shù)據(jù)字段過長則需將其封裝成不同的幀進(jìn)行發(fā)送,第一個幀被發(fā)送之后再發(fā)送第二個幀。若少于46B的數(shù)據(jù)則要在后面填充“0”,發(fā)送封裝幀后對總線的空閑狀態(tài)要進(jìn)行判斷,只有在總線空閑時才可將其發(fā)送寫入文件,接收并解析。封裝命令流程圖/Encap.cpp 封裝幀類的實(shí)現(xiàn)代碼#include <fstream> #include <string>#include <iostream>#include "Encap.h"#include "CRC8.h"using namespace std; /*

17、/* 功能: 完成前導(dǎo)碼到源地址的四項(xiàng)封裝 /* 輸入?yún)?shù): fstream對象 /*/void Encap:HeaderEncap(fstream& file)file.seekg(0,ios:end); /將讀指針移到文件末尾 for(int i=0;i<7;i+) /寫入B的前導(dǎo)碼和B的幀前定界符file.put(char)0xaa);file.put(char)0xab);file.write(destination,6); /寫入目的地址file.write(source, 6); /寫入源地址/*/* 功能: 處理數(shù)據(jù)字段 /* 輸入?yún)?shù):file:fstream對象

18、;inputstr:等待封裝的字符串 /*/int Encap:DataDeal(fstream& file, string inputStr) int packTotal = 0; int length = inputStr.length(); if(length <= MINLENGTH) /如果輸入文件長度不足46B,則用'0'補(bǔ)足 if (length < MINLENGTH)for(int j = 0; j < MINLENGTH - length; j+)inputStr += '0'cout << "

19、數(shù)據(jù)字段小于46,將封裝成一個幀" <<endl;else cout << "數(shù)據(jù)字段等于46,將封裝成一個幀" <<endl;packTotal = 1;Encapsulate(file, inputStr, length); /將字符串內(nèi)容寫入到輸出文件中cout << "第1個幀封裝完畢!" << endl;elseint packNum = 1;if (length > MAXLENGTH) /如果輸入文件長度大于最大值packNum = length / MAXLENG

20、TH;if (length % MAXLENGTH) /計算封幀個數(shù)packNum+;packTotal = packNum;cout << "數(shù)據(jù)字段大于1500B,將封裝成" << packNum << "個幀" <<endl;string divideStr; /本次拆分好的數(shù)據(jù)string leftStr = inputStr; /剩余未封裝的數(shù)據(jù)packNum = 1;while (length > MAXLENGTH)divideStr = leftStr.substr(0,MAXLENG

21、TH);cout << divideStr << endl;leftStr = leftStr.substr(MAXLENGTH,length);length = leftStr.length();Encapsulate(file, divideStr, MAXLENGTH);cout << "第" << packNum << "個幀封裝完畢!" << endl;packNum+;if(length < MINLENGTH)for(int j = 0; j < MINLE

22、NGTH - length; j+)leftStr += '0'Encapsulate(file, leftStr, length); /將剩余字符串封裝,length為字符串的真實(shí)長度,不是補(bǔ)足'0'后的長度cout << leftStr << endl;cout << "第" << packNum << "個幀封裝完畢!" << endl;packNum+;else /如果輸入文件長度小于等于最大值if (MAXLENGTH= length)cou

23、t << "數(shù)據(jù)字段等于1500B,將封裝成1個幀" <<endl;elsecout << "數(shù)據(jù)字段介于46B和1500B之間,將封裝成1個幀" <<endl;packTotal = 1;Encapsulate(file, inputStr, length); /將字符串封裝cout << "第" << packNum << "個幀封裝完畢!" << endl;packNum+;return packTotal;/*/

24、* 功能: 完成剩余封裝/* 輸入?yún)?shù):file:fstream對象;inputstr:等待封裝的字符串;/* length 數(shù)據(jù)內(nèi)容長度 /*/void Encap:Encapsulate(fstream& file, string inputStr, int length)HeaderEncap(file); / 封裝頭 const char* inputChar = inputStr.data();char inputLength2;inputLength0 = length >> 8;inputLength1 = length & 0xFF; file.pu

25、t(inputLength0); /將字符串長度值前八位放入inputLength0file.put(inputLength1); /后八位放入inputLength1 file.write(inputChar, inputStr.length(); /inputChar可能被填充,因此它的長度不是原來的數(shù)據(jù)長度length unsigned char CRC8 = char(0x00); / CRC8初始化校驗(yàn)碼 int i = 0;for(i = 0; i < 6; i+) / 校驗(yàn)?zāi)康牡刂?、源地址checkCRC(CRC8, destinationi);for(i = 0; i &

26、lt; 6; i+)checkCRC(CRC8, sourcei); checkCRC(CRC8, inputLength0); / 校驗(yàn)長度checkCRC(CRC8, inputLength1); for(i = 0; i < inputStr.length(); i+) / 校驗(yàn)字符串checkCRC(CRC8, inputChari); checkCRC(CRC8, 0x00); / 在校驗(yàn)對象后加0x00,校驗(yàn)完畢 file.put(CRC8); / 將CRC8校驗(yàn)值封裝到幀中3、解析幀 執(zhí)行“EthernetFrame -u input”命令,以實(shí)現(xiàn)以太網(wǎng)幀的解析。在解析命令

27、中首先要讀取input文件,從文件中找到幀,計算輸入文件的長度與幀的個數(shù),定位前導(dǎo)碼,幀前定界符,目的地址,源地址等,輸出幀序號,對其進(jìn)行CRC校驗(yàn),填充字符,輸出前導(dǎo)碼,幀前定界符,目的地址,源地址和數(shù)據(jù)字段并對數(shù)據(jù)字段進(jìn)行校驗(yàn),若校驗(yàn)后數(shù)據(jù)字段過于小則填充“0”,校驗(yàn)后輸出狀態(tài),如圖所示為兩次解析的解析幀。解析幀解析幀1解析命令流程圖/Unpack.cpp 解析幀源文件代碼#include <fstream> #include <string>#include <iostream>#include "Unpack.h" / 解析幀類的

28、定義#include "CRC8.h" / 定義了CRC8校驗(yàn)函數(shù)的頭文件using namespace std; /*/* 功能: 在input中找到一個幀 /* 輸入?yún)?shù):file,被讀取的input文件 /*/void Unpack:FindFrame(fstream& file) int nFileEnd = 0; / 輸入文件的長度 file.seekg(0, ios:end); / 計算輸入文件的長度nFileEnd = file.tellg(); file.seekg(0, ios:beg); int frameNum = 1; / 計算幀的個數(shù),初值

29、置為1while(file.tellg() < nFileEnd)for(int j = 0; j < 7; j+) / 定位前導(dǎo)碼,找到連續(xù)7個0xAAif(file.tellg() >= nFileEnd) break;if(file.get() != 0xAA)j = -1;if(file.tellg() >= nFileEnd)break; if(file.get() = 0xAB) / 定位幀前界定符int temp = file.tellg();if(temp + 14 > nFileEnd) / 判斷是否為一個完整的幀頭break;else / 輸出

30、幀的序號 cout << endl << "=第 "<< frameNum << " 個幀="<<endl;UnpackFrame(file);frameNum+; if(0 = frameNum)cout<<"沒有找到合法的幀"<<endl;file.close();/*/* 功能: 對input中找到的一個幀進(jìn)行解析/* 輸入?yún)?shù):file,被讀取的input文件 /*/void Unpack:UnpackFrame(fstream& fi

31、le) unsigned char CRC8 = 0; / CRC8校驗(yàn)碼初始化cout.setf(ios:uppercase); / 十六進(jìn)制數(shù)以大寫字母輸出cout.fill('0'); / 為十六進(jìn)制數(shù)設(shè)置填充字符unsigned char c; / 臨時變量,用于輸出前導(dǎo)碼,幀前定位符,目的、源地址 cout << "前導(dǎo)碼: " / 輸出前導(dǎo)碼,只輸出,不校驗(yàn)c = 0xAA;for (int i = 0; i < 7; i+)cout.width(2);cout << hex << (int)c <

32、< dec << " "cout << endl;cout << "幀前定位符: " / 輸出幀前定位符cout.width(2); c = 0xAB;cout << hex << (int)c << endl;cout << "目的地址: " / 輸出目的地址,從這里開始CRC8校驗(yàn)for (i = 0; i < 6; i+) c = file.get();cout.width(2);cout << hex <<

33、(int)c << dec << (i=5 ? "" : "-");checkCRC(CRC8, c);cout << endl;cout << "源地址: " / 輸出、校驗(yàn)源地址for (i = 0; i < 6; i+) c = file.get();cout.width(2);cout << hex << (int)c << dec << (i=5 ? "" : "-");checkCR

34、C(CRC8, c); cout << endl;cout << "長度字段: " / 輸出、校驗(yàn)長度字段cout.width(2); int length = 0;c = file.get();length = c;cout << hex << (int)length << " "checkCRC(CRC8, c);c = file.get(); / 將2B長度字段轉(zhuǎn)化為int類型length,為后續(xù)循環(huán)準(zhǔn)備int tempL = c;cout.width(2); cout <<

35、hex << (int)c << " " << endl;checkCRC(CRC8, c);length = length << 8;length = length | tempL; cout << "數(shù)據(jù)字段: " / 輸出、校驗(yàn)數(shù)據(jù)字段string getStr;for(i = 0; i < length; i+)char dataChar = file.get();checkCRC(CRC8, dataChar);getStr += dataChar; int ncount = 5

36、0; / 此處定義每行輸出的最大值,防止單詞被強(qiáng)行換行而沒有連字符for(i = 0; i < length; i+)ncount-;cout << getStri;if(ncount < 0)if(getStri=' ') / 行尾遇上一個空格,表明有一個單詞會顯示不全,因此換行cout << endl << "t" / 與“數(shù)據(jù)字段”這四個字段落對齊ncount = 50;if(length < 46) /如果幀小于46字節(jié),檢驗(yàn)填充的'0'for(i = 0; i < 46 -

37、 length; i+)checkCRC(CRC8, file.get(); checkCRC(CRC8, 0x00); /CRC8校驗(yàn)完成,此處相當(dāng)于在被校驗(yàn)數(shù)據(jù)后添加0x00cout << endl;cout << "CRC校驗(yàn): " / 輸出CRC校驗(yàn)碼,并與input中的CRC8做比較c = file.get(); if (CRC8 = c) / 正確 cout.width(2);cout << "(正確): " << hex << (int)c << endl;cout &

38、lt;< "狀態(tài): Accept" << endl; else / 錯誤 cout.width(2);cout << "(錯誤): " << hex << (int)c << " 應(yīng)為: " << hex << (int)CRC8 << endl;cout << "狀態(tài): Discard" << endl;四、分析結(jié)果 本系統(tǒng)是為實(shí)現(xiàn)以太網(wǎng)幀的封裝及其成幀的設(shè)計,通過本次設(shè)計實(shí)踐,我得出的結(jié)果有下幾點(diǎn):1、在對以太網(wǎng)幀進(jìn)行封裝時,先分析了以太網(wǎng)幀的幀結(jié)構(gòu)的特點(diǎn),將在以太網(wǎng)幀代碼中格式固定的前序碼,幀定界符,目的地址,源地址和數(shù)據(jù)進(jì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. 人人文庫網(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論