【问题标题】:How to deal with a case where multiple operations are posted on the same socket如何处理在同一个socket上发布多个操作的情况
【发布时间】:2012-07-25 02:38:32
【问题描述】:

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

这是来自网络编程书籍的引述:

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

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

【问题讨论】:

    标签: c++ sockets asyncsocket iocp


    【解决方案1】:

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

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

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

    【讨论】:

    • +1,对付它最简单的办法就是不对付它!我对 IOCP 套接字类有类似的方法,它使用自己的缓冲区列表来发送来解决这个确切的问题。随着每个请求得到满足,下一个请求将被传输。当然,所有线程安全;)
    猜你喜欢
    • 2021-02-24
    • 2015-08-13
    • 2021-12-06
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多