我已经websocket
使用boost::beast::websocket
and boost::asio::io_context
in编写了一个小客户端C++
。我有一个具有以下状态的状态机:
enum class State {
GDR_PROVISING,
WEBSOCKET_HANDSHAKE,
REGISTRATION,
READY,
CLEANUP,
};
如果代码无法建立连接或建立连接后失败(可能的原因:Internet 已关闭,Service 已关闭,Server 发送关闭帧),则状态机将进入CLEANUP
状态并应进行清理。
我不确定我是否可以重复使用相同的io_context
和websocket::stream
. 目前,我的 io_context 只在这个单线程中使用。我打算使用pointers
websockets 和 io_context 并在 CLEANUP 中删除它们并在 GDR_PROVISING 中再次分配它们。
我可以使用相同的 websocket 和 io_context 实例来重新建立与服务器的连接吗?可能我需要调用一些成员函数,比如stop
or reset
?
我READY
现在的样子是这样的:
case State::READY:
{
// TODO: Send the Message from the vector
{
std::lock_guard<std::mutex> msgGaurd(msgMutex_);
for (const auto& m: sendMsgQueue_) {
boost::system::error_code ec;
pWebStream_->write(boost::asio::buffer(m.toString()), ec);
}
}
// Call io_context run_until to process read messages async because there is no way for non-blocking read in boost for websockets!
pIoc_->run_until(std::chrono::steady_clock::now() + /* TODO: Add some time_point */);
break;
}
case State::CLEANUP:
{
// TODO: Verify if we should delete the stream!
if (pWebStream_)
delete pWebStream_;
if (pIoc_)
delete pIoc_;
pWebStream_ = nullptr;
pIoc_ = nullptr;
state_ = State::GDR_PROVISING;
break;
}