【问题标题】:How to know if a completion packet is for WSASend() or WSARecv() or AcceptEx()?如何知道完成数据包是针对 WSASend() 还是 WSARecv() 还是 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

标签: c++ sockets winapi network-programming iocp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多