在重叠模式下使用 WSASend 时,我应该什么时候释放缓冲区?

问题描述

我正在使用 WSASend() 通过 IOCP 发送一些数据。我分配一个缓冲区并用要发送的数据填充它,然后创建一个指向我的缓冲区的 WSABUF 并将其传递给 WSASend()

documentation 说:

如果此函数以重叠方式完成,Winsock 服务提供者有责任在此调用返回之前捕获 WSABUF 结构

所以,我可以堆栈分配我的 WSABUF 结构。但是,我是否也可以在本地分配我的底层缓冲区,在 WSASend() 返回之后但在 IO 完成之前释放它?或者我应该将底层缓冲区的所有权转移给我的 IOCP 工作线程,以便它可以释放它?

解决方法

我是否也可以在本地分配我的底层缓冲区,在 WSASend() 返回之后但在 IO 完成之前释放它?

没有。缓冲区必须保持分配状态,直到 IO 完成使用它。只有这样你才能释放它。

或者我应该将底层缓冲区的所有权转移给我的 IOCP 工作线程,以便它可以释放它?

是的。