суббота, 17 сентября 2011 г.

сетевая часть recv

даю реально рабочий кусок из проекта.
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 мс

Комментариев нет:

Отправить комментарий