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 会话的数据平面循环,确保在特定条件下发送数据,并在定时器超时时继续循环。这是一种典型的异步编程模式,其中通过定时器和回调函数来组织异步任务的执行。