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);
}
服务架构设计
在前面我们的结构设计如下:

优点是设计直观,简单.缺点也很明显,就是当前我们是echo类型的,处理简单,如果是复杂的处理,直接在HandleHead和HanldeMsg进行事件的处理,耦合性升高,同时如果一些操作很耗费时间的话,服务器会有一定时间的阻塞,效率就会下降.
因此我们的解决方案是,将消息处理的任务交给专门的逻辑层去处理,而不是嵌合在我们的读写处理函数之中.
那么接下来的架构如下:


浙公网安备 33010602011771号