Seite 1 von 1

[SOLVED] QT Server - Kein Datenempfang

Verfasst: 17. Dezember 2011 19:12
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;

Re: QT Server - Kein Datenempfang

Verfasst: 18. Dezember 2011 17:00
von DBGTMaster
Schonmal ein telnet auf deinem TCP Server probiert??

Am Client schonmal auf flush() am Socket gemacht?

Re: QT Server - Kein Datenempfang

Verfasst: 18. Dezember 2011 23:47
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

Re: QT Server - Kein Datenempfang

Verfasst: 19. Dezember 2011 23:46
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?!

Re: QT Server - Kein Datenempfang

Verfasst: 20. Dezember 2011 13:07
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

Re: QT Server - Kein Datenempfang

Verfasst: 20. Dezember 2011 13:12
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).

Re: QT Server - Kein Datenempfang

Verfasst: 20. Dezember 2011 13:48
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