【发布时间】:2017-06-16 09:05:05
【问题描述】:
我正在尝试找到正确/规范的方法来实现下面的代码,该代码提供了一个围绕异步 asio 方法的同步包装器,以实现超时。代码似乎可以工作,但我看过的示例都没有使用 lambda 中的布尔值来终止运行 i/o 服务的 do/while 循环,所以我不确定这是否是正确的形式,或者它是否会有意想不到的后果。有些人会做类似的事情 而(IOService.run_one); 但这永远不会终止。
编辑: 我正在尝试遵循此示例: http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/timeouts/blocking_tcp_client.cpp
但在这段代码中,它们避免了使用 \n 终止符读取的字节数。我需要读取的字节数,因此需要回调。
我见过许多其他使用 boost async futures 以及其他方法的解决方案,但它们似乎无法与 Ubuntu 16.04 的 gcc / boost 标准版本一起编译,我想继续使用这些版本。
ByteArray SessionInfo::Read(const boost::posix_time::time_duration &timeout)
{
Deadline.expires_from_now(timeout);
auto bytes_received = 0lu;
auto got_callback = false;
SessionSocket->async_receive(boost::asio::buffer(receive_buffer_,
1024),
[&bytes_received, &got_callback](const boost::system::error_code &error, std::size_t bytes_transferred) {
bytes_received = bytes_transferred;
got_callback = true;
});
do
{
IOService.run_one();
}while (!got_callback);
auto bytes = ByteArray(receive_buffer_, receive_buffer_ + bytes_received);
return bytes;
}
【问题讨论】:
-
如果你希望它与超时同步,你为什么要使用异步 I/O?
-
据我了解,这是在超时的情况下使用 boost asio 的首选/唯一方法。从理论上讲,您可以获得本机套接字和 setsockopt,但从我阅读的内容来看,它显然既不推荐、也不可靠或可移植。似乎首选机制是使用 boost::use_future,但那是在 gcc 5.4.0 / boost 1.58 上无法编译的
-
这不是我使用超时的方式。在调用 async_receive 时设置截止日期,并在收到数据包时重新设置。
-
Michaël Roy - 我不确定你的意思。据我所知,我没有遇到超时机制的问题 - 我直接从 boost 示例中得到它。
标签: sockets boost timeout asio