如何知道完成数据包是针对 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()?的主要内容,如果未能解决你的问题,请参考以下文章
阻塞模式下的 WSASend() 是不是会导致将通知数据包放置在完成端口中?