重叠i/o也是一种异步i/o,同样也支持win32的其它对象,当然在winsock中可以发挥很大的作用.使用overlapped开发支持一定数量的socket的应用,效率是相当很高的.但就我个人的观点,在win32下做网络应用的开发,如果要支持100个以上的socket的话,还是考虑completion port i/o.要求支持socket最好是100个以下,我是基于这样考虑的:overlapped是通过多线程支持多socket的,如果开辟的线程太多的话,势必影响了系统的性能;completion port i/o可以更好支持大量的客户端.这两种在windows下具有高效率的i/o都不支持windows ce及其它平台.我在这里说一下在开发网络应用时什么时候用overlapped i/o 模型:准备在win98与以上版本或winnt3.1与以上版本做开发,且要求支持socket最好在100个以下.另外在串口开发中,考虑效率问题,有很多地方用到了overlapped i/o.
overlapped i/o执行步骤很清晰,只要下面三步: 【程序编程相关:笔记:vc6.0添加自定义用户消息的基本】 overlapped i/o主要涉及一个数据结构overlapped(winsock中是wsaoverlapped)与一个函数wsagetoverlappedresult(..). 【推荐阅读:用 API 作简繁体转换】表示,执行的是overlapped操作; 【扩展信息:开发基于Windows2000/XP的防】 (1) 应用先通过wsasend或wsarecv(不知道有没有其它的请求,我只用过这两个函数),注意要向两者转入wsaoverlapped参数, (2)在一个循环中,调用getoverlappedresult(..)等待操作完成,getoverlappedresult返回时,进行相应的处理,如处理数据; (3) 最后,还在(2)循环中,发送另外一个请求(wsasend或wsarecv),重复处理(2).(3)两步. 第一步中执行wsasend或wsarecv时,函数立即返回,得到socket_error信息且此时wsageterrorlast返回wsa_io_pending,说明调用已成功,winsock正在处理wsasend或wsarecv的请求.个人认为winsock在内部开辟了新的线程处理,应用程序不用管理多线程,达到异步的目的,有利于性能的提高.wsasend或wsarecv也可能返回"0",表示立即成功,这时,应用还是可以在wsagetoverlappedresult()处等待,处理过程与上面是一样的;也就是说我们不须要马上在wsasend或wsarecv进行相关的处理. wsagetoverlappedresult返回fasle且wsagetlasterror返回wsa_io_incomplete,表示处理正在进行中. 下面我给出支持单个socket及支持多个socket的console程序代码.先来看看支持单个socket的程序,考虑到代码简洁性,只给一个框架,同时不进行出错处理.... 下一页