异步IO中网络数据发送的完整性保障

        对于串口通信,通常需要自行进行crc的校验,确保数据的准确性,而当使用TCP时,数据的准确性已经无需应用校验,但是数据的应用协议完整性,需要应用自行保障。

        当定义了一套应用协议,譬如魔术字PROTOCOL(8B),命令字(2B),数据长度(4B),数据内容(数据长度指示)。

        发送方组织对应协议数据,通过异步IO进行发送,异步IO返回提交成功的字节数,注意这里,不是把需要发送的数据全部都提交发送了,而是可能只提交了部分,如果应用这里不进行处理,而紧跟着发送下一条协议数据,就会导致协议数据的不完整性,进而导致接收方数据处理的错误。

        好一点的情况是接收方重新寻找魔术字的头,进而恢复正确处理;差一点的可能导致连接断开,而后重连再次新的接收处理;最坏的,碰巧构建了一个错误内容的完整有效协议数据,进行了错误的业务处理,从而导致整个业务混乱。

        本文介绍一种方法,以保障协议数据的完整发送或完整不发送,在不发送的情况下,外部业务再行额外保障。

        整体方案雷同“进出口数据缓存管理”,大致描述如下:

        对整个IO进行输出包装,需要发送的协议数据优先发送到一个输出IO管道,管道设置内存缓存最大大小,如果数据量已超出缓存最大大小,直接返回发送失败,反之则把新数据追加到缓存,而后按照先进先出的原则,从队列第一个数据进行异步IO的发送,如果该协议数据全部发送完毕,则清理该协议数据并发送下一个,直到所有协议数据发送完毕或某个数据未能完全发送,那么该数据及后续协议数据保留在内存缓存中。

        在下一个数据进入时,继续触发上述逻辑或者由对输出IO管道管理的整体驱动器进行周期性驱动发送(缓存数据通过异步IO的发送)。

        基于上述逻辑,进入该管道的数据,将会依次发送,就算异步IO没能一次性完整输出协议数据,后续的发送也将保证协议数据发送的完整性。

        更进一步,如果在实际业务中存在相对的高优先级和低优先级协议数据,那么可以在该管道内放置多个缓存数据队列,每次异步IO发送时,优先发送高优先级队列的数据。并且在缓存满的时候,当高优先级数据进行添加时,可以尝试清理低优先级的数据以优先满足高优先级数据的加入。当然,所有已经半发送状态的数据是无法进行清理的。

        再进一步,当业务外部因为内部内存缓存满,返回失败时,可以使用“进出口数据缓存管理”方案进行外部的数据缓存,最终达到数据的完整发送。

        本文主要描述如何保障协议数据自身的发送完整性,确保接收方能够在协议的基础上,有效解析数据,不会出现协议数据中断或错乱的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值