Asio13-OptimizeTheStructure

Asio13-OptimizeTheStructure.md

MsgNode

为了方便发送和接受,避免使用错误,我们将MsgNode重新设计,派生出了RecvNode和SendNode,分别用于读取和发送.

基类的MsgNode用于接受头节点,一般情况下设置内部的缓冲区大小为4字节(我们为了方便管理,在其后面添加了一个'\0',实际是5),前两个字节存储msg_id,后两个字节存储消息体的长度.

// .h
class MsgNode {
public:
    MsgNode(short max_len);
    ~MsgNode();
    void clear();

    // protected:
    short _cur_len;
    short _total_len;
    char* _data;
    short msg_id;
};

class RecvNode : public MsgNode {
public:
    RecvNode(short max_len, short msg_id);
    // private:
    short _msg_id;
};

class SendNode : public MsgNode {
public:
    SendNode(const char* data, short max_len, short msg_id);

    // private:
    short _msg_id;
};

// .cpp
MsgNode::MsgNode(short max_len)
    : _total_len(max_len)
    , _cur_len(0)
    , _data(new char[_total_len + 1]())
{
    _data[_total_len] = '\0';
}

MsgNode::~MsgNode()
{
    delete[] _data;
}

void MsgNode::clear()
{
    ::memset(_data, 0, _total_len);
    _cur_len = 0;
}

RecvNode::RecvNode(short max_len, short msg_id)
    : MsgNode(max_len)
    , _msg_id(msg_id)
{
}
SendNode::SendNode(const char* data, short max_len, short msg_id)
    : MsgNode(max_len + HEAD_TOTAL_LEN)
    , _msg_id(msg_id)
{
    memcpy(_data, &msg_id, HEAD_ID_LEN);
    memcpy(_data + HEAD_ID_LEN, &max_len, HEAD_DATA_LEN);
    memcpy(_data + HEAD_TOTAL_LEN, data, max_len);
}

服务架构设计

在前面我们的结构设计如下:

image-20250923230739949

优点是设计直观,简单.缺点也很明显,就是当前我们是echo类型的,处理简单,如果是复杂的处理,直接在HandleHead和HanldeMsg进行事件的处理,耦合性升高,同时如果一些操作很耗费时间的话,服务器会有一定时间的阻塞,效率就会下降.

因此我们的解决方案是,将消息处理的任务交给专门的逻辑层去处理,而不是嵌合在我们的读写处理函数之中.

那么接下来的架构如下:

image-20250923231253509

posted @ 2025-12-24 23:13  大胖熊哈  阅读(15)  评论(0)    收藏  举报