даю реально рабочий кусок из проекта.
Blob это класс контейнер фабрики классов
uint32_t CClientTransport::recv(ClientNode* _pNode)
Blob это класс контейнер фабрики классов
uint32_t CClientTransport::recv(ClientNode* _pNode)
{
Blob bb;
uint8_t* pBuffer = new uint8_t[4];
int32_t nReceived, nReceivedTotal = 0;
while(true)
{
nReceived = m_pSocket->read((char*) pBuffer + nReceivedTotal, 4);
nReceivedTotal += nReceived;
if (nReceivedTotal >= 4)
break;
m_pSocket->waitForReadyRead(1000);
}
bb.assign(pBuffer, nReceivedTotal, 4);
int32_t uPacketSize;
bb >> uPacketSize;
nReceivedTotal = 0;
pBuffer = new uint8_t[4096];
while(true)
{
nReceived = m_pSocket->read((char*) pBuffer + nReceivedTotal, 4096);
nReceivedTotal += nReceived;
if (nReceivedTotal >= uPacketSize)
break;
m_pSocket->waitForReadyRead(1000);
}
bb.assign(pBuffer, nReceivedTotal, 4096);
//bb.print(16, 4);
uint32_t uCrc32;
// просто забираем размер пакета
// забираем CRC32
bb >> uCrc32;
// и сравниваем с CRC32 полученных данных пакета
if (bb.crc32() != uCrc32)
throw Exception(EX_CT(Exception::CONNECTIONERROR, "CRC32 error"));
uint32_t uMessageType = bb.readUInt32();
vn::MessageWrap msgw = _pNode->messageFactory(uMessageType);
msgw.message()->Serialize(bb, false);
_pNode->receiveMessage(msgw);
return uMessageType;
}
В общем в заборе пакета я пользуюсь асинхронным методом m_pSocket->waitForReadyRead(1000);
в общем она похожа если бы я под виндой делал Sleep(1000)
просто ожидание, тормозов в общем не наблюдалось, но мы этот параметр минимизировали до 100 мс
Комментариев нет:
Отправить комментарий