当前位置: 首页 > 工具软件 > Ascs > 使用案例 >

ascs 简明开发教程(五):连接状态转换及生命周期管理

柴宏阔
2023-12-01

QQ交流群:198941541

客户端:

multi_client + 断线自动重连(此时开不开启对象重用都一样):

add_socket -> on_connect -> on_recv_error -> on_close -> after_close -> on_connect -> ...

multi_client + 对象重用(关闭自动重连,注意reset是object_pool在重用对象时调用的,之后对象被重用,已经完全代表另一条连接了):

add_socket -> on_connect -> on_recv_error -> on_close -> after_close -> reset -> on_connect -> ...

multi_client + 关闭对象重用和自动重连:

add_socket -> on_connect -> on_recv_error -> on_close -> after_close -> free (c++ keyword)

single_client + 断线自动重连:

on_connect -> on_recv_error -> on_close -> after_close -> on_connect -> ...

single_client + 关闭自动重连:

on_connect -> on_recv_error -> on_close -> after_close

 

服务端:

开启对象重用(注意reset是object_pool在重用对象时调用的,之后对象被重用,已经完全代表另一条连接了):

on_connect -> on_recv_error -> on_close -> after_close -> reset -> on_connect -> ...

关闭对象重用:

on_connect -> on_recv_error -> on_close -> after_close -> free (c++ keyword)

 

由此可见:

1. 如果你想初始化一些东西,在on_connect里面是个不错的选择;

2. 开启对象重用之后,一定要在reset里面把你的状态和数据清理干净,否则被重用之后,留下来的状态和数据就是垃圾;

3. 如果你有资源需要释放,在on_close里面做是最安全的,after_close里面也安全,但要记得调用父类同名函数,否则自动重连功能会失效,on_close则不强求。

 

对象池相关宏:

ASCS_REUSE_OBJECT:开启对象重用;

ASCS_CLEAR_OBJECT_INTERVAL:对象池扫描时间间隔,单位为秒。如果你是长连接,推荐不定义该宏,这样每次有连接断开时会马上移出对象池(如果是客户端,前提是没开启自动重连);如果你是短连接,推荐定义它,这样可以批量的移出对象池(如果是客户端,前提是没开启自动重连),因为操作对象池是有锁的,总之定义与不定义,仅仅是效率上考虑。

 

自动重连接及相关宏:

自动重连接是一个客户端概念,服务端没有。如果想开启自动重连,则定义ASCS_RECONNECT宏为true(默认值,所以无需显示定义为true,需要关闭自动重连才需要显示定义为false),如果以true调用socket的force_shutdown, disconnect和graceful_shutdown主动断开连接,则也会重连且覆盖ASCS_RECONNECT宏(注意仅仅是对这个socket而言,这意味着,当连接下次被动断开时,会执行自动重连,不管ASCS_RECONNECT宏定义为true还是false)。

上一篇:ascs 简明开发教程(4)下一篇:ascs 简明开发教程(6)

 类似资料: