一种基于链表的报文协议超时重发方法及系统技术方案

技术编号:30779400 阅读:20 留言:0更新日期:2021-11-16 07:39
一种基于链表的报文协议超时重发方法,包括:设计报文协议超时重发管理的链表Link;对链表Link的进行初始化操作,将链表Link初始化为空节点链表,头尾指针指向相同的节点;在已初始化的链表Link中插入一个节点,该节点参数为报文重发管理结构变量;要进行报文发送时,使用报文重发管理结构对发送内容进行管理;在报文接收函数中对接收确认报文进行处理;设置并启动查询无效节点定时器,并进行无效节点查询;在查询无效节点定时器中进行重发操作。本发明专利技术上述基于链表数据结构,将报文重发的过程信息全部记录到链表中,对于超时重发的管理仅需在定时器中不断查询关联容器中的报文应答状态,对超时未收到应答的报文进行重发,即可高效地完成超时应答管理。高效地完成超时应答管理。高效地完成超时应答管理。

【技术实现步骤摘要】
一种基于链表的报文协议超时重发方法及系统


[0001]本专利技术涉及一种基于链表的报文协议超时重发方法,属于计算机控制领域。

技术介绍

[0002]在多个分系统互联的大型系统中,系统间数据通过总线进行交互。在交互过程中由于干扰或故障等原因造成错帧、乱帧、丢帧等,造成了系统间数据交互的失败,一些重要数据交互的失败容易导致整个系统任务的失败。因此,系统间通讯对重要的报文数据通常要求接收方进行应答,传统的应答管理方法通常采用线性表的方式进行管理,例如在一个数组中标记出哪些报文已经成功发送但还未收到应答,并通过计数器进行超时计数,超时发生后根据全局变量记录的报文内容进行重发操作。但对于不同的报文类型,报文发送后在数组中标记该报文是否需要应答,对于系统中不断增加的需要应答的报文数量,数组的长度需要不断增加,参与标记的变量也不断增多,代码的框架也需要不停进行修改,同时超时管理在程序中通过一个定时器进行计数,管理若干需要应答的报文,这种管理方式非常容易出错,当报文重发时,需要确认需要重发报文的地址、内容、长度等信息,一般为全局共有变量,从报文第一次发送到超时未应答期间数据的值可能被篡改,导致两次发送数据内容并非完全一致,影响系统正常运行。

技术实现思路

[0003]本专利技术的技术解决问题是:克服现有技术的不足,提供了一种基于链表的报文协议超时重发方法。
[0004]本专利技术的技术解决方案是:
[0005]一种基于链表的报文协议超时重发方法,步骤如下:
[0006](1)设计报文协议超时重发管理的链表Link;
[0007](2)对链表Link的进行初始化操作,将链表Link初始化为空节点链表,头尾指针指向相同的节点;
[0008](3)在已初始化的链表Link中插入一个节点,该节点参数为报文重发管理结构变量;
[0009](4)在进行报文发送时,使用报文重发管理结构对发送内容进行管理;
[0010](5)在报文接收函数中对接收确认报文进行处理;
[0011](6)设置并启动查询无效节点定时器,并进行无效节点查询;
[0012](7)在查询无效节点定时器中进行重发操作。
[0013]进一步的,所述链表Link的数据域存储的数据元素为报文重发管理结构,指针域为指向下一个节点的地址。
[0014]进一步的,报文重发管理结构包括报文发送的目的地址、报文序号、需要发送的数据指针、需要发送的数据长度、是否收到标志、重发计数器、以及需要重发的次数。
[0015]进一步的,对链表Link的进行初始化操作,具体为:
[0016](2.1)定义链表Link指型变量:包括头节点指针head,普通节点指针node,尾节点指针tail;
[0017](2.2)使用动态内存申请方法申请链表Link结构长度的内存pLink,将申请到的内存首地址赋值到头节点指针head;
[0018](2.3)将头节点指针head的值赋值到尾结点指针tail;
[0019](2.4)链表Link的初始状态是空节点,头尾指针都指向相同的位置pLink。
[0020]进一步的,所述步骤(3)在已初始化的链表Link中插入一个节点,具体为,参数为报文重发管理结构FrmMani类型变量nodeAdd;
[0021](3.1)定义重发管理的链表Link指针变量node1、node2,使用动态内存申请方法申请重发管理的链表Link所占长度的内存,将所申请内存空间的首地址赋值到node1;
[0022](3.2)将函数形参nodeAdd的值赋到node1节点的报文重发管理结构数据成员;
[0023](3.3)判断头指针head是否为空,如果为空,则将node1的值赋值给head,如果不为空,则将头指针赋值给node2;
[0024](3.4)循环判断node2中next元素指向的内容是否为空,如果不为空,把node2中next元素所指向的内容赋值到node2,如果为空,则将node1的值赋值给node2中next元素所指的位置,同时将node1中next元素所指的位置设置为空指针NULL。
[0025]进一步的,所述步骤(4)使用报文重发管理结构对发送内容进行管理,具体为:
[0026](4.1)定义报文重发管理结构FrmMani变量gMani;
[0027](4.2)调用报文发送函数后,将报文发送的目的地址FrmDst、报文序号FrmSeq、发送报文的数据指针FrmPtr、发送给报文的数据长度FrmLen分别赋值到报文重发管理结构FrmMani变量gMani中对应的成员中;
[0028](4.3)将变量gMani中的重发计数器SndCnt清零,设置需要重发的次数SndTimes,设置是否收到标志IsRecvd设置为否。
[0029]进一步的,所述步骤(5)在报文接收函数中对接收确认报文进行处理,具体为:
[0030](5.1)提取接收确认报文的报文序号SeqNum;根据报文序号SeqNum查找一个链表节点;
[0031](5.2)定义链表Link指针变量node,将链表的头指针head赋值给node;
[0032](5.3)循环进行判断链表里报文重发管理结构FrmMani里有无报文序号SeqNum,如果查找到报文序号SeqNum,则将应答报文是否收到标志IsRecvd置为是,此时循环结束;
[0033](5.4)如果遍历到尾节点还没有匹配,提示错误。
[0034]进一步的,所述步骤(6)设置并启动查询无效节点定时器,并进行无效节点查询,具体为:
[0035](6.1)将查询无效节点定时器调用周期设置为PERIOD;
[0036](6.2)通过步骤(2)中初始化的链表头指针判断链表是否为空,如果为空,则直接返回;如果不为空,遍历删除链表中已经满足条件的节点,包括重发计数器SndCnt已经大于等于需要重发的次数SndTimes或者是否收到标志IsRecvd为是的节点;
[0037](6.3)定义节点Link指针LinkPtr,将头指针head赋值给LinkPtr;
[0038](6.4)循环判断LinkPtr是否为空,如果不为空,则判断是否收到标志IsRecvd的值为是或者重发计数器值已经大于等于SndTimes,如果满足,则LinkPtr中next的值赋值给
LinkPtr;否则,判断是不是头节点,如果是头节点,则LinkPtr中next的值赋值给头节点,释放原来头节点的空间,将LinkPtr中next的值赋值给LinkPtr。
[0039]进一步的,所述步骤(7)在查询无效节点定时器中进行重发操作,具体为:
[0040](7.1)设置时间基数gMulti为全局变量对时间进行计算,每次定时器回调函数被调用时进行加一操作,计算时间基数gMulti对重发频次基数ReSnd取余的值为0的时候,则进入步骤(7.2);
...

【技术保护点】

【技术特征摘要】
1.一种基于链表的报文协议超时重发方法,其特征在于步骤如下:(1)设计报文协议超时重发管理的链表Link;(2)对链表Link进行初始化操作,将链表Link初始化为空节点链表,头尾指针指向相同的节点;(3)在已初始化的链表Link中插入一个节点,该节点参数为报文重发管理结构变量;(4)在进行报文发送时,使用报文重发管理结构对发送内容进行管理;(5)在报文接收函数中对接收确认报文进行处理;(6)设置并启动查询无效节点定时器,并进行无效节点查询;(7)在查询无效节点定时器中进行重发操作。2.根据权利要求1所述的一种基于链表的报文协议超时重发方法,其特征在于:所述链表Link的数据域存储的数据元素为报文重发管理结构,指针域为指向下一个节点的地址。3.根据权利要求2所述的一种基于链表的报文协议超时重发方法,其特征在于:报文重发管理结构包括报文发送的目的地址、报文序号、需要发送的数据指针、需要发送的数据长度、是否收到标志、重发计数器、以及需要重发的次数。4.根据权利要求2所述的一种基于链表的报文协议超时重发方法,其特征在于:对链表Link的进行初始化操作,具体为:(2.1)定义链表Link指型变量:包括头节点指针head,普通节点指针node,尾节点指针tail;(2.2)使用动态内存申请方法申请链表Link结构长度的内存pLink,将申请到的内存首地址赋值到头节点指针head;(2.3)将头节点指针head的值赋值到尾结点指针tail;(2.4)链表Link的初始状态是空节点,头尾指针都指向相同的位置pLink。5.根据权利要求4所述的一种基于链表的报文协议超时重发方法,其特征在于:所述步骤(3)在已初始化的链表Link中插入一个节点,具体为,参数为报文重发管理结构FrmMani类型变量nodeAdd;(3.1)定义重发管理的链表Link指针变量node1、node2,使用动态内存申请方法申请重发管理的链表Link所占长度的内存,将所申请内存空间的首地址赋值到node1;(3.2)将函数形参nodeAdd的值赋到node1节点的报文重发管理结构数据成员;(3.3)判断头指针head是否为空,如果为空,则将node1的值赋值给head,如果不为空,则将头指针赋值给node2;(3.4)循环判断node2中next元素指向的内容是否为空,如果不为空,把node2中next元素所指向的内容赋值到node2,如果为空,则将node1的值赋值给node2中next元素所指的位置,同时将node1中next元素所指的位置设置为空指针NULL。6.根据权利要求5所述的一种基于链表的报文协议超时重发方法,其特征在于:所述步骤(4)使用报文重发管理结构对发送内容进行管理,具体为:(4.1)定义报文重发管理结构FrmMani变量gMani;(4.2)调用报文发送函数后,将报文发送的目的地址FrmDst、报文序号FrmSeq、发送报文的数据指针FrmPtr、发送给报文的数据长度FrmLen分别赋值到报文重发管理结构FrmMani变量gMani中对应的成员中;
(4.3)将变量gMani中的重发计数器SndCnt清零,设置需要重发的次数SndTimes,设置是否收到标志IsRecvd设置为否。7.根据权利要求5所述的一种基于链表的报文协议超时重...

【专利技术属性】
技术研发人员:王雨龙
申请(专利权)人:天津津航计算技术研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1