如何捕获websocket连接错误
How to catch websocket connection error
我正在从Qt/c++客户端打开一个url,如
m_webSocket = new QWebSocket();
m_webSocket->open("wss://192.123.1.44:8087");
我想捕获连接中的任何错误。我怎么做呢?我已经连接到信号QWebSocket:error(QAbstractSocket::SocketError error)
,但我从来没有得到它触发,即使我的服务器没有运行。
编辑:我连接到错误信号如下,
m_webSocket = new QWebSocket();
connect(m_webSocket, SIGNAL(error(QAbstractSocket::SocketError error)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError error)));
m_webSocket->open(url);
如文档所述:
注意:信号错误在这个类中是重载的。为了通过使用函数指针语法连接到这个信号,Qt提供了一个方便的助手来获取函数指针,如下例所示:
connect(webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
[=](QAbstractSocket::SocketError error){ /* ... */ });
当然,您可以连接到一个正常的lambda函数,而不是lambda函数,但QOverload
部分很重要。
在打开套接字之前连接到QWebSocket错误信号
QWebSocket* pWebSocket = new QWebSocket;
connect(pWebSocket, &QWebSocket::error, [=](QAbstractSocket::SocketError error)
{
// Handle error here...
qDebug() << pWebSocket->errorString();
}
pWebSocket->open("wss://192.123.1.44:8087");
注意,这个连接使用了一个lambda函数,它需要c++ 11。以通常方式连接到插槽也可以。
如果没有c++ 11,使用标准(Qt 5)连接:-
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QUrl url);
protected slots:
void Error(QAbstractSocket::SocketError error);
private:
QWebSocket* pWebSocket;
};
MyClass::MyClass(QUrl url)
{
QWebSocket* pWebSocket = new QWebSocket;
connect(pWebSocket, &QWebSocket::error, pMyClass, &MyClass::Error);
m_webSocket->open(url);
}
由于QObject::connect返回一个QMetaObjectConnection,其中包含一个重载bool操作符,因此您可以检查调用connect的返回值,以确保找到了有效的信号和槽,并提供了有效的参数:-
// Old-style connection
if(!connect(m_webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError))) )
{
qDebug() << "Failed to connect to QWebSocket::error" << endl;
}
然而,这在很大程度上是多余的,因为一个失败的连接通常产生调试输出通知你这个问题,从Qt的连接调用。
注意,在旧式连接语法中,参数列表不提供参数的名称,只提供类型。添加名称将导致连接失败。
相关文章:
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 从 Linux OMI (omicli) 到 Windows WMI 的连接失败,并出现与 DMTF 相关的错误
- C++ 中连接 4 游戏的输入逻辑错误
- Eclipse:错误:初始化模式失败(无法连接到目标)
- C++所有 AT 命令的短信返回错误 |PC<->通过蓝牙和winsocket的移动连接
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- Mongocxx 连接错误
- 连接到套接字失败 - 错误编号 88 (CPP)
- 尝试重新连接到服务器时获取错误提升 asio 连接超时
- 字符和 int 连接何时会导致 seg 错误?
- 在 ZeroMQ 中绑定订阅者套接字并连接发布者套接字会在代码运行时给出错误.为什么
- JNI - WMI 连接错误
- boost :: Asio连接错误的界面
- 如何在两个设备之间与TCP通信时修复错误"连接被拒绝"