gpt4 book ai didi

c++ - 读取 QTcpSocket

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:57 27 4
gpt4 key购买 nike

我有一个与 UNIX C++ 套接字的套接字连接,连接后,我有一个逐字节读取的循环,直到我获得完整的消息。我知道我将要接收的消息的前两个字节及其长度(15 个字节)。所以函数看起来像:

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 的循环中一次又一次地检查,但是读取函数总是返回 0 字节读取。没有收到新信息。这是不可能的,因为服务器每隔几毫秒发送一次相同的数据包,所以即使我丢失了一些数据,最终我也应该读到一些东西。

那么,我做错了什么?我应该以不同的方式等待吗?我应该再次等待第一次读取函数返回 0 字节读取吗?这个读取函数和 C++ 库函数有什么区别?

最佳答案

最后,问题在于尝试一直读取,而不是在读取函数返回第一个零之后等待新数据。这样做就像一个魅力!

关于c++ - 读取 QTcpSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10444154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com