我自定義了一套協(xié)議,采用的TCP傳輸方式,協(xié)議主要作用是判斷數(shù)據(jù)完整及有效性并進(jìn)行初步處理轉(zhuǎn)換成一個(gè)對(duì)象提交到ONMESSAGE里面去處理.
現(xiàn)在有一個(gè)問(wèn)題,當(dāng)我在INPUT里面判斷出來(lái)BUFFER里面的數(shù)據(jù)幀頭是錯(cuò)誤的,不符合我的協(xié)議規(guī)范要求,這時(shí)我需要將BUFFER清空并返回0,表示清空緩沖區(qū),不調(diào)用DECODE并等待下一幀數(shù)據(jù)的到達(dá).
測(cè)試直接設(shè)置BUFFER=NULL無(wú)效,下一幀數(shù)據(jù)到達(dá)時(shí)會(huì)加上之前錯(cuò)誤的數(shù)據(jù),如果RETURN整個(gè)數(shù)據(jù)的長(zhǎng)度又會(huì)觸發(fā)DECODE及ONMESSAGE,這樣我需要在后面兩個(gè)回調(diào)里面再次去判斷有效性,有點(diǎn)浪費(fèi)資源.我希望數(shù)據(jù)到DECODE就已經(jīng)是有保證的有效性的數(shù)據(jù),不知道這個(gè)有什么好的解決辦法?
調(diào)用$connection->consumeRecvBuffer($length)來(lái)清空接收緩沖區(qū)的數(shù)據(jù),$length代表清空多少字節(jié)。
然后input里面return 0即可。
建議:
建議收到無(wú)效數(shù)據(jù)最好把鏈接斷開(kāi),不能容忍客戶(hù)端的數(shù)據(jù)錯(cuò)誤。
將buffer清空不一定保證下一個(gè)正確的包能被解析。因?yàn)榍蹇盏臄?shù)據(jù)里面可能包含了下一個(gè)正確包的包頭部分,造成下一個(gè)包解析時(shí)也出現(xiàn)錯(cuò)誤,如此惡性循環(huán),可能導(dǎo)致這個(gè)鏈接上發(fā)來(lái)的數(shù)據(jù)都是無(wú)法解析的。