没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论































以 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(oth
er.m_len)
,m_readPos(other.m_readPos),m_readBuf(0),m_bin
Buffer(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<char>();
}
short ReadShort()
{
return Read<short>();
}
long ReadLong()
{
return Read<long>();
}
float ReadFloat()
{
return Read<float>();
}
double ReadDouble()
{
return Read<double>();
}
short ReadCmd()
{
return *(short*)&m_buf->m_buf[m_head+sizeOfLen];
}
const char* ReadString()
{
unsigned int strLen = (unsigned
int)Read<short>();
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],&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;
}
m_dataRemain -= len;
Arrange();
return bin;
}
private:
template <typename T>
T Read()
{
if(m_readBuf._nil())
return 0;

unsigned int TypeSize = sizeof(T);
if(m_dataRemain < TypeSize)
return 0;//应提示错误,可能读包顺序与发包不一致了
T ret = 0;
unsigned int sizeRemain = MAX_PACKET_SIZE -
m_readPos;//当前 buf 还有多少有效数据
if(sizeRemain >= TypeSize)
{
ret = *(T*)&m_readBuf->m_buf[m_readPos];
m_readPos += TypeSize;
}
else
{
//数据跨越了两个数据块
char tmp[sizeof(T)];
char *ptr = tmp;
unsigned int copySize = sizeRemain;
memcpy(&m_readBuf-
>m_buf[m_readPos],ptr,copySize);
ptr += copySize;
copySize = TypeSize - copySize;
m_readBuf = m_readBuf->m_next;
m_readPos = 0;
memcpy(&m_readBuf-
>m_buf[m_readPos],ptr,copySize);
m_readPos += copySize;
ret = *(T*)&tmp[0];
}
m_dataRemain -= TypeSize;
Arrange();
return ret;
}
RPacket(rptr<buffer> &buf,unsigned short head)
:m_buf(buf),m_readBuf(buf),m_head(head),m_readPos
(head+sizeOfLen+cmdlen)
,m_len(0),m_dataRemain(0),m_binBuffer(0),m_binBuf
ferPos(0)
{
if(!m_buf._nil())
剩余28页未读,继续阅读
资源评论


「已注销」
- 粉丝: 3
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 网络环境下计算机在图书信息管理中的应用.docx
- 中国智能音箱市场分析:销量增长明显-推动智能家居技术和模式新突破.docx
- 上半信息完整项目管理师参考答案及解析.doc
- 计算机网络系统安全探析.docx
- 配电自动化系统实用化运维技术的研究.docx
- MATLAB编程与工程应用——第6章-MATLAB数据分析与多项式计算.ppt
- 光纤通信工程设计中的应用探究.docx
- 县通信公司月份工作总结精选模板.doc
- 互联网+背景下高职院校多元化创新创业教育初探.docx
- 大数据时代图书馆信息资源建设策略研究.docx
- Xlsx表格数据简易数据库服务程序-支持xlsx文件作为数据源并提供命令行操作界面-用于快速查询和批量修改多个表格中的特定字段-包含find命令高级语法和范围语句块功能-基于Pyt.zip
- 浅析管理沟通在项目管理工作中的应用.doc
- PLC的三自由度机械手控制系统设计方案.doc
- 基于单片机的水箱液位控制与报警系统的方案设计书.doc
- 项目管理从稚嫩到成熟到卓越.docx
- 基于单片机的电子琴机器音乐播放器的方案设计书--开题报告.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
