Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理在同一套接字上发布多个操作的情况_C++_Sockets_Asyncsocket_Iocp - Fatal编程技术网

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

C++ 如何处理在同一套接字上发布多个操作的情况,c++,sockets,asyncsocket,iocp,C++,Sockets,Asyncsocket,Iocp,我正在开发一个管理一个套接字的客户端应用程序。我正在使用IOCP管理异步I/O 这是一本网络编程书中的一句话: 所有重叠操作都保证按照应用程序发出的顺序执行。但是,不能保证从完成端口返回的完成通知的顺序相同。也就是说,如果应用程序发布两个重叠的WSARecv操作,一个是10 KB缓冲区,另一个是12 KB缓冲区,则首先填充10 KB缓冲区,然后填充12 KB缓冲区。在10 KB操作的完成事件之前,应用程序的工作线程可能会收到来自GetQueuedCompletionStatus的12 KB WS

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

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

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


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

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

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


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

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