可变大小的消息帧

时间:2015-09-27 23:28:55

标签: c++ network-programming

gcc编译器允许将一些声明为:

struct Msg : public BaseMsg // BaseMsg could contain the message code and common stuff to all the diferent messages frames
{
  // some class state stuff whose layout must be contiguous 
  size_t len;     // length of variable data
  char buffer[0]; // here one could put data of variable size
};

过去,我使用此样式来管理邮件框架。例如,我可以这样做:

Msg * msg = (Msg*) malloc(sizeof(Msg) + additional_length);
memcpy(msg->buffer, /* some src addr for additional data */, additional_length);

通过这种方式,我可以在Msg类型的对象中将常量消息状态和一些其他数据连接到整个消息,其大小通常是可变的。然后我执行发送/接收一次。

这不是一种琐碎的技巧,但在我的谦虚体验中,比其他选择更简洁,清晰和有效(发送两个独立的消息和/或做更多的演员技巧)。

那么,我的兴趣是询问是否有更有效的技术,或者即使已经有一个设计模式或库来简化这些问题的解决方案。

提前感谢您的关注

1 个答案:

答案 0 :(得分:1)

如果你正在使用,我无法理解为什么这会效率低下

class Msg
{
public:
    Msg(size_t size, const char *const data)
    {
        m_data = new char[size + sizeof(size)];
        // Be careful with endiannes
        memcpy(m_data, &size, sizeof(size));
        memcpy(m_data + size, data, size);
    }

    const char *
    data() const
    {
        return m_data + sizeof(size_t);
    }

    size_t
    length() const
    {
        return *reinterpret_cast<size_t *>(m_data);
    }

    ~Msg()
    {
        delete[] m_data;
    }

private:
    char *m_data;
};

您甚至可以添加send()receive()方法,如果有任何理由可以解决这个问题,我很想知道。