I/O 在网络方案拟订中重复使用

      最后更新:2021-11-04 22:55

      参考

      1. TCP/IP网络方案拟订

      I/O复用

      多进程服务器端的不足

      如果收到客户连接请求,多进程服务器将产生一个新的过程。但是,形成过程费用昂贵。这需要大量的计算和内存空间,因为每个过程都有自己的内存空间,因此它们之间的数据交换也需要一种非常复杂的技术。

      select函数

      在使用选择函数时,您可以将单个监视(也称为事件)的多个文件描述符组合在一起:

      1. 是否有数据接收插座?
      2. 不要求数据传输被屏蔽的软件包是什么?
      3. 哪个合成体是不正常的?

      援引选定函数的方式:
      (1)步骤一:

      1. 设置文件描述符
      2. 指定监视范围
      3. 设置超时

      (2)步骤二:

      1. 使用选定函数。

      (3)步骤三:

      1. 查看调用结果

      设置文件描述符

      要同时监测多个文件描述符, 请使用选择函数 。 要监测的文件描述集将根据观察项( 接收、 传输、 异常) 来区分 。

      fd_set 数据变量用于存储各种被监视的文件描述符。 fd_set 数组有 0 和 1 位数, 如果设置为 1, 文件描述符是监视对象 。

      下列宏执行 fd_set 变量中的登记或修改值的过程:

      1. FP _ERO( fd_set*fdset); 将所有 fd_set 变量位数设置为零 。

      2. FID_SET( int fd, fd_ set* fdset) : 在参数 fdset 指向的变量中登记文件描述 fd 信息( 逆向位置为 1) 。

      3. FP_CLR( int fd, fd_ set* fdset) : 从引用参数 fd 的变量中删除文件描述符 fd 。

      4. 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 的位置上已经更改 。

      选择函数示例

      在服务器端执行 I/O 重复使用 。

      基于Windows在服务器端执行 I/O 重复使用 。

      select函数

      Windows 中的选定函数包含所有与 Linux 中选定函数相同的参数,但前者的第一个参数是为兼容性而引入的,没有意义。

      时间值结构使用typedef来声明:成功时返回0,失败时返回1。

      fd_set 结构不是数字阵列,

      因为 Windows 的脚手架把手不是从零开始的, 手柄的整数值之间没有规律性, 因此需要直接存储手柄的数组, 并记录手柄的变量 。

      在服务器端执行 I/O 重复使用 。

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类