如何知道完成数据包是针对 WSASend() 还是 WSARecv() 还是 AcceptEx()?

Posted

技术标签:

【中文标题】如何知道完成数据包是针对 WSASend() 还是 WSARecv() 还是 AcceptEx()?【英文标题】:How to know if a completion packet is for WSASend() or WSARecv() or AcceptEx()? 【发布时间】:2015-02-24 15:01:38 【问题描述】:

当我调用WSASend()WSARecv()AcceptEx() 时,将在完成端口中放置一个完成数据包,我可以使用GetQueuedCompletionStatus() 将其出列。但是我怎么知道这个完成包代表什么操作呢?

【问题讨论】:

比较您从GetQueuedCompletionStatus 获得的LPOVERLAPPED 指针与您传递给WSASend 等的指针。您还可以在结构的末尾添加其他成员,以存储额外的信息。 所以我可以在结构的末尾添加一个char 成员来保存这是什么类型的操作,例如:'S'、'R'、'A'? (这似乎比比较指针更好!) @user4592590:是的,完全正确。 Raymond Chen 在他的博客上描述了该功能:The OVERLAPPED associated with asynchronous I/O is passed by address, and you can take advantage of that 【参考方案1】:

您使用包含其他信息的“扩展”OVERLAPPED 结构。这通常还包含数据缓冲区和一些标志,这些标志告诉GetQueuedCompletionStatus() 的调用者完成类型是什么。

网络上有很多关于 IOCP 的有用教程,我希望它们都能解释这一点,因为它相当基础。我的教程可以在here 找到,以及一些实现一些简单 IOCP 服务器的代码。

【讨论】:

以上是关于如何知道完成数据包是针对 WSASend() 还是 WSARecv() 还是 AcceptEx()?的主要内容,如果未能解决你的问题,请参考以下文章

TCP WSASend 完成标准

阻塞模式下的 WSASend() 是不是会导致将通知数据包放置在完成端口中?

具有多个缓冲区的 WSASend() - 可以完成不完整吗?

如何确保 WSASend() 将发送数据?

是否有可能不会收到 WSASend 调用的完成?

连续性多个 WSASend() io 完成端口