如果在 IOCP 模型中指定了 WSASend 的 lpCompletionRoutine 怎么办?

Posted

技术标签:

【中文标题】如果在 IOCP 模型中指定了 WSASend 的 lpCompletionRoutine 怎么办?【英文标题】:What if lpCompletionRoutine of WSASend is specified in IOCP model? 【发布时间】:2013-01-24 13:21:11 【问题描述】:

WriteFileEx 的 MSDN 页面说它不能在 IOCP 模型中使用,因为它有一个参数来指定完成例程。如果文件句柄已与 I/O 完成端口相关联,则 WriteFileEx 将失败。

不过,WSASend 允许调用者指定完成例程作为其最后一个参数,而此函数可用于 IOCP 模型。

我检查了几个带有 IOCP 的 WinSock 示例,发现最后一个参数 lpCompletionRoutine 始终为空。这是强制性的吗?

【问题讨论】:

【参考方案1】:

文档中唯一说的是:

完成例程遵循为 Windows 文件 I/O 完成例程规定的相同规则。

这可能表明您不能将 IOCP 和 lpCompletionRoutine 混合在一起,就像 WriteFileEx() 一样。另一方面,您为什么首先想要将它们混合在一起?完成端口得到结果,或者完成例程得到结果。为什么需要同时使用两者?

【讨论】:

我只是想知道为什么 MSDN 没有将这个问题明确记录为 WriteFileEx。

以上是关于如果在 IOCP 模型中指定了 WSASend 的 lpCompletionRoutine 怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

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

我可以反复调用 WSASend() 吗?

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

wsasend lpnumberofbytesSent

如果在 select 中指定了大写,则 Order by 子句失败

io 完成端口问题,每个 GetQueuedCompletionStatus 调用多个 wsarecv 或 wsasend