select可读套接字集合有关问题
select可读套接字集合问题
使用
判断套接字是否可读!
现在的问题是,客户端只是连接了服务器,但是并没有真正的向服务器发送数据,仍然要执行printf("有数据到来\n");这句代码!难道连接过后,没有发送数据套接字就可以读了么!?不是应该有数据到达,select中检验可读集合才会保留可读的套接字么?!现在并没有数据传来,怎么可读套接字集合中也有套接字!!!???
------解决方案--------------------
要在ACCEPT后保存SOCKET句柄.
每次select前 , FD_ZERO(&fd5Read) FD_ZERO(&fd5Write)将FDSET置0.
然后FD_SET重新加入.
使用
select(0,&fd5Read,&fd5Write,NULL,&tval);判断套接字的状态,使用
for(u_int i=0;i<fdset[0].fd_count;i++)
{
if (FD_ISSET(fdset[0].fd_array[i],&fd1Read))
{//有数据到来
int icount=recv(fdset[0].fd_array[i],szbuffer,BUFFER_SIZE,0);
printf("有数据到来\n");
if(icount>0)
{
szbuffer[icount]='\0';
//printf("Thread1 Recvs:%s\n",szbuffer);
}
}
if (FD_ISSET(fdset[0].fd_array[i],&fd1Write))
{//可写
}
}
}
判断套接字是否可读!
现在的问题是,客户端只是连接了服务器,但是并没有真正的向服务器发送数据,仍然要执行printf("有数据到来\n");这句代码!难道连接过后,没有发送数据套接字就可以读了么!?不是应该有数据到达,select中检验可读集合才会保留可读的套接字么?!现在并没有数据传来,怎么可读套接字集合中也有套接字!!!???
------解决方案--------------------
要在ACCEPT后保存SOCKET句柄.
每次select前 , FD_ZERO(&fd5Read) FD_ZERO(&fd5Write)将FDSET置0.
然后FD_SET重新加入.