2012-05-04 17 views
5

Avevo una connessione socket con socket UNIX C++ dove, dopo la connessione, avevo un ciclo per la lettura byte per byte fino a quando non avevo il msg completo. Conosco i primi due byte del messaggio che riceverò e la sua lunghezza (15 byte). Quindi la funzione sembrava:Lettura di una QTcpSocket

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

Ora sto implementando lo stesso con QTcpSockets. La connessione viene stabilita, e poi io chiamo:

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

Così sto aspettando fino a quando non v'è una certa Info pronto yo essere letto, e quindi chiamare findPacket, che ora è quasi lo stesso, la lettura byte per 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; 
} 

Sembra molto simile, ma non funziona. Una volta che ho aspettato su waitForReadyRead, inserisco il ciclo di findPacket e sono in grado di leggere i primi 4 byte ricevuti. Successivamente, non vengono più ricevuti dati. Resta di nuovo nel ciclo di ricerca di findPacket, e ancora e ancora, ma la funzione di lettura restituisce sempre 0 byte letti. Non sono state ricevute nuove informazioni. Il che è impossibile, perché il server sta inviando lo stesso pacchetto una volta ogni pochi ms, quindi anche se dovessi perdere alcuni dati, alla fine dovrei leggere qualcosa.

Quindi, cosa sto facendo male? Dovrei aspettare in un modo diverso? Dovrei aspettare ancora la prima volta che la funzione di lettura restituisce 0 byte letti? Qual è la differenza tra questa funzione di lettura e quella delle librerie C++?

risposta

0

Infine, il problema era cercare di leggere tutto il tempo invece di attendere nuovi dati dopo il primo zero restituito dalla funzione di lettura. Fare ciò funziona come un fascino!

Problemi correlati