質問

私は、単純なサーバー接続スレッドを持っています。あなたは、関数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がfalseを返された場合でも、実行中に、あなたは常にソケット上のデータを読んでいることに注意してください。
あなたは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