QQ交流群:198941541
以tcp为例,udp和tcp类似(只是类的名字不同),ssl和tcp完全一样,只是命名空间不一样:
service_pump相当于asio::io_context,它负责创建(可动态)service线程(调用asio::io_context::run的线程),启停各种service,service_pump和asio::io_context一样,本身与网络编程无关,只是个异步回调派发器。
那么什么是service呢,它是指实现了i_service接口的对象,包括single_client_base,multi_client_base,server_base。这些service会随着service_pump的start_service和stop_service而启停。同时,这些service要么本身继承自socket(仅支持单条连接),要么就是个容器(支持多条连接),容器都继承自object_pool,所以支持对象重用。
动态增减的service如何启停呢?一是可以调用带i_service*参数的service_pump的start_service和stop_service,二是可以调用i_service的start_service和stop_service。
如何启停某条连接呢?推荐是可以调用socket的启停函数(比如force_shutdown,start),对于single_client_base,你还可以调用i_service的start_service和stop_service。
注意一个service_pump是可以管理多个service的,所以只有在退出进程的时候,才调用其stop_service(不需要i_service*参数的那个版本)。
另外,socket和object_pool都继承自timer,所以你可以很方便地在socket里面和容器里面使用定时器。
下面是一些推荐的继承起始点(前面说了,你至少得继承socket得到自己的socket,因为你需要处理数据):
1. 单条连接,可以继承自single_client,也可以继承自client_socket,然后用的时候single_client_base<your_socket> c(sp);,如果你需要传入自定义的打包解包器,则只能用后一种方法;
2. 多条连接,只能继承自client_socket(需要传入打包解包器就是client_socket_base),然后用的时候multi_client_base<your_socket> c(sp);,如果你觉得容器multi_client_base提供的功能不够用,则你需要继承它,然后用的时候your_multi_client<your_socket> c(sp);;
3. 服务端只能继承自server_socket(需要传入打包解包器就是server_socket_base),然后用的时候server_base<your_socket> s(sp);,如果你觉得容器server_base提供的功能不够用,则你需要继承它,然后用的时候your_server<your_socket> s(sp);;
4. socket支持的模板参数还很多,你甚至还可以指定输入输出消息的类型,容器(队列使用的)类型和队列类型;容器类还支持自定义object_pool,这些我们留到以后再讲,敬请期待。
上一篇:ascs 简明开发教程(5)下一篇:ascs 简明开发教程(7)