QByteArray TCP::TcpSocket::Request(const QByteArray &byte)
{
if (this->state() != 3) // 检测链接状态
{
qDebug()<<this->errorString();
return "";
}
Send(byte);//发送信息
if(!this->waitForReadyRead())// 注意此函数在windows下可能失败
{
qDebug()<<this->errorString();
return "";
}
char dataSizeBuf[8+1];//读取自定义报文长度 前8位
int ret = ntcpRead(this, dataSizeBuf, 8);
if (ret != 0)
{
qDebug() << "Read Data Pack Size Error.";
return "";
}
dataSizeBuf[8] = '\0';
int dataSize = 0;
dataSize = atoi(dataSizeBuf);
char *dataBuffer = new char[dataSize+1];//根据读取的报文总长度 分配空间 在读取
ret = ntcpRead(this, dataBuffer, dataSize);
if (ret != 0)
{
delete []dataBuffer;
qDebug() << "Read Data Buff Error.";
return "";
}
dataBuffer[dataSize] = '\0';
QByteArray data = QByteArray(dataBuffer, dataSize);
delete []dataBuffer;
return QByteArray::fromBase64(data);
}
int TCP::TcpSocket::ntcpRead(QTcpSocket *sock, char *buf, int numReadTotal)
{
try
{
int numRead = 0;
int len = 0;
len = numReadTotal;
while (numReadTotal > 0)//循环读取 如果 read函数读取的大小 与我们自定义的大小不符合 就继续读取套接字
{
numRead = sock->read(buf, numReadTotal);//取得当前读取大小
if (numRead == -1)
{
qDebug() << "sock error occurred. numRead=-1";
return -1;
}
if (numRead == 0 && !sock->waitForReadyRead())
{
qDebug() << "numRead == 0 && !sock->waitForReadyRead()";
return -1;
}
buf += numRead;
numReadTotal -= numRead;
}
}
catch (...)
{
qDebug() << " ntcpRead exception." << endl;
return -1;
}
return 0;
}
解决 QTcpSocket 读取超过 8192个字节 不能正常处理的问题
最新推荐文章于 2025-09-11 09:47:53 发布
本文介绍了在使用QTcpSocket进行网络通信时遇到的读取数据超过8192字节无法正常处理的问题,并详细讨论了问题的原因及提供了解决该问题的具体方法和步骤。
1177

被折叠的 条评论
为什么被折叠?



