怎样使用winsock i/o多路复用??????
socket编程时,如果不使用阻塞方式,windows提供了几种i/o多路复用方式:
select、WSAAyncSelect、WSAEventSelect、可重叠i/o、完成端口等
我的理解:这些i/o方式好像都是对socket i/o集中管理(至少select、WSAAyncSelect、WSAEventSelect是这样吧?),可能的应用方式是,一个线程管理多个i/o,使用 **Select 扫描,可读则读取,可写则有数据就写(我觉得集中管理时,读写操作不在这里操作的话,读写事件好像没有什么好的方式能安全地发布出去,如果其他线程来读写操作的话,可能读写时情况已经变化了)
如果如我上面理解,那么我们面临很多问题:
1、socket队列的管理,如何删除,如何添加,好像也只能放在集中管理线程中了
2、循环扫描的效率,参见这位兄弟的疑问:
http://www.csdn.net/Develop/article/27/27235.shtm
看他的[4.1 对套接字数组扫描的效率问题]
3、也是效率问题。如果读写也集中管理:
1、读可以此时就读到缓冲队列中,但是多个socket集中管理读取数据都在一个线程
里,是不是很合理?
2、写的事件处理:可能用户很多时间没有数据可写,那事件扫描的时候老是有可写事
件,于是我们不断地察看用户发送队列中有没有待发送数据,这样不是很浪费时
间?
4、读写的集中管理,使得很多“用户”操作客观上成了“异步”形式,例如用户发送一个
数据包,可能接着就想检查结果,i/o成功了没有等等,集中管理只能丢到队列中,然
后可能过一段时间还得来扫描发送队列数据包是不是在指定的时间内送出去了,还要扫
描接受到了那些数据,然后分发处理,这样是增加了复杂度?
以上是我对windows提供的几种i/o多路复用方式的疑问(关于读写的集中管理,可能是我的个人想法,也许并不一定要放在扫描线程中,可能有其他的解决方法)
请大家谈谈自己是如何使用i/o多路复用的,希望能得到大家的实际应用方式,而不是设想的东西
我和这位兄弟(http://www.csdn.net/Develop/article/27/27235.shtm)非常希望能得到一种完美的、“正宗”的方法 :)
谢谢大家的解答
(请大家不要发无关的话,这样便于大家阅读)