我有一个与UNIX C++套接字的套接字连接,在连接之后,我有一个循环来逐字节读取,直到我拥有完整的msg。我知道要接收的消息的前两个字节,以及它的长度(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的循环中,一次又一次地检查,但read函数总是返回0字节读取。未收到任何新信息。这是不可能的,因为服务器每隔几毫秒发送一次相同的数据包,所以即使我丢失了一些数据,最终我也应该读取一些数据。
那么,我做错了什么呢?我应该用不同的方式等待吗?当第一次读取函数返回0字节读取时,我是否应该再次等待?这个read函数与C++库函数有什么不同?
发布于 2012-05-04 15:57:57
最后,问题是一直在尝试读取数据,而不是在读取函数返回第一个零之后等待新数据。这样做就像一种护身符!
https://stackoverflow.com/questions/10444154
复制相似问题