第一次我想感謝HostileFork幫助我解釋我的問題。 謝謝!使用QT網絡進行序列化並使用Boost進行反序列化
我試圖建立一個客戶端和服務器誰通過二進制協議發送他們的數據。
我的問題是我想從QT客戶端發送到Boost服務器的類。我的頭文件(一個是我的班級大小的整數)寫在套接字上。當我想讀服務器端的標題時,我無法得到好的整數(而不是我有一個像-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;
}
}
我得到了3 2位有符號整數(4字節),但不是10位,而是類似-1163005939。任何人有和想法爲什麼這不起作用?
服務器和客戶端都在Windows7 pro上啓動,64位。
TL; DR。這真的是你能夠提供的最簡單的情況來診斷問題嗎?你能找到一個非常簡單的非工作例子嗎?你爲什麼告訴我們你讀回的大小,不包括你認爲你寫的大小? (另外,爲了顯示數字,不需要粘貼屏幕截圖...複製和粘貼數字更好,並且也允許其他人複製/粘貼它。)客戶端和服務器是否在相同的情況下運行建築? http://en.wikipedia.org/wiki/Endianness – HostileFork
當然,對不起, –
Isize似乎不是16位長。價值太小。你寫得如同你寫的一樣長嗎? – Lol4t0