windows下多种套接字模型的理解

     给自己做个笔记。

      一: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还不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值