如果在 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 怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
在重叠模式下使用 WSASend 时,我应该何时释放缓冲区?
如果在 select 中指定了大写,则 Order by 子句失败
io 完成端口问题,每个 GetQueuedCompletionStatus 调用多个 wsarecv 或 wsasend