解决的问题:
传统用法,若一个handle不可读,则阻塞;设想若有一个不可读被阻塞了,这个时候还有一个handle可读呢,这时就要用select来解决
Select的函数格式:
int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval*timeout);
对于fd_set类型的操作:(fd_set相当于一个handle数组)
fd0 fd1 fd2
readfd 0 0 0 ;;;;;; ;
writefd 0 0 0 ;;;;;;;
FD_ZERO(fd_set *),将fd_set所有位都清零
FD_SET(int ,fd_set*),开启fd_set的 一位
FD_CLR(int,fd_set*),清除一位
FD_ISSET(int ,fd_set* )检查集合中指定的handle是否开启
从select返回时,可以用FD_ISSET 来测试fdset中一个给定位是否仍然开启
select的返回值是已经置位的描述符个数,,若一个描述符可以读也可以写,将会记数两次。
FD_ZERO(&allset); /* 清空文件描述符集合 */
FD_SET(lfd, &allset); /* 将监听接字设置在集合内 */
/* 开始服务器程序的死循环 */
while(1){
printf("hello\n");
rset = allset;
ret_n = FD_ISSET(lfd, &rset); //返回1,因为已经开启
/* 得到当前可以读的文件描述符数 */
rdy = select(maxfd + 1, &rset, NULL, NULL, NULL);
if (FD_ISSET(lfd, &rset)){ //rdy表示rset集合中 有几个可以读的hand开启,
//FD_ISSET来测试rset中的lfd是否依然可以读,因为select会重新对集合中的位检测并置位,虽然上边那个FD_ISSET返回1,但是经过了select不一定
addr_len = sizeof(cin);
;;
;;