Select 模型的使用,简单聊天室的实现
select模型是一种非阻塞的I/O 模型,他主要是使用select来同时管理多个套接字,如果没有网络事件发生,它边进入等待状态,以便执行同步IO;它的好处在于一个线程可以同时管理多个连接的套接字,这样避免了线程的膨胀。
要使用selcet模型的步骤:
1. 创建socket
2. socket 通过bind绑定本地地址
3. socket 监听
到这里,都是跟阻塞模式的一模一样,下面是不同的
4.设置套接字的模式为阻塞
u_long value=1;
iRet=ioctlsocket(socket_listen,FIONBIO ,&value);
5. 调用select 函数 int select(
int nfds,
fd_set* readfds,
fd_set* writefds,
fd_set* exceptfds,
const struct timeval* timeout
);
第一个参数是设为0,不管。第二,三,四个参数都是一个套接字的集合,第二个参数是检测套接字的可读性,第三个检测可写性,第四个检查错误。 第五个设置超时时间,如果为NULL,那么永远等待。第二,三,四个参数不能全为NULL,可以允许其中两个为NULL.
失败返回SOCKET_ERROR也就是-1,如果超时返回0
所以,判断是否成功,只要判断返回值是否>0就OK。
select 方法返回后,会在相应的套接字集合fd_set中移除没有网络事件发生的套接字