Frage

Ich habe einfaches Server-Anschlussgewinde. Wenn Sie Funktion ReceiveString rufen, scheitert es. Allerdings, wenn Sie denselben Code in run () ausführen, es gelingt. Was ist für die Funktion ReceiveString zur Arbeit benötigt?

Ich habe versucht, beide

bool TestServerThread::receiveString(QTcpSocket& sock, QString& str)
bool TestServerThread::receiveString(QTcpSocket* sock, QString& str)

Die tatsächliche Code:

TestServerThread::TestServerThread(int socketDescriptor, QObject *parent) : QThread(parent), socketDescriptor(socketDescriptor)
{
}


bool TestServerThread::receiveString(QTcpSocket& sock, QString& str)
{
    if(sock.isValid())
    {
        if(!sock.waitForReadyRead(30))
        {
            qWarning() << "fail"; // fails here
            return false;
        }
        QByteArray buf = sock.readAll();
        str = buf;
    }
}

void TestServerThread::run()
{
    QTcpSocket sock;
    if (!sock.setSocketDescriptor(socketDescriptor)) {
        emit error(sock.error());
        return;
    }

    bool ok = true;
    while(ok)
    {
        QString str;
        //if(ok) ok = receiveString(sock, str);

        if(!sock.waitForReadyRead(30))
        {
            qWarning() << "false";
        }
        QByteArray buf = sock.readAll(); // same routine succeeds
        str = buf;
        qWarning() << str;

        qWarning() << "Received: " << str;
        if(ok) ok = sendString(sock, "kaka");
    }
    sock.disconnectFromHost();
    sock.waitForDisconnected();
}
War es hilfreich?

Lösung

Entweder Ihr Code, um den Prozess-Stack ruiniert, oder Ihre Timeout-Wert ist nicht genug.

Andere Tipps

Was ist der Rückgabewert oder QTcpSocket::errorString()?

//...
if(!sock.waitForReadyRead(30))
{
    qWarning() << "fails " << sock.errorString(); // fails here
    emit error(sock.error());
    return false;
}
//...

Beachten Sie, dass in der Flucht, Sie werden immer die Daten auf dem Sockel zu lesen, auch wenn QTcpSocket::waitForReadyRead false zurückgegeben.
Sind Sie sicher, dass Sie nicht den gleichen Fehler in den run wie in receiveString bekommen, aber die Lese erfolgreich, weil Sie diesen Fehler ignorieren?

Ist run noch Erfolg, wenn Sie diesen Code verwenden:

bool ok = true;
while(ok)
{
    QString str;
    //if(ok) ok = receiveString(sock, str);

    if(sock.waitForReadyRead(30))
    {
        QByteArray buf = sock.readAll(); // same routine succeeds
        str = buf;
        qWarning() << str;
        qWarning() << "Received: " << str;
        if(ok) 
        {
            ok = sendString(sock, "kaka");
        }
    }
    else
    {
         qWarning() << "fails " << sock.errorString();
         ok = false;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top