WEB开发网
开发学院软件开发VC 一个简单的完成端口(服务端/客户端)类 阅读

一个简单的完成端口(服务端/客户端)类

 2009-02-25 19:59:50 来源:WEB开发网   
核心提示: 2.2.1 为什么使用IOCP?通过使用IOCP,我们可以解决“每个客户端占用一个线程”的问题,一个简单的完成端口(服务端/客户端)类(3),通常普遍认为如果软件不能运行在真正的多处理器机器上,执行能力会严重降低,很重要的一点是:该数据将会被锁定并不允许从物理内存中

2.2.1 为什么使用IOCP?

通过使用IOCP,我们可以解决“每个客户端占用一个线程”的问题。通常普遍认为如果软件不能运行在真正的多处理器机器上,执行能力会严重降低。线程是系统资源,而这些资源既不是无限的,也不是低价的。

IOCP提供了一种方式来使用几个线程“公平的”处理多客户端的输入/输出。线程被挂起,不占用CPU周期直到有事可做。

2.3 什么是IOCP?

我们已经看到IOCP只是一个线程同步对象,类似于信号灯,因此IOCP并不是一个复杂的概念。一个IOCP对象与几个支持待定异步I/O请求的I/O对象绑定。一个可以访问IOCP的线程可以被挂起,直到一个待定的异步I/O请求结束。

3 IOCP是怎样工作的?

要使用IOCP,你必须处理三件事情,绑定一个socket到完成端口,创建异步I/O请求,并与线程同步。为从异步I/O请求获得结果,如那个客户端发出的请求,你必须传递两个参数:CompletionKey参数和OVERLAPPED结构。

3.1 关键参数

第一个参数:CompletionKey,是一个DWORD类型的变量。你可以传递任何你想传递的唯一值,这个值将总是同该对象绑定。正常情况下会传递一个指向结构或类的指针,该结构或类包含了一些客户端的指定对象。在源码中,传递的是一个指向ClientContext的指针。

3.2 OVERLAPPED参数

这个参数通常用来传递异步I/O请求使用的内存缓冲。很重要的一点是:该数据将会被锁定并不允许从物理内存中换出页面(page out)。

3.3 绑定一个socket到完成端口

一旦创建完成一个完成端口,可以通过调用CreateIoCompletionPort函数来绑定socket到完成端口。形式如下:

BOOL IOCPS::AssociateSocketWithCompletionPort(SOCKET socket, HANDLE hCompletionPort, DWORD dwCompletionKey)
{

HANDLE h = CreateIoCompletionPort((HANDLE) socket, hCompletionPort, dwCompletionKey, m_nIOWorkers);

return h == hCompletionPort;
}

上一页  1 2 3 4 5 6 7 8  下一页

Tags:一个 简单 完成

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接