CN106571888A - 一种仿真系统自动同步可靠通信方法 - Google Patents

一种仿真系统自动同步可靠通信方法 Download PDF

Info

Publication number
CN106571888A
CN106571888A CN201610988418.7A CN201610988418A CN106571888A CN 106571888 A CN106571888 A CN 106571888A CN 201610988418 A CN201610988418 A CN 201610988418A CN 106571888 A CN106571888 A CN 106571888A
Authority
CN
China
Prior art keywords
udplink
class
packet
queue
automatic synchronization
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201610988418.7A
Other languages
English (en)
Other versions
CN106571888B (zh
Inventor
张志春
张继夫
肖景新
赵秀影
步健
赵振鹏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Jilin Tianyi Simulation Technology Co., Ltd
Original Assignee
Military Simulation Technical Institute Of Air Force Aviation University Of Chinese People's Liberation Army
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Military Simulation Technical Institute Of Air Force Aviation University Of Chinese People's Liberation Army filed Critical Military Simulation Technical Institute Of Air Force Aviation University Of Chinese People's Liberation Army
Priority to CN201610988418.7A priority Critical patent/CN106571888B/zh
Publication of CN106571888A publication Critical patent/CN106571888A/zh
Application granted granted Critical
Publication of CN106571888B publication Critical patent/CN106571888B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04JMULTIPLEX COMMUNICATION
    • H04J3/00Time-division multiplex systems
    • H04J3/02Details
    • H04J3/06Synchronising arrangements
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L1/00Arrangements for detecting or preventing errors in the information received
    • H04L1/12Arrangements for detecting or preventing errors in the information received by using return channel
    • H04L1/16Arrangements for detecting or preventing errors in the information received by using return channel in which the return channel carries supervisory signals, e.g. repetition request signals
    • H04L1/18Automatic repetition systems, e.g. Van Duuren systems

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)
  • Synchronisation In Digital Transmission Systems (AREA)

Abstract

本发明公开一种仿真系统自动同步可靠通信方法。将网络通信代码封装到一个类中,使仿真系统内的各子系统可以通过该类的对象来方便地实现可靠通信;本发明的积极效果在于这种可靠通信使得数据包只被接收一次,既不会出现重复接收、接收不到、也不会乱序;它具有TCP传输的可靠性,又克服了TCP传输需要在接收端进行数据包识别的缺点;它不需要像TCP传输那样进行通信连接;因为仿真系统内的各子系统是自主运行的,在运行中某个或某些子系统可能会重新启动,因此其上次运行时的通信关系需要恢复。

Description

一种仿真系统自动同步可靠通信方法
技术领域
本发明涉及仿真系统通信技术领域,特别是涉及一种仿真系统自动同步可靠通信方法。
背景技术
在飞行模拟器仿真、电站仿真等大型仿真系统由若干子系统组成,在子系统需要解决网络通信问题。网络通信的信息主要包括两种情况:对于周期性变化且信息状态具有连续特征的信息,可以采用周期性的数据报非可靠传输方式,如飞机位置信息;但对于信息状态具有瞬时性特征的信息,如短暂的射击状态信息,如果采用数据报非可靠传输方式在周期性发送数据包中传输,则如果数据包在传输中丢失,则在下一个传输周期到来时,飞机已由射击状态转为正常状态,射击状态将不可能为其它子系统收到。类似此类的具有瞬时性特征的仿真实体的状态信息,应该与具有连续特征的仿真实体的状态信息分开,采用可靠传输方式进行传输。此外,例如控制台对仿真实体的状态进行配置等仿真管理信息,属于事件型信息,更适合于采用可靠传输方式。
目前在仿真系统中普遍采用的可靠传输方式是采用TCP协议。这种方式使用不够方便,主要表现在以下几个方面:一是TCP传输是面向字节流的,在发送端发送的若干数据包是连接在一起一个流的形式传输,因而在接收端必须由用户识别出的数据包的边界;二是TCP传输是面向连接的,在传输前需要首先建立连接;三是仿真系统内的各子系统是自主运行的,在运行中某个或某些子系统可能会重新启动,此时TCP传输无法恢复上次运行时的通信连接,使通信无法进行。本发明给出了一种解决以上问题的方法。
发明内容
本发明的目的是公开一种仿真系统自动同步可靠通信方法,将网络通信代码封装到一个类中,使仿真系统内的各子系统可以通过该类的对象来方便地实现可靠通信;这种可靠通信使得数据包只被接收一次,既不会出现重复接收、接收不到、也不会乱序;它具有TCP传输的可靠性,又克服了TCP传输需要在接收端进行数据包识别的缺点;它不需要像TCP传输那样进行通信连接;因为仿真系统内的各子系统是自主运行的,在运行中某个或某些子系统可能会重新启动,因此其上次运行时的通信关系需要恢复,本发明采用自动同步方法来满足这种需求。
本发明所述的一种仿真系统自动同步可靠通信方法,其技术解决方案如下:
包括若干台通过以太网连接的计算机(成为主机),每台主机上运行一个或多个进程,其特征在于, 包括一个类UdpLink;相互通信的两个进程通过在各自的进程空间内创建两个互相匹配的所述类UdpLink的对象进行通信;所述匹配由这两个对象的初始化参数来保证;所述两个对象在所述进程间建立起一个逻辑通信信道;相互通信的两个进程使用各自对象的Send操作发送数据、使用第一对象的Recv操作接收数据;所述类UdpLink的对象具有自动同步功能,即当所述相互通信的两个进程或其中之一重新启动后,两个进程之间仍可继续实现通信;一个进程可以通过所述类UdpLink的N(N>1)个对象与一个或多个其它进程建立起N个逻辑通信信道。
本发明所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述类UdpLink实现如下构造函数:
UdpLink(const char *localIp, unsigned short localPort,const char *remoteIp, unsigned short remotePort);
其中,localIp是本地ip地址,十进制点字符串标准格式;localPort是本地端口号,以主机序表示;remoteIp是远程ip地址,十进制点字符串标准格式;remotePort是本地端口号,以主机序表示;与localIp,localPort,remoteIp, remotePort等价的信息被存储;被存储的与localIp和localPort等价的信息表示为(localIp,localPort);被存储的与remoteIp和remotePort等价的信息表示为(remoteIp,remotePort)。
本发明所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述匹配由这两个对象的初始化参数来保证的具体做法是:
1) 第一进程创建的所述类UdpLink的第一对象按如下形式调用所述构造函数完成初始化操作:UdpLink(第一进程所在的主机上配置的第一ip地址,第一端口号,第二进程所在的主机上配置的第二ip地址,第二端口号);
2) 第二进程创建的所述类UdpLink的第二对象按如下形式调用所述构造函数完成初始化操作:UdpLink(第二进程所在的主机上配置的第二ip地址,第二端口号,第一进程所在的主机上配置的第一ip地址,第一端口号)。
本发明所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述类UdpLink的每个对象包括一个发送队列、一个接收队列。
本发明所述的一种基于UDP协议的自动同步可靠通信方法,其特征在于,所述类UdpLink维持一个后台线程,该线程负责驱动一个进程内的所述类UdpLink的每个对象完成如下操作:
1)从(localIp, localPort)向(remoteIp, remotePort)发送位于所述发送队列队首数据包,并在队首数据包被成功接收后从所述发送队列中删除该队首数据包;
2)从(localIp, localPort)接收发给该对象的数据包,并把有效数据包加入接收队列队尾;所述有效数据包是指确保按序接收一次且只接收一次的数据包;
3) 实现所述自动同步功能。
本发明所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述自动同步功能的实现方法如下:
1)所述类UdpLink在硬盘上维持一个自动同步文件,所述自动同步文件存储一个计数值(以下称硬盘同步计数),初值为1;
2)所述类UdpLink维持一个静态数据成员,称为本地自动同步计数,初值为0;
3)所述类UdpLink维持一个数据成员,称为远程自动同步计数,初值为0;
4)当且仅当进程在每次启动后创建所述类UdpLink的首个对象时,所述类UdpLink读取所述自动同步文件中存储的硬盘同步计数到所述本地自动同步计数;然后,所述自动同步文件中的硬盘同步计数加1;
5)所述类UdpLink的每个对象被创建后,发送同步数据包,直到接收到同步应答数据包;取出同步应答数据包中的所述本地自动同步计数,并存于所述远程自动同步计数;
6)所述类UdpLink的每个对象接收到同步数据包后,如果该同步数据包包含的所述本地自动同步计数比所述远程自动同步计数小,执行如下操作,否则忽略该同步数据包:
a)清空所述发送队列和所述接收队列;
b)置所述发送计数和所述接收计数为0;
c)置所述远程自动同步计数为同步数据包包含的所述本地自动同步计数;
d)发同步应答数据包,该同步应答数据包包含该对象的所述本地自动同步计数。
本发明所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述类UdpLink的Send操作负责生成数据包并把数据包添加到所述发送队列队尾;所述类UdpLink的Recv操作负责获取所述接收队列的队首数据包,并删除该队首数据包。
本发明的积极效果在于:将网络通信代码封装到一个类中,使仿真系统内的各子系统可以通过该类的对象来实现可靠通信,使用方便。确保数据包只被接收一次,既不会出现重复接收、接收不到、也不会乱序,特别适合于在仿真系统内部传输条件设置信息、仿真对象瞬时发生的状态变化信息,这种瞬时变化信息不适合采用数据报周期传输方式,它常常造成瞬时变化信丢失;具有TCP传输的可靠性,又克服了TCP传输需要在接收端进行数据包识别的缺点,它不需要像TCP传输那样进行通信连接,使用起来更方便。四、仿真系统内的各子系统是自主运行的,在运行中某个或某些子系统可能会重新启动,因此其上次运行时的通信关系需要恢复,本发明采用自动同步方法以满足这种需求。
附图说明
图1是仿真系统通信结构。
具体实施方式
下面结合本发明的一个较佳实施例来对本发明作进一步说明。
实施例1
根据图1所示,本发明包括若干台通过以太网连接的计算机(成为主机),每台主机上运行一个或多个进程,其特征在于, 包括一个类UdpLink;相互通信的两个进程通过在各自的进程空间内创建两个互相匹配的所述类UdpLink的对象进行通信;所述匹配由这两个对象的初始化参数来保证;所述两个对象在所述进程间建立起一个逻辑通信信道;相互通信的两个进程使用各自对象的Send操作发送数据、使用第一对象的Recv操作接收数据;所述类UdpLink的对象具有自动同步功能,即当所述相互通信的两个进程或其中之一重新启动后,两个进程之间仍可继续实现通信;一个进程可以通过所述类UdpLink的N(N>1)个对象与一个或多个其它进程建立起N个逻辑通信信道。
所述类UdpLink实现如下构造函数:
UdpLink(const char *localIp, unsigned short localPort,const char *remoteIp, unsigned short remotePort);
其中,localIp是本地ip地址,十进制点字符串标准格式;localPort是本地端口号,以主机序表示;remoteIp是远程ip地址,十进制点字符串标准格式;remotePort是本地端口号,以主机序表示;与localIp,localPort,remoteIp, remotePort等价的信息被存储;被存储的与localIp和localPort等价的信息表示为(localIp,localPort);被存储的与remoteIp和remotePort等价的信息表示为(remoteIp,remotePort)。
所述匹配由这两个对象的初始化参数来保证的具体做法是:
1) 第一进程创建的所述类UdpLink的第一对象按如下形式调用所述构造函数完成初始化操作:UdpLink(第一进程所在的主机上配置的第一ip地址,第一端口号,第二进程所在的主机上配置的第二ip地址,第二端口号);
2) 第二进程创建的所述类UdpLink的第二对象按如下形式调用所述构造函数完成初始化操作:UdpLink(第二进程所在的主机上配置的第二ip地址,第二端口号,第一进程所在的主机上配置的第一ip地址,第一端口号)。
所述类UdpLink的每个对象包括一个发送队列、一个接收队列。
所述类UdpLink维持一个后台线程,该线程负责驱动一个进程内的所述类UdpLink的每个对象完成如下操作:
1)从(localIp, localPort)向(remoteIp, remotePort)发送位于所述发送队列队首数据包,并在队首数据包被成功接收后从所述发送队列中删除该队首数据包;
2)从(localIp, localPort)接收发给该对象的数据包,并把有效数据包加入接收队列队尾;所述有效数据包是指确保按序接收一次且只接收一次的数据包;
3) 实现所述自动同步功能。
所述自动同步功能的实现方法如下:
1)所述类UdpLink在硬盘上维持一个自动同步文件,所述自动同步文件存储一个计数值(以下称硬盘同步计数),初值为1;
2)所述类UdpLink维持一个静态数据成员,称为本地自动同步计数,初值为0;
3)所述类UdpLink维持一个数据成员,称为远程自动同步计数,初值为0;
4)当且仅当进程在每次启动后创建所述类UdpLink的首个对象时,所述类UdpLink读取所述自动同步文件中存储的硬盘同步计数到所述本地自动同步计数;然后,所述自动同步文件中的硬盘同步计数加1;
5)所述类UdpLink的每个对象被创建后,发送同步数据包,直到接收到同步应答数据包;取出同步应答数据包中的所述本地自动同步计数,并存于所述远程自动同步计数;
6)所述类UdpLink的每个对象接收到同步数据包后,如果该同步数据包包含的所述本地自动同步计数比所述远程自动同步计数小,执行如下操作,否则忽略该同步数据包:
a)清空所述发送队列和所述接收队列;
b)置所述发送计数和所述接收计数为0;
c)置所述远程自动同步计数为同步数据包包含的所述本地自动同步计数;
d)发同步应答数据包,该同步应答数据包包含该对象的所述本地自动同步计数。
所述类UdpLink的Send操作负责生成数据包并把数据包添加到所述发送队列队尾;所述类UdpLink的Recv操作负责获取所述接收队列的队首数据包,并删除该队首数据包。
实施例2
根据图1所示,本发明包括若干台通过以太网连接的计算机(成为主机),每台主机上运行一个或多个进程,其特征在于, 包括一个类UdpLink;相互通信的两个进程通过在各自的进程空间内创建两个互相匹配的所述类UdpLink的对象进行通信;所述匹配由这两个对象的初始化参数来保证;所述两个对象在所述进程间建立起一个逻辑通信信道;相互通信的两个进程使用各自对象的Send操作发送数据、使用第一对象的Recv操作接收数据;所述类UdpLink的对象具有自动同步功能,即当所述相互通信的两个进程或其中之一重新启动后,两个进程之间仍可继续实现通信;一个进程可以通过所述类UdpLink的N(N>1)个对象与一个或多个其它进程建立起N个逻辑通信信道。
所述类UdpLink实现如下构造函数:
UdpLink(const char *localIp, unsigned short localPort,
const char *remoteIp, unsigned short remotePort);
其中,localIp是本地ip地址,十进制点字符串标准格式;localPort是本地端口号,以主机序表示;remoteIp是远程ip地址,十进制点字符串标准格式;remotePort是本地端口号,以主机序表示;与localIp,localPort,remoteIp, remotePort等价的信息被存储;被存储的与localIp和localPort等价的信息表示为(localIp,localPort);被存储的与remoteIp和remotePort等价的信息表示为(remoteIp,remotePort)。
所述匹配由这两个对象的初始化参数来保证的具体做法是,
a) 第一进程创建的所述类UdpLink的第一对象按如下形式调用所述构造函数完成初始化操作:
UdpLink(第一进程所在的主机上配置的第一ip地址,第一端口号,第二进程所在的主机上配置的第二ip地址,第二端口号);
b) 第二进程创建的所述类UdpLink的第二对象按如下形式调用所述构造函数完成初始化操作:
UdpLink(第二进程所在的主机上配置的第二ip地址,第二端口号,第一进程所在的主机上配置的第一ip地址,第一端口号)。
如图1所示,仿真系统内的有三个子系统进程:进程A、进程B、进程C,它们分别运行于主机A、主机B、主机C,主机A、主机B、主机C的ip地址分别为128.1.1.1、128.1.1.2、128.1.1.3。则进程A、进程B、进程C通过创建如下所述类UdpLink的对象来建立三个逻辑通信信道:
a)进程A创建所述类UdpLink的对象LinkAB、LinkAC1、LinkAC2:UdpLink LinkAB("128.1.1.1",1024, "128.1.1.2",1024);
UdpLink LinkAC1("128.1.1.1",1025, "128.1.1.3",1024);
UdpLink LinkAC2("128.1.1.1",1026, "128.1.1.3",1025);
b)进程B创建所述类UdpLink的对象LinkBA:
UdpLink LinkBA("128.1.1.2",1024, "128.1.1.1",1024);
c)进程C创建所述类UdpLink的对象LinkCA1、LinkCA2:
UdpLink LinkCA1("128.1.1.3",1024",128.1.1.1",1025);
UdpLink LinkCA2("128.1.1.3",1025,"128.1.1.1",1026);
这三个逻辑通信信道是:
a)进程A到进程B:AB;
b)进程A到进程C的第一个信道:AC1;
c)进程A到进程C的第二个信道:AC2;
所述类UdpLink的每个对象包括一个发送队列、一个接收队列。发送队列、和接收队列用于存储数据包。
在本实施例中, 发送队列的元素是struct SendHead类型数据包的指针;接收队列的元素是struct RecvPacket类型数据包的指针。这两个类型数据包及本实施例采用的其它数据包类型定义如下:
a)发送数据包头
struct SendHead
{
unsigned short size;//数据包总字节数,含本域
char type;//数据包类型
};
b) 发送数据包
struct SendPacket
unsigned short size;//数据包总字节数,含本域
char type;//数据包类型,必须为1
unsigned long recvSynCount;//接收方同步计数
unsigned long recvCount;//期望接收序号
unsigned long sendSynCount;//发送方同步计数
unsigned long sendCount;//发送序号
char data[];//用户数据
};
b)接收数据包
struct RecvPacket
unsigned short size;//数据包总字节数,含本域
char data[];//用户数据
};
c)应答数据包
struct AckPacket
unsigned short size;//数据包总字节数,含本域
char type;//数据包类型,必须为2
unsigned long recvSynCount;//接收方同步计数
unsigned long recvCount;//期望接收序号
};
c)同步数据包
struct SynPacket
unsigned short size;//数据包总字节数,含本域
char type;//数据包类型,必须为2
unsigned long synCount;//同步计数
};
d)同步应答数据包
struct AckSynPacket
unsigned short size;//数据包总字节数,含本域
char type;//数据包类型,必须为3
unsigned long synCount;//同步计数
unsigned long ackSynCount;//应答同步计数
};
所述类UdpLink定义有如下数据成员:
a)本地套接字
SOCKET m_sock;
b)远程ip地址,以二进制网络序表示;
unsigned long m_remoteIp;
c)远程端口号,以网络序表示;
unsigned short m_remotePort;
d)发送计数
unsigned long m_sendCount;
e)发送队列
std::vector<struct SendHead*> m_sendPackets;
f)接收计数
unsigned long m_recvCount;
g)接收队列
std::vector<struct RecvPacket*> m_recvPackets;
h)远程自动同步计数
unsigned long m_recvSynCount; //初值为(0)
所述类UdpLink还定义有如下静态数据成员:
a)本地自动同步计数
unsigned long ms_sendSynCount; //初值为(0)
b)类UdpLink对象的指针的集合
std::vector<UdpLink*> ms_allLinks;
所述类UdpLink还定义有一个静态线程函数:
void Update();
所述类UdpLink在硬盘上维持一个自动同步文件,所述自动同步文件存储一个计数值(以下称硬盘同步计数),初值为1;
所述类UdpLink的构造函数:
UdpLink(const char *localIp, unsigned short localPort,
const char *remoteIp, unsigned short remotePort);
具体执行如下初始化操作:
步骤1,创建UDP本地套接字m_sock;
步骤2,将m_sock本地套接字bind到本地ip地址localIp和本地端口号localPort;
步骤3,将远程ip地址remoteIp转换为二进制网络序表示并存储于m_remoteIp,将远程端口号remotePort转换为网络序表示并存储于m_remotePort;
步骤4,m_sendCount置0;m_sendPackets置空;m_recvCount置0;m_recvPackets置空;m_recvSynCount置0;
步骤5,若ms_allLinks为空,则执行:
步骤5.1,从自动同步文件中读取硬盘同步计数到ms_sendSynCount;硬盘同步计数加1,若硬盘同步计数加1后回0则置硬盘同步计数为1;硬盘同步计数写回自动同步文件,关闭自动同步文件;
步骤5.2,创建以Update函数为线程执行函数的线程;
步骤6,生成自动同步数据包:
p=new struct SynPacket;
p->size=sizeof(struct SynPacket);
p->type =2;
p-> synCount= ms_sendSynCount;
将p添加到m_sendPackets队尾;
步骤7,将本对象的指针(this)加入ms_allLinks;
步骤8,操作结束;
所述类UdpLink维持一个后台线程,该线程在上述步骤5.2中创建。该线程以Update函数为线程执行函数, Update函数负责驱动一个进程内的所述类UdpLink的每个对象完成如下操作:
a)从(localIp, localPort)向(remoteIp, remotePort)发送位于所述发送队列队首数据包,并在队首数据包被成功接收后从所述发送队列中删除该队首数据包;
b)从(localIp, localPort)接收发给该对象的数据包,并把有效数据包加入接收队列队尾;所述有效数据包是指确保按序接收一次且只接收一次的数据包;
c) 实现所述自动同步功能,方法如下:
c.1)所述类UdpLink的每个对象被创建后,发送同步数据包,直到接收到同步应答数据包;取出同步应答数据包中的所述本地自动同步计数,并存于所述远程自动同步计数;
c.2)所述类UdpLink的每个对象接收到同步数据包后,如果该同步数据包包含的所述本地自动同步计数比所述远程自动同步计数小,执行如下操作,否则忽略该同步数据包:
c.2.1)清空所述发送队列和所述接收队列;
c.2.2)置所述发送计数和所述接收计数为0;
c.2.3)置所述远程自动同步计数为同步数据包包含的所述本地自动同步计数;
c.2.4)发同步应答数据包,该同步应答数据包包含该对象的所述本地自动同步计数。。
基于以上分析,可以得到Update函数的详细算法如下:
步骤1,定义数据包接收区buf,buf表示其首地址,为指向struct SendHead
类型的指针;
步骤2,取ms_allLinks中的下一个link(若到达集合中最后一个元素则返回到第一个元素),执行:
步骤2.1,从link->m_sock接收数据并存储到buf;
步骤2.2, 若数据包的发送者不是 (link-> m_remoteIp, link-> m_remotePort),转步骤2;
步骤2.3,若buf-> type为1,则数据包为发送数据包,转换buf到struct SendPacket类型;
步骤2.3.1,若buf-> sendSynCount!= m_recvSynCount,转步骤2;
步骤2.3.2,若m_sendPackets为空,转步骤2.3.7;
步骤2.3.3,取m_sendPackets的首元素hd;
步骤2.3.4,若hd->type为2,则hd为同步数据包, 转步骤2.3.7;
步骤2.3.5,转换hd为struct SendPacket 类型;
步骤2.3.6,若buf->recvSynCount==hd-> sendSynCount,且
buf->recvCount==hd-> sendCount,则
从m_sendPackets移除hd,并释放hd占用的内存;
步骤2.3.7,发送应答数据包ack:
若m_sendPackets为非空,且m_sendPackets的首元素hd的type为1,则执行:
hd-> recvSynCount= ms_sendSynCount;
hd->recvCount=m_recvCount;
否则执行:
ack. size=sizeof(struct AckPacket);
ack. size=2;
ack. recvSynCount=ms_sendSynCount;
ack.recvCount=m_recvCount;
从m_sock向(m_remoteIp, m_remotePort)发送ack;
步骤2.3.8,若buf-> m_sendSynCount!= m_recvSynCount,或
buf-> m_sendCount!= m_recvCount,转步骤2;
步骤2.3.9,申请内存:p= (struct RecvPacket*)new char[sizeof(structRecvPacket)+ buf->size- sizeof(struct SendPacket)];
步骤2.3.10,p->size= sizeof(struct RecvPacket)+ buf->size- sizeof(structSendPacket);
步骤2.3.11,从buf->data拷贝buf->size- sizeof(struct SendPacket)个字节到p->data;
步骤2.3.12,转步骤2;
步骤2.4,若buf-> type为2,则数据包为同步数据包,执行如下同步操作:
步骤2.4.1,清空m_sendPackets和m_recvPackets;
步骤2.4.2,置m_sendCount和m_recvCount为0;
步骤2.4.3,置m_recvSynCount为buf-> synCount;
步骤2.4.4,发同步应答数据包ackSyn SynPacket:
ackSyn SynPacket. size=sizeof(struct AckSynPacket);
ackSyn SynPacket. size=3;
ackSyn SynPacket. ackSynCount =ms_sendSynCount;
ackSyn SynPacket. synCount =buf-> synCount;
从m_sock向(m_remoteIp, m_remotePort)发送ackSyn SynPacket;
步骤2.5,转步骤2。
所述类UdpLink还实现如下发送函数Send:
int Send(void *buf,int size);
其中,buf为发送的用户数据,size(大于0)为用户数据的字节数;返回值大于0,表示成功发送的字节数;返回值小于0,表示发送失败;
所述发送函数Send执行如下操作:
步骤1,申请数据包内存:
p=new char[sizeof(struct SendPacket)+size];
若p=NULL,返回(-1),操作结束;
步骤2,置数据包头:
p->size=sizeof(struct SendPacket)+size;
p->type=1;
p->recvSynCount=0;
p-> recvCount=0;
p-> sendSynCount = ms_sendSynCount;
p-> sendCount = m_ sendCount;
m_ sendCount++;
步骤3,拷贝数据: 从buf中拷贝size个字节的数据到p->data;
步骤4,将p添加到m_sendPackets队尾, 返回size值,操作结束;
所述类UdpLink还实现如下接收函数Recv:
int Recv(void *buf,int size);
其中,buf为接收数据缓冲区,size(大于0)为接收数据缓冲区的字节数;返回值大于0,表示成功接收的字节数;返回值等于0,表示收到同步数据包;返回值小于0, 表示无数据到达,接收失败;
所述发送函数Recv执行如下操作:
步骤1,m_recvPackets为空,返回(-1),操作结束;
步骤2,移除m_recvPackets的队首数据包到struct RecvPacket类型指针p;
步骤3,拷贝数据:将总共p->size字节的数据拷贝到buf;
步骤4,释放p指向的内存, 返回size值, 操作结束。

Claims (7)

1.一种仿真系统自动同步可靠通信方法,包括若干台通过以太网连接的计算机(成为主机),每台主机上运行一个或多个进程,其特征在于, 包括一个类UdpLink;相互通信的两个进程通过在各自的进程空间内创建两个互相匹配的所述类UdpLink的对象进行通信;所述匹配由这两个对象的初始化参数来保证;所述两个对象在所述进程间建立起一个逻辑通信信道;相互通信的两个进程使用各自对象的Send操作发送数据、使用第一对象的Recv操作接收数据;所述类UdpLink的对象具有自动同步功能,即当所述相互通信的两个进程或其中之一重新启动后,两个进程之间仍可继续实现通信;一个进程可以通过所述类UdpLink的N(N>1)个对象与一个或多个其它进程建立起N个逻辑通信信道。
2.根据权利要求1所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述类UdpLink实现如下构造函数:
UdpLink(const char *localIp, unsigned short localPort,const char *remoteIp, unsigned short remotePort);
其中,localIp是本地ip地址,十进制点字符串标准格式;localPort是本地端口号,以主机序表示;remoteIp是远程ip地址,十进制点字符串标准格式;remotePort是本地端口号,以主机序表示;与localIp,localPort,remoteIp, remotePort等价的信息被存储;被存储的与localIp和localPort等价的信息表示为(localIp,localPort);被存储的与remoteIp和remotePort等价的信息表示为(remoteIp,remotePort)。
3.根据权利要求2所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述匹配由这两个对象的初始化参数来保证的具体做法是:
1) 第一进程创建的所述类UdpLink的第一对象按如下形式调用所述构造函数完成初始化操作:UdpLink(第一进程所在的主机上配置的第一ip地址,第一端口号,第二进程所在的主机上配置的第二ip地址,第二端口号);
2) 第二进程创建的所述类UdpLink的第二对象按如下形式调用所述构造函数完成初始化操作:UdpLink(第二进程所在的主机上配置的第二ip地址,第二端口号,第一进程所在的主机上配置的第一ip地址,第一端口号)。
4.根据权利要求3所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述类UdpLink的每个对象包括一个发送队列、一个接收队列。
5.根据权利要求4所述的一种基于UDP协议的自动同步可靠通信方法,其特征在于,所述类UdpLink维持一个后台线程,该线程负责驱动一个进程内的所述类UdpLink的每个对象完成如下操作:
1)从(localIp, localPort)向(remoteIp, remotePort)发送位于所述发送队列队首数据包,并在队首数据包被成功接收后从所述发送队列中删除该队首数据包;
2)从(localIp, localPort)接收发给该对象的数据包,并把有效数据包加入接收队列队尾;所述有效数据包是指确保按序接收一次且只接收一次的数据包;
3) 实现所述自动同步功能。
6.根据权利要求5所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述自动同步功能的实现方法如下:
1)所述类UdpLink在硬盘上维持一个自动同步文件,所述自动同步文件存储一个计数值(以下称硬盘同步计数),初值为1;
2)所述类UdpLink维持一个静态数据成员,称为本地自动同步计数,初值为0;
3)所述类UdpLink维持一个数据成员,称为远程自动同步计数,初值为0;
4)当且仅当进程在每次启动后创建所述类UdpLink的首个对象时,所述类UdpLink读取所述自动同步文件中存储的硬盘同步计数到所述本地自动同步计数;然后,所述自动同步文件中的硬盘同步计数加1;
5)所述类UdpLink的每个对象被创建后,发送同步数据包,直到接收到同步应答数据包;取出同步应答数据包中的所述本地自动同步计数,并存于所述远程自动同步计数;
6)所述类UdpLink的每个对象接收到同步数据包后,如果该同步数据包包含的所述本地自动同步计数比所述远程自动同步计数小,执行如下操作,否则忽略该同步数据包:
a)清空所述发送队列和所述接收队列;
b)置所述发送计数和所述接收计数为0;
c)置所述远程自动同步计数为同步数据包包含的所述本地自动同步计数;
d)发同步应答数据包,该同步应答数据包包含该对象的所述本地自动同步计数。
7.根据权利要求6所述的一种仿真系统自动同步可靠通信方法,其特征在于,所述类UdpLink的Send操作负责生成数据包并把数据包添加到所述发送队列队尾;所述类UdpLink的Recv操作负责获取所述接收队列的队首数据包,并删除该队首数据包。
CN201610988418.7A 2016-11-10 2016-11-10 一种仿真系统自动同步可靠通信方法 Active CN106571888B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610988418.7A CN106571888B (zh) 2016-11-10 2016-11-10 一种仿真系统自动同步可靠通信方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610988418.7A CN106571888B (zh) 2016-11-10 2016-11-10 一种仿真系统自动同步可靠通信方法

Publications (2)

Publication Number Publication Date
CN106571888A true CN106571888A (zh) 2017-04-19
CN106571888B CN106571888B (zh) 2018-08-14

Family

ID=58541000

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610988418.7A Active CN106571888B (zh) 2016-11-10 2016-11-10 一种仿真系统自动同步可靠通信方法

Country Status (1)

Country Link
CN (1) CN106571888B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110083945A (zh) * 2019-04-29 2019-08-02 中国人民解放军空军航空大学飞行研究所 一种分布式多节点仿真管理方法
CN112967290A (zh) * 2021-02-22 2021-06-15 中国人民解放军空军航空大学 一种可用于无人机对空中目标飞机敌友自动识别的方法
CN113300871A (zh) * 2020-09-14 2021-08-24 阿里巴巴集团控股有限公司 一种仿真网络的组网方法和装置

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2010045394A1 (en) * 2008-10-14 2010-04-22 Oblong Industries, Inc. Multi-process interactive systems and methods
CN102209074A (zh) * 2011-05-30 2011-10-05 中国电力科学研究院 一种电力系统全数字动态仿真系统
CN102760114A (zh) * 2011-04-29 2012-10-31 无锡江南计算技术研究所 多处理器系统的通信仿真方法、引擎及系统
CN103279892A (zh) * 2011-12-21 2013-09-04 大同电力高级技工学校 仿真运行管理服务器及其仿真对象发现方法
WO2014063517A1 (zh) * 2012-10-24 2014-05-01 中兴通讯股份有限公司 一种终端及其同步控制方法
CN103856483A (zh) * 2013-12-31 2014-06-11 中国人民解放军空军航空大学军事仿真技术研究所 一种飞行模拟器通讯方法
CN104954179A (zh) * 2015-06-03 2015-09-30 中国人民解放军空军航空大学军事仿真技术研究所 一种多模拟器联网仿真节点信息交互关系优化系统

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2010045394A1 (en) * 2008-10-14 2010-04-22 Oblong Industries, Inc. Multi-process interactive systems and methods
CN102760114A (zh) * 2011-04-29 2012-10-31 无锡江南计算技术研究所 多处理器系统的通信仿真方法、引擎及系统
CN102209074A (zh) * 2011-05-30 2011-10-05 中国电力科学研究院 一种电力系统全数字动态仿真系统
CN103279892A (zh) * 2011-12-21 2013-09-04 大同电力高级技工学校 仿真运行管理服务器及其仿真对象发现方法
WO2014063517A1 (zh) * 2012-10-24 2014-05-01 中兴通讯股份有限公司 一种终端及其同步控制方法
CN103781171A (zh) * 2012-10-24 2014-05-07 中兴通讯股份有限公司 一种终端及其同步控制方法
CN103856483A (zh) * 2013-12-31 2014-06-11 中国人民解放军空军航空大学军事仿真技术研究所 一种飞行模拟器通讯方法
CN104954179A (zh) * 2015-06-03 2015-09-30 中国人民解放军空军航空大学军事仿真技术研究所 一种多模拟器联网仿真节点信息交互关系优化系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
张继夫等: "基于面向对象技术的飞行仿真研究", 《计算机技术与发展》 *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110083945A (zh) * 2019-04-29 2019-08-02 中国人民解放军空军航空大学飞行研究所 一种分布式多节点仿真管理方法
CN110083945B (zh) * 2019-04-29 2023-03-24 中国人民解放军空军航空大学飞行研究所 一种分布式多节点仿真管理方法
CN113300871A (zh) * 2020-09-14 2021-08-24 阿里巴巴集团控股有限公司 一种仿真网络的组网方法和装置
CN112967290A (zh) * 2021-02-22 2021-06-15 中国人民解放军空军航空大学 一种可用于无人机对空中目标飞机敌友自动识别的方法

Also Published As

Publication number Publication date
CN106571888B (zh) 2018-08-14

Similar Documents

Publication Publication Date Title
US9628382B2 (en) Reliable transport of ethernet packet data with wire-speed and packet data rate match
JP5859669B2 (ja) 通信ネットワークにおける配送ルート変化に基づくパケットオーダリング
CN103986647A (zh) 报文传输方法及设备
CN101848171B (zh) 一种基于gre隧道的数据传输方法、设备和系统
CN106571888A (zh) 一种仿真系统自动同步可靠通信方法
CN103259632B (zh) 基于续采单传模型的无线传感网络数据可靠汇聚方法
CN110069441A (zh) 一种用于流计算的fpga网络及流计算系统与方法
CN104025550B (zh) 从数据项获得信息的方法及装置
US9584425B2 (en) Bandwidth optimization using coalesced DUP ACKs
CN102006173B (zh) 一种以太网接口扩展方法及装置
CN101778093A (zh) 基于udp协议的数据传输方法
CN104270344A (zh) 万兆网闸
CN101494585A (zh) 一种实现通用路由封装隧道可靠传输的方法及设备
CN110120854A (zh) 传输数据的方法和装置
CN101018205A (zh) 一种流量控制方法及通信设备
CN108063809B (zh) 机器设备数据采集方法以及采集系统
CN101212480A (zh) 在usb主机和usb装置之间通信的方法和设备
CN104660506B (zh) 一种数据包转发的方法、装置及系统
CN106302426A (zh) 一种基于fpga的带重发机制的udp协议栈实现方法
Dai et al. Design of remote upgrade of equipment monitoring system software
CN109586931A (zh) 组播方法及终端设备
CN103107875B (zh) 基于网络编码的广播重传系统及其方法
WO2009003398A1 (fr) Procédé et dispositif de simulation de canal de communication numérique série asynchrone
CN103368772B (zh) 半卸载方法、设备及系统
CN103200086B (zh) 一种ForCES系统中路由协议的信息交互方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB03 Change of inventor or designer information
CB03 Change of inventor or designer information

Inventor after: Deng Hua

Inventor after: Zhang Jifu

Inventor after: Xiao Jingxin

Inventor after: Zhao Xiuying

Inventor before: Zhang Zhichun

Inventor before: Zhang Jifu

Inventor before: Xiao Jingxin

Inventor before: Zhao Xiuying

Inventor before: Bu Jian

Inventor before: Zhao Zhenpeng

GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20181017

Address after: 102200 2 North Road, South Road, Changping District, Beijing

Patentee after: Zhang Zhiqiu

Address before: 130022 nanhu road 2222, Changchun, Jilin

Patentee before: Military Simulation technical institute of Air force Aviation University of the Chinese People's Liberation Army

TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20200814

Address after: No.777 Xiali Road, Changchun automobile economic and Technological Development Zone, Jilin Province

Patentee after: Jilin Tianyi Simulation Technology Co., Ltd

Address before: 102200 2 North Road, South Road, Changping District, Beijing

Patentee before: Zhang Zhiqiu