我第一次要感谢HostileFork帮助我解释我的问题。谢谢 !
我正在尝试构建一个通过二进制协议发送数据的客户端和服务器。
我的问题是我想将一个类从 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;
然后我尝试在使用 boost 的 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;
}
}
我确实得到了 32 位有符号整数(4 个字节),但它不是 10,而是类似于 -1163005939。任何人都知道为什么这不起作用?
服务器和客户端都在 Windows7 pro 64 位上启动。