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 上。

相关推荐
哈里谢顿6 小时前
no_proxy介绍
网络协议
Oflycomm8 小时前
工业以太网四大主流协议(EtherCAT/PROFINET/EtherNet/IP/Modbus)技术参数深度对比
网络·网络协议·tcp/ip·欧飞信·plc模组
wangl_9210 小时前
Modbus RTU 与 Modbus TCP 深入指南-现代替代协议
网络·网络协议·tcp/ip·tcp·modbus·rtu
霸道流氓气质13 小时前
SpringAIAlibaba整合 Streamable HTTP 调用免费 MCP Server 实战全解
网络·网络协议·http
想唱rap13 小时前
传输层协议TCP
linux·运维·服务器·网络·c++·tcp/ip
一只小白00015 小时前
一篇讲清TCP的三次握手&四次挥手
服务器·网络·tcp/ip
上海云盾-小余15 小时前
网站木马植入原理与彻底清除、长效防御方案
网络·网络协议·tcp/ip·系统安全
源远流长jerry16 小时前
TCP 三次握手深度解析:从内核源码到生产实践
linux·运维·网络·网络协议·tcp/ip
上海云盾安全满满17 小时前
服务器被攻击了,更换IP是否有用吗
服务器·网络·tcp/ip
xlq2232218 小时前
53.tcp socket
linux·服务器·开发语言·网络·网络协议·tcp/ip