TcpServer Problem mit newConnection Signal

Alles rund um die Programmierung mit Qt
Antworten
SoerenV
Beiträge: 7
Registriert: 4. Juli 2017 15:49

TcpServer Problem mit newConnection Signal

Beitrag von SoerenV »

Hallo liebes Forum,

ich möchte eine Tcp Verbindung auf meinem Rechner aufbauen. Ich nutze Qt 5.7.1 und den mingw32 Compiler unter Windows 7. Der untere Code ist ein minimal Beispiel, welcher aber auch nicht funktioniert.

Mein Problem ist, dass das Signal newConnection() aus der Klasse QTcpServer bei mir nicht funktionieren möchte. Ich habe eine neue Connection erstellt und eig. sollte er bei einer neuen Verbindung das Signal acceptConnection() aufrufen. Das macht er jedoch nur, wenn ich waitForNewConnection(1000) hinzufüge.

Ich habe online auch einen ähnlichen Fall gefunden (nachfolgender Link). Leider ist die Lösung nicht auf mein Problem anwendbar, auch wenn ich die Lösung für mein Compiler angepasst habe.
https://forum.qt.io/topic/79311/qtcpser ... stantiated

main.ccp

Code: Alles auswählen

#include "tcpserver.h"
#include <QDebug>

int main()
{
    tcpServer tServer;
    return 0;
}

tcpserver.h

Code: Alles auswählen

#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>

class tcpServer : public QObject
{
    Q_OBJECT
public:
    explicit tcpServer(QObject *parent = 0);

public slots:
    void acceptConnection();

    void connected();
    void disconnected();

private:
    QTcpServer server;
    QTcpSocket socket;
};

#endif // TCPSERVER_H
tcpserver.cpp

Code: Alles auswählen

#include "tcpserver.h"

tcpServer::tcpServer(QObject *parent) :
    QObject(parent)
{
    qDebug() << connect( &server,  &QTcpServer::newConnection, this, &tcpServer::acceptConnection );
    qDebug() << connect( &socket, &QTcpSocket::connected,     this, &tcpServer::connected );
    qDebug() << connect( &socket, &QTcpSocket::disconnected,  this, &tcpServer::disconnected );

    if( !server.listen(QHostAddress::LocalHost,1234) ){
        qDebug() << "Server: Server could not start!";
    }
    else{
        qDebug() << "Server: Server started!";
    }

    socket.connectToHost(QHostAddress::LocalHost, server.serverPort());
    if(!socket.waitForConnected(3000)){
        qDebug() << "ServerClient: Not Connected";
    }

    // mit dieser Methode klappt es
    // server.waitForNewConnection(1000);
}

void tcpServer::acceptConnection()
{
    qDebug() << "Works only with server.waitForNewConnection(1000); ";
}

void tcpServer::connected()
{
    qDebug() << "ServerClient: Connected!";
}

void tcpServer::disconnected()
{
    qDebug() <<  "ServerClient: Disconnected!";
}
HMI_PCVersion.pro

Code: Alles auswählen

QT += network

CONFIG += c++11

SOURCES += main.cpp \
    tcpserver.cpp

HEADERS += \
    tcpserver.h

QMAKE_LFLAGS_WINDOWS += -Wl,--stack,256000000
Ich hoffe ich konnte das Problem verständlich machen und ihr könnt mir helfen.

Grüßle
Sören
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: TcpServer Problem mit newConnection Signal

Beitrag von MichaelS »

Hallo,

das Problem dürfte sein, dass Du keine Eventloop hast, in der die Signale verarbeitet werden können. Da fehlt also irgendetwas wie

Code: Alles auswählen

QApplication app(argc, argv);
    ...
return app.exec();
Gruß Michael
SoerenV
Beiträge: 7
Registriert: 4. Juli 2017 15:49

Re: TcpServer Problem mit newConnection Signal

Beitrag von SoerenV »

Hallo MichaelS,

vielen lieben Dank für deine Antwort. Ich habe oben lediglich eine sehr stark gekürzte Fassung dargestellt.
In meinem original Programm (siehe die main.cpp unten) habe ich das jedoch mit implementiert. Außerdem funktionieren ja anderen connections.

Code: Alles auswählen

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include "tcpconnection.h"
#include "tcpserver.h"
#include <QQmlContext>
#include <QDebug>


int main(int argc, char *argv[])
{
    QScopedPointer<tcpConnection> tcpCon(new tcpConnection);
    tcpServer tServer;

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    engine.rootContext()->setContextProperty("tcpCon", tcpCon.data());

    return app.exec();
}
Grüßle
Sören
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: TcpServer Problem mit newConnection Signal

Beitrag von Christian81 »

Warum auch immer Du einen TCP-Port öffnest um zu dich selbst zu connecten aber MichaelS hat recht - wenn zwischen dem Server und Socket keine Eventloop läuft, kann auch kein Signal ankommen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
SoerenV
Beiträge: 7
Registriert: 4. Juli 2017 15:49

Re: TcpServer Problem mit newConnection Signal

Beitrag von SoerenV »

Hallo,

ich habe den Fehler nun gefunden. Ich hatte zwar einen Eventloop, jedoch habe ich die jeweiligen Klassen vor "QGuiApplication app(argc, argv);" aufgerufen.

Ziemlich doofer Fehler. Vielen Dank für den Tip mit dem Eventloop!

Grüßle
Sören
Antworten