Ошибка прослушивания websocketpp asio
У меня есть многопоточный сервер websocketpp. Когда у меня нет подключенных клиентов, когда я закрываю программу и перезапускаю, она работает без проблем.
Однако, когда клиент подключен, и я завершаю работу / перезапуска, программа выдает эту ошибку
[2017-08-06 15:36:05] [info] asio listen error: system:98 ()
terminate called after throwing an instance of 'websocketpp::exception'
what(): Underlying Transport Error
Aborted
Я полагаю, что у меня правильная последовательность разъединения, и у меня появляется следующее сообщение (моя собственная информация отладки), когда я запускаю последовательность выхода
[2017-08-06 15:35:55] [control] Control frame received with opcode 8
on_close
[2017-08-06 15:35:55] [disconnect] Disconnect close local:[1000] remote:[1000]
Quitting :3
Waiting for thread
Что означает ошибка asio? Я надеюсь, что кто-то видел это раньше, чтобы я мог начать устранение неполадок. Спасибо!
РЕДАКТИРОВАТЬ: я адаптирую стандартный пример broadcast_server, где
typedef std::map<connection_hdl, connection_data, std::owner_less<connection_hdl> > con_list;
con_list m_connections;
Код для закрытия соединения.
lock_guard<mutex> guard(m_connection_lock);
std::cout << "Closing Server" << std::endl;
con_list::iterator it;
for (it = m_connections.begin(); it != m_connections.end(); ++it)
{
m_server.close(it->first, websocketpp::close::status::normal, "", ec);
if (ec)
{
std::cout << "> Error initiating client close: " << ec.message() << std::endl;
}
m_connections.erase(it->first);
}
Также в деструкторе для класса broadcast_server у меня есть m_server.stop()
1 ответ
Всякий раз, когда есть websocketpp::exception
Я сначала проверяю везде, где я явно использую конечную точку, в вашем случае m_server
,
Например, это может быть где-то, где вы звоните m_server.send(...)
, Поскольку вы используете многопоточность, вполне возможно, что один из потоков пытается использовать connection_hdl
в то время как это уже было закрыто другой веткой.
В этом случае это обычно websocketpp::exception invalid state
, Я не уверен в Underlying Transport Error
,
Вы можете использовать точки останова, чтобы определить виновника (или поставить кучу cout
последовательности в разных методах, и посмотрите, какая последовательность нарушена до того, как будет сгенерировано исключение), или используйте try/catch:
try {
m_server.send(hdl, ...);
// or
m_server.close(hdl, ...);
// or really anything you're trying to do using `m_server`.
} catch (const websocketpp::exception &e) {//by safety, I just go with `const std::exception` so that it grabs any potential exceptions out there.
std::cout << "Exception in method foo() because: " << e.what() /* log the cause of the exception */ << std::endl;
}
В противном случае я заметил, что иногда выдается исключение, когда вы пытаетесь закрыть connection_hdl
даже если никакой другой поток, по-видимому, не обращается к нему. Но если вы поместите его в try/catch, хотя он по-прежнему выдает исключение, поскольку он не завершает программу, он в конечном итоге закрывает обработчик.
Также, возможно, попробуйте m_server.pause_reading(it->first)
перед звонком close()
заморозить активность этого обработчика.
После второго взгляда, я думаю, что исключение, которое вы получаете, брошено туда, где вы слушаете m_server.listen(...)
, Попытайтесь окружить это попыткой / поймать и поместить пользовательское сообщение регистрации.