一款基于Boost的网络库基本结构

本文简单介绍一款基于Boost的网络库的基本结构,适用Windows和类Linux平台,

在实际开发过程,根据不同的需要来进行选择,原理性的东西都差不多。

比如windows平台客户端,可以使用 其API 封装一个轻量级的库,而不必使用开源的库,

开源的库一般相对较大,因为一般它会兼顾不同平台


言归正传,简单记录一下该网络库的基本组成

/*
工作Socket
socket的封装类,包括根据协议对包头进行的处理,心跳
socket读写 关闭,都在这个类实际处理
*/
WorkSocket
{
+ SendPkg(bool Aysn = false); 默认为异步发送 boost::asio::async_write();
}
/*
所有client 处理都要继承此接口
*/
CmdHandlerBase(socket,cmd)
{
+ DoHandleCommand = 0;Handler实例处理
}
/*
  只负责关心连接事件
*/
Work_Connector()//抽象一个连接
{
CmdHandlerCreatorMgr_ : 生产 new CmdHandlerCreator
- InitWorkSocket():  生产 socket,在连接时候调用,会将 CmdHandlerCreatorMgr_ 附加到此工作socket
+ SynConnect();
+ AsynConnect();
}
/*
Command Handler Creator管理器
非线程安全,必须在网络连接之前注册,以后只读
*/
CmdHandlerCreatorMgr
{
+ RegisterCreator(CmdHandlerCreator);
+ GetAllCmdHandler(socket,CmdHandlerList &) ;工作socket或Task 调用,负责实例化Handler 并绑定 CmdHandlerList
}
/*
管理 CmdHandlerList,负责迭代处理
*/
CmdHandlerCtrl
{
+ AddCommandHandler();//
+ HandleCmdPkg(..):int // 这里的参数比较重要
}



在网络库设计的时候应该考虑最多是接口的设计,下面是一个利用回调简单设计的接口:

struct ONE
{
	/*
	连接成功之后,我们干什么
	*/
	virtual unsigned OnConnected() = 0;
	/*
	有数据来
	*/
	virtual unsigned OnSocketRead(void * pData,unsigned nSzie) = 0;
	/*
	socket关闭之后,一些清理工作
	*/
	virtual unsigned OnSocketClosed(bool byServer) = 0;
}

struct TWO
{
	set(ONE * pOne);
	connect();
	closeSocket();
	SendData();
}

另外要注意点的是,使用接口指针来删除对象的时候,可能有内存泄露的问题。

解决办法是:接口使用  虚析构函数。

具体解释见 Effective c++ 相关章节

//////////////////////////////////////////END//////////////////////////////////////////

你可能感兴趣的:(笔记)