ascs (https://github.com/youngwolf-project/ascs.git) 前面的as跟asio前面的as意义完全一样,这也从侧面说明了ascs与asio的关系,后面的cs是client/server结构的意思。
ascs是基于asio的cs框架,并不是简单的对asio的封装(事实上asio已经有的东西,我没有做过任何封装),因为asio已经封装的够好了,而且据说它已经在被纳入c++标准的过程中。
asio只能算是一套类库,跟STL平级,属于静态的,基本上一切都必须由使用者来触发(除了回调),而ascs则不同,它侧重点在于快速的帮你构建一套cs系统,属于框架范畴,也就是说,你只需要很少的几个调用,比如说start(),ascs就可以自己工作,基本上所有的都是自动的(除非数据发送,显然要你来触发)。
ascs支持TCP/UDP和SSL,对于TCP,它也是基于消息的,这是因为ascs引入了打包解包器的概念,消息在发送之前会经过打包,收到数据之后会经过解包才最终到达你的回调函数里面,当然显然的,你需要提供打包解包器(ascs默认提供了4种不同协议的打包解包器——lenght+body,prefix[suffix], fixed length 和 无协议)。注意先提个醒,写打包解包器,既要考虑效率,又要考虑各种情况,比如出错,粘包,分包等,是一件很容易出错的事情。
ascs支持对象池,所以对象可被重要。
ascs支持定时器,底层也是由asio实现的。
ascs提供比较完善的内部状态监视,你可以用来查找性能瓶颈。
ascs的log系统比较欠缺,但可以用你自己的log系统,只需要提供几个函数(约定签名的)接口即可。
ascs与st_asio_wrapper的关系:首先它们的功能是完全一样的,类的名字也完全一样,只是最顶层的命令空间一个是ascs::一个是st_asio_wrapper::,st_asio_wrapper可以完完全全参照ascs的文档来使用。它们最大的区别在于,ascs依赖c++0x和standalone asio (https://github.com/youngwolf-project/ascs.git),而st_asio_wrapper只依赖于boost(最低1.49)而不依赖c++0x,但至少得c++98,另外ascs无论是编译还是运行速度都快于st_asio_wrapper,特别是编译速度,快得更多。
先看一个最简单的cs程序(服务器和客户端在同一个进程里面,相信分开也没什么难度):
#include <iostream>
#include <ascs/ext/tcp.h>
using namespace ascs;
using namespace ascs::tcp;
using namespace ascs::ext;
using namespace ascs::ext::tcp;
#define QUIT_COMMAND "quit"
int main()
{
service_pump sp;
server s(sp);
single_client c(sp);
sp.start_service();
while (sp.is_running())
{
std::string str;
std::getline(std::cin, str);
if (str.empty())
;
else if (QUIT_COMMAND == str)
sp.stop_service();
else
{
c.send_msg(str + " (from client)");
s.broadcast_msg(str + " (from server)");
}
}
}
大家可以看到,你真正也就触发了start_service和send_msg,broadcast_msg而已,够简单吧?
注:ascs/ext 目录并不严格属于ascs,但建议大家包涵它(tcp.h, udp.h, ssl.h),这样你可以少写很多包涵语句,还能得到许多实用的便利性定义,比如上面的server和single_client等,实际上server是:
typedef ascs::tcp::server_socket_base<ASCS_DEFAULT_PACKER, ASCS_DEFAULT_UNPACKER> server_socket;
typedef ascs::tcp::server_base<server_socket> server;