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

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 关于#python#的问题
  • ¥15 主机可以ping通路由器但是连不上网怎么办
  • ¥15 数据库一张以时间排好序的表中,找出多次相邻的那些行
  • ¥50 关于DynamoRIO处理多线程程序时候的问题
  • ¥15 kubeadm部署k8s出错
  • ¥15 Abaqus打不开cae文件怎么办?
  • ¥20 双系统开机引导中windows系统消失问题?
  • ¥15 小程序准备上线,软件开发公司需要提供哪些资料给甲方
  • ¥15 关于生产日期批次退货退款,库存回退的问题
  • ¥15 手机应用的时间可以修改吗