本人常用环境是WINDOWS,因此暂时略读根据书上提示跳过10、11章进行笔记:
Windows相较于Linux,多进程服务器并不适用,10~11章重点放在Linux平台。
复用
在一个通信频道中传递多个数据(信号)的技术。
为了提高物理设备的效率,利用最少的物理要素传递最多的数据使用的技术。
I/O复用服务器端
类比成课堂:1位老师服务多位学生;只有当(客户端)学生举手提问,老师才会在收到举手的信息(收到数据的套接字)后回答问题。也就是现在的教室以I/O复用方式运行。
select()函数
//Window
int select(int maxfd,fd_set* cprReads,fd_set* writeset,fd_set* readset,fd_set* timeout)
/*
在windows中,maxfd 并无意义,只是为了其他平台系统的兼容性,因此传0
readset 关注“是否存在待读取数据”
writeset 关注“是否可传输无阻塞数据”
timeout 关注“超时信息(time-out)”
实际使用我们根据需要关注的功能进行传参,其他情况传0。
*/
select()函数可以将多个文件描述符集中到一起统一监视,监视项目:
- 是否存在套接字接收数据?
- 无需阻塞传输数据的套接字有哪些?
- 哪些套接字发生了异常?
调用方法和顺序
- 设置文件描述符→指定监视范围→设置超时
- 调用select函数
- 查看调用结果
一共三个步骤。
利用fd_set数组变量对文件描述符进行监视,数组下标位置为该文件描述符所在位置,该位置为1,则表示该对象为监视对象,0则相反。
利用宏完成对fd_set变量中注册或更改值的操作:(Linux与Windows一致)
- FD_ZERO(fd_set * fdset) fd_set所有位置初始化为0
- FD_SET(int fd, fd_set * fdset) 在fdset指向变量中注册描述符fd的信息
- FD_CLR(int fd, fd_set * fdset) 在fdset指向变量中清除描述符fd的信息
- FD_ISSET(int fd, fd_set * fdset) 若fdset指向变量中包含注册描述符fd的信息,则返回真
代码:(含注释 Windows)
为了效果,你可以同时开多几个客户端进行测试。