免费注册 查看新帖 |

Chinaunix

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

select函数超时问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-08 00:06 |只看该作者 |倒序浏览
int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);
编程出现问题
首先,设置超时时间
struct timeval overtime;
overtime.tv_sec = 2;
overtime.tv_usec = 0;

ret = select(max, &fdset, NULL, NULL, &overtime);

用TCP连接,连接套接字已经加入fdset中,但是运行程序后,在第一个2秒超时后,ret根本不等待超时,
一直不停的返回0.以至于连接上了也无法发送数据。

这是为何??

当将overtime换成NULL后,程序就能正常运行。
ret = select(max, &fdset, NULL, NULL, NULL);

这又是为何?

论坛徽章:
0
2 [报告]
发表于 2011-01-08 16:09 |只看该作者
哥们儿们,怎么没有哦回答一下呢?

论坛徽章:
0
3 [报告]
发表于 2011-01-11 00:06 |只看该作者
代码不完整,一般是循环,每次select结束,都要重新设置时间后再进入。时间设为NULL就没有超时退出select,要一直等到读集合中有数据可读是才退出

论坛徽章:
0
4 [报告]
发表于 2011-01-11 10:00 |只看该作者
回复 3# luckydone


    恩,是的,我将FD_SET放到循环体内,每一次select结束都重新填充fdset。

论坛徽章:
0
5 [报告]
发表于 2011-01-11 11:44 |只看该作者
返回零就是表示超时。LZ

论坛徽章:
0
6 [报告]
发表于 2011-01-11 22:45 |只看该作者
回复 5# kuok2000


    恩,对!

超市过后所有的描述符集和超时时间都被设为0 ,所以都需要重新添加描述符集,超时时间也需要重新赋值。
而超时时间使用NULL时,永远不会超时

论坛徽章:
0
7 [报告]
发表于 2011-01-14 12:33 |只看该作者
select函数是判断文件描述是否发生变换,如果发生变化或超时就会返回。LZ可以试试重新清空fdset让select函数重新检查文件描述的状态是否可读或可写什么的。详细的是还是man 2 select查看。

论坛徽章:
0
8 [报告]
发表于 2014-08-14 13:40 |只看该作者
whyliyi 发表于 2011-01-11 22:45
回复 5# kuok2000


正解,timeout每次select之前都要重新赋值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP