【发布时间】:2011-05-31 23:45:34
【问题描述】:
通过阅读其他 Stack Overflow 条目和 boost::asio 文档,我确认没有同步 ASIO 读/写调用也提供易于使用的超时作为调用参数。
我正在使用使用超时的 select(2) 调用转换老式 Linux 套接字应用程序,我需要或多或少地做同样的事情。
那么在boost::asio 中执行此操作的最佳方法是什么?查看 asio 文档,有许多与计时器有关的各种令人困惑的示例,但我很困惑。
我希望看到一个简单易读的示例:从套接字读取,但最多等待 X 秒,之后该函数要么什么都不返回,要么返回任何内容能够在超时到期之前从套接字读取。
【问题讨论】:
-
您能否详细说明这个示例的混淆之处:think-async.com/Asio/asio-1.4.7/src/examples/timeouts/… - 基本逻辑是,您发送 2 个异步任务,一个是读/写,另一个是超时(如果读/写首先返回你杀死截止时间计时器,如果截止时间计时器返回逻辑是读/写仍然未完成 - 从那里你继续你的超时逻辑。非常非常简单。
-
在 hf 网络中可能会出现一种与回调队列相关的极端情况。超时 cb 排队,然后读/写排队。当实际上读/写已经完成时,您遇到超时 cb 并开始执行超时逻辑,我见过的一个可能的解决方案类似于双重检查锁定 - 简而言之,当第一个超时返回时执行辅助超时,但是这有同样的问题,如果读/写在第二次超时后排队怎么办...
-
只要记住超时是一个硬条件,你是说如果我在一定时间内没有得到什么,我会做一些具体的事情 - 这包括读/写的事实可能已经发生并且正在寄给您的路上,但这并不能改变您尚未收到它的事实。
-
@zenikoder 我认为混淆在于 asio 提供的超时构造使用异步方法强制执行,它们不能与同步方法一起使用。
-
@Sam:您可以创建同步超时,您只需将异步调用隐藏在阻塞的同步接口后面,直到发生超时或读/写。
标签: c++ sockets boost-asio