如何处理在同一个套接字上发布多个操作的情况

时间:2012-07-26 13:35:19

标签: c++ sockets asyncsocket iocp

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

这是网络编程书的引用:

  

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

那我该怎么办呢?

1 个答案:

答案 0 :(得分:3)

最简单的解决方案是,不要有多个未完成的读或写。因此,如果通知完成,则表明所有数据都已写入套接字。如果在等待IO完成时,需要向套接字写入更多数据,只需缓冲该数据并在IO完成时写入数据。

如果套接字有多个未完成的IO,则必须在读取端进行排序。在写入方面,您必须做一些簿记以了解哪个写入是最后一个,因此,当数据完全写入时。

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