fd_set readfds ;
memset(&readfds,0x00,sizeof(fd_set)) ;
//FD_ZERO(&readfds) ;
FD_SET(*pSocket,&readfds);while(true)
{
   int iRect= select(0,&readfds,NULL,NULL,NULL) ;//&OutTime   bool bRect= FD_ISSET(*pSocket,&readfds) ;
   if(!bRect) return ;   m_Rect =recv(*pSocket,pData.m_Buff,sizeof(pData.m_Buff),0);
   int * p=(int*)pData.m_Buff ;
   memset(pData.m_Buff,0x00,sizeof(pData.m_Buff)) ;
}
//在等待select时,如果socket连接突然断线,select 还是返回1 (我在read上放入一个socket),我判断bRect返回也是true 。为什么??socket断线时为什么select总是返回1???
谢谢兄弟们能帮忙解答.

解决方案 »

  1.   

    select 是一直在block网络和它没关系,只是和它接收的参数有关系readfds
    去测它的值,如果断线RECV它则为0或负数值。
      

  2.   

    为什么bRect返回true ???应该是false 都断线了。部可能有数据可以读了。不是吗
      

  3.   

    你的select 循环有问题
    1) 每次SELECT前都必需初始化FD_SET结构,你没有.
    2) 当SOCKET中断时,会有可读的消息. 此时调用Recv函数将读出0个字节,或者返回错误. 
    读出0,表示,对方主动关断了SOCKET ,错误表示SOCKET发生了错误. 你要判断recv的返回结果,并做相应的处理
      

  4.   

    TO krh2001(边城浪子) 
    加上一样:
    memset(&readfds,0x00,sizeof(fd_set)) ;
    FD_SET(*pSocket,&readfds);
    int iRect= select(0,&readfds,NULL,NULL,NULL) ;
    bool bRect= FD_ISSET(*pSocket,&readfds) ;断线后readfds上应该没有可以读取的数据,但是为什么readfds.fd_count还是1 ,其数组的句柄不为空?
    应该自动检查没有可以读取的socket,删除readfds中socket 。
      

  5.   

    当SOCKET中断时,会有可读的消息,但没有可读据,这个只是告诉你,SOCKT出问题了. 根据recv的结果可以知道,select返回1就是通知你这件事的.有什么奇怪