C ++ Boost ASIO:如何使用超时读取/写入? [英] C++ Boost ASIO: how to read/write with a timeout?

查看:643
本文介绍了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进行设置,可以使用

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

SO_RCVTIMEO和SO_SNDTIMEO 指定接收或发送超时,直到报告 错误.该参数是一个结构 时间间隔.如果输入或输出 此期间的功能块 时间,并且数据已发送 或接收到该函数的返回值将是 传输的数据量;如果不 数据已传输,并且 已达到超时,则-1为 返回errno设置为 EAGAIN或EWOULDBLOCK就像将套接字指定为 不阻塞.如果超时是 设置为零(默认值),然后 操作将永远不会超时. 超时仅生效 用于执行套接字I/O的系统调用(例如read(2), recvmsg(2),send(2),sendmsg(2)); 超时对select(2)无效, poll(2),epoll_wait(2)等.

SO_RCVTIMEO and SO_SNDTIMEO Specify the receiving or sending timeouts until reporting an error. The argument is a struct timeval. If an input or output function blocks for this period of time, and data has been sent or received, the return value of that function will be the amount of data transferred; if no data has been transferred and the timeout has been reached then -1 is returned with errno set to EAGAIN or EWOULDBLOCK just as if the socket was specified to be non-blocking. If the timeout is set to zero (the default) then the operation will never timeout. Timeouts only have effect for system calls that perform socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts have no effect for select(2), poll(2), epoll_wait(2), etc.

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆