怎样使用winsock i/o多路复用??????

fangcheng 2004-05-03 03:25:29
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)非常希望能得到一种完美的、“正宗”的方法 :)

谢谢大家的解答
(请大家不要发无关的话,这样便于大家阅读)
...全文
258 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zhuhuidong 2004-07-21
服务器向已建立连接的若干个客户机主动发送数据,用完成端口、重叠I/O怎么实现?
  • 打赏
  • 举报
回复
sharkhuang 2004-05-08
select是系统调用!系统函数是do_select!
如果不是系统完成那你怎么轮训!while?那将是死循环!
而系统可以用唤醒!在没有时间的时候会是idel的.
  • 打赏
  • 举报
回复
sevencat 2004-05-08
选用哪种模型一般来说可能要根据不同的服务器要求和平台来确定,

要是对效率要求比较高的话,一般都要用到特定平台的特定函数操作。
可移植性一般就意味着效率低。

在WIN平台用完成端口的话性能还是很不错的,正好还省掉了一个线程池的开销。

假如客户端比较少的话,客户处理基本不阻塞的话,用select效率也不错。
  • 打赏
  • 举报
回复
sevencat 2004-05-08
1、socket队列的管理,如何删除,如何添加,好像也只能放在集中管理线程中了
//重新扫描事件的时候进行处理
2、循环扫描的效率,参见这位兄弟的疑问:
http://www.csdn.net/Develop/article/27/27235.shtm
看他的[4.1 对套接字数组扫描的效率问题]
//确实效率比较那个
3、也是效率问题。如果读写也集中管理:
1、读可以此时就读到缓冲队列中,但是多个socket集中管理读取数据都在一个线程
里,是不是很合理?//合理
2、写的事件处理:可能用户很多时间没有数据可写,那事件扫描的时候老是有可写事
件,于是我们不断地察看用户发送队列中有没有待发送数据,这样不是很浪费时
间?
//这个时候应该是每次事件扫描之前查看有没有待发数据,有的话才把这个连接的可写事件列入扫描项目。

4、读写的集中管理,使得很多“用户”操作客观上成了“异步”形式,例如用户发送一个
数据包,可能接着就想检查结果,i/o成功了没有等等,集中管理只能丢到队列中,然
后可能过一段时间还得来扫描发送队列数据包是不是在指定的时间内送出去了,还要扫
描接受到了那些数据,然后分发处理,这样是增加了复杂度?
//假如用户急需知道结果的话,可以在发送缓冲区的地方加个回调,每个缓冲区发送后调用回调函数。
  • 打赏
  • 举报
回复
UDX协议 2004-05-03
我的理解是,WSAAyncSelect、WSAEventSelect、可重叠i/o、完成端口都是基于winsock内核工作的。在windows下,他是紧密结合os,网ka驱动的,能够最大限度的发挥硬件的能力。重叠i/o、完成端口可以说是windows成功的典范,而楼主所引用的url只是一种软件上的模似多路复用其效率是没有WSAAyncSelect、WSAEventSelect、可重叠i/o、完成端口高的,不过作为一般的应用还是可以的。

这只是针对windows下。
  • 打赏
  • 举报
回复
相关推荐
发帖
网络编程
加入

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2004-05-03 03:25
社区公告
暂无公告