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

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 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器