QTcpSocket 触发readyRead信号执行槽函数的过程中,这时候有新数据到了,read获取不到新数据吗?

ylmszy1314 2018-11-14 02:45:49
例如:客户端发送"123456789010101010101010", 第一次触发信号bytesAvailable()得到的是5个字节,数据是"1234567890",这时候加入延时操作后,使用read(),可以获取到后面的数据吗?谢谢
槽函数如下
int len = this->bytesAvailable(); //注意这里的len得到的是5,数据没有全部到达
while(len >0)
{
char readData[5]={0};
int ireadlen= this->read(readData,5);
int total = 12;
/*这里根据readData计算出全部数据长度,例如第一个字节12表示,总长度12
*
*/
下面这段代码可以得到后面的数据吗?
char *Data ;
int ireadnum=this->read(Data,12-ireadlen);

}
...全文
428 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你发送的不对
弓人水 2018-11-14
  • 打赏
  • 举报
回复
后面那段代码,不一定能得到后面的数据。

Tcp数据流的读取,最好使用 QDataStream,它有一个事务支持的功能,每次 readReady 如果读取的 数据包不是完整的,事务无法提交成功,会回滚读取的数据,待到下次 readReady 继续尝试读取,直到读到完整的数据包。
大致如下面这个写法:

QTcpSocket *tcpSocket;
QDataStream readStream;
readStream.setDevice(tcpSocket);
connect(tcpSocket, &QIODevice::readyRead, [&](){
readStream.startTransaction();

char *Data;
readStream.readRawData(Data, 12);

if (!readStream.commitTransaction())
return;

// When get full package to do something.
});

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧