引言
飛行仿真系統(tǒng)是現(xiàn)代航空科研、教學(xué)、試驗等不可缺少的技術(shù)設(shè)備。在飛行性能研究、飛行品質(zhì)評估和飛行訓(xùn)練等方面都具有很高的經(jīng)濟價值和軍事價值。正常情況下,飛行仿真系統(tǒng)采用分布式計算技術(shù),整個系統(tǒng)由多臺計算機組成,各計算機之間的數(shù)據(jù)傳輸需要采用數(shù)據(jù)通信技術(shù)來完成。數(shù)據(jù)通信技術(shù)需要采用網(wǎng)絡(luò)協(xié)議,目前互聯(lián)網(wǎng)采用的協(xié)議是IPv4協(xié)議。
IPv4是互聯(lián)網(wǎng)協(xié)議(Internet Protocol,IP)的第四版,它定義的IP數(shù)據(jù)通信方式有單播、全網(wǎng)廣播和組播。單播是指兩個IP地址間進行的數(shù)據(jù)通信;全網(wǎng)廣播是指在IP子網(wǎng)內(nèi)向所有網(wǎng)內(nèi)IP地址以廣播的方式發(fā)送數(shù)據(jù)包,所有子網(wǎng)內(nèi)的IP站都能收到全網(wǎng)廣播;組播是當(dāng)某一個人向一組人發(fā)送數(shù)據(jù)時,他不必將數(shù)據(jù)向每一個人發(fā)送,只須將數(shù)據(jù)發(fā)送到一個特定的預(yù)約組地址,所有加入該組的人均可以收到這份數(shù)據(jù)。
為了讓網(wǎng)絡(luò)中的多個主機可以同時接受到相同的數(shù)據(jù)包,如果采用單播的方式,那么源主機必須分別發(fā)送相同的數(shù)據(jù)包。對于一臺主機來說,同時不停的發(fā)送相同的數(shù)據(jù)包來說也是一個很大的負(fù)擔(dān)。如果采用采用廣播方式,則數(shù)據(jù)包傳送到局域網(wǎng)內(nèi)每個主機上,不管這個主機是否對數(shù)據(jù)包感興趣,這樣做就會造成了帶寬的浪費和主機的資源浪費。如果采用組播的方式,源主機可以只需要發(fā)送一個數(shù)據(jù)包就可以到達每個需要接受的主機上,這中間還要取決于路由器對組員和組關(guān)系的維護和選擇。組播有一套對組員和組之間關(guān)系維護的機制,可以明確的知道在某個子網(wǎng)中,是否有主機對這類組播數(shù)據(jù)包感興趣,如果沒有就不會把數(shù)據(jù)包進行轉(zhuǎn)發(fā),并會通知上游路由器不要再轉(zhuǎn)發(fā)這類數(shù)據(jù)包到下游路由器上。InternetNIC關(guān)于IP地址的規(guī)定中,IP地址共分為A-E共5類, D類地址即為組播地址,范圍為224.0.0.0-239.255.255.255。D類地址是動態(tài)分配和恢復(fù)的瞬態(tài)地址。每一個組播組對應(yīng)于動態(tài)分配的一個D類地址;當(dāng)組播組結(jié)束組播時,相對應(yīng)的D類地址將被回收,用于以后的組播。
根據(jù)以上所述,運用組播技術(shù),對發(fā)送者而言,數(shù)據(jù)只需發(fā)送一次就可以發(fā)送到所有接收者,所以,組播技術(shù)對于接收者來說,都是同時接收到相同的數(shù)據(jù),這使得對計算機接收數(shù)據(jù)的同步性得到很好的控制,縮短了發(fā)送的時間周期,從而大大減輕了發(fā)送者的負(fù)擔(dān)和網(wǎng)絡(luò)的負(fù)載,節(jié)省了大量資源。
1 飛行仿真系統(tǒng)的組成及通信機制
一個典型的飛行仿真系統(tǒng)包括:飛行系統(tǒng)、火控系統(tǒng)、音響系統(tǒng)、運動系統(tǒng)、教員臺系統(tǒng)、導(dǎo)航系統(tǒng)、儀表系統(tǒng)、操縱系統(tǒng)、多臺視景計算機等,如圖1所示。其中飛行系統(tǒng)控制整個飛行仿真系統(tǒng),是整個系統(tǒng)的核心;儀表系統(tǒng)是顯示飛機坐艙內(nèi)各個儀表盤,通過儀表盤來顯示飛機飛行的狀態(tài);操縱系統(tǒng)是控制飛機飛行的姿態(tài);多臺視景計算機顯示的是飛機在同一位置時的不同角度。
圖1 飛行仿真系統(tǒng)的通信結(jié)構(gòu)(實線表示網(wǎng)絡(luò))
根據(jù)圖1所示,可以看出整個系統(tǒng)的數(shù)據(jù)傳輸過程。如果用單播通信方式,那么飛行系統(tǒng)計算機會重復(fù)發(fā)送相同的數(shù)據(jù)給多臺視景計算機,增加了發(fā)送的時間周期,這樣就會導(dǎo)致飛行系統(tǒng)計算機的工作任務(wù)的重復(fù)和網(wǎng)絡(luò)資源的浪費,并且單播在發(fā)送數(shù)據(jù)時有先有后,因此五臺視景顯示計算機不是同時收到飛行系統(tǒng)計算機的數(shù)據(jù),這樣就會導(dǎo)致多臺視景計算機幀與幀之間不同步,這不符合實時顯示的要求。如果采用廣播通信方式,則操縱系統(tǒng)計算機也會收到控制計算機的數(shù)據(jù),而事實上是操縱系統(tǒng)計算機用不到飛行系統(tǒng)計算機的信息,這樣會導(dǎo)致網(wǎng)絡(luò)資源的浪費。如果采用組播的通信方式,飛行仿真系統(tǒng)中所有的計算機同在一個組播組中,這樣飛行系統(tǒng)計算機發(fā)送一次數(shù)據(jù),則有關(guān)計算機都會同時接收到相同的數(shù)據(jù),多臺視景計算機可以實時的顯示飛機飛行的姿態(tài),不會存在幀與幀之間不同步的問題。所以綜合以上分析,我們在實驗系統(tǒng)中采用組播技術(shù)來實現(xiàn)網(wǎng)絡(luò)通信。
2 組播技術(shù)的實現(xiàn)
本節(jié)是介紹在VC6.0平臺上如何用winsock實現(xiàn)組播通信編程的方法。
2.1 用winsock實現(xiàn)組播的方法
本系統(tǒng)采用VC6.0為開發(fā)工具。對于網(wǎng)絡(luò)編程而言,需要用到多線程技術(shù)。在VC6.0開發(fā)環(huán)境中,開啟一個線程用到AfxBeginThread()函數(shù),AfxBeginThread(RecvThread, &m_mysock);其中RecvThread()函數(shù)是線程函數(shù),主要是用來接收和發(fā)送數(shù)據(jù)的;m_mysock是自己封裝的一個類CMySocket的對象,這個類封裝所有有關(guān)組播通信的信息,如:線程函數(shù)中接收的數(shù)據(jù)存入該類的變量中。
對于Socket編程,首先要對sockaddr_in結(jié)構(gòu)體進行初始化,就是把組播地址和端口號分別賦值給sockaddr_in中的s_addr和sin_port,具體實現(xiàn)如下代碼:
Local.sin_addr.s_addr =inet_addr(“234.0.0.0”);
Local.sin_family = AF_INET;
Local.sin_port= htons( 2007 );
其中Local是sockaddr_in結(jié)構(gòu)變量,組播地址為:234.0.0.0,端口號:2007。
然后是對套接字的初始化了,定義SOCKET的變量為sock,
sock = socket (AF_INET,SOCK_DGRAM,0);其中SOCK_DGRAM表示為采用UDP協(xié)議(SOCK_STREAM表示為TCP協(xié)議)。
初始化之后用bind()函數(shù)將套接字與IP地址和端口號綁定起來,bind (sock,(sockaddr*)&( Local),sizeof(Local));
其中sock與Local定義同上。
組播技術(shù)用setsockopt()函數(shù)的套接字功能選項來進行設(shè)置, setsockopt()函數(shù)有關(guān)組播技術(shù)的選項見下表:
表1 setsockopt()組播選項說明
發(fā)送數(shù)據(jù)用到sendto()函數(shù),用這個函數(shù)向組播地址發(fā)送數(shù)據(jù),sendto(sock,buffer,sizeof(buffer),0,(sockaddr*)&Local,sizeof(Local));
其中buffer所存放的就是所要發(fā)送的數(shù)據(jù)。這里介紹一下buffer中存放數(shù)據(jù)的形式,buffer是一個字符數(shù)組,它的前四位放的是本機的計算機名字;5到8位存放的是命令,這個命令是指要讓接收方做什么事情;從9位以后全部都是數(shù)據(jù),這些數(shù)據(jù)就是讓接收方利用這些數(shù)據(jù)完成各自的任務(wù)。這個主要是因為發(fā)送方發(fā)送數(shù)據(jù)到組播地址后,所有的接收方都會到網(wǎng)組播地址上取數(shù)據(jù),對于每個接收方,有可能接收的數(shù)據(jù)對于自己是無用的,所以在發(fā)送數(shù)據(jù)時,數(shù)據(jù)頭加上前面所講的1到8位的識別信息,接收方可以根據(jù)這些信息來獲取對自己有用的數(shù)據(jù)。接收數(shù)據(jù)用到recvfrom()函數(shù),這個函數(shù)是接收網(wǎng)絡(luò)上的數(shù)據(jù)的,recvfrom(sock,recvBuff,1024,0,(sockaddr*)&clientsock,&sizeof(clientsock));recvBuff是字符數(shù)組,把接收過來的數(shù)據(jù)存放到這個數(shù)組中。然后,我們要對這個數(shù)據(jù)進行解析,也就是前面所講的發(fā)送時所加的數(shù)據(jù)包頭的信息。接收到數(shù)據(jù)以后,先對數(shù)據(jù)包的前四位進行判別,判別是從哪個計算機上發(fā)送來的信息。再對5到8位進行判別,判別是什么信息,也就是什么命令。根據(jù)數(shù)據(jù)包前8位的信息,如果是本機將要用到的數(shù)據(jù),則對數(shù)據(jù)包前8位以后的數(shù)據(jù)進行提?。环駝t,對接收來的數(shù)據(jù)舍棄不用。
2.2 數(shù)據(jù)傳輸?shù)挠行?/p>
在前面講過組播的主要缺點是沒有糾錯機制,發(fā)生丟包錯包后難以彌補。也就是說在數(shù)據(jù)傳輸過程中無法保證接收的數(shù)據(jù)與發(fā)送的數(shù)據(jù)一致,這樣可導(dǎo)致實時仿真不同步,以至多臺視景計算機不能實時觀察飛機飛行的不同的角度,為了解決這個問題,采取兩種方案予以彌補。
2.2.1采用時間等待
時間等方法是運用select()函數(shù)。select()函數(shù)用法是如果程序要檢查套接字上在設(shè)定的時間范圍內(nèi)(timeout =5ms)是否有數(shù)據(jù)到來,則首先需要把套接字句柄加入可讀性監(jiān)視集合中,然后調(diào)用select()函數(shù)。如果沒有數(shù)據(jù)到來,則再等下一個5ms,一直等到網(wǎng)絡(luò)上有數(shù)據(jù)為止。select()函數(shù)具體實現(xiàn)如下代碼:
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))
但是這個方法也有一定的弊端,就是如果所有的視景計算機中某幾臺視景計算機在接收數(shù)據(jù)的過程中等待的時間長,那么所有的視景機一定不會同時獲得相同數(shù)據(jù),這樣就會導(dǎo)致多臺視景計算機視景不同步。
2.2.2 發(fā)送副本方法
在發(fā)送端發(fā)送數(shù)據(jù)時,同時要發(fā)送這個數(shù)據(jù)的一個或多個副本,在接收端接收數(shù)據(jù)時,如果發(fā)現(xiàn)接收的數(shù)據(jù)不正確,則到其它副本取數(shù)據(jù),這樣會彌補接收數(shù)據(jù)的不可靠性。
3 結(jié)束語
由于組播技術(shù)采用的是UDP協(xié)議,UDP協(xié)議的主要特點是數(shù)據(jù)傳輸速度快,所以在飛行仿真系統(tǒng)中數(shù)據(jù)傳輸速度問題可以得到解決。在飛行仿真系統(tǒng)中,視景顯示是該系統(tǒng)中的重點。如果多臺視景機不同步顯示,則會造成觀察者無法對飛機飛行進行有效的控制,繼而對整個系統(tǒng)無法控制。組播技術(shù)是只發(fā)送一次數(shù)據(jù),同在一個組播地址內(nèi)的計算機都會接收到這些數(shù)據(jù),根據(jù)圖1中所示,飛行系統(tǒng)計算機向視景計算機發(fā)送數(shù)據(jù)之后,視景計算機會同時接收到相同的數(shù)據(jù),這樣,視景計算機就會根據(jù)接收到的數(shù)據(jù)來做飛機飛行相應(yīng)的動作。所以,利用組播技術(shù),可以使視景計算機顯示同步的問題得到解決。在飛行仿真系統(tǒng)中通過利用select()函數(shù)和發(fā)送副本的方式,可以使彌補數(shù)據(jù)在傳輸過程中的可靠性。利用以上的方法,在飛行仿真系統(tǒng)中,數(shù)據(jù)傳輸?shù)乃俣?、視景計算機的同步性和數(shù)據(jù)傳輸?shù)目煽啃远嫉玫搅撕芎玫尿炞C。
責(zé)任編輯:gt
-
互聯(lián)網(wǎng)
+關(guān)注
關(guān)注
54文章
11236瀏覽量
105812 -
計算機
+關(guān)注
關(guān)注
19文章
7636瀏覽量
90300 -
仿真系統(tǒng)
+關(guān)注
關(guān)注
1文章
104瀏覽量
21121
發(fā)布評論請先 登錄
匿名聯(lián)合體結(jié)構(gòu)體在VC6.0環(huán)境不支持?
分享:uc/OSII VC6.0 環(huán)境
VC6.0調(diào)用MATLAB2015a
請問UCOS在VC6.0下如何調(diào)用PC函數(shù)?
VC6.0無法打開文件該怎么辦?
c語言編程軟件vc6.0中文綠色版_vc6.0官方下載

c語言編程軟件vc6.0使用教程_vc6.0怎么用

使用VC6.0實現(xiàn)微機與多個51單片機通信的詳細(xì)資料說明

評論