本文简单介绍一款基于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//////////////////////////////////////////