В первый раз я хочу поблагодарить HostileFork , чтобы помочь мне объяснить мою проблему.Спасибо вам!
Я пытаюсь создать клиент и сервер, которые отправляют свои данные через двоичный протокол.
Моя проблема в том, что я хочу отправить класс из клиента QT вBoost Server.Мой заголовок (одно целое число размером с мой класс) записывает в сокет.Когда я хочу прочитать заголовок на стороне сервера, я не могу получить хорошее целое число (вместо этого у меня есть большое число, например -13050660).Я думаю, что проблема заключается в десериализации на сервере, но я не уверен.
Это метод, который мой код клиента Qt использует для записи числа 10 в сокет:
QByteArray paquet;
QDataStream out(&paquet, QIODevice::WriteOnly);
out << (quint32) 0;
out.device()->seek(0);
out << (quint32) (10);
cout << "Writing " << sizeof(quint32) << " bytes to socket." << endl;
Затем я пытаюсь прочитать его на серверном процессе, который использует метод async_read ():
this->Iheader.resize(size, '\0'); // Iheader is a vector of char
async_read(
this->socket,
buffer(this->Iheader),
bind(
&Client::endRead,
cli,
placeholders::error,
placeholders::bytes_transferred)
);
Вот функция, которая работает с результатом строки:
#ifdef WIN32
#define MYINT INT32
#include <Windows.h>
#else
#define MYINT int
#endif
void Client::endRead(const error_code& error, size_t nbytes)
{
if (!error && nbytes == sizeof(MYINT)) {
cout << "Read " << sizeof(MYINT) << " bytes from a socket." << endl;
istringstream stream(this->connection->getIheader(nbytes));
stream >> this->Isize;
cout << "Integer value read was " << this->Isize << endl;
} else {
cout << "Could not read " << sizeof(MYINT) << " bytes." << endl;
}
}
Iполучить 32-разрядное целое число со знаком (4 байта), но это не десять, а что-то вроде -1163005939.Кто-нибудь есть и идеи, почему это не работает?
Сервер и клиент оба при запуске на Windows7 Pro, 64-разрядная.