国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種tcp網(wǎng)絡(luò)傳輸數(shù)據(jù)中防粘包的方法及系統(tǒng)的制作方法

      文檔序號:10626530閱讀:439來源:國知局
      一種tcp網(wǎng)絡(luò)傳輸數(shù)據(jù)中防粘包的方法及系統(tǒng)的制作方法
      【專利摘要】本發(fā)明所提供的一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的方法及系統(tǒng),通過采用循環(huán)隊列緩存網(wǎng)絡(luò)數(shù)據(jù),并提供操作接口,對數(shù)據(jù)進行處理。由于數(shù)據(jù)是循環(huán)存儲的,當(dāng)循環(huán)隊列存儲到結(jié)尾處以后,接下來接收的數(shù)據(jù),會循環(huán)存儲在循環(huán)隊列開始處,而讀取過的循環(huán)隊列中數(shù)據(jù)會被清除,因此,接收到的數(shù)據(jù)會循環(huán)存儲到隊列中,且使用該方法及系統(tǒng),調(diào)用者不必維護很多的參數(shù),在不降低傳輸效率的同時,減少了TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)時,發(fā)生數(shù)據(jù)包之間的粘包,導(dǎo)致數(shù)據(jù)傳輸錯誤的可能。
      【專利說明】
      一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)中防粘包的方法及系統(tǒng)
      技術(shù)領(lǐng)域
      [0001]本發(fā)明涉及信息通信領(lǐng)域,尤其涉及的是一種TCP傳輸數(shù)據(jù)時防粘包的方法及系統(tǒng)。
      【背景技術(shù)】
      [0002]TCP是面向連接的傳輸層協(xié)議,其目標(biāo)是提供可靠的端到端連接,保證信息有序無誤的傳輸,它除了提供基本的數(shù)據(jù)傳輸功能外,還采用了數(shù)據(jù)編號、校驗和計算、數(shù)據(jù)確認等一系列措施來保證可靠性。
      [0003]TCP粘包是指發(fā)送方發(fā)送的若干數(shù)據(jù)包在接收方接收時粘成一包,從接收緩沖區(qū)看,后一包數(shù)據(jù)的頭緊接著前一包數(shù)據(jù)的尾。造成粘包現(xiàn)象的原因是多方面的,它既可能由發(fā)送方造成,也可能由接收方造成。發(fā)送方引起的粘包是由TCP協(xié)議本身造成的,TCP為提高傳輸效率,發(fā)送方往往要收集到足夠多的數(shù)據(jù)后才發(fā)送一包數(shù)據(jù)。若連續(xù)幾次發(fā)送的數(shù)據(jù)都很少,通常TCP會根據(jù)優(yōu)化算法把這些數(shù)據(jù)合成一包后一次發(fā)送出去,這樣接收方就收到了粘包數(shù)據(jù)。接收方引起的粘包是由于接收方用戶進程不及時接收數(shù)據(jù),從而導(dǎo)致粘包現(xiàn)象。這是因為接收方先把收到的數(shù)據(jù)放在系統(tǒng)接收緩沖區(qū),用戶進程從該緩沖區(qū)取數(shù)據(jù),若下一包數(shù)據(jù)到達時前一包數(shù)據(jù)尚未被用戶進程取走,則下一包數(shù)據(jù)放到系統(tǒng)接收緩沖區(qū)時就接到前一包數(shù)據(jù)之后,而用戶進程根據(jù)預(yù)先設(shè)定的緩沖區(qū)大小從系統(tǒng)接收緩沖區(qū)取數(shù)據(jù),這樣就一次取到了多包數(shù)據(jù)。粘包情況有兩種,一種是粘在一起的包都是完整的數(shù)據(jù)包,另一種情況是粘在一起的包有不完整的包。
      [0004]不是所有的粘包現(xiàn)象都需要處理,若傳輸?shù)臄?shù)據(jù)是不帶結(jié)構(gòu)的連續(xù)流數(shù)據(jù)(如文件傳輸),則不必把粘連的包分開。但在實際應(yīng)用中,傳輸?shù)臄?shù)據(jù)一般是帶結(jié)構(gòu)的數(shù)據(jù),這時就需要做分包處理。
      [0005]但在實際應(yīng)用中,傳輸?shù)臄?shù)據(jù)一般是帶結(jié)構(gòu)的數(shù)據(jù),這時就需要做分包處理。
      [0006]通常情況下,為了避免數(shù)據(jù)粘包,現(xiàn)有技術(shù)中采用一些方法避免:一是通過設(shè)置socket參數(shù),強制立即發(fā)送數(shù)據(jù),而不是等到緩沖區(qū)滿后才發(fā)送;二是對于接收方引起的粘包,則可通過優(yōu)化程序設(shè)計、精簡接收進程工作量、提高接收進程優(yōu)先級等措施,使其及時接收數(shù)據(jù),從而盡量避免粘包現(xiàn)象;三是由接收方控制,將一包數(shù)據(jù)按結(jié)構(gòu)字段,人為控制分多次接收,然后合并,通過這種手段來避免粘包。以上提到的三種措施,都有其不足之處。第一種編程設(shè)置方法雖然可以避免發(fā)送方引起的粘包,但卻取消了優(yōu)化算法,降低了網(wǎng)絡(luò)發(fā)送效率,影響應(yīng)用程序的性能。第二種方法只能減少粘包的可能性,但并不能完全避免粘包,當(dāng)發(fā)送頻率較高時,或由于網(wǎng)絡(luò)突發(fā)可能使某個時間段數(shù)據(jù)包到達接收方較快,接收方還是有可能來不及接收,從而導(dǎo)致粘包。第三種方法雖然避免了粘包,但應(yīng)用程序的效率較低,對實時應(yīng)用的場合不適合。
      [0007]現(xiàn)有使用的一種比較周全的解決方法是:接收方創(chuàng)建一個預(yù)處理線程,對接收到的數(shù)據(jù)包進行預(yù)處理,將粘連的包分開。具體的:將接收的網(wǎng)絡(luò)數(shù)據(jù)存儲在數(shù)組中,從數(shù)組的開始位置,讀取長度字段L,如果數(shù)組中的有效數(shù)據(jù)大于等于L,則根據(jù)L,從數(shù)組中提取出一個數(shù)據(jù)包P,然后,將數(shù)組的剩余數(shù)據(jù),重新移動到數(shù)組的開始位置,再繼續(xù)接收數(shù)據(jù)或者分析剩余數(shù)據(jù)是否滿足提取一個數(shù)據(jù)包的條件。此方法的缺點是,當(dāng)處理完數(shù)據(jù)后,必須將數(shù)據(jù)重新移動到數(shù)組的開始位置,否則在繼續(xù)接收數(shù)據(jù)時,可能因數(shù)組剩余空間不足而無法完全接收網(wǎng)絡(luò)數(shù)據(jù),另外,數(shù)組的有效數(shù)據(jù)長度,需要額外的參數(shù)維護。
      [0008]因此,現(xiàn)有技術(shù)存在缺陷,有待于改進和發(fā)展。

      【發(fā)明內(nèi)容】

      [0009]本發(fā)明的目的在于針對上述現(xiàn)有技術(shù)中的TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)時由于TCP網(wǎng)絡(luò)傳輸本身或者接收方不能及時接收數(shù)據(jù)的原因,導(dǎo)致傳輸?shù)臄?shù)據(jù)包之間發(fā)生粘包的缺陷,提供一種TCP傳輸數(shù)據(jù)時防粘包的方法及系統(tǒng)。
      [0010]本發(fā)明的技術(shù)方案如下:
      一種TCP傳輸數(shù)據(jù)時防粘包的方法,其中,應(yīng)用于數(shù)據(jù)接收方,所述方法包括:
      A、預(yù)先在傳輸數(shù)據(jù)的緩沖區(qū)域中建立循環(huán)隊列;
      B、接收來自發(fā)送方的數(shù)據(jù),并將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中,并從存儲數(shù)據(jù)的開始位置判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包,若含有則執(zhí)行步驟C,否則重復(fù)本步驟;
      C、提取該完整的數(shù)據(jù)包,并清除所述循環(huán)隊列中已提取的該完整的數(shù)據(jù)包所對應(yīng)的數(shù)據(jù);同時對所述循環(huán)隊列中接收到的數(shù)據(jù)是否排列到循環(huán)隊列的結(jié)尾處進行判斷,若排列到結(jié)尾處,則執(zhí)行步驟D,否則返回步驟B ;
      D、將后續(xù)接收到的數(shù)據(jù)從循環(huán)隊列的開始位置進行下一循環(huán)的存儲。
      [0011]所述TCP傳輸數(shù)據(jù)時防粘包的方法,其中,在上述步驟A還包括步驟Al:
      Al、在循環(huán)隊列中設(shè)置用于對其中存儲數(shù)據(jù)的開始位置和結(jié)束位置進行定位的開始定位標(biāo)識和結(jié)束定位標(biāo)識。
      [0012]所述TCP傳輸數(shù)據(jù)時防粘包的方法,其中,所述步驟C中還包括:
      清除所述循環(huán)隊列中完整數(shù)據(jù)包所對應(yīng)的數(shù)據(jù)之后,所述開始定位標(biāo)識自動移動到下一完整數(shù)據(jù)包所對應(yīng)存儲位置的開始端;
      所述步驟B中還包括:
      將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中以后,所述結(jié)束定位標(biāo)識自動移動到數(shù)據(jù)存儲的結(jié)束位置。
      [0013]所述TCP傳輸數(shù)據(jù)時防粘包的方法,其中,在上述步驟C中還包括:判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包的方法為:判斷預(yù)定數(shù)據(jù)長度是否小于等于循環(huán)隊列中存儲的有效數(shù)據(jù)長度,若小于等于則判定為含有完整的數(shù)據(jù)包,否則判定為不含有;
      所述有效數(shù)據(jù)長度為:當(dāng)開始定位標(biāo)識在結(jié)束定位標(biāo)識之前時,位于所述開始定位標(biāo)識和結(jié)束定位標(biāo)識之間的隊列長度,當(dāng)開始定位標(biāo)識在結(jié)束定位標(biāo)識之后時,則位于所述開始定位標(biāo)識之后和位于結(jié)束定位標(biāo)識之前的隊列長度。
      [0014]所述TCP傳輸數(shù)據(jù)時防粘包的方法,其中,所述步驟A之前還包括步驟:
      預(yù)先在用于傳輸數(shù)據(jù)的緩沖區(qū)域中設(shè)置用于建立循環(huán)隊列的內(nèi)存空間。
      [0015]一種TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其中,應(yīng)用于數(shù)據(jù)接收方,所述系統(tǒng)包括: 循環(huán)隊列建立模塊,用于預(yù)先在傳輸數(shù)據(jù)的緩沖區(qū)域中建立循環(huán)隊列;數(shù)據(jù)存儲判斷模塊,用于接收來自發(fā)送方的數(shù)據(jù),并將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中,并從存儲數(shù)據(jù)的開始位置判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包;數(shù)據(jù)提取及清除模塊,用于提取該完整的數(shù)據(jù)包,并清除所述循環(huán)隊列中已提取的該完整的數(shù)據(jù)包所對應(yīng)的數(shù)據(jù);同時對所述循環(huán)隊列中接收到的數(shù)據(jù)是否排列到循環(huán)隊列的結(jié)尾處進行判斷;
      循環(huán)存儲模塊,用于當(dāng)所述循環(huán)隊列中接收到的數(shù)據(jù)排列到循環(huán)隊列的結(jié)尾處,則將后續(xù)接收到的數(shù)據(jù)從循環(huán)隊列的開始位置進行下一循環(huán)的存儲。
      [0016]所述TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其中,所述循環(huán)隊列建立模塊包括標(biāo)識定位單元;
      所述標(biāo)識定位單元,用于在循環(huán)隊列中設(shè)置用于對其中存儲數(shù)據(jù)的開始位置和結(jié)束位置進行定位的開始定位標(biāo)識和結(jié)束定位標(biāo)識。
      [0017]所述TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其中,所述數(shù)據(jù)存儲判斷模塊包括結(jié)束定位標(biāo)識移動單元;所述數(shù)據(jù)提取及清除模塊包括開始定位標(biāo)識移動單元;
      所述開始定位標(biāo)識移動單元,用于當(dāng)清除所述循環(huán)隊列中完整數(shù)據(jù)包所對應(yīng)的數(shù)據(jù)之后,將所述開始定位標(biāo)識自動移動到下一完整數(shù)據(jù)包所對應(yīng)存儲位置的開始端;
      所述結(jié)束定位標(biāo)識移動單元,用于將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中以后,所述結(jié)束定位標(biāo)識自動移動到數(shù)據(jù)存儲的結(jié)束位置。
      [0018]所述TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其中,所述系統(tǒng)還包括:內(nèi)存設(shè)置模塊;
      所述內(nèi)存設(shè)置模塊,用于預(yù)先在用于傳輸數(shù)據(jù)的緩沖區(qū)域中設(shè)置用于建立循環(huán)隊列的內(nèi)存空間。
      [0019]有益效果:本發(fā)明所提供的一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的方法及系統(tǒng),通過采用循環(huán)隊列緩存網(wǎng)絡(luò)數(shù)據(jù),并提供操作接口,對數(shù)據(jù)進行處理。由于數(shù)據(jù)是循環(huán)存儲的,當(dāng)循環(huán)隊列存儲到結(jié)尾處以后,接下來接收的數(shù)據(jù),會循環(huán)存儲在循環(huán)隊列開始處,而讀取過的循環(huán)隊列中數(shù)據(jù)會被清除,因此,接收到的數(shù)據(jù)會循環(huán)存儲到隊列中,且使用該方法及系統(tǒng),調(diào)用者不必維護很多的參數(shù),在不降低傳輸效率的同時,減少了 TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)時,發(fā)生粘包現(xiàn)象導(dǎo)致數(shù)據(jù)傳輸錯誤的可能。
      【附圖說明】
      [0020]圖1為本發(fā)明提供的一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的方法的步驟流程圖。
      [0021]圖2a-圖2e為本發(fā)明提供的一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的方法中循環(huán)隊列存儲數(shù)據(jù)的排列示意圖。
      [0022]圖3為本發(fā)明提供的一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的方法具體實施例示意圖。
      [0023]圖4為本發(fā)明提供的一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的系統(tǒng)結(jié)構(gòu)原理示意圖。
      【具體實施方式】
      [0024]本發(fā)明提供了一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的方法及系統(tǒng),以下結(jié)合附圖本發(fā)明的實施例對所述方法及系統(tǒng)進行詳細說明。
      [0025]基于在現(xiàn)有技術(shù)中通過在接收方緩沖內(nèi)存中創(chuàng)建一個預(yù)處理線程,首先將接收到的數(shù)據(jù)包進行預(yù)處理,其中,由于需要在每次提取出數(shù)組中的存儲的完整數(shù)據(jù)包后,剩下存儲的數(shù)據(jù)需要重新移動到數(shù)組的開始位置,然后再繼續(xù)接收數(shù)據(jù)和從剩下存儲的數(shù)據(jù)中提取完整數(shù)據(jù)包,從帶來每次提起數(shù)據(jù)都必須移動剩下的存儲數(shù)據(jù)和數(shù)值中存儲的數(shù)據(jù)需要額外的維護等諸問題,本發(fā)明提供了一種使用循環(huán)隊列進行數(shù)據(jù)存儲防止數(shù)據(jù)包之間發(fā)生粘包的方法。
      [0026]本發(fā)明提供了一種TCP傳輸數(shù)據(jù)時防粘包的方法,應(yīng)用于數(shù)據(jù)接收方,如圖1所示,所述方法包括以下步驟:
      S1、預(yù)先在傳輸數(shù)據(jù)的緩沖區(qū)域中建立循環(huán)隊列。
      [0027]為了防止發(fā)送方發(fā)出的,而接收方不能及時接收的數(shù)據(jù)包發(fā)生粘包的情況,在本步驟中首先在用于存儲傳輸數(shù)據(jù)的緩沖區(qū)域中建立循環(huán)隊列,所述循環(huán)隊列用于對緩沖區(qū)域內(nèi)保持的數(shù)據(jù)進行循環(huán)存儲。
      [0028]S2、接收來自發(fā)送方的數(shù)據(jù),并將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中,并從存儲數(shù)據(jù)的開始位置判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包,若含有則執(zhí)行步驟C,否則重復(fù)本步驟。
      [0029]接收發(fā)送方發(fā)出的數(shù)據(jù),將接收到的數(shù)據(jù)按照接收的先后順序依次排列到循環(huán)隊列中。從存儲隊列的開始位置對隊列中是否已經(jīng)接收到完整的數(shù)據(jù)包進行判斷,若接收到則執(zhí)行步驟S3,否則繼續(xù)接收數(shù)據(jù)。
      [0030]S3、提取該完整的數(shù)據(jù)包,并清除所述循環(huán)隊列中已提取的該完整的數(shù)據(jù)包所對應(yīng)的數(shù)據(jù);同時對所述循環(huán)隊列中接收到的數(shù)據(jù)是否排列到循環(huán)隊列的結(jié)尾處進行判斷,若排列到結(jié)尾處,則執(zhí)行步驟S4,否則返回步驟S2。
      [0031]提取上述步驟S2中檢測到的完整的數(shù)據(jù)包,復(fù)制所述數(shù)據(jù)包中包含的內(nèi)容,并清除循環(huán)隊列中包含的所述數(shù)據(jù)包所對應(yīng)的數(shù)據(jù),從而是循環(huán)隊列中所述數(shù)據(jù)包所占用的位置空閑,便于下一數(shù)據(jù)包的存儲。
      [0032]S4、將后續(xù)接收到的數(shù)據(jù)從循環(huán)隊列的開始位置進行下一循環(huán)的存儲
      將接下來接收到的數(shù)據(jù)從循環(huán)隊列的開始位置進行下一循環(huán)的存儲,即從循環(huán)隊列的開始位置重新開始進行數(shù)據(jù)的存儲。
      [0033]本發(fā)明為時數(shù)據(jù)在循環(huán)隊列中循環(huán)存儲,即讀取數(shù)據(jù)時,從每次均從循環(huán)隊列中保存數(shù)據(jù)的有效開始端進行讀取,并將讀取后的數(shù)據(jù)清除,則存儲數(shù)據(jù)的開始位置隨著數(shù)據(jù)包的清除也移動到下一個存儲數(shù)據(jù)包的開始位置,而當(dāng)接收到的數(shù)據(jù)排列存儲到循環(huán)隊列的結(jié)尾處時,則自動從循環(huán)隊列的開始端進行存儲,從而實現(xiàn)了在存儲的數(shù)據(jù)的存儲位置不變的前提下,防止數(shù)據(jù)包之間的粘包問題,提高了傳輸數(shù)據(jù)的效率。
      [0034]為了能更好的對循環(huán)隊列中存儲數(shù)據(jù)的開始端和結(jié)束端進行定位,在上述步驟SI還包括步驟Sll:
      S11、在循環(huán)隊列中設(shè)置用于對其中存儲數(shù)據(jù)的開始位置和結(jié)束位置進行定位的開始定位標(biāo)識和結(jié)束定位標(biāo)識。
      [0035]如圖2a中所示,在循環(huán)隊列未開始存儲數(shù)據(jù)之前,在循環(huán)隊列的存儲數(shù)據(jù)的位置標(biāo)示有數(shù)據(jù)存儲的開始位置和結(jié)束位置,如圖中以begin標(biāo)識存儲數(shù)據(jù)的開始處,以end標(biāo)識存儲數(shù)據(jù)的結(jié)束處。由于圖2a中循環(huán)隊列中未存儲數(shù)據(jù),因此其上顯示的begin標(biāo)識和end標(biāo)識位于循環(huán)隊列同一位置。
      [0036]如圖2b為循環(huán)隊列中存儲有數(shù)據(jù)包Pl和P2的示意圖,如圖所示,循環(huán)隊列中從接收方接收到數(shù)據(jù)包Pl和P2,并使用開始定位標(biāo)識和結(jié)束定位標(biāo)識對其中存儲的數(shù)據(jù)的位置進行標(biāo)識,如圖所示,begin標(biāo)識表示為開始定位標(biāo)識,其位于數(shù)據(jù)包Pl存儲位置之前,所述end標(biāo)識表示結(jié)束定位標(biāo)識,其位于數(shù)據(jù)包P2存儲位置之后。
      [0037]圖2c為當(dāng)從開始定位標(biāo)識處開始進行完整數(shù)據(jù)包的檢測,當(dāng)檢測到循環(huán)隊列中存儲有完整數(shù)據(jù)包P1,將完整數(shù)據(jù)包Pl提取并清除后,循環(huán)隊列中存儲數(shù)據(jù)的結(jié)構(gòu)示意圖。如圖所示,當(dāng)數(shù)據(jù)包被清除后,其中存儲數(shù)據(jù)包Pl的位置空閑,因此開始定位標(biāo)識移動中其中存儲的數(shù)據(jù)包P2的開始處,對循環(huán)隊列中存儲數(shù)據(jù)的開始位置進行定位。
      [0038]圖2d為在上述圖2c中表述的狀態(tài)下循環(huán)隊列中再次接收到數(shù)據(jù)包P3時,將其進行存儲,則結(jié)束定位標(biāo)識自動移動到數(shù)據(jù)包P3之后,即圖中所示的end標(biāo)識根據(jù)循環(huán)隊列中存儲數(shù)據(jù)發(fā)生了改變,發(fā)生了移動。
      [0039]圖2e為當(dāng)循環(huán)隊列存儲的數(shù)據(jù)已經(jīng)到的隊列的結(jié)尾處,則結(jié)束定位標(biāo)識自動返回到循環(huán)隊列的開始端,對接收到的數(shù)據(jù)所存儲的位置進行定位,也即是當(dāng)數(shù)據(jù)包P5保存在循環(huán)隊列的開始端時,則將數(shù)據(jù)包P5結(jié)束段標(biāo)識為數(shù)據(jù)存儲的結(jié)束位置,并將其新接收到的數(shù)據(jù)包存儲在end位置后面的空閑緩存區(qū)域,并從begin標(biāo)識位置檢測是否存儲有完整數(shù)據(jù)包,并提取完整的數(shù)據(jù)包后,清除相對應(yīng)的數(shù)據(jù),從而實現(xiàn)對接收到的數(shù)據(jù)進行循環(huán)存儲。
      [0040]如上述圖2b-圖2c所述,步驟S4中還包括:
      清除所述循環(huán)隊列中完整數(shù)據(jù)包所對應(yīng)的數(shù)據(jù)之后,所述開始定位標(biāo)識自動移動到下一完整數(shù)據(jù)包所對應(yīng)存儲位置的開始端;
      如上述所述圖2a_圖2b所述,步驟S2中還包括:
      將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中以后,所述結(jié)束定位標(biāo)識自動移動到數(shù)據(jù)存儲的結(jié)束位置。
      [0041]為了能更加準(zhǔn)確的對循環(huán)隊列中是否含有完整的數(shù)據(jù)包,在上述步驟S3中判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包的方法為:判斷預(yù)定數(shù)據(jù)長度是否小于等于循環(huán)隊列中存儲的有效數(shù)據(jù)長度,若小于等于則判定為含有完整的數(shù)據(jù)包,否則判定為不含有完整的數(shù)據(jù)包;
      所述有效數(shù)據(jù)長度為:當(dāng)開始定位標(biāo)識在結(jié)束定位標(biāo)識之前時,位于所述開始定位標(biāo)識和結(jié)束定位標(biāo)識之間的隊列長度,當(dāng)開始定位標(biāo)識在結(jié)束定位標(biāo)識之后時,則位于所述開始定位標(biāo)識之后和位于結(jié)束定位標(biāo)識之前的隊列長度。例如圖2d中循環(huán)隊列中存儲數(shù)據(jù)的有效數(shù)據(jù)長度為begin標(biāo)識(即開始定位標(biāo)識)與end標(biāo)識(即結(jié)束定位標(biāo)識)之間的數(shù)據(jù)長度,而圖2e中循環(huán)隊列中存儲數(shù)據(jù)的有效數(shù)據(jù)長度為begin標(biāo)識(即所述開始定位標(biāo)識)之后和位于end標(biāo)識(即結(jié)束定位標(biāo)識)之前的數(shù)據(jù)長度。
      [0042]為了能緩存區(qū)域中建立循環(huán)隊列,在所述步驟SI之前還包括步驟:
      SO、預(yù)先在用于傳輸數(shù)據(jù)的緩沖區(qū)域中設(shè)置用于建立循環(huán)隊列的內(nèi)存空間。
      [0043]如圖3所示為本發(fā)明所提供的一種TCP傳輸數(shù)據(jù)時防粘包的方法在具體實施例時的步驟流程圖,如圖所示,在具體進行實施時,所述方法包括以下步驟:
      H1、開始時,首先建立用于對發(fā)送方發(fā)送的數(shù)據(jù)進行預(yù)先存儲的循環(huán)隊列。
      [0044]H2、接收TCP傳輸?shù)臄?shù)據(jù),并將數(shù)據(jù)寫入循環(huán)隊列中,并實時根據(jù)循環(huán)隊列中存儲的數(shù)據(jù)處于的位置移動結(jié)束定位標(biāo)識。
      [0045]H3、在將接收到的數(shù)據(jù)存儲入循環(huán)隊列的同時,數(shù)據(jù)的接收方從開始定位標(biāo)識位置讀取長度為I的字段,并判斷該字段長度是否小于等于有效數(shù)據(jù)長度,若小于等于則將其判定在循環(huán)隊列中存在至少一個完整的數(shù)據(jù)包,則執(zhí)行步驟H5,否則,返回到步驟H2繼續(xù)接收數(shù)據(jù),說明循環(huán)隊列中不存在完整的數(shù)據(jù)包。
      [0046]H5、提取檢測到的完整的數(shù)據(jù)包,并清空該數(shù)據(jù)包在循環(huán)隊列中的數(shù)據(jù),并移動開始定位標(biāo)識到下一個數(shù)據(jù)包存儲的開始位置。
      [0047]以c++語言為例,循環(huán)隊列提供的接口如下:
      1、long init(long size)
      循環(huán)隊列開辟大小為size的內(nèi)存空間。
      [0048]2、long writeBuffer (const char *pData, long len)
      TCP接收到長度為len的網(wǎng)絡(luò)數(shù)據(jù),寫入到循環(huán)隊列。
      [0049]3、long readBuffer (char *pBuf, long len)
      從循環(huán)隊列begin位置開始,取出長度為Ien的數(shù)據(jù)。
      [0050]4、long readBytes (char *pBuf, long len)
      從循環(huán)隊列begin位置開始,讀取長度為Ien的數(shù)據(jù)。
      [0051]5、long getDataLengthO 返回循環(huán)隊列中有效數(shù)據(jù)的長度。
      [0052]6、1nggetBufferSize O 返回循環(huán)隊列的大小。
      [0053]的區(qū)別是,readBuffer讀取數(shù)據(jù)后,會移動begin游標(biāo)的位置,即取出了網(wǎng)絡(luò)數(shù)據(jù),而readBytes僅將數(shù)據(jù)拷貝一份,也即是僅僅用于對預(yù)設(shè)的數(shù)據(jù)長度是否小于等于存儲數(shù)據(jù)的有效長度,小于等于,則通過readBuffer讀取數(shù)據(jù),否則并不通過readBuffer讀取數(shù)據(jù)。
      [0054]在上述方法的基礎(chǔ)上,本發(fā)明還提供了一種TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),如圖4所示,所述系統(tǒng)包括:
      循環(huán)隊列建立模塊10,用于預(yù)先在傳輸數(shù)據(jù)的緩沖區(qū)域中建立循環(huán)隊列;其功能如上述步驟SI所述。
      [0055]數(shù)據(jù)接收存儲模塊20,用于接收來自發(fā)送方的數(shù)據(jù),并將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中;其功能如上述步驟S2所述。
      [0056]數(shù)據(jù)包判斷模塊30,用于從存儲數(shù)據(jù)的開始位置判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包;其功能如上述步驟S3所述。
      [0057]數(shù)據(jù)提取及清除模塊40,用于當(dāng)所述數(shù)據(jù)包判斷模塊中判定出含有完整的數(shù)據(jù)包時,則提取該完整的數(shù)據(jù)包,并清除該數(shù)據(jù)包所對應(yīng)的數(shù)據(jù);其功能如上述步驟S4所述。
      [0058]循環(huán)存儲模塊50,用于當(dāng)檢測所述循環(huán)隊列中接收到的數(shù)據(jù)排列到循環(huán)隊列的結(jié)尾處,則自動將后續(xù)接收到的數(shù)據(jù)從循環(huán)隊列的開始位置進行下一循環(huán)的存儲。其功能如上述步驟S5所述。
      [0059]所述循環(huán)隊列建立模塊包括標(biāo)識定位單元;
      所述標(biāo)識定位單元,用于在循環(huán)隊列中設(shè)置用于對其中存儲數(shù)據(jù)的開始位置和結(jié)束位置進行定位的開始定位標(biāo)識和結(jié)束定位標(biāo)識。
      [0060]所述數(shù)據(jù)提取及清除模塊包括結(jié)束定位標(biāo)識移動單元;所述數(shù)據(jù)接收存儲模塊包括開始定位標(biāo)識移動單元;
      所述開始定位標(biāo)識移動單元,用于當(dāng)清除所述循環(huán)隊列中完整數(shù)據(jù)包所對應(yīng)的數(shù)據(jù)之后,將所述開始定位標(biāo)識自動移動到下一完整數(shù)據(jù)包所對應(yīng)存儲位置的開始端;
      所述結(jié)束定位標(biāo)識移動單元,用于將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中以后,所述結(jié)束定位標(biāo)識自動移動到數(shù)據(jù)存儲的結(jié)束位置。
      [0061]所述系統(tǒng)還包括:內(nèi)存設(shè)置模塊;
      所述內(nèi)存設(shè)置模塊,用于預(yù)先在用于傳輸數(shù)據(jù)的緩沖區(qū)域中設(shè)置用于建立循環(huán)隊列的內(nèi)存空間。
      [0062]本發(fā)明所提供的一種TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)防粘包的方法及系統(tǒng),通過采用循環(huán)隊列緩存網(wǎng)絡(luò)數(shù)據(jù),并提供操作接口,對數(shù)據(jù)進行處理。由于數(shù)據(jù)是循環(huán)存儲的,當(dāng)循環(huán)隊列存儲到結(jié)尾處以后,接下來接收的數(shù)據(jù),會循環(huán)存儲在循環(huán)隊列開始處,而讀取過的循環(huán)隊列中數(shù)據(jù)會被清除,因此,接收到的數(shù)據(jù)會循環(huán)存儲到隊列中,且使用該方法及系統(tǒng),調(diào)用者不必維護很多的參數(shù),在不降低傳輸效率的同時,減少了 TCP網(wǎng)絡(luò)傳輸數(shù)據(jù)時,發(fā)生數(shù)據(jù)包粘包的現(xiàn)象,導(dǎo)致數(shù)據(jù)傳輸錯誤的可能。
      [0063]應(yīng)當(dāng)理解的是,對本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)上述說明加以改進或變換,而所有這些改進和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護范圍。
      【主權(quán)項】
      1.一種TCP傳輸數(shù)據(jù)時防粘包的方法,其特征在于,應(yīng)用于數(shù)據(jù)接收方,所述方法包括: A、預(yù)先在傳輸數(shù)據(jù)的緩沖區(qū)域中建立循環(huán)隊列; B、接收來自發(fā)送方的數(shù)據(jù),并將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中,并從存儲數(shù)據(jù)的開始位置判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包,若含有則執(zhí)行步驟C,否則重復(fù)本步驟; C、提取該完整的數(shù)據(jù)包,并清除所述循環(huán)隊列中已提取的該完整的數(shù)據(jù)包所對應(yīng)的數(shù)據(jù);同時對所述循環(huán)隊列中接收到的數(shù)據(jù)是否排列到循環(huán)隊列的結(jié)尾處進行判斷,若排列到結(jié)尾處,則執(zhí)行步驟D,否則返回步驟B ; D、將后續(xù)接收到的數(shù)據(jù)從循環(huán)隊列的開始位置進行下一循環(huán)的存儲。2.根據(jù)權(quán)利要求1所述TCP傳輸數(shù)據(jù)時防粘包的方法,其特征在于,在上述步驟A還包括步驟Al: Al、在循環(huán)隊列中設(shè)置用于對其中存儲數(shù)據(jù)的開始位置和結(jié)束位置進行定位的開始定位標(biāo)識和結(jié)束定位標(biāo)識。3.根據(jù)權(quán)利要求2所述TCP傳輸數(shù)據(jù)時防粘包的方法,其特征在于,所述步驟C中還包括: 清除所述循環(huán)隊列中完整數(shù)據(jù)包所對應(yīng)的數(shù)據(jù)之后,所述開始定位標(biāo)識自動移動到下一完整數(shù)據(jù)包所對應(yīng)存儲位置的開始端; 所述步驟B中還包括: 將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中以后,所述結(jié)束定位標(biāo)識自動移動到數(shù)據(jù)存儲的結(jié)束位置。4.根據(jù)權(quán)利要求2所述TCP傳輸數(shù)據(jù)時防粘包的方法,其特征在于,在上述步驟C中還包括:判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包的方法為:判斷預(yù)定數(shù)據(jù)長度是否小于等于循環(huán)隊列中存儲的有效數(shù)據(jù)長度,若小于等于則判定為含有完整的數(shù)據(jù)包,否則判定為不含有; 所述有效數(shù)據(jù)長度為:當(dāng)開始定位標(biāo)識在結(jié)束定位標(biāo)識之前時,位于所述開始定位標(biāo)識和結(jié)束定位標(biāo)識之間的隊列長度,當(dāng)開始定位標(biāo)識在結(jié)束定位標(biāo)識之后時,則位于所述開始定位標(biāo)識之后和位于結(jié)束定位標(biāo)識之前的隊列長度。5.根據(jù)權(quán)利要求1所述TCP傳輸數(shù)據(jù)時防粘包的方法,其特征在于,所述步驟A之前還包括步驟: 預(yù)先在用于傳輸數(shù)據(jù)的緩沖區(qū)域中設(shè)置用于建立循環(huán)隊列的內(nèi)存空間。6.一種TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其特征在于,應(yīng)用于數(shù)據(jù)接收方,所述系統(tǒng)包括: 循環(huán)隊列建立模塊,用于預(yù)先在傳輸數(shù)據(jù)的緩沖區(qū)域中建立循環(huán)隊列;數(shù)據(jù)存儲判斷模塊,用于接收來自發(fā)送方的數(shù)據(jù),并將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中,并從存儲數(shù)據(jù)的開始位置判斷循環(huán)隊列中存儲的數(shù)據(jù)是否含有完整的數(shù)據(jù)包;數(shù)據(jù)提取及清除模塊,用于提取該完整的數(shù)據(jù)包,并清除所述循環(huán)隊列中已提取的該完整的數(shù)據(jù)包所對應(yīng)的數(shù)據(jù);同時對所述循環(huán)隊列中接收到的數(shù)據(jù)是否排列到循環(huán)隊列的結(jié)尾處進行判斷; 循環(huán)存儲模塊,用于當(dāng)所述循環(huán)隊列中接收到的數(shù)據(jù)排列到循環(huán)隊列的結(jié)尾處,則將后續(xù)接收到的數(shù)據(jù)從循環(huán)隊列的開始位置進行下一循環(huán)的存儲。7.根據(jù)權(quán)利要求6所述TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其特征在于,所述循環(huán)隊列建立模塊包括標(biāo)識定位單元; 所述標(biāo)識定位單元,用于在循環(huán)隊列中設(shè)置用于對其中存儲數(shù)據(jù)的開始位置和結(jié)束位置進行定位的開始定位標(biāo)識和結(jié)束定位標(biāo)識。8.根據(jù)權(quán)利要求7所述TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其特征在于, 所述數(shù)據(jù)存儲判斷模塊包括結(jié)束定位標(biāo)識移動單元;所述數(shù)據(jù)提取及清除模塊包括開始定位標(biāo)識移動單元; 所述開始定位標(biāo)識移動單元,用于當(dāng)清除所述循環(huán)隊列中完整數(shù)據(jù)包所對應(yīng)的數(shù)據(jù)之后,將所述開始定位標(biāo)識自動移動到下一完整數(shù)據(jù)包所對應(yīng)存儲位置的開始端; 所述結(jié)束定位標(biāo)識移動單元,用于將接收的數(shù)據(jù)依次排列存儲到循環(huán)隊列中以后,所述結(jié)束定位標(biāo)識自動移動到數(shù)據(jù)存儲的結(jié)束位置。9.根據(jù)權(quán)利要求6所述TCP傳輸數(shù)據(jù)時防粘包的系統(tǒng),其特征在于,所述系統(tǒng)還包括:內(nèi)存設(shè)置模塊; 所述內(nèi)存設(shè)置模塊,用于預(yù)先在用于傳輸數(shù)據(jù)的緩沖區(qū)域中設(shè)置用于建立循環(huán)隊列的內(nèi)存空間。
      【文檔編號】H04L1/00GK105991223SQ201510077379
      【公開日】2016年10月5日
      【申請日】2015年2月13日
      【發(fā)明人】朱錦華
      【申請人】Tcl集團股份有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1