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