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

文档序号:1834482 发布日期:2021-11-12 浏览:8次 >En<

阅读说明:本技术 一种基于链表的报文协议超时重发方法及系统 (Message protocol overtime retransmission method and system based on linked list ) 是由 王雨龙 于 2021-06-18 设计创作,主要内容包括:一种基于链表的报文协议超时重发方法,包括:设计报文协议超时重发管理的链表Link;对链表Link的进行初始化操作,将链表Link初始化为空节点链表,头尾指针指向相同的节点;在已初始化的链表Link中插入一个节点,该节点参数为报文重发管理结构变量;要进行报文发送时,使用报文重发管理结构对发送内容进行管理;在报文接收函数中对接收确认报文进行处理;设置并启动查询无效节点定时器,并进行无效节点查询;在查询无效节点定时器中进行重发操作。本发明上述基于链表数据结构,将报文重发的过程信息全部记录到链表中,对于超时重发的管理仅需在定时器中不断查询关联容器中的报文应答状态,对超时未收到应答的报文进行重发,即可高效地完成超时应答管理。(A message protocol overtime retransmission method based on a linked list comprises the following steps: designing a linked list Link for message protocol overtime retransmission management; initializing the Link of the Link table, initializing the Link of the Link table into a null node Link table, and pointing the head pointer and the tail pointer to the same node; inserting a node in the initialized linked list Link, wherein the parameter of the node is a message retransmission management structure variable; when a message is to be sent, managing the sending content by using a message retransmission management structure; processing the receiving confirmation message in a message receiving function; setting and starting an invalid node query timer, and performing invalid node query; and performing retransmission operation in the query invalid node timer. The invention records the process information of message retransmission into the linked list based on the linked list data structure, only needs to continuously inquire the message response state in the associated container in the timer for managing the overtime retransmission, and retransmits the message which does not receive response after overtime, thus efficiently finishing the overtime response management.)

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

技术领域

本发明涉及一种基于链表的报文协议超时重发方法,属于计算机控制领域。

背景技术

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

发明内容

本发明的技术解决问题是:克服现有技术的不足,提供了一种基于链表的报文协议超时重发方法。

本发明的技术解决方案是:

一种基于链表的报文协议超时重发方法,步骤如下:

(1)设计报文协议超时重发管理的链表Link;

(2)对链表Link的进行初始化操作,将链表Link初始化为空节点链表,头尾指针指向相同的节点;

(3)在已初始化的链表Link中插入一个节点,该节点参数为报文重发管理结构变量;

(4)在进行报文发送时,使用报文重发管理结构对发送内容进行管理;

(5)在报文接收函数中对接收确认报文进行处理;

(6)设置并启动查询无效节点定时器,并进行无效节点查询;

(7)在查询无效节点定时器中进行重发操作。

进一步的,所述链表Link的数据域存储的数据元素为报文重发管理结构,指针域为指向下一个节点的地址。

进一步的,报文重发管理结构包括报文发送的目的地址、报文序号、需要发送的数据指针、需要发送的数据长度、是否收到标志、重发计数器、以及需要重发的次数。

进一步的,对链表Link的进行初始化操作,具体为:

(2.1)定义链表Link指型变量:包括头节点指针head,普通节点指针node,尾节点指针tail;

(2.2)使用动态内存申请方法申请链表Link结构长度的内存pLink,将申请到的内存首地址赋值到头节点指针head;

(2.3)将头节点指针head的值赋值到尾结点指针tail;

(2.4)链表Link的初始状态是空节点,头尾指针都指向相同的位置pLink。

进一步的,所述步骤(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。

进一步的,所述步骤(4)使用报文重发管理结构对发送内容进行管理,具体为:

(4.1)定义报文重发管理结构FrmMani变量gMani;

(4.2)调用报文发送函数后,将报文发送的目的地址FrmDst、报文序号FrmSeq、发送报文的数据指针FrmPtr、发送给报文的数据长度FrmLen分别赋值到报文重发管理结构FrmMani变量gMani中对应的成员中;

(4.3)将变量gMani中的重发计数器SndCnt清零,设置需要重发的次数SndTimes,设置是否收到标志IsRecvd设置为否。

进一步的,所述步骤(5)在报文接收函数中对接收确认报文进行处理,具体为:

(5.1)提取接收确认报文的报文序号SeqNum;根据报文序号SeqNum查找一个链表节点;

(5.2)定义链表Link指针变量node,将链表的头指针head赋值给node;

(5.3)循环进行判断链表里报文重发管理结构FrmMani里有无报文序号SeqNum,如果查找到报文序号SeqNum,则将应答报文是否收到标志IsRecvd置为是,此时循环结束;

(5.4)如果遍历到尾节点还没有匹配,提示错误。

进一步的,所述步骤(6)设置并启动查询无效节点定时器,并进行无效节点查询,具体为:

(6.1)将查询无效节点定时器调用周期设置为PERIOD;

(6.2)通过步骤(2)中初始化的链表头指针判断链表是否为空,如果为空,则直接返回;如果不为空,遍历删除链表中已经满足条件的节点,包括重发计数器SndCnt已经大于等于需要重发的次数SndTimes或者是否收到标志IsRecvd为是的节点;

(6.3)定义节点Link指针LinkPtr,将头指针head赋值给LinkPtr;

(6.4)循环判断LinkPtr是否为空,如果不为空,则判断是否收到标志IsRecvd的值为是或者重发计数器值已经大于等于SndTimes,如果满足,则LinkPtr中next的值赋值给LinkPtr;否则,判断是不是头节点,如果是头节点,则LinkPtr中next的值赋值给头节点,释放原来头节点的空间,将LinkPtr中next的值赋值给LinkPtr。

进一步的,所述步骤(7)在查询无效节点定时器中进行重发操作,具体为:

(7.1)设置时间基数gMulti为全局变量对时间进行计算,每次定时器回调函数被调用时进行加一操作,计算时间基数gMulti对重发频次基数ReSnd取余的值为0的时候,则进入步骤(7.2);

(7.2)定义重发管理的链表Link指针变量node,将链表的头指针head赋值给node,循环进行判断链表里报文重发管理结构FrmMani里是否重发标志IsRecvd的值为否,同时需要重发的次数SndTimes和重发计数器SndCnt值不一致,此时进入步骤(7.3)对报文数据进行重发;

(7.3)将报文重发管理结构FrmMani里的目的地址FrmDst、发送报文的数据指针FrmPtr、发送给报文的数据长度FrmLen传入到报文发送函数,完成重发操作。

进一步的,本发明还提出一种基于链表的报文协议超时重发系统,包括:

链表设置模块:设计报文协议超时重发管理的链表Link;

初始化模块:对链表Link的进行初始化操作,将链表Link初始化为空节点链表,头尾指针指向相同的节点;

节点插入模块:在已初始化的链表Link中插入一个节点,该节点参数为报文重发管理结构变量;

接收确认报文处理模块:要进行报文发送时,使用报文重发管理结构对发送内容进行管理;在报文接收函数中对接收确认报文进行处理;

无效节点查询模块:设置并启动查询无效节点定时器,并进行无效节点查询;

重发操作模块:在查询无效节点定时器中进行重发操作。

本发明与现有技术相比的有益效果是:

本发明基于链表数据结构,通过一种新型报文重发管理结构,将报文重发的过程信息全部记录到链表中,对于超时重发的管理仅需在定时器中不断查询链表中报文重发管理结构中的报文应答状态,对超时未收到应答的报文进行重发,即可高效地完成超时应答管理。

附图说明

图1为一种基于链表的报文协议超时重发方法流程图;

图2是链表结构示意图。

具体实施方式

下面结合附图对本发明的具体实施方式进行进一步的详细描述。

传统的系统间报文超时重发管理方法通常采用线性表中数组标记的方式进行管理,对于不同的报文类型,报文发送后在数组中标记该报文是否需要应答,对于系统中不断增加的需要应答的报文数量,数组的长度需要不断增加,参与标记的变量也不断增多,代码的框架也需要不停进行修改,同时超时管理在程序中通过一个定时器进行计数,管理若干需要应答的报文,这种管理方式非常容易出错,当报文重发时,需要确认需要重发报文的地址、内容、长度等信息,一般为全局共有变量,从报文第一次发送到超时未应答期间数据的值可能被篡改,导致两次发送数据内容并非完全一致,影响系统正常运行。

如图1所示,本发明提出一种基于链表的报文协议超时重发方法,包括如下步骤:

S1:设计报文协议超时重发管理的链表Link。

(1)重发管理的链表Link数据域存储的数据元素为报文重发管理结构FrmMani,指针域为指向下一个节点的地址next.

(2)如图2所示,报文重发管理结构FrmMani包括报文发送的目的地址FrmDst(类型设置为无符号整型),报文序号FrmSeq(类型为无符号整型),发送报文的数据指针FrmPtr(类型为无符号字符型指针),发送报文的数据长度FrmLen。是否收到标志IsRecvd(类型为无符号字符型),重发计数器SndCnt(类型为无符号整型),需要重发的次数SndTimes(类型为无符号短整型,如果设置为0则表示不需要重发)。

S2:以S1所设计的链表为结构对链表进行初始化操作,实现链表成功初始化后只有一个空节点。

(1)定义Link指型变量:包括头节点指针head,普通节点指针node,尾节点指针tail。

(2)使用C标准库中动态内存申请方法malloc()申请Link结构长度的内存pLink(使用sizeof(Link)计算长度),将申请到的内存首地址赋值到头节点指针head。

(3)将头节点指针head的值赋值到尾结点指针tail。

(4)链表的初始状态是空节点,头尾指针都指向相同的位置pLink。

S3:在S2中已初始化的链表中插入一个节点,参数为报文重发管理结构FrmMani类型变量nodeAdd。

(1)定义重发管理的链表Link指针变量node1,node2,使用动态内存申请方法malloc()申请重发管理的链表Link所占长度的内存,将所申请内存空间的首地址赋值到node1。

(2)将函数形参nodeAdd的值赋到node1节点的报文重发管理结构数据成员。

(3)判断头指针head是否为空,如果为空,则将node1的值赋值给head,如果不为空,则将头指针赋值给node2。

(4)循环判断node2中next元素指向的内容是否为空,如果不为空,把node2中next元素所指向的内容赋值到node2,如果为空,则将node1的值赋值给node2中next元素所指的位置,同时将node1中next元素所指的位置设置为空指针NULL。

S4:在发送S1设计的报文协议时,使用重发管理结构FrmMani对发送内容进行管理

(1)定义报文重发管理结构FrmMani变量gMani。

(2)调用报文发送函数后,将报文发送的目的地址FrmDst,报文序号FrmSeq,发送报文的数据指针FrmPtr,发送报文的数据长度FrmLen。分别赋值到报文重发管理结构体FrmMani变量gMani中对应的成员中。

(3)将变量gMani中,重发计数器SndCnt清零,需要重发的次数SndTimes设置为TIMES,是否收到标志IsRecvd设置为否。

S5:在报文接收函数中对接收确认报文ACK进行处理

(1)提取接收确认报文的报文序号SeqNum;根据报文序号SeqNum查找一个链表节点。

(2)定义Link指针变量node,将链表的头指针head赋值给node。

(3)循环进行判断链表里报文重发管理结构FrmMani里有无报文序号SeqNum,如果查找到报文序号SeqNum,则将应答报文是否收到标志IsRecvd置为是,此时循环结束。

(4)如果遍历到尾节点还没有匹配,提示错误。

S6:设置并启动查询无效节点定时器,并进行无效节点查询。

(1)设置查询无效节点定时器调用周期设置为PERIOD。

(2)通过S2中初始化的链表头指针判断链表是否为空,如果为空,则直接返回。如果不为空,遍历删除链表中已经满足条件的节点,包括重发计数器SndCnt已经大于等于需要重发的次数SndTimes或者否收到标志IsRecvd为是的节点。

(3)定义节点Link指针LinkPtr,将head赋值给LinkPtr。

(4)循环判断LinkPtr是否为空,如果不为空,则判断是否收到标志IsRecvd的值为是或者重发计数器值已经大于等于SndTimes了,如果满足这个条件,则LinkPtr中next的值赋值给LinkPtr。否则,判断是不是头节点,如果是头节点,则LinkPtr中next的值赋值给头节点。释放原来头节点的空间。将LinkPtr中next的值赋值给LinkPtr。

S7:在查询无效节点定时器中进行重发操作。

(1)设置时间基数gMulti为全局变量对时间进行计算,每次定时器回调函数被调用时进行加一操作,计算时间基数gMulti对重发频次基数ReSnd(该值为用户根据系统进行调整)取余的值为0的时候,则进入下一步骤;

(2)定义重发管理的链表Link指针变量node,将链表的头指针head赋值给node,循环进行判断链表里报文重发管理结构FrmMani里是否重发标志IsRecvd的值为否同时需要重发的次数SndTimes和重发计数器SndCnt值不一致,此时进入下一步骤对报文数据进行重发。

(3)将报文重发管理结构FrmMani里的目的地址FrmDst,发送报文的数据指针FrmPtr,发送给报文的数据长度FrmLen传入到报文发送函数,完成重发操作。

本发明上述基于链表数据结构,通过一种新型报文重发管理结构,将报文重发的过程信息全部记录到链表中,对于超时重发的管理仅需在定时器中不断查询关联容器中的报文应答状态,对超时未收到应答的报文进行重发,即可高效地完成超时应答管理。

本发明说明书中未作详细描述的内容属于本领域的公知技术。

11页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种数据处理方法及相关设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类