我尝试将一个类的大小从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 64位上运行。
你能解决我的问题吗?
答案 0 :(得分:1)
首先,确认当您使用out.device()->seek(0)
时,会导致下一次写入前置,而不是像我预期的那样覆盖您已编写的数据。
然后,请咨询this answer以查找可能存在相同或类似问题的问题。
如果您需要更多帮助,请在评论中告诉我。
ETA:QString
将数据存储为16位QChar
,以支持unicode。 std::string
和std::istringstream
正在阅读8位char
。另见this answer。由QT序列化的QChars可能会让您陷入困境。另请注意,恰好位于getIheader()返回的char序列中的任何0(null)char将终止std::string
的赋值运算符。
我建议将std::istringstream
替换为QDataStream
,然后使用该类将数据读出到您最初编写的类型。在将序列化放在后面之后,您可以从QT类型转换为c ++本机类型。否则,你必须要小心翼翼地弄清楚QT在引擎盖下做了什么。通过自己的努力来匹配它。