2012-05-04 7 views
5

पढ़ना मेरे पास यूनिक्स सी ++ सॉकेट के साथ सॉकेट कनेक्शन था, जहां कनेक्ट करने के बाद, मेरे पास बाइट द्वारा बाइट पढ़ने के लिए एक लूप था जब तक कि मेरा पूरा संदेश नहीं था। मुझे संदेश के पहले दो बाइट्स मिलते हैं जिन्हें मैं प्राप्त करने जा रहा हूं, और इसकी लंबाई (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; 
} 

सुंदर दिखता है, लेकिन यह काम नहीं करता है। एक बार जब मैं प्रतीक्षा करने के लिए इंतजार कर रहा हूं ForReadyRead, मैं findPacket लूप दर्ज करता हूं और मैं प्राप्त पहले 4 बाइट पढ़ने में सक्षम हूं। उसके बाद, कोई और डेटा प्राप्त नहीं हुआ है। यह खोज के अंदर रहता है पैकेट की लूप जांच फिर से, और फिर, और फिर, लेकिन फ़ंक्शन फ़ंक्शन हमेशा 0 बाइट पढ़ने को वापस कर देता है। कोई नई जानकारी प्राप्त नहीं हुई है। जो असंभव है, क्योंकि सर्वर प्रत्येक कुछ एमएस में एक ही पैकेट भेज रहा है, इसलिए यदि मैं कुछ डेटा खो देता हूं, तो अंत में मुझे कुछ पढ़ना चाहिए।

तो, मैं क्या गलत कर रहा हूं? क्या मुझे अलग तरीके से इंतजार करना चाहिए? क्या मुझे फिर से इंतजार करना चाहिए कि फंक्शन रिटर्न 0 बाइट्स पढ़ता है? इस पढ़े गए फ़ंक्शन और सी ++ पुस्तकालयों के बीच क्या अंतर है?

उत्तर

0

अंत में, समस्या फ़ंक्शन द्वारा लौटाए गए पहले शून्य के बाद नए डेटा की प्रतीक्षा करने के बजाय हर समय पढ़ने की कोशिश कर रही थी। ऐसा करना एक आकर्षण की तरह काम करता है!