【问题标题】:Serialize a struct and send it via socket with C++使用 C++ 序列化结构并通过套接字发送它
【发布时间】:2011-06-18 15:06:22
【问题描述】:

我会通过 C++ 套接字发送一个结构。这是一个示例结构:

struct PIPPO
{
int x;
int y;
};

我使用的:

PIPPO test2;
test2.x = 10;
test2.y = 20;

我有上面的代码来序列化并通过套接字发送它。问题是,如果我尝试获取测试变量的 HEX 值,我只会看到 0A 并且实际上在接收数据的另一台计算机上我无法将二进制数据转换回结构。有人可以帮我吗?

template <class T> void SerializeData(char *outputArray, T inputData)
{
memcpy(outputArray, &inputData, sizeof(inputData));
}

char *StrToHexStr(char *str)
{
    char *newstr = new char[(strlen(str)*2)+1];
    char *cpold = str;
    char *cpnew = newstr;

    while('\0' != *cpold) {
        sprintf(cpnew, "%02X", (char)(*cpold++));
        cpnew+=2;
    }
    *(cpnew) = '\0';
    return(newstr);
}

char *test = new char[sizeof(PIPPO)];

memcpy((void *)&test, (void *)&test2, sizeof(test2));

send(this->m_socket, test, strlen(test), 0);

【问题讨论】:

    标签: c++ sockets serialization


    【解决方案1】:

    你的代码不是很清楚,但是如果你的发送者和接收者在同一个平台上,你需要做的就是下面这样..

    PIPPO to_send;
    to_send.x = 10;
    to_send.y = 20;
    
    // just send the structure
    send(this->m_socket, reinterpret_cast<const char*>(&to_send), sizeof(to_send), 0);
    

    在接收方..

    PIPPO to_receive;
    // now read directly into the structure
    recv(this->m_socket, reinterpret_cast<char*>(&to_receive), sizeof(to_receive));
    

    如果您不关心协议的向后兼容性等,这种方法应该可以在相同的平台上正常工作。

    【讨论】:

    • 我花了几天的时间试图干净地做到这一点,你帮我解决了这个问题。人们真的把事情复杂化了,不是吗
    • @Charlie,是的,他们确实这样做了......无论如何 - 将编辑上面的内容,它可以更简单...... :)
    【解决方案2】:


    要发送文本表示,您可以使用 boost::serialization 库。 它有据可查并支持以下功能:
    1.(反)contianers的序列化
    2. 对象树的(反)序列化
    3. 指向对象的指针(反)序列化
    4. 多态(反)序列化
    5. 完全类型安全
    还有更多..

    其实我觉得里面有一些黑魔法生成器:)

    问候, 马辛

    【讨论】:

    • 我也做了同样的事情,但我看到 boost 序列化库不支持大/小端。对吗?
    • 文本存档是可移植的,但二进制不是:boost.org/doc/libs/1_45_0/libs/serialization/doc/… 所以如果您真的需要二进制表示,则需要一些解决方法(可能为存档实现/找到“可移植流”)。
    【解决方案3】:

    是的,它引发了很多对齐和字节顺序问题。 要走的路是使用XDR 或实际切换到文本表示。 无论如何,将二进制编码为十六进制是没有用的。

    【讨论】:

      【解决方案4】:

      通过网络发送原始二进制表示可能会给您带来问题,特别是当您拥有异构网络或应用程序时。看看protobuf,这可能最适合这个。

      【讨论】:

      • +1 用于提供指向protobuf 的链接。看起来很有趣。 :-)
      • 我已经看到了 google 协议缓冲区,但我认为对于在 Windows 上运行且仅用 C++ 编写的程序来说,这确实是开销。我会推荐 protobuffer 用于异构应用程序,无论如何感谢您对我的问题感兴趣
      猜你喜欢
      • 2016-04-04
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2010-11-22
      相关资源
      最近更新 更多