Problem mit QTcpServer

Alles rund um die Programmierung mit Qt
Antworten
levu
Beiträge: 6
Registriert: 23. November 2008 07:44
Kontaktdaten:

Problem mit QTcpServer

Beitrag von levu »

Hallo, der folgende Code bereitet mir sorgen. Ich habe einen Server an Port 3333 laufen lassen und dann per Browser auf http://localhost:3333/ zugegriffen, es müstte also etwas wie "GET /" ankommen. Wie kann ich das auslesen?

Code: Alles auswählen

QTcpSocket *con = m_tcpserver->nextPendingConnection();
    connect(con, SIGNAL(disconnected()), con, SLOT(deleteLater()));
    QDataStream *in = new QDataStream(con);
    in->setVersion(QDataStream::Qt_4_4);
    QString *str = new QString("");
    char* tmp = "";
    quint32 blockSize = 1024;
    while(con->bytesAvailable() >= blockSize) {
        in->readBytes(tmp, blockSize);
        str->append(tmp);
        qDebug(tmp);
    }
    blockSize = (quint32) con->bytesAvailable();
    in->readBytes(tmp, blockSize);
    str->append(tmp);
    con->disconnectFromHost();
    qDebug((char*) str);
mfg, Levu

Edit: Es kommt immer irgendein Zeichensalat raus (Ausgabe von qDebug): 4Á0j^ 
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du castest einen QString auf ein char* und wunderst Dich das Datensalat rauskommt... ?
Da Du außerdem nie die Eventloop ausführst wird wohl auch wahrscheinlich keine Daten ankommen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
levu
Beiträge: 6
Registriert: 23. November 2008 07:44
Kontaktdaten:

Beitrag von levu »

Das mit dem QString hab ich nun korrigiert in QString::toLatin1(), aber das andere versteh ich nicht :(
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Selbst QString::toLatin1() bring kein char* zurück ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
nicmoe
Beiträge: 18
Registriert: 8. November 2008 19:29
Kontaktdaten:

Beitrag von nicmoe »

Vielleicht solltest du dir auch mal im internet einen Artikel zur Socketprogrammierung durchlesen um das verstaendnis zu verbessern.
So hab ich das gelernt.

und ach ja: Caste niemals Klassen wie QString auf datentypen wie char* ... Ruf dir in Erinnerung was ein char ist: Ein Zeichen. Nicht mehr. Ich bin mir sicher dass QString sich noch an seine Wurzeln erinnert und deswegen eine eigene Methode mitbringt: "toWcharArray()" heißt das teil seh ich grad. Damit einfach das Array fuettern und dann noch anschließend ein "\0" anhaengen sonst ist es nicht terminiert..
1+1=0;
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Auch toWcharArray() ist nun wirklich nicht die richtige Wahl - was soll er mit einem std::wstring?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Code: Alles auswählen

char* tmp = ""; 
....
in->readBytes(tmp, blockSize); 
Quizfrage... wohin werden die empfangenen Daten geschrieben....
levu
Beiträge: 6
Registriert: 23. November 2008 07:44
Kontaktdaten:

Neues Problem: im slot unterscheiden welches Signal

Beitrag von levu »

sorry, dass ich nicht schon schneller geantwortet habe :| aber ich hatte viel zu tun und war (fast) nicht am Computer...

Das Problem hat sich gelöst, sobald ich mir den Ablauf anhand irgendeines Beispiels klargeamcht hatte. So weit so gut, aber jetzt hab ich folgendes Problem:

ich habe in einem Configfile stehen, auf welchen Ports das Programm lauschen soll. es sind mehrere, also brauche ich mehrere QTcpServer. Soweit eigentlich auch kein Problem, aber bisher habe ich von allen das Signal newConnection mit genau einem Slot verbunden. Jetzt muss ich aber wissen, welches Objekt das Signal ausgelöst hat, konkreter, auf welchem Port der Request kam. Mein bisheriger Ansatz:

in einer Schleife alle QTcpServer durchlaufen und gucken, ob eine neue wartende Anfrage da ist, wenn ja diese bearbeiten. Je weiter hinten der QTcpServer in dem Array steht, desto geringer ist also die Chance, dass er auch mal drankommt.

Wie kann man das eleganter lösen, ohne für jeden Server einen eigenen Slot zu definieren?

Muss ich das mit Multithreading machen und immer waitForNewConnection aufrufen? Gibt's vielleicht ein Beispiel wo ein kleiner Server in Qt programmiert wurde?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QObject::sender() verwenden
levu
Beiträge: 6
Registriert: 23. November 2008 07:44
Kontaktdaten:

Beitrag von levu »

Danke!! Wo kann man den Thread auf gelöst stellen?
Antworten