你的基本思路是正確的,就是在發(fā)送數(shù)據(jù)之前把數(shù)據(jù)的長度添加在數(shù)據(jù)之前,便于收到后進行解析。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站設(shè)計、鄱陽網(wǎng)絡(luò)推廣、重慶小程序開發(fā)公司、鄱陽網(wǎng)絡(luò)營銷、鄱陽企業(yè)策劃、鄱陽品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供鄱陽建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
不過你這個在稍微有點異常的情況下就可以引起系統(tǒng)崩潰,因為一旦“長度”部分可能是亂碼,因而引起后面數(shù)據(jù)的訪問越界。
比較科學的做法就是為payload數(shù)據(jù)增加包頭(包括前導碼、數(shù)據(jù)描述)和包尾(包校驗碼),通過一系列的校驗,首先驗證包的數(shù)據(jù)是正常的,然后再從包中吧數(shù)據(jù)解析出來。
通訊協(xié)議數(shù)據(jù)包的話,前面放你用來判斷你這個包所做事情的功能碼,然后后面接數(shù)據(jù)所占字符的長度,最后一段是你要發(fā)送的數(shù)據(jù),可以是數(shù)組也可以是結(jié)構(gòu)體,看你喜歡
CMD是你要做的事
LENGTH是你后面數(shù)據(jù)的長度,方便你讀數(shù)據(jù)
INFO是你的數(shù)據(jù),你想發(fā)什么都行
解包你就從CMD開始用if,else來判斷,找到對應(yīng)的讀取里面的內(nèi)容,做你這個判斷要做的事。
而相對復(fù)雜點的協(xié)議變色前面的判斷內(nèi)容更多的,比如控制變電所的設(shè)備,那就增加哪個變電所,變電所哪臺設(shè)備,數(shù)據(jù)格式變化不大,基本都是承載在tcp,udp,.modbus這類協(xié)議上面,這些都是數(shù)據(jù)內(nèi)容,是你自己定義的
當然可以,協(xié)議是具有層次的,協(xié)議的目的就是讓通信雙方能明白自己正在傳輸?shù)氖窃鯓拥臄?shù)據(jù)格式。
TCP/IP是一種比較通用的通信協(xié)議,在windows中采用socket組件庫實現(xiàn),是對協(xié)議通信功能的一種封裝,
如你要發(fā)送一個信息(數(shù)據(jù)如“MSG”)從A到B,那么A將“MSG”打包成“4MSG”,第一個字節(jié)“4”表示這個數(shù)據(jù)包長度為4,那么接緊接的3個字節(jié)就是數(shù)據(jù),那么這里就是一個協(xié)議,只是這個協(xié)議很簡單,屬于你自己開發(fā)的協(xié)議,而TCP這些協(xié)議屬于開放協(xié)議,大家都知道標準,因此只要收到一個TCP數(shù)據(jù)包,那么你就可以根據(jù)協(xié)議分析你收到的數(shù)據(jù)包的格式是什么,數(shù)據(jù)包協(xié)議中,一般在數(shù)據(jù)包的開始部分定義了固定格式的信息,如TCP包頭中包含了數(shù)據(jù)長度,目的的IP地址等很多信息。
如果你收到一個數(shù)據(jù)包,你不清楚它是什么格式的,那么你怎么解析呢,根本無法解析的,當然如果人工打開這個數(shù)據(jù)包進行數(shù)據(jù)內(nèi)容與已知的協(xié)議比對,也許可以猜出它是什么格式。
看數(shù)據(jù)包的傳送過程,
程序A:sengPackage("MSG"){ 調(diào)用TCP協(xié)議函數(shù)sendTCPPackage("4MSG");};
sendTCPPackage(char *pkg){調(diào)用IP協(xié)議函數(shù)sendIPPackage(TCP頭+“4MSG”)};
sendIPPackage(char *pkg){調(diào)用MAC協(xié)議函數(shù)sendMACPackage(IP頭+“TCP頭+4MSG”)};
sendMACPackage(char *pkg){調(diào)用驅(qū)動發(fā)送數(shù)據(jù)包sendPkg(MAC頭+“IP頭TCP頭+4MSG”)};
這里僅僅是用函數(shù)調(diào)用的描述解釋協(xié)議實現(xiàn)的原理:協(xié)議的分層在編寫程序時體現(xiàn)的就是一個調(diào)用層次關(guān)系。
在接收方,其實就是調(diào)用相同層級的函數(shù)對收到的數(shù)據(jù)包進行解包,把去掉本層頭部的數(shù)據(jù)包傳給上層調(diào)用函數(shù),
如getPackage(char *buffer){
buffer = getTCPPackageData(buffer);
return buffer +1; // 去掉開始的一個字節(jié)。這里就是我自己定義的協(xié)議解包過程。
}; //buffer是收到的數(shù)據(jù)包。
char * getTCPPackage(char *buffer){
buffer = getIPPackageData(buffer);
buffer = 去掉TCP包后的數(shù)據(jù)包; // TCP包解包過程,IP,MAC的解包一樣。
return buffer;
}
如HTTP是建立在TCP協(xié)議上,那么TCP包的數(shù)據(jù)部分就包含了HTTP的協(xié)議頭部以及HTTP的數(shù)據(jù)部分。也就是說協(xié)議分層中,任何上層的協(xié)議被打包后的數(shù)據(jù)包(注意其中包含有協(xié)議頭)被下層協(xié)議當做一個純數(shù)據(jù)處理,下層協(xié)議并不清楚你上層怎么組織數(shù)據(jù)的。
因此我們只要能獲得任何一層的協(xié)議調(diào)用函數(shù)接口,就可以采用該層協(xié)議來傳輸數(shù)據(jù),我們?nèi)绻塬@得MAC層的調(diào)用函數(shù)接口,那么直接打包成MAC傳輸也可以,只是MAC的格式中不包含TCP、IP這些信息,數(shù)據(jù)包到達路由器的時候就不知道發(fā)給哪個電腦了,除非路由器知道MAC地址是哪個電腦,并且路由器支持MAC包的轉(zhuǎn)發(fā)。因此需要用什么協(xié)議,是根據(jù)需要來確定的。
采用共用協(xié)議,目的是讓通信過程更加通用,使系統(tǒng)可以通過已知的網(wǎng)絡(luò)進行連接。