网络游戏NetPacket包与sendBuffer

来源:互联网 发布:北航人工智能研究生 编辑:程序博客网 时间:2024/06/07 08:35


//m_parseLen 表示当前netPacket解析到哪里了
//m_sendLen表示buffer已经发出去的到哪里了
//buffer总的长度 m_sendBufferSize 32767,很多包写到buffer里面,发送是以buffer为单位,往出发
void TcpConnection:encodeSendBuffer()
{
//要发送的NetPacket放入Buffer里面
bool bPolicy = false;
if(m_sendPacket == bull)
m_sendPacket = m_sendList.pop();
while(m_sendPacket != NULL)
{
int len = (min)(m_sendPacket->getBuffer()-7+m_parseLen,m_sendBufferSize-4-m_sendLen);//当前消息包还剩下的长度,buffer剩下可填充的长度
if(len<=0)
return;
memcpy(m_sendBuffer+m_sendLen+4,m_sendPacket->getBuffer()-7+m_paseLen,len);//从消息包起始位置开始+parseLen之后的东西拷贝到buffer里面
//每个包每个包 在buffer里面是间隔4个字节的?干什么用?
m_parseLen+=len;//放进去了len,所以parseLen+=len
if(m_parseLen == m_sendPacket->size())
{
//说明一个完整的包成功放进了buffer
m_sendListByteLen -= m_sendPacket->size();
m_sendPacket->destroy();//释放空间,因为消息包内容已经拷贝到buffer了
m_sendPacket = m_sendList->pop();//重新取一个消息包,继续把内容往buffer里面放
m_parseLen = 0;//下个消息包肯定是从头处理的
}


m_sendLen += len;//要发送长度加上len
if(m_sendLen == m_sendBufferSize-4)
break;//如果buffer里面放满了就(不再往buffer里面放了)退出去 压缩
//因为buffer里面消息包和消息包之间相距4个字节,所以如果剩下四个字节那么就不要放了。

}
//走到这里,说明buffer里面塞满了 小于4,那么会在上面的min取len的地方直接return,也就是不会再塞,会发了再塞
//因为上面取len 用min,所以长度最后最多剩下4,不够了会break出while

if(m_sendLen > 0)
{
if(m_sendLen<=300)
{
//buffer里面每个消息包都会在前面空出4个字节,因此buffer总的前面也有4个空的字节
//前两个字节写入总的长度 后两个字节写入0
m_sendLen+=4;
*((int16_t*)(m_buffer)) = m_sendLen;
*((int16_t*)(m_buffer+2)) = 0;
}
else
{
//buffer长度一般都大于300 所以都是走的这里
char szCompress[32767-4] = {};//buffer总长度就是这么长,4个空的,后面的长度就是这个数值
int compressLen = Zip::compress(szCompress,32767-4,m_Buffer+4,m_sendLen);
//把buffer里面的内容压缩放入szCompress这个char型的数组里面
//szCompress表示首地址
if(compressLen>0 && compressLen<32767-4)
{
//bufer压缩后的内容重新放进来
memcpy(m_buffer+4,szCompress,compressLen);//数组开始往后压缩长度的内容全部覆盖放入buffer,前4字节空出来
*((int16_t*)(m_buffer)) = compressLen+4;//前两字节放入当前压缩总长度+4,
*((int_26*)(m_buffer+2)) = m_sendLen;
m_sendLen = compressLen+4; //compressLen+4是当前buffer里面有效的长度,需要发送出去的
}
else
{
//压缩后长度+4会大于buffer的长度
m_sendLen += 4;
//出错
}
}


}


}


Zip:;compress(char* dest,long destlen,char* src,long srclen)
{
//把从src开始srclen长度的东西压缩到dest地址开始destlen长度的空间里面去 返回值也是destlen
}
原创粉丝点击