FD_SET(listen_socket,&readfds); i = select(0,&readfds,&writefds,&exceptfds,NULL);
if (i == SOCKET_ERROR) {
fprintf(stderr,"select failed %d\n",WSAGetLastError());
}
if (i==0){
fprintf(stderr,"Select returned no fds ready\n");
} if (FD_ISSET(listen_socket, &readfds)){
                      .........
                   }
请问是不是只有在select 时检测到listen_socket 已就绪后,FD_ISSET 才能检查到listen_socket 是 readfds 中数组的成员?在这儿,select 起到什么作用?

解决方案 »

  1.   

    实际上这个是用于网络的非阻塞模式的,先用select进行套接字的检测,看它是否进入了自己所需要的状态,最后一个参数是时间,如果你不设置,那么就会无限等待,直到其中的套接字发生了目标事件,或出错了。当一个select正常返回之后,你就可以用FD_ISSET去检测目标套接字是否还在那个结构中,如果在则代表已经发生了目标事件,你就需要去执行了。拿你上面的代码来说吧,当你最后FD_ISSET检测之后如果返回TRUE就应该开始读数据了。