最后更新:2021-11-04 22:55
如果收到客户连接请求,多进程服务器将产生一个新的过程。但是,形成过程费用昂贵。这需要大量的计算和内存空间,因为每个过程都有自己的内存空间,因此它们之间的数据交换也需要一种非常复杂的技术。
在使用选择函数时,您可以将单个监视(也称为事件)的多个文件描述符组合在一起:
援引选定函数的方式:
(1)步骤一:
(2)步骤二:
(3)步骤三:
要同时监测多个文件描述符, 请使用选择函数 。 要监测的文件描述集将根据观察项( 接收、 传输、 异常) 来区分 。
fd_set 数据变量用于存储各种被监视的文件描述符。 fd_set 数组有 0 和 1 位数, 如果设置为 1, 文件描述符是监视对象 。
下列宏执行 fd_set 变量中的登记或修改值的过程:
FP _ERO( fd_set*fdset); 将所有 fd_set 变量位数设置为零 。
FID_SET( int fd, fd_ set* fdset) : 在参数 fdset 指向的变量中登记文件描述 fd 信息( 逆向位置为 1) 。
FP_CLR( int fd, fd_ set* fdset) : 从引用参数 fd 的变量中删除文件描述符 fd 。
FID_ISSET( int fd, fd_ set* fdset) : 如果参数 fdset对应的变量有关于文件描述符 fd 的信息, 返回真实值 。
选择函数解释 :
(1)maxfd
跟踪对象文件描述符的数量 。
(2)readset
在 fd_set 变量中注册所有含有“ 有数据要读” 短语的文件标题, 并提供它们的地址值 。
(3)writeset
任何与“ 可渗透数据传输” 相关的文件描述符都应在 fd_set 变量中注册, 地址值应发送 。
(4)exceptset
注册并通报所有文件描述器的地址值,其中涉及 fd_set 变量是否发生了异常。
(5)timeout
使用选定函数。后,为防止陷入无限阻塞的状态,传递超时(time-out)信息
(6)返回值
当关注事件返回时返回大于 0 的值, 即该事件的文件描述符的数量。 将变量的地址值发送给上述函数的第二至第四参数, 取决于三个 fd_ set 变量, 并发送给每个注册的文件描述符 。
文件描述符监视范围与第一个参数连接, 选择函数要求通过第一个参数提供被监测对象文件描述符的数量。 但是, 每次您创建新文件描述符时, 值会增加一个, 因此只要将最大文件描述符加上一个即可将文件描述符转到 selec 函数 。 由于文件描述符的值从 0 开始, Plus 1 。
设定超时是为了避免选择的函数在任何时候都被停止,只要指定时间已过,就可以返回。所花费的时间与最后一个参数有关,最后一个参数具有以下时间值结构:
以 tv_sec 成员填充秒数和 tv_usc 成员填充微秒数。 如果您不想设置超时, 请通过 NULL 。
文件描述符中的修改与被监测的文件描述符中相应的监视事件有关。 当选中的函数调用完成时, 您传输到的 fd_ set 变量将会更改。 所有先前 1 的位置都更改为 0, 但修改过的文件描述除外。 因此, 文件描述符在值仍被视为 1 的位置上已经更改 。
Windows 中的选定函数包含所有与 Linux 中选定函数相同的参数,但前者的第一个参数是为兼容性而引入的,没有意义。
时间值结构使用typedef来声明:成功时返回0,失败时返回1。
fd_set 结构不是数字阵列,
因为 Windows 的脚手架把手不是从零开始的, 手柄的整数值之间没有规律性, 因此需要直接存储手柄的数组, 并记录手柄的变量 。
本文由 在线网速测试 整理编辑,转载请注明出处。