我无法使用Qt和Boost通过网络发送标头大小

时间:2011-11-22 15:40:00

标签: c++ qt boost network-programming boost-asio

我尝试将一个类的大小从Qt客户端发送到Boost服务器(我制作了两个)。

这是我要序列化的课程

class Commande
{
public:
        std::string     login;
        std::string     mdp;
        std::string     IP;
        std::string     to;
        std::string     from;
        bool            rep;
        int             nbCmd;
};

这是我用来序列化和发送Commande大小和对象的函数。 _socket是QTcpSocket

void    BNetwork::sendData(void)
{
    QByteArray  paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    Commande    cmd;

    cmd.setCmd(1);
    cmd.setFrom("Paris");
    cmd.setIP("127.0.0.1");
    cmd.setLogin("test1");
    cmd.setMdp("mdp1");
    cmd.setRep(0);
    cmd.setTo("maryline");
    out << (quint32) 0;
    out << cmd;
    out.device()->seek(0);
    out << (paquet.size() - (int)sizeof(quint32));
    this->_socket.write(paquet);
}

QDataStream &operator<<(QDataStream &out, Commande &cmd)
{
    QString test(cmd.from.c_str());

        out << (quint32)cmd.nbCmd;
        out << test;
        test = cmd.IP.c_str();
        out << test;
        test = cmd.mdp.c_str();
        out << test;
        out << (quint32)cmd.rep;
        test = cmd.to.c_str();
        out << test;
        return out;
}

这是我用来转换从QT客户端收到的标题大小的函数。

std::string  save = this->connection->getIheader(); \\ this is the string i read on the socket
std::istringstream                      stream(save);
std::cout << save << std::endl;
if (!(stream >> std::dec >> this->Isize))
      throw my_exception("error in endRead()");

由于未知原因,save包含“1000”,当我尝试将此字符串转换为整数时,它不起作用,所以我认为我得到的值不正确。

客户端和服务器在Windows 7 64位上运行。

你能解决我的问题吗?

1 个答案:

答案 0 :(得分:1)

首先,确认当您使用out.device()->seek(0)时,会导致下一次写入前置,而不是像我预期的那样覆盖您已编写的数据。

然后,请咨询this answer以查找可能存在相同或类似问题的问题。

如果您需要更多帮助,请在评论中告诉我。

ETA:QString将数据存储为16位QChar,以支持unicode。 std::stringstd::istringstream正在阅读8位char。另见this answer。由QT序列化的QChars可能会让您陷入困境。另请注意,恰好位于getIheader()返回的char序列中的任何0(null)char将终止std::string的赋值运算符。

我建议将std::istringstream替换为QDataStream,然后使用该类将数据读出到您最初编写的类型。在将序列化放在后面之后,您可以从QT类型转换为c ++本机类型。否则,你必须要小心翼翼地弄清楚QT在引擎盖下做了什么。通过自己的努力来匹配它。