gpt4 book ai didi

c++ - Qt 客户端发送一个结构数据来 boost asio 服务器

转载 作者:行者123 更新时间:2023-11-30 04:31:14 35 4
gpt4 key购买 nike

当我的客户端向我的服务器发送结构数据时,我遇到了一个问题。我的客户端使用 Qt tcp,我的服务器使用 boost.asio。在我的服务器端,我可以接收客户端发送的缓冲区数据,但是当我将数据转换为我的结构数据时,我得到一个不可读的结构数据。

这是有问题的结构数据:

struct Protocole
{
int type;
char infos[1024];
}

这是我服务器中读取客户端套接字数据的代码:

    this->_socket.async_read_some(boost::asio::buffer(_buffer), // _buffer is type of char[1024];
_strand.wrap(boost::bind(&ClientManager::HandleRead,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred))
);

在 ClientManager::HandleRead 中:

ProtocoleCS *_proto; // this is the struct data i have to cast 

_proto = static_cast<ProtocoleCS*>(static_cast<void*>(&_buffer));
// I can read _proto

这是我客户端中发送结构数据的代码:

void                Network::SendMsgToServer()
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
Protocole proto;

proto.type = 1;

std::cout << " i am sending a message" << std::endl;

proto._infos[0] = 'H';
proto._infos[1] = 'E';
proto._infos[2] = 'L';
proto._infos[3] = 'L';
proto._infos[4] = 'O';
proto._id[5] = '\0';

out << static_cast<char*>(static_cast<void*>(&proto));
this->socket->write(block);
}

最佳答案

QDataStream operator <<用于序列化,而不是按原样写入原始数据。
例如,字节序列是用32-bits发送的。 “header”表示序列的大小。

并且因为您将整个结构转换为 char* ,它将其解释为字符串并在第一个 '\0' 处停止int 中的字符结构的一部分。

因此您应该分别编写这两个成员并避免显式转换:

// If you want to avoid endianness swapping on boost asio side
// and if both the server and the client use the same endianness
out.setByteOrder(QDataStream::ByteOrder(QSysInfo::ByteOrder));

out << proto.type;
out.writeRawData(proto.infos, sizeof(proto.infos));

在 boost asio 方面,因为你知道结构的大小,你应该使用 async_read而不是 async_read_some因为后者可能会在接收到整个结构之前返回。

关于c++ - Qt 客户端发送一个结构数据来 boost asio 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8310861/

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