通俗粘包分包處理邏輯

2021-09-11 23:13:55 字數 2309 閱讀 6050

網路傳送頻率和網路堵塞,就可能出現粘包情況。

1 傳送端需要等發送緩衝區滿才傳送出去,造成粘包

2 接收方不及時接收緩衝區的包,造成多個包接收

如圖(盜取的)

處理邏輯:

宣告乙個讀取到資料的資料快取變數,從收到第乙個資料報開始步驟:

1.讀出來的資料依次存放到該資料快取變數,然後判斷處理該資料快取變數的內容:

2.只處理內容資料長度大於等於當前包體大小的情況(其他情況跳過繼續步驟1),然後把該等於包體資料拿出來存放分發,剩餘內容資料拷貝到資料快取前面(拿出的資料,後面剩餘繼續補上,如快取123456789,拿出來的12345,剩下放到前面如6789***xx)。然後繼續步驟1,迴圈讀取處理。

ue4具體**描述實現如下:

messagebase.h:

#define message_max_length 10240

class fmessagebase//訊息結構,後面自定義訊息結構繼承該類

~fmessagebase()

{}int32 length;//包體大小,訊息長度

};struct recvbufferdata

~recvbufferdata()

bool readbufferdata(fsocket* socket);//從socket->recv讀取資料

template

t* getmessage();//針對資料快取區處理,拿到所需包的資料,剩餘的資料繼續放到bufferdata最前面位址開始

int offsetindex;//記錄bufferdata的最終資料位置偏移,換句話就是快取資料大小

uint8* bufferdata;//讀取訊息資料快取區,最後對這個判斷處理。

};messagebase.cpp:

bool recvbufferdata::readbufferdata(fsocket* socket)

return recvret;

}template//t 就是fmessagebase

t* recvbufferdata::getmessage()

netactor.h:

class highspeednetdriver_api anetactor: public aactor

}fsocket* socket = isocketsubsystem::get(platform_socketsubsystem)->createsocket(name_stream, text("default"), false);

if (!socket)

tsharedrefinternetaddr = isocketsubsystem::get(platform_socketsubsystem)->createinternetaddr();

if (!serveripaddr.isempty())

else

internetaddr->setport(serverport);

int32 receivebuffersize = 2 * 1024 * 1024;

int32 sendbuffersize = 2 * 1024 * 1024;

int32 newsize = 0;

socket->setreceivebuffersize(receivebuffersize, newsize);

socket->setsendbuffersize(sendbuffersize, newsize);

bool connected = socket->connect(*internetaddr);

if (!connected)

return false;

}if (clientsocket)

clientsocket = socket; 

bclientisready = true;

}return bclientisready;

}void anetactor::destroyed()

void anetactor::tick( float deltatime )

#if platform_windows && !with_editor

}//__except (exception_execute_handler)//catch (std::exception& e)

catch(std::exception& e)

#endif}}

}return true;

}

粘包和分包

socket通訊時會對傳送的位元組資料進行分包和粘包處理,屬於一種socket內部的優化機制。粘包 當傳送的位元組資料報比較小且頻繁傳送時,socket內部會將位元組資料進行粘包處理,既將頻繁傳送的小位元組資料打包成 乙個整包進行傳送,降低記憶體的消耗。分包 當傳送的位元組資料報比較大時,socke...

Socket粘包分包

粘包和分包問題 1.首先什麼是包 包就是每次伺服器向客戶端傳送的資料每傳送乙個訊息都會被打成乙個包傳送到客戶端。客戶端向伺服器端傳送訊息也是一樣的。2.為什麼會有粘包和分包的問題 是因為sockettcp自身的優化機制所導致的。3.什麼是粘包 粘包就是當伺服器端傳送的資料很小的時候又很頻繁的時候,就...

TCP分包方法 粘包處理策略

針對三種不同的粘包現象,分包演算法分別採取了相應的解決辦法。其基本思路是首先將待處理的接收資料流 長度設為m 強行轉換成預定的結構資料形式,並從中取出結構資料長度字段,而後根據n計算得到第一包資料長度。1 若nm,則表明資料流內容尚不夠構成一完整結構資料,需留待與下一包資料合併後再行處理。也就是說,...