Ошибка прослушивания 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(...), Попытайтесь окружить это попыткой / поймать и поместить пользовательское сообщение регистрации.

Другие вопросы по тегам