ascs 简明开发教程(八):消息接收与发送

31 篇文章 0 订阅
31 篇文章 1 订阅

QQ交流群:198941541

异步消息发送函数有 send_msg,send_native_msg,safe_send_msg 和 safe_send_native_msg;同步消息发送需要定义宏ASCS_SYNC_SEND,定义之后你将得到 sync_send_msg,sync_send_native_msg,sync_safe_send_msg 和 sync_safe_send_native_msg 函数用于同步消息发送,签名跟异步消息发送函数类似,只是在消息后面多了个duration代表超时时间,单位为毫秒,0表示永远等待。

注意:同步发送超时并不表示失败,ascs库原生不支持同步发送,而是用异步发送来模拟,所以消息还是会放入发送缓存,并由后台service线程来调度并异步发送,只要消息放入了发送缓存且连接不断,即便是同步发送超时,最终消息还是会到达对方。

同步消息发送函数的签名为(异步几乎一样,只是少了duration参数且返回值类型为bool):

sync_call_result sync_send_msg(in_msg_type&& msg, unsigned duration = 0, bool can_overflow = false, bool prior = false);
sync_call_result sync_send_msg(in_msg_type&& msg1, in_msg_type&& msg2, unsigned duration = 0, bool can_overflow = false, bool prior = false);
sync_call_result sync_send_msg(typename Packer::container_type&& msg_can, unsigned duration = 0, bool can_overflow = false, bool prior = false);
sync_call_result sync_send_msg(const char* const pstr[], const size_t len[], size_t num, unsigned duration = 0, bool can_overflow = false, bool prior = false);
sync_call_result sync_send_msg(const char* pstr, size_t len, unsigned duration = 0, bool can_overflow = false, bool prior = false);
sync_call_result sync_send_msg(char* pstr, size_t len, unsigned duration = 0, bool can_overflow = false, bool prior = false);
template<typename Buffer> sync_call_result sync_send_msg(const Buffer& buffer, unsigned duration = 0, bool can_overflow = false, bool prior = false);

其它三个函数签名完全一样,所以省略掉。can_overflow参数我们留到以后再讲,prior如果为true,消息会被放入发送缓存的最前端(以便尽快发出),如果你的消息不允许乱序,则你应该保持其为false;泛型Buffer可以是任何对象,只要它提供const char* data() const 和 size_t size() const 接口即可。
再说说什么是native消息,如果你调用 (sync_)send_native_msg,ascs将以native为true调用i_packer的pack_msg接口,所以什么叫native消息,其实是由打包器说了算的,但为了统一以及符合字面上的涵义,我们应该理解为就是不打包的意思,不打包为什么要调用pack_msg呢?那是因为ascs只接受i_packer::msg_type做为消息类型(比如是std::string),但如果你的数据是在char[]里面,虽然已经打好包了,我们仍然需要打包器将char[]转成std::string,此时就要调用 (sync_)send_native_msg,那我们为什么不直接在std::string里面打好包呢?其实我推荐你直接在std::string里面打包,但考虑到有些老代码你可能不想动,所以提供了这种兼容模式。如果你直接在std::string里面打好了包,你还可以直接调用direct_send_msg和sync_direct_send_msg,后者需要定义ASCS_SYNC_SEND宏,其签名为:

template<typename T> bool direct_send_msg(T&& msg, bool can_overflow = false, bool prior = false);
bool direct_send_msg(list<InMsgType>& msg_can, bool can_overflow = false, bool prior = false);

template<typename T> sync_call_result direct_sync_send_msg(T&& msg, unsigned duration = 0, bool can_overflow = false, bool prior = false);
sync_call_result direct_sync_send_msg(list<InMsgType>& msg_can, unsigned duration = 0, bool can_overflow = false, bool prior = false);

 

异步消息接收是自动的,除非使用了被动模式,这个我们留到以后再讲;同步消息接收需要定义宏ASCS_SYNC_RECV,定义之后你将得到 sync_recv_msg 函数用于同步消息接收,其签名为:

sync_call_result sync_recv_msg(list<OutMsgType>& msg_can, unsigned duration = 0);

其中 duration 代表在没有消息时的最长等待时间,单位为毫秒,0表示永远等待。返回该函数之后,ascs不再维护msg_can链表,你必须处理完所有消息,否则消息会被丢掉(何时丢由你的msg_can链表的生命周期而定)。

注意:同步接收超时并不表示失败,ascs库原生不支持同步接收,而是用异步接收来模拟,只要接收一发出,将由后台service线程来调度并异步接收,只要消息最终到达,仍然会成功接收到数据。这就带来一个问题,还记得上一篇教程吗?加上这一篇讲的同步接收(派发)消息,我们又多了一种消息派发,于是不得不分几种情况说一说:

如果sync_recv_msg不超时,那么所有由sync_recv_msg而得到的消息(不影响之前的接收缓存里面的消息,如果有的话,所以它该怎么派发还怎么派发)会通过sync_recv_msg返回(派发),那么就没后面什么事了,因为前面讲了,sync_recv_msg返回之后,ascs不再维护那个msg_can链表;如果sync_recv_msg超时了呢?前面讲了,消息可以在超时之后到达,此时的派发流程跟异步消息接收时完全一样,可以回到上一篇教程再温习一下。

上一篇:ascs 简明开发教程(7)下一篇:ascs 简明开发教程(9)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值