我正在使用C++ REST SDK
(「卡薩布蘭卡」)從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()
,然後用新客戶端覆蓋指針,而使舊指針取消刪除。這將是一個非常不清楚的解決方案。
我能做些什麼來關閉會話並打開一個新會話?
我編輯了我的問題並添加了更多詳細信息。不幸的是,由於析構函數仍然會等待它,所以不能使用get()。唯一的解決方案是在不帶'get()'的情況下調用'close()',然後覆蓋指針,從而使舊客戶端不被刪除。 – Bobface