0

我有一个发送一些异或加密字符串的服务器应用程序。我正在从我的 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(),就像几乎所有曾经调用它的人一样,包括我。它告诉您在没有阻塞的情况下可以读取多少数据。它与最终可能通过连接传递多少数据无关,原因是有 TCP API 可以告诉您前者,但不能告诉您后者。事实上后者没有任何实际意义,考虑到同行可以从现在一直写到世界末日。您应该只是阻塞和循环,直到您读取了下一项工作所需的数据量。

于 2012-09-26T09:54:56.317 回答
0

我建议您执行以下操作:

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

一些解释:

  1. 创建一个类实例来管理网络是很方便的;
  2. 一个成员是 TCPSocket 上的指针;
  3. 在构造函数中实现来自套接字的信号连接,readyRead()当需要的数据通过SLOT(processRecivedDatagrams()). 它负责处理接收到的数据报/在这种情况下它是 processRecivedDatagrams(),也实现这个插槽

请注意,管理网络的类必须继承自 QObject 以及s declaration include macrosMOC 的 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 回答