tcp粘包問題

2021-08-02 11:55:02 字數 1235 閱讀 3362

**什麼是粘包問題:**
粘包問題的起因是socket的快取機制。

簡而言之 粘包問題就是如何將連續的資料按照不同的資料幀截斷,以及如何處理殘包情況。

分割資料需要按需分配。

處理殘包也很簡單——「等」。

等它發來下一包資料,不管他發來多少資料,先拿來512,接到上次那512後面。湊成完整的資料幀。

當然也有可能你發現這次來的資料不夠512,那就有多少拿多少,先接到那幀資料的後面,然後再等,什麼時候湊夠了什麼時候去截下一幀。

二進位制資料可以被看成水(當然這麼比喻有一定的侷限性,考慮到二進位制資料的連續性將其比喻成水是有誤區的,但這麼比喻也是為了方便理解)。recv最多能從井裡面取出來的水的多少是固定的,但是井裡面的水也有可能不足以裝滿一桶。桶裡面的水要倒到不同的杯子中去。開始被倒的杯子是會被裝滿的,最後的杯子可能只裝了半杯,桶裡就沒有水了。這個杯子就要等,等桶去井裡面取水,然後再給他裝。當井裡的水不足以裝滿一桶的時候,桶不會在那等,而是有多少拿多少。要是井裡沒有水,那就只能等,等他有水了再裝走。

處理好這個過程就解決了粘包問題。

當然這只是本人的理解,本人也是初學者,歡迎指教。

下面附上一段我處理粘包過程的**,同樣歡迎指教。

//這段**使用的前提是資料幀要有頭標識,可以從資料頭中獲取幀的長度。

memcpy(data_return+left_len, data, datal);

//data是recv得到的資料,datal是recv的返回值(資料長度)。

//data_return上次操作剩下的殘缺資料。left_len是剩餘資料長度。

left_len = left_len + datal;

while(1)

do_data(data_return, header

->

header

.len);//資料拿走操作

left_len = left_len -

header

->

header

.len;//剩餘長度變更

memcpy(data_tmp,(data_return +

header

->

header

.len), left_len);

memcpy(data_return,data_tmp,left_len);//被使用的資料截掉

}else

}}

TCP粘包問題

原因 tcp提供的是一種位元組流服務,沒有訊息保護邊界。傳送端需要等緩衝區滿才傳送出去,造成粘包 接收方不及時接收緩衝區的包,造成多個包接收 解決方法 一是對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本...

TCP粘包問題

tcp粘包是指傳送方傳送的若干包資料到接收方接收時粘成一包,從接收緩衝區看,後一包資料的頭緊接著前一包資料的尾。出現粘包現象的原因是多方面的,它既可能由傳送方造成,也可能由接收方造成。傳送方引起的粘包是由tcp協議本身造成的,tcp為提高傳輸效率,傳送方往往要收集到足夠多的資料後才傳送一包資料。若連...

tcp 粘包問題

粘包出現原因 傳送方引起 tcp為提高傳輸效率,傳送方往往要收集到足夠多的資料後才傳送一包資料。若連續幾次傳送的資料都很少,通常tcp會根據優化演算法把這些資料合成一包後一次傳送出去,這樣接收方就收到了粘包資料。接收方引起 由於接收方使用者程序不及時接收資料,從而導致粘包現象。這是因為接收方先把收到...