0

xor暗号化文字列を送信するサーバーアプリケーションがあります。QTクライアントアプリケーションからそれらを読んでいます。サーバーの速度が遅く、文字列全体を受信できない場合があります。以下のようなものを試しましたが、スタックします(以下のコメントを参照してください)。データ全体が揃うまで待つにはどうすればよいですか。試しbytesAviable()ましたが、再びスタックします(無限ループ)

QTcpSocket * sock = static_cast<QTcpSocket*>(this->sender());
if (key == 0)
{
    QString recv(sock->readLine());
    key = recv.toInt();
    qDebug() << "Cheia este " << key;

    char * response = enc_dec("#AUTH|admin|admin",strlen("#AUTH|admin|admin"),key);
    sock->write(response);
}
else
{
    busy = true;
    while (sock->bytesAvailable() > 0)
    {
        unsigned short word;
        sock->read((char*)(&word),2);
        qDebug()<<word;
        //Sleep(100); if i do this than it works great!
        QByteArray bts = sock->read(word);
        while (bts.length() < word)
        {
            char bit; //here get's stuck
            if (sock->read(&bit,1) > 0)
                bts.append(bit);
            sock->flush();
        }

        char * decodat = enc_dec((char*)bts.data(),bts.length() - 2,key);
        qDebug() << decodat;
    }

}
4

2 に答える 2

1

意味はわかりませんが、私を含め、これまでに電話をかけたことのあるほとんどの人と同じようkey == 0に、あなたはほぼ間違いなく誤用available()しています。をブロックせずに読み取ることができるデータの量を示します。最終的に接続を介して配信される可能性のあるデータの量とは関係ありません。その理由は、前者は通知できるが後者は通知できないTCPAPIがあるためです。確かに後者は、ピアが今から終末まで書き続けることができることを考えると、本当の意味はありません。次の作業に必要な量のデータを読み取るまで、ブロックしてループする必要があります。

于 2012-09-26T09:54:56.317 に答える
0

私はあなたに次のことをすることを提案します:

QObject::connect(this->m_TCPSocket, SIGNAL(readyRead()), this, SLOT(processRecivedDatagrams()));

いくつかの説明:

  1. ネットワークを管理するクラスインスタンスを作成すると便利です。
  2. 1つには、TCPSocketのポインターであるメンバーがあります。
  3. readyRead()コンストラクターで、必要なデータがで配信されたときに送信されるソケットからのシグナルの接続を実装しSLOT(processRecivedDatagrams())ます。受信したデータグラムの処理を担当します/この場合はprocessRecivedDatagrams()であり、このスロットも実装します

ネットワークを管理するクラスはQObjectから継承する必要がありs declaration include macros、MOCの場合はQ_OBject`も継承する必要があることに注意してください。

アップデート:

また、受信したデータをスタックやキューなどのコンテナーに保存することもできます。これにより、送信者と受信者を同期できます(この場合のコンテナーはバッファーのように機能します

// SLOT:


void Network::processRecivedDatagrams(void)
{
    if (!this->m_flagLocked) // use analog of mutex 
    {
        this->m_flagLocked = true; // lock resource

    QByteArray datagram;
    do 
    {
        datagram.resize(m_TCPSocket->pendingDatagramSize());
        m_TCPSocket->readDatagram(datagram.data(), datagram.size());
    }
            Qt::String YourString; // actualy I don`t remember how to declare Qt string
    while (m_TCPSocket->hasPendingDatagrams());
    QDataStream in (&datagram, QIODevice::ReadOnly);

        in  >> YourString



        --numberOfDatagrams;
    }

    this->m_flagLocked = false; // unlock resource
}

}

于 2012-09-26T10:57:14.377 に答える