《TCP/IP网络编程》第21章

      最后更新:2022-01-17 22:30:37 手机定位技术交流文章

      《TCP/IP网络编程》第21章

      • 理解异步通知I/O模型
        • 同步和异步
        • 同步I/O缺点及异步解决方案
        • 异步通知I/O模型
      • 实现异步通知I/O模型
        • WSAEventSelect函数
        • manual-reset模式事件对象的创建
        • 验证是否发生了事件
        • 区分事件类型
        • 异步通知I/O模型回声服务器

      理解异步通知I/O模型

      同步和异步

      同步的关键是函数的调用及返回时刻,以及数据传输的开始和完成时刻。

      • 调用send函数的瞬间开始传输数据,send函数执行完(返回)的时刻完成数据传输(数据完全传输到输出缓冲,操作系统完成网络传输)。
      • 调用recv函数的瞬间开始接收数据,recv函数执行完(返回)的时刻完成数据接收。

      异步(Asynchronous),不一致。
      异步I/O指I/O函数的返回时刻与数据收发的完成时刻不一致。

      同步I/O缺点及异步解决方案

      同步I/O的过程中函数无法返回,不能执行其他任务。
      异步I/O立即返回函数,可以执行其他任务,更有效地使用CPU。

      异步通知I/O模型

      异步工作方式“通知I/O”。
      通知I/O:通知输入缓冲收到数据并需要读取,以及输出缓冲为空故可以发送数据。

      select是同步方式通知I/O,需要I/O或可以进行I/O的时间点(I/O相关事件发生的时间点)与select函数的返回时间点一致。

      异步通知I/O中,指定I/O监视对象的函数和实际验证状态变化的函数是相互分离的。指定监视对象后可以离开执行其他任务,最后再回来验证状态变化。

      实现异步通知I/O模型

      WSAAsyncSelect函数,需指定Windows句柄以获取发生的事件(UI相关内容),本书不会涉及。

      WSAEventSelect函数

      I/O的状态变化

      • 套接字的I/O状态变化
      • 发生套接字I/O相关事件

      传入参数s的套接字内只要发生lNetworkEvents中指定事件之一, WSAEventSelect函数就将hEventObject句柄所指内核对象改为signaled状态。该函数是连接事件对象和套接字的函数,以异步通知方式工作,调用后直接返回。

      事件类型信息:

      • FD_READ:可读
      • FD_WRITE:可写
      • FD_OOB:收到带外数据
      • FD_ACCEPT:新连接
      • FD_CLOSE:断开连接

      manual-reset模式事件对象的创建

      CreateEvent函数可以创建auto-reset或manual-reset模式事件对象。
      WSACreateEvent只创建manual-reset模式non-signaled状态的事件对象。

      验证是否发生了事件

      最多可传递64个事件对象,如需监视更多句柄,只能创建线程或扩展保存句柄的数组,并多次调用上述函数。

      获取所有signaled状态的事件对象。

      区分事件类型

      上述函数将manual-reset模式事件对象改为non-signaled状态,无需单独调用ResetEvent函数。

      查看发生的事件类型

      iErrorCode数组保存错误信息。

      • FD_READ错误,查看iErrorCode[FD_READ_BIT]
      • FD_WRITE错误,查看iErrorCode[FD_WRITE_BIT]
      • FD_XXX错误,查看iErrorCode[FD_XXX_BIT]

      异步通知I/O模型回声服务器

      AsyncNotiEchoServ_win.c

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/16688.html

          热门文章

          文章分类