websocketpp asio 监听错误
websocketpp asio listen error
我有一个多线程的 websocketpp 服务器。当我退出程序并重新启动时没有连接客户端,它没有问题。
然而,当客户端连接并且我 quit/relaunch 时,程序会抛出此错误
[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 class 的析构函数中,我有一个 m_server.stop()
每当有 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->first)
以从该处理程序中冻结 activity。
再看一遍,我认为你遇到的异常是在你用 m_server.listen(...)
收听的地方抛出的。尝试用 try/catch 围绕它并放置自定义日志消息。
我有一个多线程的 websocketpp 服务器。当我退出程序并重新启动时没有连接客户端,它没有问题。
然而,当客户端连接并且我 quit/relaunch 时,程序会抛出此错误
[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 class 的析构函数中,我有一个 m_server.stop()
每当有 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->first)
以从该处理程序中冻结 activity。
再看一遍,我认为你遇到的异常是在你用 m_server.listen(...)
收听的地方抛出的。尝试用 try/catch 围绕它并放置自定义日志消息。