IOS 詳解socket程式設計 oc 粘包 半包處理

2022-09-24 20:12:08 字數 953 閱讀 6472

ios 詳解socket程式設計[oc]粘包、半包處理

在做socket程式設計時,如果是做tcp連線,那就不可避免的會遇到粘包與半包的問題,粘包就是多組資料被一併接收了,粘在了一起,無法做劃分;半包就是有資料接收不完整,無法處理。要解決粘包、半包的問題,一般在設計資料(訊息)格式時會約定好乙個字段專門用於描述資料報的長度,這樣就使資料有了邊界,依靠這個邊界,就能把每組資料劃分出來,資料不完整時也能獲知資料的缺失。

(當然也可以把資料設計成程式設計客棧定長資料,但這樣不夠靈活;或者用\n,\r這類字元作為資料劃分依據,但不直觀、不明確,同時也不靈活)

舉個栗子:

訊息=訊息頭+訊息體。訊息頭用於描述訊息本身的基本資訊,訊息體則為訊息的具體內容

如上圖所示,假如我們的乙個訊息是這麼定義的

訊息頭 = msgid(4b)+version(2b)+len(4b),共占用10位元組

訊息體 =  len中描述的16位元組長

所以這條訊息的長度就是 26位元組

可以看到,要想知道一條完整資料的邊界,關鍵就是訊息頭中的len欄位

假如我們現在接收到的資料是這樣的:

這個情況下即包含了粘包,也出現了半包的情況,三個資料報粘在了一起,最後乙個資料報沒有接收完全,出現程式設計客棧了半包的情況,看看**如何處理

- (void)onsocket:(asyncsocket *)sock didreaddata:(nsdata *)data withtag:(long)tag

else//如果快取中的資料長度不夠乙個包的長度,則包不完整(處理半包,繼續讀取)

} //快取中資料都處理完了,繼續讀取新資料

[_socket readdatawithtimeout:-1 buffer:_readbuf bufferoffset:_readbuf.length tag:0];//繼續讀取資料

}本文標題: ios 詳解socket程式設計[oc]粘包、半包處理

本文位址:

iOS 開發 網路程式設計詳解之Socket詳解

注意 socket使用步驟 1.建立客戶端socket.2.連線到伺服器socket.3.客戶端socket傳送資料到伺服器socket.4.客戶端socket接收伺服器返回的資料.5.關閉客戶端socket.import viewcontroller.h import import import ...

iOS開發 Socket程式設計

socket程式設計 一 了解網路各個協議 tcp ip socket http等 網路七層由下往上分別為物理層 資料鏈路層 網路層 傳輸層 會話層 表示層和應用層。其中物理層 資料鏈路層和網路層通常被稱作 層,是網路工程師所研究的物件 傳輸層 會話層 表示層和應用層則被稱作主機層,是使用者所面向和...

iOS網路程式設計 iOS中Socket程式設計介紹

使用socket進行c s結構程式設計,連線過程 服 務器端監聽某個埠是否有連線請求。伺服器端程式處於堵塞狀態,直到客戶端向伺服器端發出連線請求,伺服器端接受請求程式才能向下執行。一旦連線建立起 來,通過socket可以獲得輸入輸出流物件。借助於輸入輸出流物件就可以實現與客戶端的通訊,最後不要忘記關...