Seite 1 von 1

QTcpSocket übersieht Pakete

Verfasst: 20. Dezember 2012 15:46
von Caber
Hallo,

ich schreibe gerade mein erstes Programm mit Qt (unter Windows 7).
Es soll folgendes tun: jedes TCP-Paket, das auf einem bestimmten Port empfangen wird, soll in ein QTableWidget gepeichert werden.
Das funktioniert auch so wie es soll. Es kommen pro Sekunde nur 10 Pakete mit je etwa 100 Byte.
Aber: sobald man das Programmfenster minimiert und maximiert, oder einen QFileDialog öffnet, "übersieht" der QTcpSocket auf einmal ankommende Pakete. Sprich, es wird kein Signal readyRead() ausgesandt. Ich habe dies überprüft, indem im entsprechenden Slot eine qDebug() Ausgabe generiert wird, die dann leider bei einigen Paketen ausbleibt.
Muss man den Socket grundsätzlich in einen QThread packen, damit er jedes Paket empfangen kann? Ich dachte immer, dass alle TCP-Daten vom Betriebssystem gepuffert werden.

Hier mal ein Codeausschnitt, der die Beziehungen meiner Klassen zeigt:

Code: Alles auswählen

//cStarter.cpp
cStarter::cStarter(int argc, char *argv[]){
    pMainScreen    = new cMainScreen;    
    pSocket        = new QTcpSocket;
    pDataManager   = new cDataManager;
    connect(pSocket,  SIGNAL(readyRead()),  this,  SLOT(slotWriteReceivedTcpToDataManager()),  Qt::QueuedConnection);
    (...)
}

void cStarter::slotWriteReceivedTcpToDataManager(){
    pDataManager->mGetReceivedBytes(pSocket->readAll());
} 
Mir ist auch aufgefallen, dass bei der Registrierung der Signal/Slots NUR Qt::QueuedConnection funktioniert. Bei allen anderen Methoden (Qt::AutoConnection usw...) werden viele Pakete mit der Länge Null empfangen. Mache ich irgendetwas grundsätzlich falsch? Ich habe mich an das Beispiel Fortune Client Example auf qt-project.org gehalten.

Re: QTcpSocket übersieht Pakete

Verfasst: 20. Dezember 2012 16:54
von Christian81
QTcpSocket übersieht keine Pakete. readyRead() wird erzeugt wenn Daten anliegen - wie viele das sind ist irrelevant. TCP kennt keine einzelnen Pakete sondern nur einen Stream.

Re: QTcpSocket übersieht Pakete

Verfasst: 20. Dezember 2012 17:29
von Caber
Vielen Dank für den Tipp. Ich empfange tatsächlich manchmal mehrere Pakete, wie ich mit pSocket->bytesAvailable() sehen konnte.
Wir sind ja eine Ebene tiefer im OSI Modell als bei HTTP... daran habe ich nicht gedacht. Dann ist natürlich etwas mehr Arbeit nötig.