使用套接字时,哪些IO操作会导致完成数据包被发送到完成端口?

时间:2015-03-11 07:38:35

标签: c++ sockets winsock iocp

在IOCP中,当启动WSARecv()等IO操作时,IO操作完成后,完成数据包将被发送到完成端口。

我想知道的是,IO操作会导致在使用套接字时将完成数据包发送到完成端口,例如,我知道WSASend()WSARecv()AcceptEx(),和PostQueuedCompletionStatus()导致完成数据包的发送。是否有其他IO操作可以做到这一点?

3 个答案:

答案 0 :(得分:3)

只有在请求完成排队的方式调用可以生成完成的API调用时,才会将完成排队到与套接字关联的IOCP。因此,您将知道哪些API调用可以通过您阅读文档并将OVERLAPPED结构传递给它们的事实来生成完成。

因此,您实际上并不需要知道问题的答案,因为您永远不会得到您不希望得到的完成,因为您必须使用适当的参数调用适当的API才能生成完成。

然后,您可以通过创建“扩展重叠结构”或使用事件句柄,通过向OVERLAPPED添加某种形式的“每个操作数据”来区分导致完成生成的API。作为不透明的数据。无论哪种方式,您都有机会从API调用站点向IOCP完成处理站点发送一些上下文。这个上下文是您自己设计的,可以告诉您启动完成的内容。

然后您可以使用GetQueuedCompletionStatus()调用的返回值来确定完成是成功还是失败,然后您可以使用WSAGetLastError()访问失败的错误代码(尽管{{3有关额外的箍的详细信息,您可以通过跳转来获得更准确的错误代码。)

然后,您可以确定EJP答案中列出的哪些事件。

可以为套接字操作生成完成的实际功能集可以随操作系统的更改而改变。确定这些对于您所定位的操作系统的最简单方法是阅读MSDN文档或搜索lpOverlapped的SDK标头...正如您将从当前的VS2013中看到的那样标题有很多与套接字有关; AcceptEx()ConnectEx()DisconnectEx()TransmitFile(),HTTP.sys API,RIO API等。

答案 1 :(得分:2)

你错过了这一点。导致完成数据包发送的原因是事件,而不是API调用。基本上只有几个TCP事件:

  • 入站连接
  • 出站连接完成
  • 数据
  • 写完
  • 超时
  • 流的结尾,
  • 错误。

答案 2 :(得分:-1)

site

复制

支持的I / O功能

以下功能可用于启动使用I / O完成端口完成的I / O操作。您必须将函数传递给OVERLAPPED结构的实例和先前与I / O完成端口关联的文件句柄(通过调用CreateIoCompletionPort)以启用I / O

完成端口机制:

  1. ConnectNamedPipe
  2. 的DeviceIoControl
  3. LockFileEx
  4. ReadDirectoryChangesW
  5. ReadFile的
  6. TransactNamedPipe
  7. WaitCommEvent
  8. WriteFile的
  9. WSASendMsg
  10. WSASendTo
  11. WSASend
  12. WSARecvFrom
  13. WSARecvMsg
  14. 的WSARecv