我正在开发一个管理一个套接字的客户端应用程序。我正在使用IOCP来管理异步I / O.
这是网络编程书的引用:
保证所有重叠操作按照应用程序发出的顺序执行。但是,从完成端口返回的完成通知不保证具有相同的顺序。也就是说,如果应用程序发布了两个重叠的WSARecv操作,一个具有10 KB缓冲区,另一个具有12 KB缓冲区,则首先填充10 KB缓冲区,然后填充12 KB缓冲区。应用程序的工作线程可以在10 KB操作的完成事件之前从GetQueuedCompletionStatus接收12 KB WSARecv的通知。当然,这只是在套接字上发布多个操作时的问题。
那我该怎么办呢?
答案 0 :(得分:3)
最简单的解决方案是,不要有多个未完成的读或写。因此,如果通知完成,则表明所有数据都已写入套接字。如果在等待IO完成时,需要向套接字写入更多数据,只需缓冲该数据并在IO完成时写入数据。
如果套接字有多个未完成的IO,则必须在读取端进行排序。在写入方面,您必须做一些簿记以了解哪个写入是最后一个,因此,当数据完全写入时。
另一方面,仅仅通过将数据成功写入套接字并不意味着,数据在另一方面被正确接收或处理,因此必须有某种协议。如果是这样,您可以简单地依赖该协议,只需查找错误通知。