Chinaunix

标题: select函数超时问题 [打印本页]

作者: whyliyi    时间: 2011-01-08 00:06
标题: select函数超时问题
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);

这又是为何?
作者: whyliyi    时间: 2011-01-08 16:09
哥们儿们,怎么没有哦回答一下呢?
作者: luckydone    时间: 2011-01-11 00:06
代码不完整,一般是循环,每次select结束,都要重新设置时间后再进入。时间设为NULL就没有超时退出select,要一直等到读集合中有数据可读是才退出
作者: whyliyi    时间: 2011-01-11 10:00
回复 3# luckydone


    恩,是的,我将FD_SET放到循环体内,每一次select结束都重新填充fdset。
作者: kuok2000    时间: 2011-01-11 11:44
返回零就是表示超时。LZ
作者: whyliyi    时间: 2011-01-11 22:45
回复 5# kuok2000


    恩,对!

超市过后所有的描述符集和超时时间都被设为0 ,所以都需要重新添加描述符集,超时时间也需要重新赋值。
而超时时间使用NULL时,永远不会超时
作者: kuok2000    时间: 2011-01-14 12:33
select函数是判断文件描述是否发生变换,如果发生变化或超时就会返回。LZ可以试试重新清空fdset让select函数重新检查文件描述的状态是否可读或可写什么的。详细的是还是man 2 select查看。
作者: yang-kiki    时间: 2014-08-14 13:40
whyliyi 发表于 2011-01-11 22:45
回复 5# kuok2000


正解,timeout每次select之前都要重新赋值。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2