在C ++中序列化向量以通过UDP套接字发送?

时间:2012-04-08 16:43:35

标签: c++ sockets vector distributed-system

作为我们学期末项目的一部分,我们需要实施分布式聊天系统。系统需要具有可扩展性和稳健性。牢记这些标准我对如何在套接字上发送矢量对象感到困惑。

由于向量是动态分配的,因此发送它的对象不会起作用,因为它所指向的内存不会被复制。为了实现这个序列化将是最好的选择。但是,根据我们的项目要求,我们不会使用任何第三方库,如Boost和Google Protocol Buffers。

因此,为了序列化矢量对象并通过网络发送它,我似乎无法找到解释如何继续的起始指南。我们还可以使用其他任何替代方案吗?

该向量将包含聊天组中每个成员的字符串(IP地址:端口)。

任何帮助都会很棒。谢谢。

注意:我们需要让聊天客户端在群集上运行,我相信为了使系统健壮且可扩展,我们还需要考虑结束。

1 个答案:

答案 0 :(得分:0)

如果在这种情况下需要二进制序列化,则需要实现2种类型的序列化 - 整数和字符串。通过将整数转换为char然后转移:

,可以逐字节地轻松写入整数
// assuming 32 bit ints and 8 bit bytes
int integer = 1337;
unsigned char data[4];
for(int i = 0; i < 4; ++i)
    data[i] = (unsigned char) (integer >> 8*i);

通过总和移位反序列化:

int integer = 0;
for(int i = 3; i >= 0; ++i)
{
    integer += data[i];
    integer <<= 8;
}

(我没有测试代码,所以在调试器中跟踪它,并确保它完成我认为它做的事情:))

序列化字符串将是序列化大小,然后是流上的字符。

Vector将是这两个大小的向量的组合,然后是逐个字符串。

您可能希望添加魔术字和校验和,以确保客户端知道预期的内容以及如何验证数据。如果你想变得非常花哨,可以为ASN.1实现自己的支持。 :)