网络游戏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
}
阅读全文
0 0
- 网络游戏NetPacket包与sendBuffer
- 网络游戏程序员须知 收包与发包
- 网络游戏程序员须知 收包与发包
- 网络游戏程序员须知 收包与发包
- 网络游戏程序员须知:收包与发包
- 网络游戏程序员须知 收包与发包
- 网络游戏程序员须知 收包与发包
- 网络游戏粘包处理
- 网络游戏中消息包结构
- 专栏:网络游戏与中国特色
- .net 与网络游戏
- 基督徒与网络游戏
- 网络游戏数据传输:粘包的处理
- VC++网络游戏建模与实现
- 开源软件与网络游戏
- 《网络游戏核心技术与实战》读书笔记
- 网络游戏
- 网络游戏
- html5内置音频 <audio>
- angular中的表达式
- TensorFlow基础 介绍
- 使用RestFulWebService根据人员登录名获取人员信息
- java 复杂链表的复制
- 网络游戏NetPacket包与sendBuffer
- SQL Server
- Zobrist Hash算法的基础:按位异或运算的性质
- C++ 数组长度不能为0
- 算法 分金币
- ArrayList
- 关于微信红包简单算法 PHP Edition
- post和get的区别
- 基于AJAX的文件上传显示进度条实现