gpt4 book ai didi

c++ - 使用 QT 网络序列化和使用 Boost 反序列化

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:47 26 4
gpt4 key购买 nike

第一次我要感谢 HostileFork 帮助我解释我的问题。谢谢!

我正在尝试构建通过二进制协议(protocol)发送数据的客户端和服务器。

我的问题是我想将一个类从 QT 客户端发送到 Boost 服务器。我的标题(一个整数,是我类(class)的大小)正在套接字上写入。当我想在服务器端读取 header 时,我无法获得好的整数(而不是我有一个大数字,如 -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 字节),但它不是十,而是类似于 -1163005939。任何人都知道为什么这不起作用?

服务器和客户端都在 64 位 Windows7 专业版上启动。

最佳答案

不客气...并感谢 following my suggestions编辑问题,并做出必要的努力以更清楚地查明问题。所以现在我可以告诉你哪里出了问题。 :)

<< 的行为和 >>QDataStream 上不同比 C++ 标准 IOstreams。在像 std::stringstream 这样的类世界中这些运算符称为“插入器”/“提取器”,用于处理格式化为文本 的信息。如果您想将一定数量的字节读入内存地址,您需要的是:

http://www.cplusplus.com/reference/iostream/istream/read/

(请注意,如果您希望从不是字符串流的内容中读取二进制数据,您需要 using ios::binary 以防止它混淆行结束转换)

QDataStream不遵循那个约定......它是二进制数据的好 helper 。这没有错......因为抽象地说<<>>运算符在语言中可用,可以重载以在您自己的类层次结构中执行任何您想做的事情。 Qt 可以自由地为其自己的流定义自己的语义,他们也这样做了。

请注意@vitakot 关于(如果可能)对输入和输出使用相同方法的建议。还要注意我关于 byte-ordering issues 的警告如果你不小心,它就会开始出现。

(好消息是,如果您使用 QDataStream,它可以通过 taking care of it for you 解决这个问题。)

请注意,在您编写的代码中,您的字符串流正在制作缓冲区的拷贝以便从中读取。我对 boost::asio 没有经验或 async_read 的最佳实践,但我相信您可以四处挖掘并找到更好的方法。

关于c++ - 使用 QT 网络序列化和使用 Boost 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8217398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com