关于通信数据解析的一个疑惑

cky77 2021-01-03 06:50:28
比如A和B通信,有具体的通信协议,那A收到B的数据之后按照协议解析就可以了。 但是如果AB间的协议有好几种,并且还有可能更改,这种情况解析程序该怎么写呢? 就是不把解析过程在代码里写死。比如把通信协议写成配置文件,然后解析时候读配置文件再解析通信数据这样。 这样子的话,具体怎么实现好一点呢?如果是固定协议可以把协议写成结构体进行解析。不固定协议的话,该怎么实现呢?
...全文
222 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cky77 2021-01-05
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
个人建议, 写一个顶层类,公共的部分写在这个类中, 不同的部分virtual 出一个接口函数, 由派生的每个类实现一种协议的解析
如果协议可提前设定,哪根据配置啥的new 其中选定的类即可,
要么用所以类方法解析一遍,看那个类能正确解析 就取那个结果


大佬,我可能没有说清楚。就是通信协议解析后生成什么格式供后面解数据用比较好?然后后面数据解析的过程是怎样的?可不可以大致讲一下。

an_bachelor 2021-01-05
  • 打赏
  • 举报
回复
如果你只是觉得解析协议很麻烦,协议又可能变化,可以用protobuf 它需要你提供一个“配置文件”来描述协议,协议中的部分可以是”可选“或”必须“的 例如: message Person { required string name = 1; required int32 id = 2; optional string email = 3; } 如果你只是打算区分不同的服务,不如通过增加一个层级:也就是客户端先请求索引服务,然后获得分配到的业务服务器去访问具体业务,这可以是不同的端口、不同的IP、不同的机器,实际应用中一般不会很需要同一个ip:port去提供不同的服务。
走好每一步 2021-01-04
  • 打赏
  • 举报
回复
引用 楼主 cky77 的回复:
比如A和B通信,有具体的通信协议,那A收到B的数据之后按照协议解析就可以了。 但是如果AB间的协议有好几种,并且还有可能更改,这种情况解析程序该怎么写呢? 就是不把解析过程在代码里写死。比如把通信协议写成配置文件,然后解析时候读配置文件再解析通信数据这样。 这样子的话,具体怎么实现好一点呢?如果是固定协议可以把协议写成结构体进行解析。不固定协议的话,该怎么实现呢?
结构体强转这种办法不太靠谱的,用状态机去解析协议吧,这种适合多种协议!
zgl7903 2021-01-04
  • 打赏
  • 举报
回复
个人建议, 写一个顶层类,公共的部分写在这个类中, 不同的部分virtual 出一个接口函数, 由派生的每个类实现一种协议的解析 如果协议可提前设定,哪根据配置啥的new 其中选定的类即可, 要么用所以类方法解析一遍,看那个类能正确解析 就取那个结果
现在还是人类 2021-01-04
  • 打赏
  • 举报
回复
然后你可以定制一个外部程序调用接口,这个接口主要传递通讯的必要参数与协议相关的信息,然后协议的对接过程由外部接口程序来处理,等外部接口程序处理完成后再返回结果给你的主程序。这种方式有点像 WEB服务里的 Apache 和 PHP,Apache 是网络服务,根据网络请求决定是用 PHP 来处理脚本还是什么别的接口来处理脚本,只是把这种过程改成通讯层而已。具体你可以学学DDK的开发方式(驱动程序),就是些函数接口定义,然后函数参数结构体的参数传来传去。
cky77 2021-01-04
  • 打赏
  • 举报
回复
引用 7 楼 走好每一步 的回复:
[quote=引用 6 楼 cky77 的回复:][quote=引用 2 楼 现在还是人类 的回复:]然后你可以定制一个外部程序调用接口,这个接口主要传递通讯的必要参数与协议相关的信息,然后协议的对接过程由外部接口程序来处理,等外部接口程序处理完成后再返回结果给你的主程序。这种方式有点像 WEB服务里的 Apache 和 PHP,Apache 是网络服务,根据网络请求决定是用 PHP 来处理脚本还是什么别的接口来处理脚本,只是把这种过程改成通讯层而已。具体你可以学学DDK的开发方式(驱动程序),就是些函数接口定义,然后函数参数结构体的参数传来传去。

我理解的意思是,用一个类去解析协议配置文件,生成的结果传给主程序。这个结果是结构体的形式吗?程序可以根据解析的内容动态生成结构体吗?
主程序拿着协议解析内容,和收到的数据源码。怎样去进行通信数据解析呢?解析结果存成什么数据结构嘞?[/quote]

状态机解包,找到对应的协议,你用类还是什么去解包,都不太重要了
[/quote]

哥,你引用的是我给别人回的
走好每一步 2021-01-04
  • 打赏
  • 举报
回复
引用 6 楼 cky77 的回复:
[quote=引用 2 楼 现在还是人类 的回复:]然后你可以定制一个外部程序调用接口,这个接口主要传递通讯的必要参数与协议相关的信息,然后协议的对接过程由外部接口程序来处理,等外部接口程序处理完成后再返回结果给你的主程序。这种方式有点像 WEB服务里的 Apache 和 PHP,Apache 是网络服务,根据网络请求决定是用 PHP 来处理脚本还是什么别的接口来处理脚本,只是把这种过程改成通讯层而已。具体你可以学学DDK的开发方式(驱动程序),就是些函数接口定义,然后函数参数结构体的参数传来传去。
我理解的意思是,用一个类去解析协议配置文件,生成的结果传给主程序。这个结果是结构体的形式吗?程序可以根据解析的内容动态生成结构体吗? 主程序拿着协议解析内容,和收到的数据源码。怎样去进行通信数据解析呢?解析结果存成什么数据结构嘞?[/quote] 状态机解包,找到对应的协议,你用类还是什么去解包,都不太重要了
cky77 2021-01-04
  • 打赏
  • 举报
回复
引用 2 楼 现在还是人类 的回复:
然后你可以定制一个外部程序调用接口,这个接口主要传递通讯的必要参数与协议相关的信息,然后协议的对接过程由外部接口程序来处理,等外部接口程序处理完成后再返回结果给你的主程序。这种方式有点像 WEB服务里的 Apache 和 PHP,Apache 是网络服务,根据网络请求决定是用 PHP 来处理脚本还是什么别的接口来处理脚本,只是把这种过程改成通讯层而已。具体你可以学学DDK的开发方式(驱动程序),就是些函数接口定义,然后函数参数结构体的参数传来传去。

我理解的意思是,用一个类去解析协议配置文件,生成的结果传给主程序。这个结果是结构体的形式吗?程序可以根据解析的内容动态生成结构体吗?
主程序拿着协议解析内容,和收到的数据源码。怎样去进行通信数据解析呢?解析结果存成什么数据结构嘞?
cky77 2021-01-04
  • 打赏
  • 举报
回复
引用 3 楼 走好每一步 的回复:
[quote=引用 楼主 cky77 的回复:]比如A和B通信,有具体的通信协议,那A收到B的数据之后按照协议解析就可以了。
但是如果AB间的协议有好几种,并且还有可能更改,这种情况解析程序该怎么写呢?
就是不把解析过程在代码里写死。比如把通信协议写成配置文件,然后解析时候读配置文件再解析通信数据这样。

这样子的话,具体怎么实现好一点呢?如果是固定协议可以把协议写成结构体进行解析。不固定协议的话,该怎么实现呢?


结构体强转这种办法不太靠谱的,用状态机去解析协议吧,这种适合多种协议![/quote]
我看了下状态机的意思,当前状态、事件、动作、下一状态。但是我没懂和协议解析怎么联系起来,大佬可以详细说下吗
cky77 2021-01-04
  • 打赏
  • 举报
回复
引用 1 楼 孤客天涯 的回复:
自己定义一个通信协议头,协议头中定义版本号,收发通过判断版本号进行解析


这样的话,还是要把几种协议都用程序实现死了,只是收到数据后判断下适用哪个协议。当协议变更或是增加还是需要改程序代码吧
孤客天涯 2021-01-03
  • 打赏
  • 举报
回复
自己定义一个通信协议头,协议头中定义版本号,收发通过判断版本号进行解析

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧