Zhangxxllll 2022-03-15 13:01 采纳率: 100%
浏览 430
已结题

Qt Tcpscoket QByteArray 发送自定义结构体

问题遇到的现象和发生背景

Qt Tcpscoket QByteArray 发送自定义结构体: 发送端将结构体转QByteArray 再转结构体结构正确,但在接收端将Qbytearray转结构体程序崩溃

问题相关代码,请勿粘贴截图

struct Info
{
int numMax;
int id;
QVector v_name;
};
struct Data{
QVector v_info;
};
//发送端
Data data;
int num = 5;
for(int i = 2; i < num; i++)
{
Info info;
info.id = i;
info.numMax = i;
for(int j = 0; j < i; j++)
{
info.v_name.push_back("player"+QString::number(j));
}
data.v_info.push_back(info);
}

QByteArray arr;
arr.append(reinterpret_cast<char *>(&data), sizeof(Data));
socket->write(arr);

//接收端
QByteArray arr = socket->readAll();
Data *getMsg = new Data;
getMsg = reinterpret_cast<Data *>(arr.data());
// getMsg2 = (Data *)arr.data();

for(auto &i:getMsg->v_info)
{
    qDebug() << i.id <<" " << i.numMax;
    for(int j = 0; j<i.v_name.size(); j++)
    {
        qDebug()<< i.v_name.at(j);
    }
}
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

2 2
"player0"
"player1"
3 3
"player0"
"player1"
"player2"
4 4
"player0"
"player1"
"player2"
"player3"

  • 写回答

2条回答 默认 最新

  • 关注

    TCP发送的时候有黏包现象,在接收端每次读取的数据长度,并不一定是你每次发送的数据长度,而且,看你结构体中有QVector,QVector的长度是不固定的,在转QByteArray的时候,转换的字节大小可能有问题。
    正确的方式:定义一个报文头,报文头的格式、长度固定,在报文头中写明每次发送的报文大小,这样在接收端接受数据时,先接收报文头长度的字节数,然后得到本次报文的长度,然后再去读取这个长度的字符串,然后再去解析成结构体。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 逆置单链表输出不完整
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥30 matlab appdesigner私有函数嵌套整合