2012-05-04 7 views
5

私はUNIX C++ソケットとのソケット接続を持っていました。接続後、完全なメッセージが出るまで1バイトずつ読むためのループがありました。私は受信しようとしているメッセージの最初の2バイトとその長さ(15バイト)を知っています。関数は次のようになります。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; 
} 

これで、QTcpSocketsで同じことを実装しています。接続が確立され、その後、私が呼ん:ヨーヨーを読み取ることがいくつかの情報準備ができるまで

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

は、だから私は待って、その後、バイトで現在はほぼ同じであるfindPacket、読んでバイトを呼び出します。

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

かなり同じように見えますが、動作しません。 waitForReadyReadで待機すると、findPacketのループに入り、受け取った最初の4バイトを読み取ることができます。その後、それ以上のデータは受信されません。それはfindPacketのループの中で再びチェックされ、そして何度も繰り返しますが、read関数は常に0バイトを返します。新しい情報は受信されません。これは不可能です。なぜなら、サーバーは数ミリ秒ごとに同じパケットを送信しているからです。データが失われても、結局私は何かを読んでいるはずです。

私は間違っていますか?私は別の方法で待つべきですか? read関数が0バイトを返す最初の時間をもう一度待機する必要がありますか?この読み込み関数とC++ライブラリの違いは何ですか?

答えて

0

最後に、問題は、read関数によって返された最初のゼロの後に新しいデータを待つのではなく、常に読み込もうとしていました。それは魅力のように機能します!