【问题标题】:Looking for a library for simple protocol implementation [closed]寻找用于简单协议实现的库 [关闭]
【发布时间】:2010-01-21 11:26:35
【问题描述】:

我需要在 C++ 中实现一个简单的网络交互,我一直想知道是否有库已经这样做了。我的协议基本上是发送消息并接收响应。每条消息只是一组 3-4 个基本数据类型的值。我想找到一个(或多个)可以执行以下一项或多项操作的库:

  1. 将值序列化为高效的字节数组(我不能使用基于文本的序列化)。
  2. 发送消息并等待结果(它可以锁定或异步接收响应,我不在乎)。
  3. 它必须能够在发送的消息和响应之间建立关联。

理想情况下,我希望能够写出这样的东西:

// On the sending side
bool send(const string& str, int x, char y)
{
    Message msg;
    msg  << str << x << y;

    // Lock until the response arrives
    return cool_library::send(address, msg);
}

// On the receiving side
bool receive(Message& msg)
{
    string str; 
    int x; 
    char y;

    msg >> str;
    msg >> x;
    msg >> y;

    if (some conditions...)
        return true; // the message was handled successfully
    else
        return false;
}

注意cool_library::send不是在消息发送成功时返回true,而是在对方响应成功时返回true。所有这些冗长的解释只是为了表明我需要一个简单的功能。没有什么花哨。我什至可以自己发送和接收缓冲区,但我需要一些可以将消息与响应相关联的东西。我不想使用 RPC,因为在我看来这有点矫枉过正。

谢谢。

【问题讨论】:

    标签: c++ c parsing networking ipc


    【解决方案1】:

    谷歌protocolbuffers。我已经使用了一段时间了,它速度快、可扩展且非常轻量级。

    这是一个考虑到时间/网络优化的二进制序列化。

    它不支持通过套接字实际“发送”,但如果你只发送一个包含消息大小的整数然后再发送消息,这真的很容易。这样,在另一端,您读取一个整数并知道传入消息的大小以正确调用parseFromArray

    【讨论】:

    • 确实看起来是一个不错的序列化解决方案。但是你知道一些可以为我管理消息生命周期的东西吗?诸如消息响应、重试之类的事情?
    • 另外,你觉得boost序列化库怎么样?
    • 从未使用过 boost 序列化,但如果您想要处理网络内容并增加更多可靠性(通过 TCP)的东西,它不会那么便宜,也许您应该寻找更完整的框架。跨度>
    • 也许这是我的一厢情愿,我无法摆脱轻松的事情。我现在正在研究 ACE (cs.wustl.edu/~schmidt/ACE.html)。这是一个巨大的图书馆,但也许这是正确的选择:(
    【解决方案2】:

    使用 Google 的协议缓冲区库。它最小化发送的数据并自动生成从声明文件中自动序列化和反序列化的 cpp 文件。当您发布协议的新版本时,它也向后兼容!

    http://code.google.com/p/protobuf/

    【讨论】:

    • 好的,我刚刚检查过了,确实可以在文本和二进制之间进行选择。所以,这是为了序列化。但是响应呢?
    • 定义协议时,您可以定义响应消息类型。如果愿意,您甚至可以非常轻松地将原始请求作为字段包含在响应中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2016-05-15
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多