Qt在利用TCP/IP socket进行通信时,如果需要发送与接收结构体,结构体中的数据存储最好不要用 char* 类型,在后面用到结构体强转、结构体转QByteArray数组时容易出错。转的时候可能只拷贝了char的地址,没有拷贝到数据;也有可能由于char数据长度不定,发送的时候出现问题;也有可能接收方收到解析的时候出现问题。
【注】一般不能在结构体中添加string类型参数,如果不确定发送字段或字符数组的长度,可以使用char*(char [])代替。
使用string的错误示例:
struct Data
{
int id;
string str;
};
void func()
{
Data data;
data.id = 01;
data.str = "xxxxx"; //直接将字符串赋值给结构体变量
int Len = data.str.length()+sizeof(int);
char* sendTcpData = new char[Len];
memset(sendTcpData,0,Len);
memcpy(sendTcpData,&data,Len);
tcpsocket->write(sendTcpData,Len);
}
通过抓包发现这样发送出去的报文为空。因为可能只拷贝了字符创地址,而没有将实际数据传给data.str
正常通过char*(char[])发送报文:
struct Data
{
int id;
char* para;
};
void tcpSend()
{
Data data;
data.id=11;
QString str = "xxxx";
QByteArray ba = str.toLatin1();
char* temp = ba.data();
memcpy(data.para,temp,ba.length()); //通过这种方式传递数据,不然传的是结构体指针
int Len = data.para.length()+sizeof(int);
char* sendTcpData = new char[Len];
memset(sendTcpData,0,Len);
memcpy(sendTcpData,&data,Len);
tcpsocket->write(sendTcpData,Len);
}
参考Blog:
1、Qt 利用TCP/IP socket通信 发送与接收结构体(简单通信协议解析)