91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

c++服務器 拆包粘包 過程 千萬別問我是基于TCP的還是UDP的...

資源截圖

代碼片段和文件信息

#include?“stdafx.h“
#include?“ReceiveManager.h“
#include?“boost\mpl\assert.hpp“
#include?“boost\bind.hpp“
#include?“msg\PerHandleData.h“
#include?“msg\Packet.h“


ReceiveManager::ReceiveManager(unsigned?int?recvBufferSize)
:SendOrRecvMngbase(recvBufferSize)
_socket_manager(NULL)
{
_msg_queue =?new?MessageQueue(recvBufferSize);

if(_msg_queue?!=?NULL){
if(!_msg_queue->Init(boost::bind(&ReceiveManager::Dispatch?this?_1))){
throw;
}
}
else{
throw;
}

#ifdef?SIC
printf(“receive?manager?has?been?launched.\n“);
#endif
}

ReceiveManager::~ReceiveManager(void)
{
//此類對象由@class?Acceptor?@class?Connector管理和維護
//_socket_manager?=?NULL;
SAFE_DELETE(_msg_queue);
}

void?ReceiveManager::AsynReceive(?mc_system_msg::PPerHandleData?handledata?const?boost::system::error_code&?error?std::size_t?bytes_transferred?)
{
//在拆包的時候,這個變量是有用的,因為拆包需要移動handledata->_buffer指針,使之不斷指向下一個包
//當處理完畢后,需要對handledata->_buffer緩沖區指針還原,以免釋放緩沖區時出現問題
char*?tmpPtr?=?handledata->_buffer;

//設置總共收到的消息的長度,必須要用+=,而不是=
handledata->_offset?+=?bytes_transferred;

if(Receive(handledata?bytes_transferred))
{
//投遞接收操作
PostReceive(handledata->Socket());
}

//防止handledata->_buffer指針在Receive中被改變還原指針值,希望指針被正確的釋放
handledata->_buffer?=?tmpPtr;
ReleaseMemory(handledata);
}

///?
///?此過程主要處理TCP消息的拆包和粘包過程,把處理完整的消息加入到消息隊列
///?

///?The?handledata.
///?The?bytes_transferred.
///?int.
bool?ReceiveManager::Receive(?mc_system_msg::PPerHandleData?handledata?std::size_t?bytes_transferred?)
{
if(bytes_transferred?==?0){
//DoData(handledata?0);
_msg_queue->Add(handledata);
return?false;
}

using?namespace?mc_system_msg;

do
{
PPacket?tmpPacket?=?(PPacket)handledata->_buffer;

if(handledata->_offset? //消息不全,跳轉到[2]繼續讀取消息
goto?FALG_4;
}
else?if(tmpPacket->_the_packet_header_size?!=?PACKET_SIZE){
return?false;
}

/*[1]*/if(tmpPacket->_the_whole_packet_size?==?handledata->_offset){
//DoData(handledata?bytes_transferred);
_msg_queue->Add(handledata);
return?true;
}
/*[2]*/else?if(handledata->_offset?_the_whole_packet_size){
/*
?* 代碼執行到這里,說明已收到的數據不是一個完整的包,需要再次接收剩下的數據,這里或許有一個疑問,為什么重新獲取數據句柄?
?* 原因在于下面一個判斷[3]:
?* else?if(handledata->_offset?>?tmpPacket->_the_whole_packet_size?&&?tmpPacket->_the_whole_packet_size?!=?0)
?* 這個判斷的意思是,收到的數據是幾個消息包的集合,需要拆分處理,那么可能正好是3個包的集合,也可能是3個半的消息包的集合,這樣,剩下的1/2
?* 數據包的處理將會走到這個if里,這時,并不能保證handledata->_buffer指針,還指在handledata->_buffer的頭部,或許已經移動到了中部,
?* 尾部等,基于這個原因,所以再次申請一個數據句柄,用于投遞接收剩下的數據。
?*
?* 看了以上的話,那為什么不定義一個臨時指針?這里可以不用重新申請數據句柄嗎?
?* 答:就算定義一個臨時指針,那么在【3個半的消息包的集合,這樣,剩下的1/2數據包的處理將會走到這個if里】這種情況下,還要把剩下的數據移動到
?* handledata->_buffer頭部,然后再去投遞接收剩下的數據,這樣的一個操作過程不比重新申請一個數據句柄簡單
?*/
FALG_4:
mc_system_msg::PPerHandleData?tmp_perHandledata?=?GetData(hand

?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????1505??2014-08-12?14:28??PerHandleData.h
?????文件????????4655??2014-08-18?08:52??ReceiveManager.cpp
?????文件????????2854??2014-08-12?14:35??ReceiveManager.h

評論

共有 條評論