首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

请问select函数等待超时的有关问题

2012-03-13 
请教select函数等待超时的问题先上代码:C/C++ codeint select_retstruct timeval timeout {3,0}int ma

请教select函数等待超时的问题
先上代码:

C/C++ code
    int select_ret;    struct timeval timeout = {3,0};    int maxfd = remote_sock_fd + 1;    fd_set sel_fds;    while(!process_exit){        //asynchronous        FD_ZERO(&sel_fds);        FD_SET(remote_sock_fd,&sel_fds);        printf("Starting select() \n"); // 打印select之前的断点        select_ret = select(maxfd,&sel_fds,NULL,NULL,&timeout);        switch(select_ret){            case 0:                printf("select() timeout \n");                break;            case -1:                printf("Error occurs when select() \n");                break;            default:                if(FD_ISSET(remote_sock_fd,&sel_fds)){                    recv_from_remote();                }        }


很简单的一段代码,用select判断socket套接字是否有数据读,
问题描述如下:代码里的select超时时间是3秒,测试过程中不向接受段发送任何数据,程序在终端显示如下:

Starting select()
select() timeout
Starting select()
select() timeout
Starting select()
select() timeout
Starting select()
select() timeout
...循环显示

第一次打印“Starting select()” 和 “select() timeout” 之间相差了3秒,和预想的一样;
之后的“Starting select()” 和 “select() timeout”就开始没有时间间隔了,打印出“Starting select()”就立刻执行到“select() timeout”,这就和预想的情况不一样了,为什么之后的select()就没有3妙的间隔了呢?

[解决办法]
timeout变量的值在第一次select以后被系统改变了。。不再是3秒。。。你应该用一个临时变量来传递timeout的值。。作为select的参数。。这样。。每次重新select以前先把那个临时变量的值赋为timeout的值
[解决办法]
select_ret = select(maxfd,&sel_fds,NULL,NULL,&timeout);

select会修改sel_fds 及 timeout 参数
在循环中为这两个参数赋值就可以了

热点排行