轉
在平時交流過程發現一些朋友即使做了這些協議的處理,但有時在處理資料的時候也會出現資料不對的情況。這主要原因他們在一些個別情況下沒有處理好。因為當一系列的訊息傳送過來的時候,對於4節字頭或結束符分布位置都是不確定的。一種簡單的情況就是當前訊息處理完成後,緊接著就是處理一下個訊息的4節字描述,但在實際情況下當前接收的buffer剩下的內容有可能不足4節字的。如果你想通過通訊的程式來測這情況相對來說觸發的機率性不高,所以對於協議分析的功能最好通過單元測試來模擬。
通過下面這個圖可以更清晰地了解協議標記資料分布的情況
下面簡單地介紹一下4位元組描述大小和結束符和處理方式。
4位元組大小描述方式
複製**
1 public void import(byte data, int start, int count)
2 12 if (mchecksize.length == -1)
13
20 }
21 else
22
31 }
32 }
33 }
34 }
35 36
37 public void import(byte value)
38
46 else
47
50 }
複製**
**很簡單如果沒有長度描述的情況就把資料匯入到訊息長度描述的buffer中,如果當前buffer滿足4位的情況直接得到相應長度。後面的工作就是獲取相應長度的buffer即可。
結束符方式
複製**
1 public void import(byte data, int start, int count)
2 11 if (data[x] == meof[0])
12
21 }
22 else
23
28 }
29 }
複製**
結束符的處理方式就相對來說簡單多了。
處理tcp粘包問題
tcp是位元組流,無邊界,udp是訊息,是有邊界的。就是udp返回的就是乙個訊息。所以tcp會產生粘包問題。如何解決粘包問題,所以我們要在應用層維護訊息與訊息的邊界。比如說定長包,包尾加 r n ftp 包頭加包體長度,更複雜的應用層協議。readn接受確切資料的讀操作 cli include in...
TCP粘包的拆包處理
因為tcp是流式處理的,所以包沒有邊界,必須設計乙個包頭,裡面表示包的長度 一般用位元組表示 根據這個來逐個拆包。如果對於傳送 接收頻率不高的話,一般也就不做拆包處理了,因為不大可能有粘包現象。以下是粘包和拆包的分析 用qt的tcpsocket讀出的資料來拆 1 m imp m thread boo...
swoole 對tcp粘包處理
1,在短時間內資料傳送過快時,會發生粘包現象,比如下面的 這個現象是雙向的,客戶端,服務端均可能出現此問題 下面只是以客戶端 to 服務端舉例 server.php host 0.0.0.0 建立server物件,監聽 127.0.0.1 9501埠 serv new swoole server h...