bool CDataSocket::SetTimeOut()
{
struct fd_set readfdset;
struct timeval timeout;
timeout.tv_sec=m_iTimeOut;
timeout.tv_usec=0;
FD_SET(m_hSocket,&readfdset);
if(select(m_hSocket,(fd_set *)&readfdset,NULL,NULL,
               (struct timeval *)&timeout)==0)
{
return true;
}
return false;
}
/////////////////////////////////上面的代码不管用,执行完select()操作之后,总是直接跳到return false;那一行了。而接下来再执行 recv()操作时,就出现了无限等待了.注:我已经将服务程序设置成在接到请求后便执行死循环以测试上述代码
请问这是为什么,谢谢!

解决方案 »

  1.   

    注:m_iTimeOut=60 即等待时间为60秒
      

  2.   

    int rcvtimeo = 60000 ; // 60 sec 
            if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
    {
    dwErr = WSAGetLastError() ;
    sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
    AfxMessageBox( szErr ) ;
    closesocket( m_s ) ;
    return ;
    }
      

  3.   

    int rcvtimeo = 60000 ; // 60 sec 
            if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
    {
    dwErr = WSAGetLastError() ;
    sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
    AfxMessageBox( szErr ) ;
    closesocket( m_s ) ;
    return ;
    }
      

  4.   

    int rcvtimeo = 60000 ; // 60 sec 
            if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
    {
    dwErr = WSAGetLastError() ;
    sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
    AfxMessageBox( szErr ) ;
    closesocket( m_s ) ;
    return ;
    }
      

  5.   

    将SOCKET设成阻塞方式,然后用定时器SetTimer来完成超时处理。