c語(yǔ)言協(xié)議打包和解包函數(shù) c語(yǔ)言如何打包

C語(yǔ)言 socket封包和解包

你的基本思路是正確的,就是在發(fā)送數(shù)據(jù)之前把數(shù)據(jù)的長(zhǎng)度添加在數(shù)據(jù)之前,便于收到后進(jìn)行解析。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站設(shè)計(jì)、鄱陽(yáng)網(wǎng)絡(luò)推廣、重慶小程序開(kāi)發(fā)公司、鄱陽(yáng)網(wǎng)絡(luò)營(yíng)銷、鄱陽(yáng)企業(yè)策劃、鄱陽(yáng)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供鄱陽(yáng)建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:muchs.cn

不過(guò)你這個(gè)在稍微有點(diǎn)異常的情況下就可以引起系統(tǒng)崩潰,因?yàn)橐坏伴L(zhǎng)度”部分可能是亂碼,因而引起后面數(shù)據(jù)的訪問(wèn)越界。

比較科學(xué)的做法就是為payload數(shù)據(jù)增加包頭(包括前導(dǎo)碼、數(shù)據(jù)描述)和包尾(包校驗(yàn)碼),通過(guò)一系列的校驗(yàn),首先驗(yàn)證包的數(shù)據(jù)是正常的,然后再?gòu)陌邪蓴?shù)據(jù)解析出來(lái)。

linux c語(yǔ)言簡(jiǎn)易通訊協(xié)議數(shù)據(jù)包的打包與解包

通訊協(xié)議數(shù)據(jù)包的話,前面放你用來(lái)判斷你這個(gè)包所做事情的功能碼,然后后面接數(shù)據(jù)所占字符的長(zhǎng)度,最后一段是你要發(fā)送的數(shù)據(jù),可以是數(shù)組也可以是結(jié)構(gòu)體,看你喜歡

CMD是你要做的事

LENGTH是你后面數(shù)據(jù)的長(zhǎng)度,方便你讀數(shù)據(jù)

INFO是你的數(shù)據(jù),你想發(fā)什么都行

解包你就從CMD開(kāi)始用if,else來(lái)判斷,找到對(duì)應(yīng)的讀取里面的內(nèi)容,做你這個(gè)判斷要做的事。

而相對(duì)復(fù)雜點(diǎn)的協(xié)議變色前面的判斷內(nèi)容更多的,比如控制變電所的設(shè)備,那就增加哪個(gè)變電所,變電所哪臺(tái)設(shè)備,數(shù)據(jù)格式變化不大,基本都是承載在tcp,udp,.modbus這類協(xié)議上面,這些都是數(shù)據(jù)內(nèi)容,是你自己定義的

C語(yǔ)言 Server和服務(wù)器之間的通信協(xié)議采用包頭Header+包體Body的形式,能夠具體實(shí)現(xiàn)這個(gè)嗎?

當(dāng)然可以,協(xié)議是具有層次的,協(xié)議的目的就是讓通信雙方能明白自己正在傳輸?shù)氖窃鯓拥臄?shù)據(jù)格式。

TCP/IP是一種比較通用的通信協(xié)議,在windows中采用socket組件庫(kù)實(shí)現(xiàn),是對(duì)協(xié)議通信功能的一種封裝,

如你要發(fā)送一個(gè)信息(數(shù)據(jù)如“MSG”)從A到B,那么A將“MSG”打包成“4MSG”,第一個(gè)字節(jié)“4”表示這個(gè)數(shù)據(jù)包長(zhǎng)度為4,那么接緊接的3個(gè)字節(jié)就是數(shù)據(jù),那么這里就是一個(gè)協(xié)議,只是這個(gè)協(xié)議很簡(jiǎn)單,屬于你自己開(kāi)發(fā)的協(xié)議,而TCP這些協(xié)議屬于開(kāi)放協(xié)議,大家都知道標(biāo)準(zhǔn),因此只要收到一個(gè)TCP數(shù)據(jù)包,那么你就可以根據(jù)協(xié)議分析你收到的數(shù)據(jù)包的格式是什么,數(shù)據(jù)包協(xié)議中,一般在數(shù)據(jù)包的開(kāi)始部分定義了固定格式的信息,如TCP包頭中包含了數(shù)據(jù)長(zhǎng)度,目的的IP地址等很多信息。

如果你收到一個(gè)數(shù)據(jù)包,你不清楚它是什么格式的,那么你怎么解析呢,根本無(wú)法解析的,當(dāng)然如果人工打開(kāi)這個(gè)數(shù)據(jù)包進(jìn)行數(shù)據(jù)內(nèi)容與已知的協(xié)議比對(duì),也許可以猜出它是什么格式。

看數(shù)據(jù)包的傳送過(guò)程,

程序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ū)動(dòng)發(fā)送數(shù)據(jù)包sendPkg(MAC頭+“IP頭TCP頭+4MSG”)};

這里僅僅是用函數(shù)調(diào)用的描述解釋協(xié)議實(shí)現(xiàn)的原理:協(xié)議的分層在編寫程序時(shí)體現(xiàn)的就是一個(gè)調(diào)用層次關(guān)系。

在接收方,其實(shí)就是調(diào)用相同層級(jí)的函數(shù)對(duì)收到的數(shù)據(jù)包進(jìn)行解包,把去掉本層頭部的數(shù)據(jù)包傳給上層調(diào)用函數(shù),

如getPackage(char *buffer){

buffer = getTCPPackageData(buffer);

return buffer +1; // 去掉開(kāi)始的一個(gè)字節(jié)。這里就是我自己定義的協(xié)議解包過(guò)程。

}; //buffer是收到的數(shù)據(jù)包。

char * getTCPPackage(char *buffer){

buffer = getIPPackageData(buffer);

buffer = 去掉TCP包后的數(shù)據(jù)包; // TCP包解包過(guò)程,IP,MAC的解包一樣。

return buffer;

}

如HTTP是建立在TCP協(xié)議上,那么TCP包的數(shù)據(jù)部分就包含了HTTP的協(xié)議頭部以及HTTP的數(shù)據(jù)部分。也就是說(shuō)協(xié)議分層中,任何上層的協(xié)議被打包后的數(shù)據(jù)包(注意其中包含有協(xié)議頭)被下層協(xié)議當(dāng)做一個(gè)純數(shù)據(jù)處理,下層協(xié)議并不清楚你上層怎么組織數(shù)據(jù)的。

因此我們只要能獲得任何一層的協(xié)議調(diào)用函數(shù)接口,就可以采用該層協(xié)議來(lái)傳輸數(shù)據(jù),我們?nèi)绻塬@得MAC層的調(diào)用函數(shù)接口,那么直接打包成MAC傳輸也可以,只是MAC的格式中不包含TCP、IP這些信息,數(shù)據(jù)包到達(dá)路由器的時(shí)候就不知道發(fā)給哪個(gè)電腦了,除非路由器知道MAC地址是哪個(gè)電腦,并且路由器支持MAC包的轉(zhuǎn)發(fā)。因此需要用什么協(xié)議,是根據(jù)需要來(lái)確定的。

采用共用協(xié)議,目的是讓通信過(guò)程更加通用,使系統(tǒng)可以通過(guò)已知的網(wǎng)絡(luò)進(jìn)行連接。

網(wǎng)站標(biāo)題:c語(yǔ)言協(xié)議打包和解包函數(shù) c語(yǔ)言如何打包
分享地址:http://muchs.cn/article38/dogiesp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、品牌網(wǎng)站制作微信公眾號(hào)、電子商務(wù)外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)