利用 select() 函数可以同时监视多个文件描述符(接受、传输、异常状态)。具体来讲是通过fd_set 数组来判断的。
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指向的变量中清除文件描述符fad的信息。
FD_ISSET(int fd, fd_set *fdset):若参数fdset指向的变量中包含文件描述符fd的信息,则返回“真”。
struct timeval //用于 select()函数 定义指定时间,防止陷入无限阻塞状态。
{
long tv_sec; //秒
long tv_usec; //微秒
}
#include <sys/select.h>
#include <sys/time.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timeval *timeout);
功能:
select() 用来验证3中监视项的变化情况。(接受、传输、异常状态)。根据监视项声明3个fd_set型变量,分别向其注册文件描述符信息,并把变量的地址值传递到上述函数的第二到第四个参数。
参数:
maxfd:监视对象文件描述符数量。
readset:将所有关注 “是否存在待读取数据” 的文件描述符注册到fd_set型变量,并传递其地址值。
writeset:将所有关注 “是否可传输无阻塞数据” 的文件描述符注册到fd_set型变量,并传递其地址值。
exceptset:将所有关注 “是否发生异常” 的文件描述符注册到fd_set型变量,并传递其地址值。
timeout:调用select函数后,为防止陷入无限阻塞的状态,传递超时( time-out)信息。
返回值
发生错误时返回-1,超时返回时返回0。因发生关注的事件返回时,返回大于0的值,该值是发生事件的文件描述符数。
1)请解释复用技术的通用含义,并说明何为I/O复用。
答:复用技术指为了提高物理设备的效率,用最少的物理要素传递最多数据时使用的技术。同样,I/O复用是指将需要I/O的套接字捆绑在一起,利用最少限度的资源来收发数据的技术
2)多进程并发服务器的缺点有哪些?如何在I/O复用服务器端中弥补?
答:多进程并发服务器的服务方式是,每当客户端提出连接要求时,就会追加生成进程。但构建进程是一项非常有负担的工作,因此,向众多客户端提供服务存在一定的局限性。而复用服务器则是将套接字的文件描述符捆绑在一起管理的方式,因此可以一个进程管理所有的I/O操作
4)select函数的观察对象中应包含服务器端套接字(监听套接字),那么应将其包含到哪一类监听对象集合?请说明原因
答:服务器套接字的作用是监听有无连接请求,即判断接收的连接请求是否存在?应该将其包含到“读”类监听对象的集合中
5)select函数使用的fd_set结构体在Windows和Linux中具有不同的声明。请说明却别,同时解释存在区别的必然性
答:Linux的文件描述符从0开始递增,因此可以找出当前文件描述符数量和最后生成的文件描述符之间的关系。但Windows的套接字句柄并非从0开始,并且句柄的整数值之间并无规律可循,因此需要直接保存句柄的数组和记录句柄数的变量。
代码入口
本文发布于:2024-01-28 07:01:47,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063965115647.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |