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)