• 一个关于消息结构体的讨论


    好久没写点什么了,

    这里发个课题,可以讨论一下,

    我有个驱动程序,同时也有个应用层模块,

    当然了,这个驱动SYS是一个保护模块,应用层模块DLL是个控制模块,

    DLL控制SYS。

    既然涉及到控制,同时就肯定涉及到通信,

    既然涉及到通信,就涉及到通信安全的问题,

    这里我们不讨论被别人干了的情况,只讨论我们自己的情况。

    首先,模块化就是为了更新方便,

    而既然是更新就包括SYS的更新和DLL的更新,

    最好的情况下,当然就是同时更新,

    但是有些比较差的情况是,DLL可以及时更新,但是SYS却不能及时更新,因为SYS不是任意时间都可以卸载的,

    而且卸载时也要考虑当前是否可能有资源被占用的问题,

    所以最好的情况就是,当电脑重新启动之前不卸载SYS,

    那么,问题就来了,新的DLL,和旧的SYS同时存在,那么交互的时候怎么办,

    如果新的DLL内存空间里面多了一个什么东西的话,那么SYS就可能解析出错,

    结果就是轻者导致功能无效,重者直接BSOD,

    这怎么办。

    我和我老大讨论了一会,我老大给出一个结论是,给每个DLL和SYS通信的信息,增加一个版本号,

    这样SYS做解析之前,先判断版本号,然后再解析。

    这,你怎么看。

    我说一下我的想法阿,其实我认为这完全是多余的,

    首先,如果DLL升级加载成功,DLL再升级加载SYS,然后和SYS沟通,那么很必然DLL如果升级加载SYS失败了,DLL自己也会知道这个情况,

    那么这时候有两种可能,

    1:如果升级加载SYS成功了,那么DLL自然可以和自己加载的SYS正确沟通,正确交互,那么自然后续都没有问题,

    2:如果升级加载SYS失败了,那么DLL肯定会知道自己对SYS的升级加载操作是失败的,这时,即便自己发给驱动的消息里面携带一个版本号,那么驱动识别版本号是自己不认识的,这时也无法正确执行消息,所以这条信息本身就是多余的。而,这时候,难道还指望新的DLL用老的版本号来发送一条消息么,这不是吃饱了撑的么,我们不是有老的DLL就在本地么,直接用老的DLL就行了阿。

    实际上不管成功还是失败,我们都是可以有比较好的办法来解决这个问题。

     

    实际上我老大想到这点,是因为,我老大是做云控的,云控发消息到本地的话,确实需要携带一个版本号(或者本地上发一个版本号告诉云控说我要哪个版本的消息),如果不这样的话,那么云控每一次升级,都会丢掉很多很多量。

  • 相关阅读:
    ubuntu 安装(install) pwntcha[一个做"验证码识别"的开源程序]
    MySQL 二进制日志过滤
    MySQL 分区表各个分区的行数
    MySQL 表分区A
    MySQL show binglog event in 'log_name'
    MySQL、You are using safe update mode
    SQL 设计心得、逗号分隔列表
    MYSQL @、@@、@x
    SQL Server
    建设供内网访问的网站
  • 原文地址:https://www.cnblogs.com/suanguade/p/5995296.html
Copyright © 2020-2023  润新知