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???
谢谢兄弟们能帮忙解答.
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???
谢谢兄弟们能帮忙解答.
去测它的值,如果断线RECV它则为0或负数值。
1) 每次SELECT前都必需初始化FD_SET结构,你没有.
2) 当SOCKET中断时,会有可读的消息. 此时调用Recv函数将读出0个字节,或者返回错误.
读出0,表示,对方主动关断了SOCKET ,错误表示SOCKET发生了错误. 你要判断recv的返回结果,并做相应的处理
加上一样:
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 。