目的:设定一个时间值,如果超出这个时间值,例如60秒,Select函数退出
现象:第一次可以等待60秒后,退出Select函数,但是第二次进入Select函数后,瞬间就会退出,根本不会等待60秒,屏幕上“time is out"不间断的出现部分代码:
//设置超时时间
timeval *ptimeval = new timeval;
ptimeval.tv_sec = 60;
ptimeval.tv_usec = 10;m_Exit = FALSE;while( m_Exit != TRUE)
{
select( maxfds, &readfds, &writefds, &exceptfds,ptimeval);
cout << “ time is out…”<< endl;  
);
我想了很久也闹不明白是怎么回事,请各位大侠出手相救!

解决方案 »

  1.   

    可能你要等待的几个文件描述符的状态发生变化了吧,好像这个问题是LINUX的,把你完整源码贴上来,看看
      

  2.   

    把readfds,writefds,exceptfds清零,重新写入一下试试.
      

  3.   

    如 Bird1945所说while( m_Exit != TRUE)
    {
      FD_ZERO(*set) 
      FD_SET(s, *set)   select( maxfds, &readfds, &writefds, &exceptfds,ptimeval);
      cout << “ time is out…”<< endl;    //FD_ISSET(s, *set) );  关于 select 的使用,请看《windows 网络编程技术》p176
      

  4.   

    select 會修改你提供的時間值,用來記錄剩餘的時間,第一次超時后這個值就已經被減為0了,所以後面會瞬間超時返回。
    正確的做法是每次調用select之前都設置超時的時間值。
      

  5.   

    正確的做法是每次調用select之前都設置超時的時間值。>>>>>>>>
    不同意。
      

  6.   

    int select (
      int nfds,                           
      fd_set FAR * readfds,               
      fd_set FAR * writefds,              
      fd_set FAR * exceptfds,             
      const struct timeval FAR * timeout  
    );
    在Window中,时间是不会被改变的,因为有const.
    这个说明同时见<UNIX网络编程(第1卷)> 第127页.为了便于向的Linux的移植,需要在 select之前都設置超時的時間值.int     sockfd;  
    fd_set  fdR;  
    struct  timeval timeout = ..;  
    ...  
    for(;;) {  
            FD_ZERO(&fdR);  
            FD_SET(sockfd, &fdR);  
            switch (select(sockfd + 1, &fdR, NULL, &timeout)) {  
                    case -1:  
                            error handled by u;  
                    case 0:  
                            timeout hanled by u;  
                    default:  
                            if (FD_ISSET(sockfd)) {  
                                    now u read or recv something;  
                                    /* if sockfd is father and   
                                    server socket, u can now  
                                    accept() */  
                            }  
            }  
    }  
      

  7.   

    谢谢各位的大力相助,确实是调用select之后,readfds的fd_count值由1变为0,
    所以瞬间返回,每次将readfds的fd_count值设为1,则功能正常实现。