电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

C++缓存设计

C++缓存设计_第1页
1/32
C++缓存设计_第2页
2/32
C++缓存设计_第3页
3/32
以windows IOCP 为例,complete 线程在接收到数据后,应该马上将接收到的数据拷贝到解包缓存,然后立即发起一次新的WSARecv 操作。然后再对解包缓存执行操作,解析出逻辑包。通常的方法是将数据拷贝到一个环形缓冲中,以减少数据的拷贝次数。但在解出一个数据包之后,免不了还要将一个完整的数据包拷贝到另一个包缓存中,再将这个包提交给应用层处理.本文介绍一种,拼包方式,以避免从解包缓存copy数据到逻辑包中. 首先介绍逻辑包的组织结构: //RPacket 数据可跨越多个 buffer class RPacket { friend class Connection; friend class WPacket; public: RPacket(const RPacket &other):m_buf(other.m_buf),m_head(other.m_head),m_len(other.m_len) ,m_readPos(other.m_readPos),m_readBuf(0),m_binBuffer(0),m_binBufferPos( 0) { } ~RPacket() { if(m_binBuffer) delete[] m_binBuffer; } bool _nil() { return m_buf._nil(); } RPacket& operator = (const RPacket &other) { if(this == &other) return *this ; m_head = other.m_head; m_len = other.m_len; m_buf = other.m_buf; m_readPos = other.m_readPos; if(m_binBuffer) { delete[] m_binBuffer; m_binBufferPos = 0; } return *this ; } char ReadChar() { return Read(); } short ReadShort() { return Read(); } long ReadLong() { return Read(); } float ReadFloat() { return Read(); } double ReadDouble() { return Read(); } short ReadCmd() { return *(short *)&m_buf->m_buf[m_head+sizeOfLen]; } const char * ReadString() { unsigned int strLen = (unsigned int)Read(); if(strLen == 0 || m_dataRemain < strLen) { return 0; } unsigned int sizeRemain = m_readBuf->m_bufSize - m_readPos; //当前 buf 还有多少有效数据 char *str; if(sizeRemain >= strLen) { str = &m_readBuf->m_buf[m_readPos]; m_readPos += strLen; } else { if(!m_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],&...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部