一、select模型有什么用
        select模型能解决accept和recv的没信号一直等待阻塞问题,但并不能解决执行的阻塞,实现原理就是建立一个数组,里面存放着socket,通过调用select函数来遍历数组来检查socket是否有信号以此来判断socket是否是accept还是recv
二、select模型
        基本步骤(1).打开网络库(2).创建socket(3).bind绑定端口和地址(4).listen使套接字处于监听状态(5)select处理
        再使用select函数前,还应该创建一个存放socket的数组,这是我们用fd_set来定义
        fd_set allsockets;//fd_set是一个结构体,其定义如下,fd_conut记录着存入的个数,fd_array[]记录着socket的数组 宏FD_SETSIZE定义为64 可以自己定义大小
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;
       对fd_set操作的宏定义(1)FD_ZERO(&对象)集合清零(将fd_count设置为0)(2)FD_SET(socket对象,&对象)添加socket(3)FD_CLR(socket对象,&对象)删除指定socket(4)FD_ISST(socket对象,&对象)指定socket是否在集合中,返回true或false
        select(0,&readsockets,&writesockets,&errorsockets,0)//第一个参数为兼容berkeley sockets 填0即可 第二个参数为检查有可读的参数 第三个参数为检查有可写的参数 第四个参数为检查是否有错误的参数第五个参数为数组检查等待时间 可以用timeval,(struct timeval {long tv_sec; /* seconds */ long tv_usec; /* and microseconds */};)结构体定义等待时间,如果填0则检查完数组后便立即结束select的检查,执行下面的语句,返回值如果为0则代表没信号,如果>0则代表请求有信号了,若readsocket返回的是服务端的socket代表请求accept,如果是客户端的socket则可以recv了

        在结束记得closesocket();

for (u_int i=0;i<allsockets.fd_count;i++)
{
closesocket(allsockets.fd_array[i]);
}

 

 
自己写select模型