4

我正在开发一个管理一个套接字的客户端应用程序。我正在使用 IOCP 来管理异步 I/O。

这是网络编程书中的一句话:

所有重叠的操作都保证按照应用程序发出它们的顺序执行。但是,不保证从完成端口返回的完成通知的顺序相同。也就是说,如果应用程序发布两个重叠的 WSARecv 操作,一个具有 10 KB 缓冲区,下一个具有 12 KB 缓冲区,则首先填充 10 KB 缓冲区,然后填充 12 KB 缓冲区。应用程序的工作线程可能会在 10 KB 操作的完成事件之前收到来自 GetQueuedCompletionStatus 的 12 KB WSARecv 通知。当然,这只是在一个套接字上发布多个操作时的问题。

那么我该如何处理这个案子呢?

4

1 回答 1

3

最简单的解决方案是,不具有超过一次的出色读取或写入。因此,如果通知完成,则很明显,所有数据都已写入套接字。如果在等待 IO 完成时,需要向套接字写入更多数据,则只需缓冲该数据并在 IO 完成时将其写入。

如果一个套接字有多个未完成的 IO,则必须在读取端对它们进行排序。在写入方面,您必须做一些记录以了解最后一次写入,从而了解何时完全写入数据。

另一方面,仅仅将数据成功写入套接字并不意味着数据在另一端被正确接收或处理,因此必须有某种协议。如果是这样,您可以简单地依赖该协议并简单地查找错误通知。

于 2012-07-26T13:47:20.723 回答