私は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++ライブラリの違いは何ですか?