给自己做个笔记。
一:select模型
二:WSAAsyncSelect模型
三:WSAEventSelect模型
四:Overlapped I/O 事件通知模型
五:Overlapped I/O 完成例程模型
六:IOCP模型
一:select模型
这个模型比较简单,也就是搞清楚select函数就好。
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
关键就是三个socket集合,readfds、writefds、errorfds。你把这三个队列分别放进去你想要关注的socket,select函数会去一个一个的看这些socket,检查readfds集合里面哪些有read事件,writefds哪些有write事件,当timeout或者前面三个集合有I/O事件时,则返回。
二:WSAAsyncSelect模型
主要由WSAAsyncSelect函数实现,把需要处理的多个socket都利用这个函数设置为消息通知的模型,这样每当有I/O事件产生时,会向指定窗口发送消息。我们在接收消息的窗口函数中,能够获得发生I/O事件的socket句柄,以及具体事件类型,再作相应处理即可。此模型需要依赖windows的消息驱动机制。
三:WSAEventSelect模型
其实原理与第二种类似,只是不使用windows的消息驱动机制,使用的是事件(事件和消息的区别我也没搞太清楚。。)。针对每一个socket,建立一个事件,然后使用WSAEventSelect函数将事件与Socket相关联。多个socket时,利用WSAWaitForMutipleEvents函数,在多个事件上等待,当有事件受信或者超时则返回,之后通过WSAEnumNetworkEvents函数查看每个socket上有什么I/O事件产生了,做相应处理。
四:Overlapped I/O 事件通知模型
这个模型与上一种类似,也是使用了事件通知模型,它的优势在于,通过重叠I/O与socket想关联,能够使得socket操作的数据直接能够放到你预先定义的缓冲区当中去,这样就节省了你每次收到事件后去复制缓冲区数据的时间。以邮局送信打个比方,每当你收到一封信,以前的做法是给你一个短信提示,你自己要去邮局取;重叠I/O的做法是:你跟邮局说好了,预先在家门口放了一个你自己的信箱,当你收到短信提示的时候,信件已经在你的信箱里面了;http://blog.csdn.net/PiggyXP/archive/2004/09/23/114908.aspx讲得相当好;
五: Overlapped I/O 完成例程模型
暂时还没怎么看过这个模型。。
六:IOCP模型
IOCP模型,一般也会利用重叠I/O的方法,但是它的核心思想是,系统会维护一个完成端口队列,大量的socket句柄与完成端口相关联之后,工作线程会从完成队列中取得该socket,以及相应完成的I/O事件,缓冲区数据等等,再做相应的操作即可。IOCP模型一般都会与线程池、内存池等结合起来。
关于IOCP的粘包现象;以及发送数据时,对overlapped中的数据是否发送完全(比如数据包较大);针对这些现象怎么处理较好等,我现在都还没搞清楚。。。关于IOCP模型,http://hi.baidu.com/winnyang/blog/item/ba0ed73de8356fe73c6d97c5.html讲得ms还不错