免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6079 | 回复: 5
打印 上一主题 下一主题

select多个socket的问题(和一般的检测多个socket不同) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-07 16:20 |只看该作者 |倒序浏览
我遇到一个问题,搜索了没找到解决办法,需要大家帮助,谢谢!

我维持着一个socket数组,需要使用select判断这些socket的状态。一般的需求是有任何一个socket可读,或者可写,或者超时,select函数就返回。我现在需要的是,一个socket变为可读或者可写select不返回,而是要直到所有的socket的状态都改变了,或者到了超时的时候,select才返回。这时候,我再分别检测每个socket的状态。

我开始的想法是另外建立一个和socket一样大的数组flag,每select返回一次,我就在flag对应的位置做一个标记,再去掉这个socket,重新select一次,这次的超时时间是总超时时间减去上次select的时间和。直到所有的flag都做了标记,或者select多次的时间和达到了超时时间为止。不过这里遇到的问题是,select返回之后,没法得到这次阻塞了多久。

我在windows下面写代码比较多,linux下面的代码不够熟悉,谢谢大家了!

论坛徽章:
0
2 [报告]
发表于 2008-07-07 16:50 |只看该作者
select 可以得到阻塞时间 : man select.

论坛徽章:
0
3 [报告]
发表于 2008-07-07 20:21 |只看该作者

回复 #1 撒哈拉里的鱼 的帖子

windows的select和linux的select貌似区别不大
第一个参数有区别
文件fd和套接字fd有区别
系统io不能作用在socket上

还有谁补充

论坛徽章:
0
4 [报告]
发表于 2008-07-07 20:34 |只看该作者
select 可以得到阻塞时间 : man select.

貌似不是所有平台都这样吧?

论坛徽章:
0
5 [报告]
发表于 2008-07-07 20:52 |只看该作者
我在freebsd上man了一下select,不过没看到可以得到本次select阻塞的时间。
另外,我想到这么个办法,所有的socket都建立了之后,我sleep 4秒钟,然后再select一下,超时为1秒,这样不知道是否可行。当select返回时,状态改变了的socket,就是我想要的。

论坛徽章:
0
6 [报告]
发表于 2008-07-07 21:22 |只看该作者
仔细看了下,是可以得到时间的,不过是linux平台,select返回的时候,会改写timeout参数,freebsd不行。

[ 本帖最后由 撒哈拉里的鱼 于 2008-7-7 21:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP