QT TCP/IP通信收发结构体

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通信 发送与接收结构体(简单通信协议解析)

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋期

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值