Я не могу отправить размер заголовка через сеть с помощью Qt и Boost - PullRequest
1 голос
/ 22 ноября 2011

Я пытаюсь отправить размер класса с клиента 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 64bit.

У вас есть решение моей проблемы?

1 Ответ

1 голос
/ 22 ноября 2011

Во-первых, подтвердите, что при использовании out.device()->seek(0) вы заставляете следующие записи начинаться, как вы ожидаете, вместо того, чтобы перезаписывать уже записанные данные, как я ожидаю.

Затем обратитесь к этому ответу на вопрос, который, скорее всего, имеет такую ​​же или похожую проблему.

Дайте мне знать в комментарии, если вам нужна дополнительная помощь.

ETA: QString хранит данные как 16-битные QChar, чтобы поддерживать Unicode. std::string и std::istringstream читают 8 бит char. Смотри также этот ответ . QChars, сериализованные QT, могут вызвать проблемы в будущем. Также обратите внимание, что любой 0 (нулевой) символ, который находится в последовательности символов, возвращенной getIheader (), завершит оператор присваивания std::string.

Я рекомендую заменить std::istringstream на QDataStream и использовать этот класс для считывания ваших данных точно в те типы, которые вы изначально написали. Вы можете приводить типы QT к собственным типам c ++ после того, как вы оставили за собой сериализацию. В противном случае вам придется проявить большую осторожность, чтобы выяснить, что делает QT под капотом, и сопоставить его своими усилиями.

...