当前位置: 代码迷 >> QT开发 >> 求解:QTcpServer,QTcpSocket发送和接收结构体有关问题
  详细解决方案

求解:QTcpServer,QTcpSocket发送和接收结构体有关问题

热度:107   发布时间:2016-04-25 03:14:43.0
求解:QTcpServer,QTcpSocket发送和接收结构体问题
自定义个一个结构体struct data{……………………}
想通过QTcpSocket发送给QTcpServer

发送和接收的代码是这么写的

发送:

    QByteArray msg;
    QDataStream out(&msg,QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_8);
    out<<quint16(0)<<data;
    out.device()->seek(0);
    out<<quint16(msg.size()-sizeof(quint16));
    sender->write(msg);//sender是QTcpSocket对象


接收:

QDataStream in(socket);//socket是QTcpServer侦听到的套接字
 in.setVersion(QDataStream::Qt_4_8);
    if (block==0)//block是存储得到接下来数据块的长度
    {
        if (socket->bytesAvailable()<(int)sizeof(quint16)) return;
        in>>block;
    }
 if (socket->bytesAvailable()<block) return;
 in>>data;


这两段代码都是根据Qt自带的demo修改的
发送的时候编译没问题,但是接收端编译就出现问题了
求指点
------解决方案--------------------
引用:
Quote: 引用:

你这个肯定不行,因为你用的
in>>data
因为data是你自定义的结构体类型的变量,因此“>>”运算符的所有重载函数不知道你这种自定义类型怎么赋值,qdatastream读出来的是字节流,而在发送的时候调用out<<quint16(0)<<data,这个data你肯定已经初始化了,因此qdatasteam不会去关心你存的什么东西,反正知道你这个data型变量在内存中的物理地址,直接读取字节写入socket,当然成功了,而你接受的时候data未初始化

那这个问题该怎么解决呢?

这个问题可以这样解决:
假设你声明的结构体为:
typedef struct  A
{
          qint32 No;
          QString message;
}msgBlock;
当你在server端接收的时候,可以采用如下的方法:假设监听端口获得连接的socket为serverConnect
可以这样写:
QDataStream readMsgFromSocket(serverConnect);
readMsgFromSocket.setVersion(QDataStream::qt_4_0);
//先声明一个msgBlock类型的结构体变量data
msgBlock data;
//假设socket中的数据顺序为先No,然后是message
readMsgFromSocket  >> data.No;
readMsgFromSocket  >> data.message;
//然后关闭socket即可