如何使用超时读取

如何使用超时读取

本文介绍了C ++ Boost ASIO:如何使用超时读取/写入?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通过阅读其他Stack Overflow条目和boost::asio文档,我已确认没有同步的ASIO读/写调用,这些调用也提供易于使用的超时作为调用的参数.

From reading other Stack Overflow entries and the boost::asio documentation, I've confirmed that there is no synchronous ASIO read/write calls that also provide an easy-to-use timeout as a parameter to the call.

我正在通过使用超时的select(2)调用转换一个老式的Linux套接字应用程序,我几乎需要做同样的事情.

I'm in the middle of converting an old-school Linux socket application with select(2) calls that employs timeouts, and I need to do more-or-less the same.

那么在boost::asio中执行此操作的最佳方法是什么?查阅asio文档,有许多令人困惑的示例说明了与计时器有关的各种事情,但是我很困惑.

So what is the best way to do this in boost::asio? Looking at the asio documentation, there are many confusing examples of various things to do with timers, but I'm quite confused.

我希望看到一个简单易懂的示例:从套接字读取,但是要等待最多X秒钟,之后函数要么不返回任何内容,要么返回任何内容可以在超时过期之前从套接字读取.

I'd love to see a simple-to-read example of this: Read from a socket, but wait for a maximum of X seconds after which the function either returns with nothing, or returns with whatever it was able to read from the socket before the timeout expired.

推荐答案

这已出现在asio邮件列表中,其中有一个门票也请求该功能.总而言之,如果您需要超时和可取消性,建议使用异步方法.

This has been brought up on the asio mailing lists, there's a ticket requesting the feature as well. To summarize, it is suggested to use asynchronous methods if you desire timeouts and cancellability.

如果无法转换为异步方法,则可以尝试使用SO_RCVTIMEOSO_SNDTIMEO套接字选项.可以使用setsockopt进行设置,可以使用 boost :: asio :: ip :: tcp :: socket :: native 方法. man 7 socket手册页上说

If you cannot convert to asynchronous methods, you might try the SO_RCVTIMEO and SO_SNDTIMEO socket options. They can be set with setsockopt, the descriptor can be obtained with the boost::asio::ip::tcp::socket::native method. The man 7 socket man page says

这篇关于C ++ Boost ASIO:如何使用超时读取/写入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 00:38