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

问题描述:

我正在开发管理一个套接字的客户端应用程序。我正在使用IOCP来管理异步I/O。如何处理多个操作发布在同一套接字上的情况

这是从网络编程的书报价:

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

那么我应该如何处理这种情况呢?

最简单的解决方案是,没有多个优秀的读或写。所以如果通知完成,很明显,所有的数据都被写入套接字。如果在等待IO完成时,需要将更多数据写入套接字,只需在IO完成时缓存该数据并写入该数据。

如果你有一个以上未完成的IO到套接字,你必须在读取端对它们进行排序。在写入方面,你必须做一些记录,以确定哪些写入是最后一次写入,从而完全写入数据。另一方面,仅仅通过将数据写入到套接字中并不意味着数据在另一侧被正确接收或处理,所以必须有某种协议。如果是这样,你可以简单地依靠该协议,只需查找错误通知。

+0

+1,处理它的最简单方法是不处理它!对于IOCP套接字类我有一个类似的方法,它使用它自己的缓冲区列表来发送以解决这个确切问题。随着每个请求的完成,下一个请求将被传送。所有线程安全的,当然;) – 2012-07-26 14:48:42