c++ - 使用sockets时,哪些IO操作会导致完成包发送到完成端口?

标签 c++ sockets winsock iocp

在IOCP中,当开始一个IO操作时,比如WSARecv(),当IO操作完成时,一个完成数据包将被发送到完成端口。

我想知道的是在使用socket的时候是什么IO操作导致完成包被发送到完成端口,比如我知道WSASend(), WSARecv()AcceptEx()PostQueuedCompletionStatus() 导致发送完成数据包。是否有其他 IO 操作可以做到这一点?

最佳答案

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

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

然后,您可以通过制作“扩展重叠结构”或使用事件句柄作为不透明数据。无论哪种方式,您都有机会将一些上下文从 API 调用站点发送到 IOCP 完成处理站点。此上下文是您自己设计的,可以告诉您启动完成的原因。

然后您可以使用 GetQueuedCompletionStatus() 调用的返回值来确定完成是成功还是失败,然后您可以使用 WSAGetLastError( )(通过 see this answer 了解更多关于附加圈的详细信息,您可以跳过该圈以获得更准确的错误代码)。

这让您可以确定您拥有 EJP 答案中列出的哪些事件。

可以为套接字操作生成完成的实际函数集可以随着操作系统的变化而变化。确定这些适用于您所针对的操作系统的最简单方法是阅读 MSDN 文档或搜索 lpOverlapped 的 SDK header ...正如您将从当前的 VS2013 头文件中有很多与套接字相关; AcceptEx()ConnectEx()DisconnectEx()TransmitFile()、HTTP.sys API、 RIO API 等

关于c++ - 使用sockets时,哪些IO操作会导致完成包发送到完成端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28980965/

相关文章:

c - C中Winsock的HTTPS/SSL连接

delphi - 使用(winsock 的)recv 接收时 TStringStream 被损坏?

c++ - 在 C++ 中创建派生类

c++ - 相同的算法实现在 Python 和 C++ 中有不同的结果?

c++ - 通过构造时获取的指针修改const对象

c++ socket read()有时在连接到服务器时返回-1

python套接字,当缓冲区不够大时如何接收所有消息?

C++ 运算符 ->* 和 .*

java - 套接字和 setSoTimeout()

windows - 连接的套接字信息