Winapi Windows异步套接字函数(文档)问题

Winapi Windows异步套接字函数(文档)问题,winapi,asynchronous,Winapi,Asynchronous,这是一篇由两部分组成的文章。我正在编写一段代码,使用WSARecvFrom()接收UDP数据包。我使用WSA_FLAG_OVERLAPPED创建套接字,使用ioctlsocket()调用将套接字设置为非阻塞模式,将其绑定到端口,创建扩展的wsaooverlapped结构实例,使用完成例程发布接收,并等待一个可警报的等待函数。我收到包,工作正常。第一部分: 以下内容来自Windows开发中心,WSARECV来自函数文档: 如果没有发生错误,并且接收操作已立即完成,WSARecvFrom将返回零。在

这是一篇由两部分组成的文章。我正在编写一段代码,使用WSARecvFrom()接收UDP数据包。我使用WSA_FLAG_OVERLAPPED创建套接字,使用ioctlsocket()调用将套接字设置为非阻塞模式,将其绑定到端口,创建扩展的wsaooverlapped结构实例,使用完成例程发布接收,并等待一个可警报的等待函数。我收到包,工作正常。第一部分:

以下内容来自Windows开发中心,WSARECV来自函数文档:

如果没有发生错误,并且接收操作已立即完成,WSARecvFrom将返回零。在这种情况下,一旦调用线程处于可警报状态,完成例程将被安排调用

这是什么意思

我对“receive function has completed instally”(接收函数已立即完成)的理解是,该函数已从套接字接收到某些内容,并已使用发送给它的内容填充缓冲区,已更新lpNumberOfBytesRecvd参数,并返回0。在这种情况下,为什么需要调用完成例程?在这种情况下,完成例行程序的CBD值是多少

请注意,我得到了文档的其余部分:“否则,将返回一个套接字错误值。错误代码WSA IO PENDING表示重叠操作已成功启动,稍后将指示完成。”。没关系,WSARecvFrom()返回SOCKET_ERROR,WSAGetLastError()返回WSA_IO_PENDING,在有东西要读的地方调用我的完成例程,我在完成例程中发布另一个接收,等等

第二部分:即使上述内容只是我对文档的误解(因为这不是我的母语),返回成功完成的异步函数也会使代码不必要地重复。否则我就走远了。但是,如果我对成功完成的理解是正确的,那么有没有办法防止异步函数返回成功?我可以让像WSARecvFrom()这样的函数始终返回SOCKET\u错误(WSA\u IO\u挂起)而从不返回0吗


感谢您到目前为止的阅读。

如果已经有数据准备好读取,
WSARecvFrom()
会立即安排完成例程,以便在线程处于可警报状态时调用它,以指示数据已读取。始终使用读取的正确缓冲区大小调用完成例程。无论
WSARecvFrom()
是否实际填充了缓冲区,您都应该在处理缓冲区之前等待调用完成例程,这样您就不会使代码与自身不同步,您可以将缓冲区处理集中在一个位置,而不是两个位置。

谢谢您的回复。所以我对函数成功完成的理解是错误的。你是说返回值0表示数据在那里等待读取,而WSA_IO_PENDING表示读取操作已发布,缓冲区正在等待填充。缓冲区的内容仅在完成例程中有效。这次我明白了吗?