WinSock IOCP 模型总结(附一个带缓存池的IOCP类)

前言

由于篇幅原因,本文假设你已经熟悉了利用Socket进行TCP/IP编程的基本原理,并且也熟练的掌握了多线程编程技术,太基本的概念我这里就略过不提了,网上的资料应该遍地都是。

IOCP全称IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的Windows I/O模型,它可以自动处理I/O操作,并在I/O操作完成后将完成通知发送给用户。本文主要介绍基于IOCP的网络I/O操作(即socket的Accept、Send、Recv和Close等)。Windows提供了6种网络通信模型,分别是:

  1. 阻塞模型:accept、recv和send操作会阻塞线程,直到操作完成,极其低效。
  2. 选择(select)模型:轮询方式探测socket上是否有收发的操作,再调用accept、recv和send操作,核心是select()函数,比阻塞模型高效一点,缺点是一次只能探测64个socket,需要手动调用recv和send进行收发数据。
  3. 异步选择(WSAAsyncSelect)模型:利用Windows窗口消息机制响应socket操作,即当socket上有Accept、Send、Recv和Close操作发生时发送一条自定义消息给指定窗口,在窗口中响应socket操作,需要手动调用recv和send进行收发数据。与select模型相比,不需要轮询方式探测socket,socket上有操作发生即发送通知给窗口窗口,缺点是需要一个窗口对象处理socket的消息,需要手动调用recv和send进行收发数据。
  4. 事件选择(WSAEventSelect)模型:原理基本同WSAAsyncSelect模型,但是不需要窗口,利用事件(Event)机制来获取socket上发生的I/O操作。缺点是一次只能等待64个事件,需要手动调用recv和send进行收发数据。
  5. 重叠 I/O(Overlapped I/O)模型:利用重叠数据结构(WSAOVERLAPPED),一次投递一个或多个Winsock I/O请求,等这些请求完成后,应用程序会收到通知,用户可以直接使用I/O操作返回的数据。简单的说:投递一个WSASend请求和接受数据的缓冲区,系统在接收完成后在通知用户,用户可以直接收到的数据,WSASend操作同理。有两种方式来管理重叠IO请求的完成情况(就是说接到重叠操作完成的通知):

    1). 事件对象通知(event object notification)

    2). 完成例程(completion routines) ,注意,这里并不是完成端口

    优点是不用管收发过程,直接提供(发送时)/使用(接收时)数据。缺点是实现略复杂。
  6. IOCP(I/O Completion Port)模型:本文要介绍的模型,见下文。

以上I/O模型由1-6难度依次提高,性能也相应地依次提高。

(未完待续……)

相关推荐