Yangff
Yangff

Reputation: 87

QWebSocketServer still connecting

I'm writing a simple server that pass some data to javascript by QWebSocketServer (basicly the same as qt doc...).

And, please take a look at here:

void DebuggerServer::onNewConnection() {
    puts("C");
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    connect(pSocket, &QWebSocket::textMessageReceived, this, &DebuggerServer::processMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &DebuggerServer::socketDisconnected);

    printf("onNewConnection");

    m_clients << pSocket;
}

I try to puts("C"); here, but I get nothing.

In my browser (latest version of chrome), If I send a request to the server, i will get some information like socket is connecting.

I've tried these things: closing firewall, changing port, changing browser, changing compile mode.

I'm not sure if this involve this issue, I'm compiling these code by msvc15 and manully moc headers.

This code is inject into other application by loadlibrary.

Full source code for the server is followed...

Server.cpp

#include "Server.h"
#include "Inspector.h"

#include "Server.moc"

#include <QtCore/QCoreApplication>

const int port = 5642;
DebuggerServer *server;

void StartServer() {
    server = new DebuggerServer(port);
}

QT_USE_NAMESPACE

DebuggerServer::DebuggerServer(quint16 port, QObject *parent) :
    QObject(parent),
    m_pWebSocketServer(Q_NULLPTR),
    m_clients()
{
    m_pWebSocketServer = new QWebSocketServer(QStringLiteral("mvInspector"),
        QWebSocketServer::NonSecureMode,
        this);
    puts("A");
    if (m_pWebSocketServer->listen(QHostAddress::Any, port))
    {
        puts("B");
        connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
            this, &DebuggerServer::onNewConnection);
    }
}


DebuggerServer::~DebuggerServer() {
    m_pWebSocketServer->close();
    qDeleteAll(m_clients.begin(), m_clients.end());
}

template<class T>
QString toStr(QList<T> y) {
    QString rst;
    for (T x : y)
        rst += "\n" + QString(x);
    return rst;
}

#define ASSERT_N(x) if (frame.length() != x) rst = "ERRON, wrong number of arguments."; else

void DebuggerServer::processMessage(QString message) {
    QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
    QStringList frame = message.split("\n");
    QString rst;

    rst += frame[0];
    if (frame[0] == "getRootWindows") {
        ASSERT_N(1)
        rst += toStr(getRootWindows());
    }
    if (frame[0] == "getChildren") {
        ASSERT_N(2)
        rst += toStr(getChildren(frame[1].toInt()));
    }
    if (frame[0] == "getPropertyName") {
        ASSERT_N(2)
        rst += toStr(getPropertyName(frame[1].toInt()));
    }
    if (frame[0] == "getProperty") {
        ASSERT_N(3)
        rst += getProperty(frame[1].toInt(), frame[2].toStdString().c_str()).toBase64();
    }
    if (frame[0] == "getClassname") {
        ASSERT_N(2)
        rst += getClassname(frame[1].toInt());
    }
    if (frame[0] == "getClassname") {
        ASSERT_N(2)
        rst += getObjectname(frame[1].toInt());
    }
    printf(rst.toStdString().c_str());
    pSender->sendTextMessage(rst);
}

void DebuggerServer::socketDisconnected()
{
    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
    if (pClient) {
        m_clients.removeAll(pClient);
        pClient->deleteLater();
    }
    printf("socketDisconnected");
}

void DebuggerServer::onNewConnection() {
    puts("C");
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    connect(pSocket, &QWebSocket::textMessageReceived, this, &DebuggerServer::processMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &DebuggerServer::socketDisconnected);

    printf("onNewConnection");

    m_clients << pSocket;
}

Server.h

#pragma once
#include <QtCore/qobject.h>
#include <QtWebSockets/qwebsocketserver>
#include <QtWebSockets/QWebSocket>

void StartServer();

class DebuggerServer : public QObject {
    Q_OBJECT
public:
    explicit DebuggerServer(quint16 port, QObject *parent = Q_NULLPTR);
    virtual ~DebuggerServer();

private Q_SLOTS:
    void onNewConnection();
    void processMessage(QString message);
    void socketDisconnected();

private:
    QWebSocketServer *m_pWebSocketServer;
    QList<QWebSocket *> m_clients;
};

DLLMain

#include <Windows.h>

#include "../Server.h"

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        StartServer();
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;

}

Upvotes: 1

Views: 889

Answers (1)

Yangff
Yangff

Reputation: 87

Finally, it seems to be a bug of Qt 5.4.1 at least on windows 10 (msvc) .

I can make two Qt application connecting by the websocket, but cannot let At application connecting with a normal browser.

So, I use another websocket library and repect the original Qt websocket.

Upvotes: 1

Related Questions