电商网站建设济南建网站百度竞价被点击软件盯上
为什么要用pull模式呢,我不是所谓的别人说pull效率高,是因为包头的长度 int不是固定长度。
服务器IO-HPSocket
PUSH:收到数据立马触发OnReceive,由开发人员自己实现拆包和缓冲区的管理逻辑。
PULL:收到数据立马触发OnReceive,但需要开发人员维护数据包的长度(数据缓冲区管理HP内部做了),当拼接一个完整的Pack之后,Fetch获取完整的数据包就OK了。
PACK:收到数据并且拼成一个完整的Pack之后触发OnReceive,OnReceive的数据就是一个完整的包。开发人员不必关系拼包的过程,
https://blog.csdn.net/CAir2/article/details/82188721
https://blog.csdn.net/weixin_41761608/article/details/115373554?spm=1001.2014.3001.5501
https://blog.csdn.net/weixin_41761608/article/details/115366101
https://zypapa.blog.csdn.net/article/details/115366101
//m_pSocket = HP_Create_TcpPackServer(this
m_pSocket = HP_Create_TcpServer(this);
pull模式的收包函数要自己写,参数也不一样
EnHandleResult NetTcpServer::OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength){Log::Instance()->WriteLog(enLogType_Debug,"--------NetTcpServer-----------OnReceive----------------dwConnID=%d",dwConnID);TPkgInfo* pInfo = FindPkgInfo(pSender, dwConnID);if(NULL == pInfo){//包长pInfo = new TPkgInfo();BYTE buffer[1];m_pPullSocket->Fetch(dwConnID, buffer, 1);((TPkgInfo*)pInfo)->PacketLen = Stream::get_bit_6(*buffer);iLength = iLength - 1;if((*buffer & 128) == 128) //判断最高位是否是1{iLength = iLength - 1;m_pPullSocket->Fetch(dwConnID, buffer, 1);pInfo->PacketLen = Stream::getLen(*buffer, pInfo->PacketLen);}packetList[dwConnID] = pInfo; }int required = pInfo->PacketLen; //包总长度//包体if (iLength >= required){BYTE* buffer = new BYTE[required];En_HP_FetchResult result;result = m_pPullSocket->Fetch(dwConnID, buffer, required);if (result == FR_OK){Log::Instance()->WriteLog(enLogType_Debug,"--------Fetch = %s",Stream::ByteToHex((const unsigned char*)buffer, required ));Extralib::Thread::sWorkItem workItem;DataPacket* dp = dataPacketPool.PopDataPacket();dp->writeBuf(buffer,required);dp->setPosition(0);workItem.Set(INetworkEvent_RecvData, dwConnID, dp->getLength(), (char*)dp);PushItem(workItem);packetList.erase(dwConnID);delete pInfo;pInfo = NULL;return HR_OK;}}return HR_OK;}