سؤال

ولدي بسيط موضوع اتصال الخادم. عند استدعاء وظيفة receiveString، فإنه فشل. ولكن عند تنفيذ نفس رمز في المدى ()، فإنه ينجح. ما هو مطلوب من أجل وظيفة receiveString إلى العمل؟

ولقد حاول كل من

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

ورمز الفعلي:

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();
}
هل كانت مفيدة؟

المحلول

وإما التعليمات البرمجية دمر كومة العملية، أو قيمة المهلة ليست كافية.

نصائح أخرى

ما هي قيمة الإرجاع أو QTcpSocket::errorString()؟

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

ملحوظة أنه في المدى، كنت دائما قراءة البيانات على مأخذ، حتى لو عاد QTcpSocket::waitForReadyRead كاذبة.
هل أنت متأكد أنك لا تحصل على نفس الخطأ في run كما هو الحال في receiveString، ولكن نجحت قراءة لأنك تجاهل هذا الخطأ؟

هل run تزال تنجح إذا كنت تستخدم هذا الرمز:

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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top