Reading a QTcpSocket
Reading a QTcpSocket
本文关键字:QTcpSocket Reading 更新时间:2023-10-16
我有一个与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 字节读取时再次等待吗?这个读取函数和C++库函数有什么区别?
最后,问题是尝试一直读取,而不是在读取函数返回的第一个零之后等待新数据。这样做就像一个魅力!
相关文章:
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 如何使用 QDatastream 通过 QTcpSocket 发送 QSqlQueryModel?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- QTcpSocket emulate netcat 'conversation'
- QTcpSocket 在 RemoteHostClosedError 后重新连接到服务器时无法传输数据
- QTcpServer/QTcpSocket:使用 QDataStream 与直接发送 UTF-8 数据
- QTcpSocket 到 QTcpSocket 在同一对象中
- 当发生套接字错误时,作为QWebSocket基础的QTcpSocket(或QSslSocket)是否会自行销毁
- 错误: C2065: "QTcpSocket" : 未声明的标识符
- QTcpSocket:消息不是从另一个线程发送的
- 例外:'Access violation reading location'
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- 我在发布模式下运行时收到"Access violation reading location"错误 - C++
- QTcpSocket 发送的数据比想要的多 - Qt/C++
- 如何将请求的客户端连接的 IP 与 QTcpSocket 类中识别的 IP 之一进行比较?
- 如何使用QTcpSocket读取超过8192字节?
- Python 3 套接字和 QTcpsocket (c++) 之间的通信失败
- QTCPSocket(Qt-C++)中的音频文件逐字节传输
- 如何将用户输入从控制台传递到不同线程中的对象 -> QTcpsocket
- Reading a QTcpSocket