完成端口

高并发服务器的实现方式一般有三种:

1.线程池

2.select机制

3.完成端口

完成端口模型创建过程

1.创建一个完成端口(HANDLE g_CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0)))

2.创建一个服务工作线程A,其职责循环调用GetQueuedCompletionStatus(GetQueuedCompletionStatus(g_CompletionPort, &BytesTransferred, (LPDWORD)&pCliData, (LPOVERLAPPED *)&lpOverLapped, INFINITE))从I/o中获取数据,进行处理。

3.创建接收客户端连接线程B。

4.连接线程循环等待客户端的连接,并使用CreateIoCompletionPort(CreateIoCompletionPort((HANDLE)Accept, g_CompletionPort, (DWORD)pClientData, 0))将客户端socket和完成端口关联起来,然后发送wsasend或wsarecv,由于是异步操作直接返回,其余操作留给windows执行。

5.服务工作线程A的GetQueuedCompletionStatus取到数据马上返回,经过处理,发送wsasend或wsarecv继续循环接收数据进行处理。

6.接收客户端线程B就不停的接收,服务工作线程就不停的取数据进行操作。

7.结束不用了的,关闭完成端口PostQueuedCompletionStatus(PostQueuedCompletionStatus(g_CompletionPort, 0, (DWORD) NULL, NULL)),各个线程。

 

你可能感兴趣的:(完成端口)