ascs 简明开发教程(一)

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;

 

上一篇:asio c++20 协程在windows下和linux下设定


下一篇:Spiral Matrix