繁体   English   中英

websocketpp asio监听错误

[英]websocketpp asio listen error

我有一个多线程的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);
}

同样在广播服务器类的析构函数中,我有一个m_server.stop()

每当有websocketpp::exception ,我都会先检查要使用端点的任何地方,在您的情况下为m_server

例如,它可能在您正在调用m_server.send(...) 由于您正在使用多线程,因此很有可能一个线程可能正在尝试使用connection_hdl而该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中,尽管它仍然会引发异常,但由于它不会终止程序,因此最终会关闭处理程序。

另外,也许在调用close()冻结该处理程序的活动之前尝试m_server.pause_reading(it->first)


经过第二次查看,我认为您在使用m_server.listen(...)监听时会抛出异常。 尝试用try / catch包围它,并放置自定义日志消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM