关于select和WSAEventSelect

土豆吞噬者 2010-08-03 06:03:19
问个问题,就是我采用select模型或者WSAEventSelect模型来管理套接字,有以下不解之处。

1.选择和Wait都会阻塞线程,所以这2种模型查看是否可读,可写等都是在子线程里进行的,如果发现可读,可写的情况,应该怎么通知主线程呢,PostMessage我想过,但是被否定了,因为这个只适合有窗口句柄的,而且如果要使用这种方法,势必要在主窗体里做消息处理,那样这个类就必须依赖于主窗体,这样肯定不可以。我想实现的效果是当发现可读,可写的情况时主线程会自动候调用类里面的一个方法,注意是在主线程里调用,不能阻塞子线程。

2.超时的检查,对于select的最后一个参数以及wait的等待时间,我有疑问,如果每个套接字的超时时间都不一样,那该如何判断超时了?
...全文
274 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆吞噬者 2010-08-03
  • 打赏
  • 举报
回复
1.如何通知主线程执行代码 除了PostMessage
2.在select线程里处理I/O是否会影响其他套接字。
土豆吞噬者 2010-08-03
  • 打赏
  • 举报
回复
那么就是说在线程里处理I/O?
打个比方 当我收到数据时候我要把数据显示到主窗体上

Select线程开始

Select....
if 发现有可读的Socket
{
读出数据
显示到主窗体(如果这个显示主窗体换成别的过程,比如说3D渲染,那岂不是要在这里停留很长时间才会进行下一次的select?还有就是在这里给主窗体画画是不安全的吧)
}
Select线程结束
Eleven 2010-08-03
  • 打赏
  • 举报
回复
1. 看你的传递的参数,以WSAEventSelect模型为例,WSAEventSelect相关联的事件对象signal的话,WSAWaitForMultiObject函数返回,然后进行轮询得到signal的事件对象,通过WSAEnumNetworkEvents来得到相关的网络事件然后进行处理。select模型,是使用select函数,查看相关的fd_set集合,如果有事件发生,select返回发生网络事件的所有套接字数量的总和,然后将原来的fd_set集合与select处理过的fd_set集合比较,确定哪些套接字有未决I/O,然后进一步处理这些I/O。如果超过了时间限制,返回0。

2. select设置超时时间是针对所有非空的fd_set集合的,即所有的集合都使用相同的超时值。。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧