|
先来看几个底层结构:
// 重叠结构类
class COverLapped
{
// 变量定义
public:
WSABUF m_WSABuffer; // 数据指针
OVERLAPPED m_OverLapped; // 重叠结构
const enOperationType m_OperationType; // 操作类型
// 函数定义
public:
// 构造函数
COverLapped(enOperationType OperationType);
// 析构函数
virtual ~COverLapped();
// 信息函数
public:
// 获取类型
enOperationType GetOperationType() { return m_OperationType; }
};
// 接收重叠结构
class COverLappedSend : public COverLapped
{
// 数据变量
public:
BYTE m_cbBuffer[SOCKET_BUFFER]; // 数据缓冲
// 函数定义
public:
// 构造函数
COverLappedSend();
// 析构函数
virtual ~COverLappedSend();
};
// 重叠结构模板
template <enOperationType OperationType> class CATLOverLapped : public COverLapped
{
// 函数定义
public:
// 构造函数
CATLOverLapped() : COverLapped(OperationType) {}
// 析构函数
virtual ~CATLOverLapped() {}
};
先复习下基础,Windows下的网络模型有很多种,这里只拿出三种来说:
EventSelect:基于信号机制,以socket为单位绑定信号量,当socket上有指定的事件发生时激发信号,然后查询事件处理事件重设事件,继续在信号量上等待。其实也是在伯克利select模型上的换不换药的加强。
OverLapped:分两种工作模式完成回调,和完成事件。重叠IO监视每次操作,每次IO都绑定一个重叠对象,当操作完成以后激发信号或者调用回调。
IOCP:和overlapped类似,不过结果经过了Windows的预处理以队列的形式挂在完成端口上
|
|