【问题标题】:Sending binary data over socket in c++在 C++ 中通过套接字发送二进制数据
【发布时间】:2012-08-23 21:06:40
【问题描述】:

在 C++ 中,我有类似这样的数据结构:

struct Data 
{ 
int N; 
double R; 
char Name[20];
};

我必须将这些数据从客户端发送到不同系统上的服务器(我必须发送一组数据结构,但我可以一个一个地发送它)。我想将它作为二进制数据发送,以便我可以在另一端提取数据并将其放入相同的结构类型中。

如果(客户端和服务器)都使用相同的编译器编译,则 sizeof(Data) 和结构中的所有位填充将相同。但是由于服务器是运行 Linux 的 64 位,而客户端甚至可以是 32 位窗口,因此 Data 中数据的顺序可能会有所不同。

我说的对吗?解决这个问题的最佳方法是什么?

【问题讨论】:

  • 我会看类似protobuf的东西

标签: c++ sockets c++11


【解决方案1】:

假设所有客户端和服务器总是使用相同的编译器构建相同的架构和操作系统,这几乎总是一个坏主意。最好编写代码,将结构的成员显式打包和解包为具有指定顺序的字节流,或者将数据转换为可以在另一端解析的非二进制格式(例如 JSON 或 XML)。

【讨论】:

  • 支持“坏主意”:看看 CORBA。为了解决这个问题,有一大群人经历了很多痛苦。并不是说您应该特别使用它,而只是为了说明为什么这是一个糟糕的主意。
【解决方案2】:

您可以使用Boost.Serialization 编组/解组(即将您的数据从源计算机格式转换为适合传输的格式,然后从该格式转换为目标计算机使用的格式)您的数据和Boost.Asio处理通信。

【讨论】:

    【解决方案3】:

    正确的协议定义将帮助您解决此问题。有一个固定长度的标头,后跟可变长度的数据。

    类似的东西

    标题***

    [DataSize] - 2 个字节

    [MSG ID] - 1 个字节

    数据包**

    [N] - 4 个字节

    [R] - 8 个字节

    [Len] - 2 个字节

    [名称] - Len 字节

    读取字节并填充结构

    【讨论】:

    • 还要确保为多字节字段指定字节顺序。
    猜你喜欢
    • 2012-10-11
    • 2020-09-08
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多