2

我在通过 enet 连接发送向量时遇到问题,因为向量似乎用它们自己的数据类型表示,可能指向向量内部数据的实际存储位置,我不知道如何访问它。

客户端和服务器都有这样的数据结构:

typedef struct {
    unsigned int type;
    vector<int> content;
} packetFormat;

数据被发送到服务器,如下所示:

packetFormat var;
var.type = 5; //sizeof is 4 bytes
var.content = {1, 3, 5, 20, 10, 50, 10, 10}; //sizeof is 16 bytes regardless of data
//total 20 bytes, 21 counting \0 character
ENetPacket* packet = enet_packet_create((char*)&var, sizeof(var) + 1, ENET_PACKET_FLAG_RELIABLE);
enet_host_broadcast(client, 0, packet);

然后服务器接收数据并将其转换为相同的结构,如下所示:

//receives 21 bytes, which is correct
packetFormat* var = (packetFormat*)(event.packet->data);

但是,检查变量时,var->type 等于 5,这是正确的,但是当我尝试检查 size() 或向量的任何内容时,它要么使服务器崩溃,要么提供垃圾数据。正如我之前所说,我认为这是因为结构中的向量实际上是一个指针,但是有人知道如何传输和重新组装原始数据吗?谢谢。

4

1 回答 1

1

如果了解您的代码在做什么,它只是将其序列化,struct就好像它没有间接性一样,例如固定宽度基准。

向量内部有一个指向它的数据的指针,所以vector在结构中序列化你只是发送指针的值,而不是它指向的实际数据本身。

此外,几乎没有或绝对没有保证主机和客户端大小的sizeof布局和布局vector相同。

如果您想发送,vector我会考虑使用理解向量的 C++ 网络库,例如 Boost.Asio。

于 2013-12-27T23:49:26.057 回答