boost::asio::ip::tcp/udp::socket::release 函数为什么限制 Windows 8.1 才可以调用?

如本文题目所示,这是因为只有在 Windows 8.1(Windows Server 2012 RC)及以上 Windows 操作版本才提供了运行时,修改/删除完成端口关联的ABI接口。

boost::asio 在 release 函数底层实现之中是调用了  FileReplaceCompletionInformation 函数来删除完成端口关联的。

微软官方的MSDN文档,上面有明确说明。

FILE_INFORMATION_CLASS (wdm.h) - Windows drivers | Microsoft Learn

FileReplaceCompletionInformation
Value: 61
A FILE_COMPLETION_INFORMATION structure to change or remove the completion port associated with a file handle. This value is available starting with Windows 8.1.

所以如果想要切 io_context 驱动线程,可能就以下几个思路。

1、共享同一个 io_context,在上层自己控制 strand 来切

2、多个 io_context 的情况,想要把 socket 交给另一个 io_context,可以考虑二次转发来解决。

3、做成多模式,Windows 8.1 以下的版本,走原本流程(不转移 io_context),Windows 8.1及以上可以转移 io_context 驱动。

4、如果能够提前知道某一个 sockfd,最终会放在那个 io_context 上是最好的。

如果修改 asio 的源代码,如果调用失败就忽略呢?也是不行的哟,因为 iocp 没有解除关联,所以就会出现致命问题,因为没法重新 assign 附加到 iocp 上。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 07:00:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 07:00:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 07:00:04       87 阅读
  4. Python语言-面向对象

    2024-03-30 07:00:04       96 阅读

热门阅读

  1. 使用Dom4j解析多层级XML为Map对象

    2024-03-30 07:00:04       39 阅读
  2. 【threejs】计算矩阵、网格等总面积

    2024-03-30 07:00:04       46 阅读
  3. spark DataFrame通过JDBC读写数据库(MySQL示例)

    2024-03-30 07:00:04       36 阅读
  4. npm包发布

    2024-03-30 07:00:04       40 阅读
  5. Node.js常用命令详解

    2024-03-30 07:00:04       40 阅读
  6. 在axios中设置方法防止http重复请求

    2024-03-30 07:00:04       37 阅读
  7. SqlSugar快速入门

    2024-03-30 07:00:04       42 阅读
  8. qt之windows库编译

    2024-03-30 07:00:04       47 阅读
  9. MYSQL分区

    2024-03-30 07:00:04       38 阅读
  10. 关于debian如何使用lb-build构建iso

    2024-03-30 07:00:04       48 阅读