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

Posted

技术标签:

【中文标题】在重叠模式下使用 WSASend 时,我应该何时释放缓冲区?【英文标题】:When using WSASend in overlapped mode, when should I free the buffers? 【发布时间】:2021-07-14 19:31:38 【问题描述】:

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

documentation 说:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

是的。

【讨论】:

以上是关于在重叠模式下使用 WSASend 时,我应该何时释放缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

readv()、writev()、WSARecv()、WSASend()

在迂回的 WSASend 中阻塞数据包

我应该为 WSASend 和 WSARecv 使用不同的 WSAOVERLAPPED 结构吗?

IOCP 服务器并使用单个 wsasend 发送数据

我应该同时进行 WSASend() 调用吗?

如何检测两个 UIImageView 何时重叠?