【C++】【异步编程】【WebSocket】通过定时器和回调实现循环读写

 session_data_plane_loop_timeout_handle 函数:

这是定时器结束的回调处理函数,op_allow为操作允许标记,cached_data是缓存的数据

data_for_send是准备发送的数据,do_write()是发送数据函数,session_close()是关闭会话

void ws_session::session_data_plane_loop_timeout_handle(const boost::system::error_code &ec) {
    if (ec == boost::asio::error::operation_aborted) {
        return;
    }

    str_mutex_.lock();
    if (op_allow && cached_data.size() > 0) {
        op_allow = false;
        data_for_send = cached_data;
        cached_data = "";
        str_mutex_.unlock();
        do_write();
    }
    else {
        str_mutex_.unlock();
    }

    if (op_allow && is_closed) {
        session_close();
    }

    start_session_alive_timer();
}
  • 这个函数处理一个定时器超时的事件。如果 ec 表示定时器操作被取消(boost::asio::error::operation_aborted),则函数直接返回。(ec是异步等待结果的一个错误码)
  • 然后,它获取一个互斥锁 str_mutex_,检查条件 op_allow && cached_data.size() > 0 是否满足。如果条件成立,表示可以进行数据发送,将 cached_data 中的数据复制到 data_for_send 中,并清空 cached_data。接着释放互斥锁并调用 do_write 函数进行实际的写入操作。
  • 接下来,它再次检查条件 op_allow && is_closed,如果满足,则调用 session_close 函数。
  • 最后,它调用 start_session_alive_timer 函数,重新启动定时器。

 start_session_alive_timer 函数:

启动定时器函数,shared_from_this是获取当前ws_session类的shared_ptr

void ws_session::start_session_alive_timer() {
    if (is_timer_canceled) {
        return;
    }
    session_data_plane_loop_timer->expires_from_now(boost::posix_time::milliseconds(200));
    auto self = shared_from_this();
    session_data_plane_loop_timer->async_wait(
        [this, self](boost::system::error_code ec) {
        session_data_plane_loop_timeout_handle(ec);
    }
    );
}

  • 这个函数用于启动或重新启动一个定时器,以便在一段时间后再次调用 session_data_plane_loop_timeout_handle 函数。
  • 首先,它检查 is_timer_canceled 是否为真。如果为真,表示定时器已经被取消,直接返回。
  • 然后,它设置定时器的超时时间为 200 毫秒,并使用 async_wait 异步等待定时器超时。在超时时,将再次调用 session_data_plane_loop_timeout_handle 函数。

总结:

这段代码的主要目的是通过定时器控制 WebSocket 会话的数据平面循环,确保在特定条件下发送数据,并在定时器超时时继续循环。这是一种典型的异步编程模式,其中通过定时器和回调函数来组织异步任务的执行。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值