websocketpp asio监听错误

Posted

技术标签:

【中文标题】websocketpp asio监听错误【英文标题】:websocketpp asio listen error 【发布时间】:2017-08-06 19:40:12 【问题描述】:

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

【问题讨论】:

您是否正确关闭了连接?代码在哪里? @Blacktempel:是的,我使用了 github 上示例中的代码来关闭连接。我已经编辑了帖子 【参考方案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 中,虽然它仍然会抛出异常,但由于它不会终止程序,它最终会关闭处理程序。

另外,也许在调用 close() 之前尝试 m_server.pause_reading(it-&gt;first) 以冻结来自该处理程序的活动。


第二次查看后,我认为您收到的异常是在您使用m_server.listen(...) 收听的地方引发的。尝试用 try/catch 包围它并放置自定义日志消息。

【讨论】:

以上是关于websocketpp asio监听错误的主要内容,如果未能解决你的问题,请参考以下文章

websocket计时器滴答后提升asio短读错误

websocketpp最简单的服务器

websocketpp 最简单的客户端 一

MtGox API 和 websocketpp

websocket和websocket++和websocketpp都是啥,有啥关系呢

尝试在 g++ 中编译 websocketpp 端点