QTcpSocket übersieht Pakete

Alles rund um die Programmierung mit Qt
Antworten
Caber
Beiträge: 4
Registriert: 20. Dezember 2012 11:30

QTcpSocket übersieht Pakete

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTcpSocket übersieht Pakete

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Caber
Beiträge: 4
Registriert: 20. Dezember 2012 11:30

Re: QTcpSocket übersieht Pakete

Beitrag 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.
Antworten