我试图了解IOCP如何使用套接字。我需要了解这是否有效:
我创建了一个完成端口,它只是一个队列,当某个操作完成时会收到通知,然后我将我的套接字与它关联,然后我处理传入的通知。
现在我想知道这与从套接字接收数据有什么关系,所以当我调用WSARecv()
究竟发生了什么时,WSARecv()
会在我调用它时立即返回(不会阻塞)稍后当数据到达WSARecv()
时,我会收到收到数据的通知吗?
答案 0 :(得分:1)
是的,这就是发生的事情。
当您调用WSARecv()
时,该函数将立即返回(请注意,您必须将缓冲区传递给存储接收到的数据)。现在系统将读取从另一端接收的数据并将其存储在提供的缓冲区中。系统执行此操作时,它会在完成端口发出通知,通知您读取操作已完成。
答案 1 :(得分:0)
如果想了解有关IOCP,WSARecv()和套接字的更多信息,请参阅我为自己教育自己的示例项目。
Click here to navigate to Socket Completion Server code
您必须熟悉GetQueuedCompletionStatus(),它位于线程循环中,等待事件返回。因为当队列中没有任何内容时它进入阻止模式,所以线程的行为也会像它在等待中一样。
一旦GetQueuedCompletionStatus()返回,它现在被解除阻塞,该过程将继续前进,评估缓冲区的内容。只需用代码填写您希望如何处理缓冲区。
关于WSARecv(),调用该函数将触发套接字API以使用数据填充缓冲区。由于重叠,WSARecv()不会阻止并立即返回。有一种方法可以通过简单地调用GetQueuedCompletionStatus()来了解何时完成事件。