[SOLVED] QT Server - Kein Datenempfang

Alles rund um die Programmierung mit Qt
Antworten
t4ggno
Beiträge: 19
Registriert: 26. September 2011 22:05

[SOLVED] QT Server - Kein Datenempfang

Beitrag von t4ggno »

Hallo,

ich habe ein Problem beim übermitteln von daten übers Netwerk (TCP-Socket).
Ich habe hierfür einen Server, welcher dann die einzelnen Sockets in Unterschiedlichen Threads verwaltet.

Das verbinden klappt soweit. Also Verbindung steht.

Wenn der Client daten sendet, dann bekomm ich als return wert "14" raus. Also hat der Datenversand auch funktioniert!

Mein Server zeigt aber leider diesen übermittelten Wert nicht an.

Habe bisher 2 Versuche unternommen:
einfach per Datastream die Werte direkt zu versen und einmal ein QByteBlock zu erstellen und dann die Daten zu versenden. Beides klappt aber nicht.

Hier mal meine 2 Dateien:

Server:

Code: Alles auswählen

 void TCPThread::run()
 {
     QTcpSocket tcpSocket;
     if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
         emit error(tcpSocket.error());
         return;
     }

     QString IP(tcpSocket.peerAddress().toString());

     std::cout << "New Connection (IP " << IP.toStdString() << " connected)\n";

     tcpSocket.waitForReadyRead();
     QString string;

     QDataStream in(&tcpSocket);
     in.setVersion(QDataStream::Qt_4_7);
     in.setByteOrder(QDataStream::LittleEndian);

     QTime time;
     time.start();

     while(tcpSocket.waitForReadyRead()){
         //In diese Schleife geht der Server nie! Die Funktion wartet also bis timeout und sendet dann return 0 :(
         if (tcpSocket.bytesAvailable()){
             qDebug() << "Test";
             in >> string;
             std::cout << string.toStdString();
         }
     }
     std::cout << "Connection timeout (IP " << IP.toStdString() << " disconnected)\n";
     this->quit();
 }
Client:

Code: Alles auswählen

connection = new QTcpSocket(this);
    connection->connectToHost("localhost",7835);
    if(connection->waitForConnected()){
        QString text("test");

        QByteArray block;
        QDataStream out(&block, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_7);
        out << (quint16)0;
        out << text;
        out.device()->seek(0);
        out << (quint16)(block.size() - sizeof(quint16));

        qDebug() << connection->write(block);
        //Return ist hier 14!!
    }
    else {
        connection = NULL;
    }
    settings = NULL;
Zuletzt geändert von t4ggno am 20. Dezember 2011 14:37, insgesamt 1-mal geändert.
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: QT Server - Kein Datenempfang

Beitrag von DBGTMaster »

Schonmal ein telnet auf deinem TCP Server probiert??

Am Client schonmal auf flush() am Socket gemacht?
t4ggno
Beiträge: 19
Registriert: 26. September 2011 22:05

Re: QT Server - Kein Datenempfang

Beitrag von t4ggno »

Hallo,

wie meinste das mit telnet?

Das mit flush werde ich morgen mal ausprobieren.

Kann ich vllt auch einen fehler haben, bevor ich den Thread starte? Allerdings würde ich dann doch nicht die IP des Client angezeigt bekommen oder?

Danke udn gruß
t4ggno
t4ggno
Beiträge: 19
Registriert: 26. September 2011 22:05

Re: QT Server - Kein Datenempfang

Beitrag von t4ggno »

Habe flush nun direkt am socket durchgeführt.
Leider ohne großen Erfolg.
Ich weiß nicht was ich anders mache als in den Beispielen erklärt?!
t4ggno
Beiträge: 19
Registriert: 26. September 2011 22:05

Re: QT Server - Kein Datenempfang

Beitrag von t4ggno »

Hallo,

nun habe ich etwas seltsames herausgefunden.
Als ich auf die Antwort von euch gewartet habe, habe ich derweil mal eine Zeitgesteuerte "Keepalive"-Funktion geschrieben. Diese schickt alle 10 Sekunden eine kurze Info an den Server "KEEPALIVE".
Daraufhin habe ich bei meinem Server etwas seltsames festgestelt. Der Server übermittelt erst, als die "write" funktion das zweite mal aufgerufen wird. Bzw. mein Server ruft den Inhalt des Sockets erst nach dem zweiten Datenversand ab.

Nochmal bisle genauer:
Client schickt alle 10 Sekundne "KEEPALIVE" an den Server.
Server erhält beim ersten mal keinen String.
Der Client schickt nun (sobald die 10 sekudnen abgelaufen sind) den String "KEEPALIVE" an den Server.
Server erhält nun den String "KEEPALIVEKEEPALIVE".
Alle anderen Packete werden normal angezeigt.

cout bei Server:
KEEPALIVEKEEPALIVE
KEEPALIVE
KEEPALIVE
...

Ich kapier nun gar nichts mehr?!

Ein Fehler von mir? Ein Fehler von QT?

Gruß
t4ggno
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QT Server - Kein Datenempfang

Beitrag von brax »

t4ggno hat geschrieben: Ein Fehler von mir?
Ja.

Ich zitiere mal Deinen Server-Code:

Code: Alles auswählen

 ...
 tcpSocket.waitForReadyRead();
 ... // kein Lesen vom Socket
 while(tcpSocket.waitForReadyRead()){
Siehst Du es?
Falls nicht, ein Hinweis: waitForReadRead kommt dann zurück wenn NEUE Daten am Socket verfügbar sind (siehe Doku).
t4ggno
Beiträge: 19
Registriert: 26. September 2011 22:05

Re: QT Server - Kein Datenempfang

Beitrag von t4ggno »

Boah... Danke.
Das die Funktion auf eine neue Verbindung wartet war mir bewusst.
Der erste wait-Befehl war aber noch ein überrest. Habe diesen total übersehen.

Naja. Nun tut alles so wie es soll.
Danke dir.

Gruß
t4ggno
Antworten