如何捕获websocket连接错误

gaj*_*gaj 4 c++ qt websocket

我正在打开Qt/c ++客户端的网址,比如

m_webSocket = new QWebSocket();
m_webSocket->open("wss://192.123.1.44:8087");
Run Code Online (Sandbox Code Playgroud)

我想抓住任何连接错误.我怎么做?我已连接到信号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);
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.

The*_*ght 5

在打开插座之前连接到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");
Run Code Online (Sandbox Code Playgroud)

请注意,此连接使用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);
}
Run Code Online (Sandbox Code Playgroud)

QObject :: connect返回包含重载bool运算符QMetaObjectConnection时,您可以检查从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;
}
Run Code Online (Sandbox Code Playgroud)

但是,这在很大程度上是多余的,因为失败的连接通常会产生调试输出,从Qt的connect调用中通知您这个问题.

注意,在旧式连接语法中,参数列表不命名参数,仅提供类型.添加名称将导致连接失败.


sco*_*nov 5

文档中所述:

注意:信号错误在这个类中被重载。为了使用函数指针语法连接到这个信号,Qt 提供了一个方便的助手来获取函数指针,如下例所示:

connect(webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
[=](QAbstractSocket::SocketError error){ /* ... */ });
Run Code Online (Sandbox Code Playgroud)

当然,您可以连接到一个普通的函数,而不是 lambda 函数,但这QOverload部分很重要。