[C++/QT] Socket Objekt bei disconnect automatisch gelöscht ?

Mo1k

Mitglied
Hallo,

ich programmiere gerade einen Server mit QT, wenn der Server eine neue Verbindung meldet wir die Funktion ausgeführt:
Code:
void MyServer::incomingConnection(int handle)
{
    nextClient *client = new nextClient(this);
    client->newsocket(handle);
}

Client.h
Code:
#ifndef NEXTCLIENT_H
#define NEXTCLIENT_H

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

class nextClient : public QObject
{
    Q_OBJECT
public:
    explicit nextClient(QObject *parent = 0);
    void newsocket(int descriptor);
signals:
    
public slots:
    void connected();
    void disconnected();
    void readyRead();

private:
    QTcpSocket *socket;

};

#endif // NEXTCLIENT_H

nextclient.cpp
Code:
#include "nextclient.h"

nextClient::nextClient(QObject *parent) :
    QObject(parent)
{
}

void MyClient::newsocket(int descriptor)
{
    socket = new QTcpSocket(this);
    connect(socket,SIGNAL(connected()),this,SLOT(connected()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()));
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));

    socket->setSocketDescriptor(descriptor);

    qDebug() << "client connected";
}

void nextClient::connected()
{
    qDebug() << "client connected event";
}

void nextClient::disconnected()
{
    qDebug() << "client disconnected";
}

void nextClient::readyRead()
{
    qDebug() << socket->readAll();
}

nun Frage ich mich, wenn der Client die Verbindung beendet, wird der slot disconnected() ausgeführt, aber wird das Objekt auch gelöscht, oder muss ich das manuell in dem disconnected() Slot machen ?

Dann wäre da noch was, ich möchte auch die Funktion implementieren, dass der Server von sich aus eine Verbindung beendet. Ich habe in der QT Doku gelesen dass das Socket einen Slot dafür hat: void QAbstractSocket::disconnectFromHostImplementation ().
Es reicht ja dann, ein Signal an diesen Slot zu schicken und um weiteres muss ich mich nicht kümmern ?

Mo1k
 
Zuletzt bearbeitet:
nun Frage ich mich, wenn der Client die Verbindung beendet, wird der slot disconnected() ausgeführt, aber wird das Objekt auch gelöscht, oder muss ich das manuell in dem disconnected() Slot machen ?
Sofern dein Server von QObject abgeleitet ist, wird das Client-Objekt automatisch gelöscht, wenn das Server-Objekt zerstört wird. Wenn du früher aufräumen willst, solltest du das im Server erledigen. Ein "delete this" würde ich vermeiden.

Es reicht ja dann, ein Signal an diesen Slot zu schicken und um weiteres muss ich mich nicht kümmern ?
Oder rufe einfach die Methode disconnectFromHost() des Servers auf.

Gruß
MCoder
 
Richtig, QObject hat ja noch diese nette Methode :)
Ich denke, die Verwendung von deleteLater() ist unkritisch, weil das delete dann über die Qt-eigenen Mechanismen abgewickelt wird.

Gruß
MCoder
 
Dann wäre da noch eins, bei einer neuen Verbindung erstelle ich ein nextClient Object als child und in dem erstelle ich ein socket als child von nextClient. Wenn nun das Socket das Signal disconnected sendet, wird es in diesem Zeitpunkt auch zerstört oder muss ich das manuell machen ? Das war meine eigentliche Frage, nicht dass ich das Socket nun manuell mit deletelater lösche aber das Socket garnichtmehr vorhanden ist und dadurch einen Fehler verursacht. Das nextClient Object zerstöre ich mit deletelater mit dem Auslösesignal disconnected von dem Socket.

Hoffe das war einigermaßen verständlich ^^
 
Da gilt das schon Geschriebene: Bei Qt-Objekten werden die Childs automatisch zerstört, wenn der Parent zerstört wird. deleteLater() sollte dafür sorgen, dass auch die Childs des betreffenden Objektes unfallfrei entsorgt werden.

Gruß
MCoder
 
so habe das jetzt so gelöst: wenn der SOcket das disconnected Signal sendet wird es an folgende Funktion weitergeleitet:
Code:
void MyServer::delete_unidentified_connection(nextClient* client)
{
    if(unidentified.removeOne(client) == true)
    {
        client->deleteLater();
    }
}

der Pointer auf das nextClient Objekt wird aus einer Liste gelöscht und anschließen wird mit deleteLater das Objekt gelöscht.
Das dürfte dann hoffentlich keine Probleme machen.
 
Zurück