【问题标题】:Sending Vectors over a network connection通过网络连接发送向量
【发布时间】:2013-12-27 23:45:37
【问题描述】:

我在通过 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() 或向量的任何内容时,它要么使服务器崩溃,要么提供垃圾数据。正如我之前所说,我认为这是因为结构中的向量实际上是一个指针,但是有人知道如何传输和重新组装原始数据吗?谢谢。

【问题讨论】:

  • 只需手动将其打包为任何合适的 POD 类型,然后发送即可。此外,您应该从网络连接另一端的 POD 数据构造向量。
  • @Ostrovski 是的,我最终只是将数据转换为 char 向量,发送它,然后在另一端接收它并重建它。

标签: c++ vector enet


【解决方案1】:

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

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

此外,几乎无法保证sizeofvector 的布局在主机和客户端大小上是相同的。

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

【讨论】:

  • 我不认为我应该仅仅因为这样的小问题就切换我的网络库,除非获取向量指向的数据实际上是不可能的,因为这有点像我想要弄清楚的。
  • @lemondrop:Boost 序列化可能更合适。将数据序列化到缓冲区后,您可以使用所需的任何网络库发送该缓冲区。
  • @lemondrop,如果您已经在使用 C++ 库,我会同意,但您似乎正在使用带有 C++ 的 C 库。如果您能提供帮助,这并不是一个很好的组合。
  • 我很确定 enet 是一个 C++ 库,如果不是,那么是的,我可能会使用 boost 或其他东西。我真的不喜欢像 boost 这样有十亿个特性的库,因为我觉得这只会减慢速度。 Enet 内部只有真正基本的网络部分,因此具有更大的灵活性,但我会在这里查看其他一些内容。
  • @lemondrop boost 是相当模块化的,boost asio 有它在 lib 它不是一个臃肿的大库。还有其他的,比如 POCO,但我只能直接推荐 Asio。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2014-11-19
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多