最近帮学长写了个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));
}
主要也就遇到这个问题.其他的都没什么了.