IO 完成端口和套接字 WSARecv()
IO Completion Ports and socket WSARecv()
我想了解 IOCP 如何与套接字一起工作。我需要了解它们是否是这样工作的:
我创建了一个完成端口,它只是一个队列,当某些操作完成时将接收通知,然后我将我的套接字与之相关联,然后我处理传入的通知。
现在我想知道这与从套接字接收数据有什么关系,所以当我调用 WSARecv()
时到底发生了什么,当我调用它时 WSARecv()
returns 会立即执行(不阻塞)然后当数据到达 WSARecv()
时,我收到一条通知说数据已收到?
是的,就是这样。
当你调用WSARecv()
时,该函数会立即return(注意你必须给它传递一个缓冲区来存储接收到的数据)。现在系统将读取从另一端接收到的数据并将其存储在提供的缓冲区中。当系统这样做时,它会在完成端口放置一个通知,通知您读取操作已完成。
如果想了解更多关于 IOCP、WSARecv() 和 Sockets 的信息,请查看我为学习该主题而制作的示例项目。
Click here to navigate to Socket Completion Server code
您必须熟悉 GetQueuedCompletionStatus(),它位于线程循环内等待 return 的事件。因为它在队列中没有任何东西时进入阻塞模式,所以线程也会表现得像在等待中。
一旦 GetQueuedCompletionStatus() returns 现在解除阻塞,进程将继续评估缓冲区的内容。只需用您的代码填写您希望如何处理缓冲区。
关于WSARecv(),调用该函数将触发套接字API用数据填充缓冲区。因为它是 Overlapped,WSARecv() 不会阻塞并且会立即 return。有一种方法可以通过简单地调用 GetQueuedCompletionStatus() 来了解何时引发完成事件。
我想了解 IOCP 如何与套接字一起工作。我需要了解它们是否是这样工作的:
我创建了一个完成端口,它只是一个队列,当某些操作完成时将接收通知,然后我将我的套接字与之相关联,然后我处理传入的通知。
现在我想知道这与从套接字接收数据有什么关系,所以当我调用 WSARecv()
时到底发生了什么,当我调用它时 WSARecv()
returns 会立即执行(不阻塞)然后当数据到达 WSARecv()
时,我收到一条通知说数据已收到?
是的,就是这样。
当你调用WSARecv()
时,该函数会立即return(注意你必须给它传递一个缓冲区来存储接收到的数据)。现在系统将读取从另一端接收到的数据并将其存储在提供的缓冲区中。当系统这样做时,它会在完成端口放置一个通知,通知您读取操作已完成。
如果想了解更多关于 IOCP、WSARecv() 和 Sockets 的信息,请查看我为学习该主题而制作的示例项目。
Click here to navigate to Socket Completion Server code
您必须熟悉 GetQueuedCompletionStatus(),它位于线程循环内等待 return 的事件。因为它在队列中没有任何东西时进入阻塞模式,所以线程也会表现得像在等待中。
一旦 GetQueuedCompletionStatus() returns 现在解除阻塞,进程将继续评估缓冲区的内容。只需用您的代码填写您希望如何处理缓冲区。
关于WSARecv(),调用该函数将触发套接字API用数据填充缓冲区。因为它是 Overlapped,WSARecv() 不会阻塞并且会立即 return。有一种方法可以通过简单地调用 GetQueuedCompletionStatus() 来了解何时引发完成事件。