一个简单的完成端口(服务端/客户端)类
2009-02-25 19:59:50 来源:WEB开发网使用异步I/O调用时,我们必须提供私有的缓冲区供I/O操作使用。
当我们将帐号信息放入分配的缓冲供使用时有许多情况需要考虑:
.分配和释放内存代价高,因此我们应重复使用以及分配的缓冲(内存),
因此我们将缓冲保存在列表结构中,如下所示:
// Free Buffer List..
CCriticalSection m_FreeBufferListLock;
CPtrList m_FreeBufferList;
// OccupiedBuffer List.. (Buffers that is currently used)
CCriticalSection m_BufferListLock;
CPtrList m_BufferList;
// Now we use the function AllocateBuffer(..)
// to allocate memory or reuse a buffer.
.有时,当异步I/O调用完成后,缓冲里可能不是完整的包,因此我们需要分割缓冲去取得完整的信息。在CIOCPS类中提供了SplitBuffer函数。
同样,有时候我们需要在缓冲间拷贝信息,IOCPS类提供了AddAndFlush函数。
. 众所周知,我们也需要添加序号和状态(IOType 变量, IOZeroReadCompleted, 等等)到我们的缓冲中。
. 我们也需要有将数据转换到字节流或将字节流转换到数据的方法,CIOCPBuffer也提供了这些函数。
以上所有问题都在CIOCPBuffer中解决。
3.8 如何使用源代码
从IOCP继承你自己的类(如图3),实现IOCPS类中的虚函数(例如,threadpool),
在任何类型的服务端或客户端中实现使用少量的线程有效地管理大量的连接。
3.8.1 启动和关闭服务端/客户端
调用下面的函数启动服务端
BOOL Start(int nPort=999,int iMaxNumConnections=1201,
int iMaxIOWorkers=1,int nOfWorkers=1,
int iMaxNumberOfFreeBuffer=0,
int iMaxNumberOfFreeContext=0,
BOOL bOrderedSend=TRUE,
BOOL bOrderedRead=TRUE,
int iNumberOfPendlingReads=4);
更多精彩
赞助商链接