0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于VC6.0平台实现组播技术的方法及在飞行仿真系统中的应用研究

电子设计 来源:电子工程网 作者:高玉宝 2021-05-16 10:13 次阅读

引言

飞行仿真系统是现代航空科研、教学、试验等不可缺少的技术设备。在飞行性能研究、飞行品质评估和飞行训练等方面都具有很高的经济价值和军事价值。正常情况下,飞行仿真系统采用分布式计算技术,整个系统由多台计算机组成,各计算机之间的数据传输需要采用数据通信技术来完成。数据通信技术需要采用网络协议,目前互联网采用的协议是IPv4协议。

IPv4是互联网协议(Internet Protocol,IP)的第四版,它定义的IP数据通信方式有单播、全网广播和组播。单播是指两个IP地址间进行的数据通信;全网广播是指在IP子网内向所有网内IP地址以广播的方式发送数据包,所有子网内的IP站都能收到全网广播;组播是当某一个人向一组人发送数据时,他不必将数据向每一个人发送,只须将数据发送到一个特定的预约组地址,所有加入该组的人均可以收到这份数据。

为了让网络中的多个主机可以同时接受到相同的数据包,如果采用单播的方式,那么源主机必须分别发送相同的数据包。对于一台主机来说,同时不停的发送相同的数据包来说也是一个很大的负担。如果采用采用广播方式,则数据包传送到局域网内每个主机上,不管这个主机是否对数据包感兴趣,这样做就会造成了带宽的浪费和主机的资源浪费。如果采用组播的方式,源主机可以只需要发送一个数据包就可以到达每个需要接受的主机上,这中间还要取决于路由器对组员和组关系的维护和选择。组播有一套对组员和组之间关系维护的机制,可以明确的知道在某个子网中,是否有主机对这类组播数据包感兴趣,如果没有就不会把数据包进行转发,并会通知上游路由器不要再转发这类数据包到下游路由器上。InternetNIC关于IP地址的规定中,IP地址共分为A-E共5类, D类地址即为组播地址,范围为224.0.0.0-239.255.255.255。D类地址是动态分配和恢复的瞬态地址。每一个组播组对应于动态分配的一个D类地址;当组播组结束组播时,相对应的D类地址将被回收,用于以后的组播。

根据以上所述,运用组播技术,对发送者而言,数据只需发送一次就可以发送到所有接收者,所以,组播技术对于接收者来说,都是同时接收到相同的数据,这使得对计算机接收数据的同步性得到很好的控制,缩短了发送的时间周期,从而大大减轻了发送者的负担和网络的负载,节省了大量资源。

1 飞行仿真系统的组成及通信机制

一个典型的飞行仿真系统包括:飞行系统、火控系统、音响系统、运动系统、教员台系统、导航系统、仪表系统、操纵系统、多台视景计算机等,如图1所示。其中飞行系统控制整个飞行仿真系统,是整个系统的核心;仪表系统是显示飞机坐舱内各个仪表盘,通过仪表盘来显示飞机飞行的状态;操纵系统是控制飞机飞行的姿态;多台视景计算机显示的是飞机在同一位置时的不同角度。

图1 飞行仿真系统的通信结构(实线表示网络)

根据图1所示,可以看出整个系统的数据传输过程。如果用单播通信方式,那么飞行系统计算机会重复发送相同的数据给多台视景计算机,增加了发送的时间周期,这样就会导致飞行系统计算机的工作任务的重复和网络资源的浪费,并且单播在发送数据时有先有后,因此五台视景显示计算机不是同时收到飞行系统计算机的数据,这样就会导致多台视景计算机帧与帧之间不同步,这不符合实时显示的要求。如果采用广播通信方式,则操纵系统计算机也会收到控制计算机的数据,而事实上是操纵系统计算机用不到飞行系统计算机的信息,这样会导致网络资源的浪费。如果采用组播的通信方式,飞行仿真系统中所有的计算机同在一个组播组中,这样飞行系统计算机发送一次数据,则有关计算机都会同时接收到相同的数据,多台视景计算机可以实时的显示飞机飞行的姿态,不会存在帧与帧之间不同步的问题。所以综合以上分析,我们在实验系统中采用组播技术来实现网络通信

2 组播技术的实现

本节是介绍在VC6.0平台上如何用winsock实现组播通信编程的方法。

2.1 用winsock实现组播的方法

本系统采用VC6.0为开发工具。对于网络编程而言,需要用到多线程技术。在VC6.0开发环境中,开启一个线程用到AfxBeginThread()函数,AfxBeginThread(RecvThread, &m_mysock);其中RecvThread()函数是线程函数,主要是用来接收和发送数据的;m_mysock是自己封装的一个类CMySocket的对象,这个类封装所有有关组播通信的信息,如:线程函数中接收的数据存入该类的变量中。

对于Socket编程,首先要对sockaddr_in结构体进行初始化,就是把组播地址和端口号分别赋值给sockaddr_in中的s_addr和sin_port,具体实现如下代码:

Local.sin_addr.s_addr =inet_addr(“234.0.0.0”);

Local.sin_family = AF_INET;

Local.sin_port= htons( 2007 );

其中Local是sockaddr_in结构变量,组播地址为:234.0.0.0,端口号:2007。

然后是对套接字的初始化了,定义SOCKET的变量为sock,

sock = socket (AF_INET,SOCK_DGRAM,0);其中SOCK_DGRAM表示为采用UDP协议(SOCK_STREAM表示为TCP协议)。

初始化之后用bind()函数将套接字与IP地址和端口号绑定起来,bind (sock,(sockaddr*)&( Local),sizeof(Local));

其中sock与Local定义同上。

组播技术用setsockopt()函数的套接字功能选项来进行设置, setsockopt()函数有关组播技术的选项见下表:

表1 setsockopt()组播选项说明

发送数据用到sendto()函数,用这个函数向组播地址发送数据,sendto(sock,buffer,sizeof(buffer),0,(sockaddr*)&Local,sizeof(Local));

其中buffer所存放的就是所要发送的数据。这里介绍一下buffer中存放数据的形式,buffer是一个字符数组,它的前四位放的是本机的计算机名字;5到8位存放的是命令,这个命令是指要让接收方做什么事情;从9位以后全部都是数据,这些数据就是让接收方利用这些数据完成各自的任务。这个主要是因为发送方发送数据到组播地址后,所有的接收方都会到网组播地址上取数据,对于每个接收方,有可能接收的数据对于自己是无用的,所以在发送数据时,数据头加上前面所讲的1到8位的识别信息,接收方可以根据这些信息来获取对自己有用的数据。接收数据用到recvfrom()函数,这个函数是接收网络上的数据的,recvfrom(sock,recvBuff,1024,0,(sockaddr*)&clientsock,&sizeof(clientsock));recvBuff是字符数组,把接收过来的数据存放到这个数组中。然后,我们要对这个数据进行解析,也就是前面所讲的发送时所加的数据包头的信息。接收到数据以后,先对数据包的前四位进行判别,判别是从哪个计算机上发送来的信息。再对5到8位进行判别,判别是什么信息,也就是什么命令。根据数据包前8位的信息,如果是本机将要用到的数据,则对数据包前8位以后的数据进行提取;否则,对接收来的数据舍弃不用。

2.2 数据传输的有效性

在前面讲过组播的主要缺点是没有纠错机制,发生丢包错包后难以弥补。也就是说在数据传输过程中无法保证接收的数据与发送的数据一致,这样可导致实时仿真不同步,以至多台视景计算机不能实时观察飞机飞行的不同的角度,为了解决这个问题,采取两种方案予以弥补。

2.2.1采用时间等待

时间等方法是运用select()函数。select()函数用法是如果程序要检查套接字上在设定的时间范围内(timeout =5ms)是否有数据到来,则首先需要把套接字句柄加入可读性监视集合中,然后调用select()函数。如果没有数据到来,则再等下一个5ms,一直等到网络上有数据为止。select()函数具体实现如下代码:

if(select(NULL,NULL,&fds,NULL,&timeout)==-1)

exit(-1);

else if(select(NULL,NULL,&fds,NULL,&timeout)==0)

continue;

else if(FD_ISSET(sock,& fds))

但是这个方法也有一定的弊端,就是如果所有的视景计算机中某几台视景计算机在接收数据的过程中等待的时间长,那么所有的视景机一定不会同时获得相同数据,这样就会导致多台视景计算机视景不同步。

2.2.2 发送副本方法

在发送端发送数据时,同时要发送这个数据的一个或多个副本,在接收端接收数据时,如果发现接收的数据不正确,则到其它副本取数据,这样会弥补接收数据的不可靠性。

3 结束语

由于组播技术采用的是UDP协议,UDP协议的主要特点是数据传输速度快,所以在飞行仿真系统中数据传输速度问题可以得到解决。在飞行仿真系统中,视景显示是该系统中的重点。如果多台视景机不同步显示,则会造成观察者无法对飞机飞行进行有效的控制,继而对整个系统无法控制。组播技术是只发送一次数据,同在一个组播地址内的计算机都会接收到这些数据,根据图1中所示,飞行系统计算机向视景计算机发送数据之后,视景计算机会同时接收到相同的数据,这样,视景计算机就会根据接收到的数据来做飞机飞行相应的动作。所以,利用组播技术,可以使视景计算机显示同步的问题得到解决。在飞行仿真系统中通过利用select()函数和发送副本的方式,可以使弥补数据在传输过程中的可靠性。利用以上的方法,在飞行仿真系统中,数据传输的速度、视景计算机的同步性和数据传输的可靠性都得到了很好的验证。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 互联网
    +关注

    关注

    54

    文章

    10906

    浏览量

    100745
  • 计算机
    +关注

    关注

    19

    文章

    6651

    浏览量

    84534
  • 仿真系统
    +关注

    关注

    1

    文章

    94

    浏览量

    20516
收藏 人收藏

    评论

    相关推荐

    容错技术电视系统应用的探讨

    容错技术电视系统应用的探讨
    发表于 10-06 09:33

    匿名联合体结构体VC6.0环境不支持?

    定义匿名联合体和结构体VC6.0环境怎么总出错?union{unsigned char P1;struct{ unsigned char P10 :1; unsigned char P11 :1
    发表于 11-22 15:16

    labview与vc6.0连接

    我想实现labview与VC6.0的混合编程实现龙格库塔算法,拜求大神帮忙
    发表于 10-17 10:49

    分享:uc/OSII VC6.0 环境

    这是卢有亮老师《嵌入式实时操作系统uc/osII原理与实践》的配套程序,测试可用,大家可以用来vc6.0熟悉uc/osII系统的原理来,{:12:}
    发表于 12-13 19:21

    VC6.0 win7可以用的

    新人报道,求win7能用的VC6.0,多谢多谢
    发表于 07-23 16:40

    VC6.0调用MATLAB2015a

    请问VC6.0版本能够调用MATLAB2015a吗,VC的版本会不会太低了,有高版本的VC吗?如果可以调用的话有哪几种方法呢?我是新手,希望大神们可以不吝赐教
    发表于 08-18 11:07

    请问UCOSVC6.0下如何调用PC函数?

    我把任哲源码的PC函数加到我的VC6.0下用不了,谁有VC6.0下的PC函数没?
    发表于 04-23 23:33

    UC/GUI仿真过程怎么实现

    看手册UC/GUI 的仿真还需要用到VC6.0,我没有用过VC6.0,今天看使用教程也只会创建简单的工程,写了个简单的程序能实现。现在要用VC
    发表于 05-09 03:24

    VC6.0无法打开文件该怎么办?

    安装的VC6.0无法打开文件 或添加文件到工程 下载补丁filetool.dll 按照流程做下来 可以了 可是每次重新打开又会变回原来的样子 还要重新弄一遍 另外一个很恼人的问题是 工程下右击
    发表于 08-27 03:46

    c语言编程软件vc6.0中文绿色版_vc6.0官方下载

    c语言编程软件vc6.0中文绿色版是一款免安装中文软件,点击直接使用,无需安装。 vc6.0简介: 1、vc6.0是windows环境下最主要的应用开发系统之一。 2、是C++语言的集
    发表于 10-15 09:05 0次下载
    c语言编程软件<b class='flag-5'>vc6.0</b>中文绿色版_<b class='flag-5'>vc6.0</b>官方下载

    c语言编程软件vc6.0使用教程_vc6.0怎么用

    c语言编程软件vc6.0使用教程,附件包含二个教程文件,VC++6.0培训教程完整版及VC6.0介绍。 Visual C++ 6.0,简称VC
    发表于 10-15 09:23 483次下载
    c语言编程软件<b class='flag-5'>vc6.0</b>使用教程_<b class='flag-5'>vc6.0</b>怎么用

    vc6.0精简版安装程序

    电子发烧友网站提供《vc6.0精简版安装程序.exe》资料免费下载
    发表于 11-16 15:41 0次下载

    VC6.0代码补全插件

    VC6.0代码补全插件,挺好用的,自动补全的小工具
    发表于 12-08 18:14 9次下载

    vc6.0 简单教程

    vc6.0 简单教程
    发表于 03-04 17:48 8次下载

    使用VC6.0实现微机与多个51单片机通信的详细资料说明

    本文介绍了利用VC6.0 语言的通信控件实现微机与多个MCS-51 单片机之间的通信。 给出了系统设计和通信协议。 本系统在工业控制中具有广泛的代表性,可以进行改进推广。
    发表于 10-15 16:31 12次下载
    使用<b class='flag-5'>VC6.0</b><b class='flag-5'>实现</b>微机与多个51单片机通信的详细资料说明