Seite 1 von 1

Problem mit QTcpServer

Verfasst: 18. Januar 2009 19:03
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^ 

Verfasst: 18. Januar 2009 20:29
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.

Verfasst: 18. Januar 2009 20:37
von levu
Das mit dem QString hab ich nun korrigiert in QString::toLatin1(), aber das andere versteh ich nicht :(

Verfasst: 18. Januar 2009 20:43
von Christian81
Selbst QString::toLatin1() bring kein char* zurück ...

Verfasst: 20. Januar 2009 00:08
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..

Verfasst: 20. Januar 2009 06:30
von Christian81
Auch toWcharArray() ist nun wirklich nicht die richtige Wahl - was soll er mit einem std::wstring?

Verfasst: 20. Januar 2009 08:46
von solarix

Code: Alles auswählen

char* tmp = ""; 
....
in->readBytes(tmp, blockSize); 
Quizfrage... wohin werden die empfangenen Daten geschrieben....

Neues Problem: im slot unterscheiden welches Signal

Verfasst: 23. Januar 2009 21:59
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?

Verfasst: 23. Januar 2009 22:40
von upsala
QObject::sender() verwenden

Verfasst: 24. Januar 2009 09:09
von levu
Danke!! Wo kann man den Thread auf gelöst stellen?