IO完成端口和套接字WSARecv()

IO Completion Ports and socket WSARecv()

本文关键字:套接字 WSARecv IO      更新时间:2023-10-16

我正在努力了解IOCP如何使用套接字。我需要了解它们是否就是这样工作的:

我创建了一个完成端口,它只是一个队列,当某个操作完成时,它将接收通知,然后我将套接字与它关联,然后我处理传入的通知。

现在我想知道这与从套接字接收数据的关系,所以当我调用WSARecv()时,究竟发生了什么,WSARecv()在我调用它时会立即返回吗(不阻塞),然后当数据到达WSARecv()时,我会收到数据已接收的通知吗?

是的,就是这样。

当您调用WSARecv()时,函数将立即返回(请注意,您必须向它传递一个缓冲区来存储接收到的数据)。现在,系统将读取从另一端接收的数据,并将其存储在提供的缓冲区中。当系统执行此操作时,它将在完成端口中放置一个通知,通知您读取操作已完成。

如果想了解更多关于IOCP、WSARecv()和Sockets的信息,请参阅我为自学该主题而制作的示例项目。

单击此处导航到套接字完成服务器代码

您必须熟悉GetQueuedCompletionStatus(),它位于线程循环中,等待事件返回。因为当队列中没有任何内容时,线程会进入块模式,所以线程的行为也会像在等待中一样。

一旦GetQueuedCompleteionStatus()返回,它现在已被取消阻止,进程将继续评估缓冲区的内容。只需用代码填写您想要如何处理缓冲区。

对于WSARecv(),调用该函数将触发套接字API用数据填充缓冲区。由于它是重叠,WSARecv()将不会阻塞并立即返回。有一种方法可以通过简单地调用GetQueuedCompleteionStatus()来知道何时引发完成事件。