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