【发布时间】:2016-07-24 20:35:54
【问题描述】:
我正在使用C++ REST SDK(“Casablanca”)接收来自 websocket 服务器的提要。
有时,我需要关闭连接并重新连接。该库没有reconnect 函数,因此我关闭了旧连接并简单地打开一个新连接。问题在于,另一端的服务器似乎没有回复我的关闭消息。
这是代码:
web::websockets::client::websocket_callback_client* m_clClient;
///...
void Connection::reconnect()
{
std::cout << "Debug 1" << std::endl;
this->m_clClient.close().get();
delete this->m_clClient;
this->m_clClient = new web::websockets::client::websocket_callback_client();
std::cout << "Debug2" << std::endl;
}
正如我所说,服务器似乎没有回复close(),因此程序永远卡在this->m_clClient.close().get();。
我还尝试在不发送close() 的情况下删除会话,如下所示:
web::websockets::client::websocket_callback_client* m_clClient;
///...
void Connection::reconnect()
{
std::cout << "Debug 1" << std::endl;
delete this->m_clClient;
this->m_clClient = new web::websockets::client::websocket_callback_client();
std::cout << "Debug2" << std::endl;
}
但程序在“调试 1”之后仍然卡住。我认为 close() 是在 websocket_callback_client 的析构函数中调用的,如果之前没有这样做的话。
我搜索了库的源代码,发现websocket_callback_client的析构函数在这里:link:
~wspp_callback_client()
{
_ASSERTE(m_state < DESTROYED);
std::unique_lock<std::mutex> lock(m_wspp_client_lock);
// Now, what states could we be in?
switch (m_state) {
case DESTROYED:
// This should be impossible
std::abort();
case CREATED:
lock.unlock();
break;
case CLOSED:
case CONNECTING:
case CONNECTED:
case CLOSING:
// Unlock the mutex so connect/close can use it.
lock.unlock();
try
{
// This will do nothing in the already-connected case
pplx::task<void>(m_connect_tce).get();
}
catch (...) {}
try
{
// This will do nothing in the already-closing case
close().wait();
}
catch (...) {}
break;
}
// At this point, there should be no more references to me.
m_state = DESTROYED;
}
正如您在case CLOSING: 下看到的,它等待连接关闭。
此时我能看到的唯一可能性是调用close() 而不等待答案,然后用新客户端覆盖指针,保持旧客户端不被删除。这将是一个非常不干净的解决方案。
如何关闭会话并打开一个新会话?
【问题讨论】:
标签: c++ websocket casablanca