2012-05-04 5 views
5

Ich hatte eine Socket-Verbindung mit UNIX C++ - Sockets, wo ich nach dem Verbinden eine Schleife zum Lesen Byte für Byte hatte, bis ich die volle Nachricht hatte. Ich kenne die ersten zwei Bytes der Nachricht, die ich erhalten werde, und ihre Länge (15 Bytes). So sah die Funktion aus:Eine QTcpSocket lesen

bool mastControl::findPacket(int sockfd, st_messageMastToPc * messageReceived, bool * connected) { 

    int n = 0; 
    bool messageFound = false; 
    char * buffer = (char *) messageReceived; 

    unsigned int pos = 0; 

    while (((n = read(sockfd, &(buffer[pos]), 1)) > 0) and not messageFound) { 

     if (n == 1) { 
      pos++; 

      if ((pos == 1) && (buffer[0] == 0x02)) { // First byte to receive 
       std::cout << "INFO - Rcv1" << std::endl; 
      } else if ((pos == 2) && (buffer[1] == 0x33)) { // Second byte 
       std::cout << "INFO - Rcv2" << std::endl; 
      } else if (pos >= uiMessageMastToPcSize) { // Full msg received 
       messageFound = true; 
       std::cout << "INFO - Complete message received" << std::endl; 
      } else if (pos <= 2) { // Wrong values for the first 2 bytes 
       std::cout << "WARN - Reseting (byte " << pos << " -> " << int(pos) << ")" << std::endl; 
       pos = 0; 
      } 
     } 
    } 

    if (n < 0){ 
     //EROR 
     *connected = false; 
    } 

    return messageFound; 
} 

Jetzt implementiere ich das gleiche mit QTcpSockets. Verbindung hergestellt ist, und dann rufe ich:

if(socket->waitForReadyRead(Global::tiempoMaximoDeEsperaParaRecibirDatosMastil)){ 
       /* Read socket to find a valid packet */ 
       if (findPacket(socket, &messageReceived)) { 
        qDebug()<<"New packet found!"; 
//... 
} 
} 

Also, bis ich warte dort einige Informationen bereit ist, yo gelesen werden, und rufen Sie dann findPacket, die jetzt fast das gleiche, das Lesen Byte für Byte:

bool mastControl::findPacket(QTcpSocket *socket, st_messageMastToPc * messageReceived) { 
    int n = 0; 
    bool messageFound = false; 
    char * buffer = (char *) messageReceived; 
    unsigned int pos = 0; 

    while (((n = socket->read(&(buffer[pos]), 1)) >= 0) and not messageFound) { 
     if (n == 1) { 
      qDebug()<<"Recibido: "<<buffer[pos]<<", en pos: "<<pos; 
      pos++; 
      if ((pos == 1) && (buffer[0] == 0x022)) { 
       qDebug()<<"0x02 in first position"; 
//    std::cout << "INFO - Rcv1" << std::endl; 
      } else if ((pos == 2) && (buffer[1] == 0x33)) { 
       qDebug()<<"0x33 in second"; 
       std::cout << "INFO - Rcv2" << std::endl; 
      } else if (pos >= uiMessageMastToPcSize) { 
       messageFound = true; 
       std::cout << "INFO - Complete message received" << std::endl; 
      } else if (pos <= 2) { 
       std::cout << "WARN - Reseting (byte " << pos << " -> " << int(pos) << ")" << std::endl; 
       pos = 0; 
      } 
     } 
    } 

    if (n < 0){ 
     qDebug()<< "Disconnected. Reason: " << socket->errorString(); 
    } 

    return messageFound; 
} 

Sieht ziemlich gleich aus, aber es funktioniert nicht. Sobald ich auf waitForReadyRead gewartet habe, gebe ich findPackets Schleife ein und kann die ersten 4 empfangenen Bytes lesen. Danach werden keine Daten mehr empfangen. Es bleibt innerhalb von findPackets Schleifenprüfung erneut und wieder und wieder, aber die Funktion lies immer 0 Bytes gelesen zurück. Es werden keine neuen Informationen empfangen. Was unmöglich ist, weil der Server das selbe Paket alle paar ms sendet, selbst wenn ich einige Daten verliere, sollte ich irgendwann etwas lesen.

Also, was mache ich falsch? Soll ich anders warten? Sollte ich beim ersten mal wieder auf die Funktion warten, gibt 0 Bytes gelesen zurück? Was ist der Unterschied zwischen dieser Lesefunktion und den C++ Bibliotheken?

Antwort

0

Schließlich war das Problem versucht, die ganze Zeit zu lesen, anstatt auf neue Daten nach der ersten Null von der Lesefunktion zurückgegeben warten. Das funktioniert wie ein Zauber!