Boost.Asio deadline_timer未按预期工作
Boost.Asio deadline_timer not working as expected
我正试图在TCP套接字上实现Boost.Asio读取的超时。
我正在尝试将async_read_some
与deadline_timer
一起使用。下面的函数是一个类的成员,该类持有指向TCP套接字和io_service
的智能指针。当在不返回任何数据的活动套接字上调用时,我期望发生的情况是等待2秒并返回false。
结果是:如果套接字从不返回任何数据,那么它将按预期工作。如果服务器返回数据,那么对下面方法的继续调用会立即返回,因为对计时器的回调是在不等待两秒钟的情况下调用的。
我尝试注释掉async_read_some
调用,该函数始终按预期工作。为什么async_read_some
会改变计时器的工作方式?
client::client() {
// Init socket and timer
pSock = boost::shared_ptr<tcp::socket > (new tcp::socket(io_service));
}
bool client::getData() {
// Reset io_service
io_service.reset();
// Init read timer
boost::asio::deadline_timer timer(pSock->io_service());
timer.expires_from_now(boost::posix_time::seconds(2));
timer.async_wait(boost::bind(&client::read_timeout, this, boost::system::error_code(), true));
// // Async read the data
pSock->async_read_some(boost::asio::buffer(buffer_),
boost::bind(&client::read_complete,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
// While io_service runs check read result
while (pSock->io_service().run_one()) {
if (m_read_result > 0) {
// Read success
return m_read_result;
}else if(m_read_result < 0){
return false;
}
}
}
}
void client::read_complete(const boost::system::error_code& error, size_t bytes_transferred) {
if (!error) {
m_read_result = bytes_transferred;
}else{
m_read_result = -1;
}
}
void client::read_timeout(const boost::system::error_code& error, bool timeout) {
if(!error){
m_read_result = -1;
}
}
设置计时器boost::system::error_code()时的简单问题应更改为_1或错误::占位符
timer.async_wait(boost::bind(&client::read_timeout, this, _1, true));
当您检查连接错误时,您已经否定了条件。
应该是:
if(error){
std::cout << "read_timeout Error - " << error.message() << std::endl;
}
现在您将看到,回调被调用,错误代码为boost::asio::error::operation_aborted
。
这是因为,当您接收到任何数据时,您会从函数getData
返回,而deadline_timer
的析构函数会调用带有错误代码集的回调。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作