如何捕获websocket连接错误

时间:2015-10-08 13:33:48

标签: c++ qt websocket

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

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);

这似乎无效。

2 个答案:

答案 0 :(得分:5)

在打开套接字之前连接到QWebSocket error信号。

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返回包含QMetaObjectConnectionoverloaded bool operator时,您可以检查从连接调用的返回,以确保找到有效的信号和插槽,并且有效提供的论据: -

// 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的连接调用中通知您这个问题。

  

注意,在旧式连接语法中,参数列表没有命名参数,只提供了类型。添加名称将导致连接失败。

答案 1 :(得分:3)

documentation中所述:

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

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

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