文档介绍:以windows IOCP为例,complete线程在接收到数据后,应该马上将接收到的数据拷贝到解包缓存,然后立即发起一次新的WSARecv操作。然后再对解包缓存执行操作,解析出逻辑包。通常的方法是将数据拷贝到一个环形缓冲中,以减少数据的拷binBuffer)
{
m_binBuffer = new char[m_len];
m_binBufferPos = 0;
}
str = &m_binBuffer[m_binBufferPos];
unsigned int copySize = sizeRemain;
memcpy(&m_readBuf->m_buf[m_readPos],&m_binBuffer[m_binBufferPos],copySize);
m_readBuf = m_readBuf->m_next;
m_readPos = 0;
m_binBufferPos += copySize;
copySize = strLen - copySize;
memcpy(&m_readBuf->m_buf[m_readPos],&m_binBuffer[m_binBufferPos],copySize);
m_readPos += copySize;
}
m_dataRemain -= strLen;
Arrange();
return str;
}
const void* ReadBinary(unsigned short &len)
{
len = (unsigned int)Read<short>();
if(len == 0 || m_dataRemain < len)
{
return 0;
}
if(m_dataRemain < len)
return 0;//应提示错误,可能读包顺序与发包不一致了
void *bin;
unsigned int sizeRemain = m_readBuf->m_bufSize - m_readPos;
//当前buf还有多少有效数据
if(sizeRemain >= len)
{
bin = &m_readBuf->m_buf[m_readPos];
m_readPos += len;
}
else
{
if(!m_binBuffer)
{
m_binBuffer = new char[m_len];
m_binBufferPos = 0;
}
bin = &m_binBuffer[m_binBufferPos];
unsigned int copySize = sizeRemain;
memcpy(&m_readBuf->m_buf[m_readPos],&m_binBuffer[m_binBufferPos],copySize);
m_readBuf = m_readBuf->m_next;
m_readPos = 0;
m_binBufferPos += copySize;
copySize = len - copySize;
memcpy(&m_readBuf->m_buf[m_readPos],&m_binBuffer[m_binBufferPos],copySize);
m_readPos += copySize;
}