我正处于困境中,要就以下情况作出决定。敬请专家帮助。
场景:在两个盒子中运行的两个进程之间有TCP/IP通信。
通信方法1:基于流的套接字通信。在接收端,他将接收整个字节缓冲区,并将前几个固定字节解释为标头,并将其反定位,并了解消息长度并开始接收该长度的消息并反序列化它,然后继续进行下一个消息头的处理。
Communication Method2 :将所有消息放置在向量中,向量将驻留在类对象中。一次序列化类对象并发送到接收方。接收器反序列化类对象并逐个读取向量数组。
请让我知道哪种方法是有效的,如果有任何其他方法,请指导我。
另外,基于类的数据传输和基于结构的数据传输的优缺点以及哪种情况适合?
发布于 2012-02-22 07:28:01
你的问题缺乏一些关键的细节,并混合了不同的关注,挫败了任何提供一个好答案的尝试。
具体来说,方法2神秘地“序列化”和“反序列化”了对象和包含的向量,而没有具体说明是如何实现的。在实践中,细节就像方法1中提到的那样。因此,除非您在使用序列化库和从头开始使用序列化库之间做出选择(在这种情况下,我会说使用库是新手,而且库更有可能正确),否则,1和2是不可替代的。
我能说的是:
read()
或recv()
从套接字中读取尽可能多的数据( )
因此,让我强调这一点:不要假设从给定的套接字读取中接收到的字节超过1字节:如果您有一个20字节的头,您应该循环读取,直到您遇到错误或组装了所有的20个字节。在单个write()
或send()
中发送20个字节并不意味着这20个字节将呈现给单个read()
/ recv()
。TCP是一种字节流协议,当它们被提供时,您必须接受任意数量的字节,直到您有足够的数据来解释它。同样,准备获取比客户机在单个write()
/`send()中编写的数据更多的数据。
另外,基于类的数据传输和基于结构的数据传输的优缺点以及哪种情况适合?
这些条款完全是假的。类和结构在C++中几乎是相同的--用于分组数据和相关函数的机制(它们仅在默认情况下--向客户端代码公开基类和数据成员的方式上有所不同)。无论是否有成员函数或支持代码,都可以帮助序列化和反序列化数据。例如,最简单和最典型的支持是operator<<
和/或operator>>
流函数。
如果您想将这类流函数与一种特殊的“编写二进制块,读取二进制块”的方法进行比较(也许是因为认为结构是POD而没有支持代码),那么我想说的是,如果可能的话,更喜欢流函数,从流到人类可读的表示开始,因为它们将使您的系统更容易开发、更快地调试和支持。一旦您对此感到满意,如果运行时性能需要它,那么使用二进制表示进行优化。如果您很好地编写了序列化代码,您将不会注意到更普通的void*/#bytes
数据模型和正确的每个成员序列化之间在性能上的差别,但是后者可以更容易地支持不寻常的情况--跨不同大小的in /long等系统的可移植性,不同的字节排序,有意的选择,对于指向数据的简单复制和深度复制等等.
我还建议查看boost序列化库。即使您不使用它,它也会让您更好地理解这类事情是如何在C++中合理实现的。
发布于 2012-02-22 07:26:29
这两种方法都是等价的。在这两种情况下,都必须发送具有消息大小和标识符的标头,以便反序列化。如果假设第一个选项是由像普通消息一样的序列化“类”组成的,则必须实现相同的“代码”。
您必须记住的另一件事是消息的大小,以便充分利用TCP缓冲区来优化通信。如果你的第一条方法信息如此之少,试着用更大的信息来提高沟通率,比如在你描述的第二个选项中。
发布于 2012-02-22 08:08:03
请记住,直接将结构或类解释为字节序列并不是安全的,即使它是一个简单的POD --存在诸如endianness (对大多数人来说不太可能成为现实世界的问题)、结构对齐/填充(这是一个潜在的问题)等问题。
C++没有任何内置的序列化/反序列化,您要么必须自己滚动,要么查看一下诸如推进系列化或谷歌的原生质之类的东西。
https://stackoverflow.com/questions/9390227
复制相似问题