Threadsicherheit bei Server-Programmen

Alles rund um die Programmierung mit Qt
Antworten
jw202
Beiträge: 36
Registriert: 6. August 2012 22:25

Threadsicherheit bei Server-Programmen

Beitrag von jw202 »

Hallo,

ich habe wieder mal eine Frage. ich hab einen Server geschrieben, der für jeden Client einen neuen Thread aufmacht. Wenn man sich jetzt via telnet auf diesem Server authentifiziert (analog zu POP3), dann ruft das thread eine funktion aus einer anderen (nicht thread)-Klasse auf und übergibt ihr einen String als Parameter. Die Funktion aus der fremden Klasse, welche den String zusammenbaut ist relativ primitiv

Code: Alles auswählen

void database::test(QString data)
{
std::cout << QString("hier ist ein langer String wo zwischendrinn irgendwann %1 vorkommt").arg(data).toStdString() << std::endl;
}

Das Thread selbst hat diese Struktur, der Funktionsaufruf von test() ist "etwas hervorgehoben"

Code: Alles auswählen

void serverThread::run()
{
    QTcpSocket tcpSocket;

    /* irrelevantes weggelassen */

    for (int i = 0; connected; i++)
    {
        tcpSocket.waitForReadyRead(-1);
        QString incoming = QString(tcpSocket.readAll());
        incoming.truncate(incoming.length()-1);
        if (incoming.startsWith("ping"))
        {
            /* ****************************** */
            db->test(incoming); //HIER IST DER FUNKTIONSAUFRUF
            /* ****************************** */
        }
       /* Hier wurden sämtliche irrelevanten else if weggelassen
        * Im Prinzip wird hier noch der korrekte Login a la 
        * > 'user jowin123'
        * > 'pass 1234567'
        * abgehandelt, ansonsten passiert hier nichts
        */
    }
    tcpSocket.disconnectFromHost();
}

Wo liegt jetzt das Problem, naja wenn ich in Telnet das Kommando "ping" an den Server sende, dann gibt der Server folgendes aus:
vorkommtein langer String wo zwischendrinn irgendwann ping
anstatt
hier ist ein langer String wo zwischendrinn irgendwann ping vorkommt
PS.: man beachte beim ersten Zitat das Leerzeichen am beginn


Ich bin mit meinem Latein am Ende und würde mich über Tipps freuen. Aber ich vermute, dass dieses Problem mit der Threadsicherheit zusammenhängt.

LG
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Threadsicherheit bei Server-Programmen

Beitrag von Christian81 »

QTcpSocket::readAll() gibt ein QByteArray zurück und keinen QString. Des weiteren übergibt telnet alles, also auch das Enter-Zeichen. Den Rest kannst Du Dir selbst zusammen reimen hoffe ich.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jw202
Beiträge: 36
Registriert: 6. August 2012 22:25

Re: Threadsicherheit bei Server-Programmen

Beitrag von jw202 »

ja, aber das Enterzeichen habe ich mit Truncate weggeschnitten und der telnet und der Konstruktor von QString nimmt QByteArray zum Konvertieren entgegen. Ich versteh da jetzt nicht wirklich wo das Problem liegt.

EDITED: Ich hab jetzt simplified() verwendet und es funktioniert. Vielen Dank. Ich nehme mal an, dass da beim übertragen noch ein bissl Mist mitgekommen ist.
Antworten