2012-09-26 100 views
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; 
    } 

} 
+0

您可能想要使用waitForReadyRead()。如果传入的字节准备好被读取,则返回true。 –

+0

@LwinHtooKo我不能指定我想要的manny字节如何 – opc0de

+0

但是当你做readAll()时,它会给你所有的字节(QByteArray)。 QByteArray.size()是它实际读取多少字节。 –

回答

0

我给你做到以下几点:

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

一些解释:

  1. 这是方便易创建一个类的实例,其中将管理网络;
  2. 一个有TCPSocket指针的成员;
  3. 在构造函数中实现来自套接字readyRead()的信号连接,当需要时数据已与SLOT(processRecivedDatagrams())一起交付。它负责处理recived数据报/在这种情况下它是processRecivedDatagrams(),也执行该插槽

心,其管理网络具有自QObject以及在它s declaration include macros Q_OBject`用于MOC继承该类。

更新:

我也提供你存储在容器recived数据像栈或队列这将允许你synhronize发件人和reciver(在这种情况下容器行为像缓冲器

// 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 
} 

}

+0

我有类似这样的功能,我发布的是相当于processReceivedDatagrams – opc0de

+0

好吧,我想我应该给解析数据的功能更详细的解释(请参阅我的答案的更新)。一个问题:你说过“发送一些xor加密字符串的服务器应用程序”为什么如果它发送字符串,你会使用字节获取数据? –

+0

如果它们被着色,那么一个0可能会滑入该字符串,我将只获得字符串的一部分 – opc0de

1

我不知道的key == 0的意义是什么,但你几乎可以肯定滥用available(),像几乎所有的人谁曾经把它称为,包括我。它告诉你可以读取多少数据而不会阻止。它与最终可能传递多少数据无关,原因是有TCP API可以告诉你前者,但不是后者。事实上后者没有任何实际意义,因为同行可以从现在开始直到世界末日。您应该阻止并循环,直到您读完了下一部分工作所需的大量数据。

+0

我尝试在循环中读取一个字节,直到我得到我需要的字节,但读取总是返回0.如果我睡得好! – opc0de

+0

@ opc0de不,为什么要睡觉?只是阻止。 read()会为你做到这一点。 – EJP

+0

如果没有要读取的数据没有被阻止,那么读取不完全(read)()返回0字节 – opc0de