Qt入门之小心read()给你设下的陷阱

最近帮学长写了个Qt Tcpsocket客户端的应用程序,被一个问题困扰了许久.因为以前没有用Qt 写过socket的客户端程序

加上时间比较紧,都没能好好的查看些资料就急忙的写代码,看了一些别人的代码,差不多都是相同的,但是我就出现了收数据

不全的问题..

最后查出原因是我在接受服务器端的数据时使用了read()这个函数,接收的是个结构体,这里顺便说下怎么在Qt 下收发结构体

发:

clientsocket->write((char *)&CardInfo, sizeof(CardInfo))
收:
clientsocket->read((char *)&CardInfo, sizeof(CardInfo));
要对结构体CardInfo进行强制类型转换.

开始我就用了clientsocket->read((char *)&CardInfo, sizeof(CardInfo)); 这个函数来接收数据.. 这里就涉及到了read()的缓冲区问题了

起先我并不知道read()是从缓冲区里区数据的.所以有时候我收数据的时候这能收到这结构体的一部分,所以会造成数据的丢失.

后来选择了用readAll()函数,但用它就要考虑怎么把QBytesArray转换成结构体了. 纠结了许久, 直接用了memcpy函数来解决了

void inputpanel::receive()
{

    QByteArray data;
    data = clientsocket->readAll();
    memcpy(&CardInfo, data, sizeof(CardInfo));

}
主要也就遇到这个问题.其他的都没什么了.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值