成世漢
(山西大眾電子信息產(chǎn)業(yè)集團(tuán)有限公司,山西 太原 030024)
組播傳輸已經(jīng)服務(wù)于醫(yī)療、網(wǎng)絡(luò)教育以及視頻會(huì)議等領(lǐng)域,隨著支持組播傳輸?shù)穆酚善?、交換機(jī)和集線器等網(wǎng)絡(luò)設(shè)備的發(fā)展將使組播技術(shù)得到進(jìn)一步完善和推廣。相較于單播傳輸面對(duì)多接收方時(shí)網(wǎng)絡(luò)延時(shí)大、阻塞嚴(yán)重的情況,組播僅需要單次發(fā)送數(shù)據(jù)包,只有加入組播地址的接收方會(huì)接收到數(shù)據(jù),網(wǎng)絡(luò)傳輸效率顯著提高,同時(shí)規(guī)避了廣播傳輸浪費(fèi)網(wǎng)絡(luò)帶寬的情況。本軟件采用C/S模型,服務(wù)器端對(duì)圖像進(jìn)行分包后發(fā)送至組播地址,客戶端將本地IP加入組播,接收數(shù)據(jù)幀并完成組包后顯示圖像。下面將對(duì)軟件設(shè)計(jì)進(jìn)行具體介紹。
本軟件提供服務(wù)器端和客戶端,發(fā)送方為服務(wù)器端,接收方為客戶端,設(shè)計(jì)思路如圖1所示。
圖1 圖像共享設(shè)計(jì)思路
具體設(shè)計(jì)思路如下:
1) 服務(wù)器端設(shè)置組播地址和端口,客戶端將本地IP加入該組播地址;
2) 服務(wù)器端獲取圖像文件的名稱和大小,計(jì)算發(fā)送幀數(shù)量;
3) 服務(wù)器端向組播地址發(fā)送圖像文件的名稱、大小以及發(fā)送幀數(shù)量信息,發(fā)送幀格式如圖2所示;
圖2 發(fā)送幀格式
4) 客戶端接收并解析接收到的圖像文件名稱、大小以及發(fā)送幀數(shù)量信息;
5) 客戶端根據(jù)圖像文件的大小創(chuàng)建緩存文件;
6) 服務(wù)器端根據(jù)發(fā)送幀數(shù)對(duì)圖像文件進(jìn)行分包,將數(shù)據(jù)幀依次發(fā)送至組播地址;
7) 客戶端接收并存儲(chǔ)接收到的數(shù)據(jù)幀,通過接收線程處理數(shù)據(jù),當(dāng)接收幀數(shù)量與接收到的發(fā)送幀數(shù)量信息相等時(shí)關(guān)閉存儲(chǔ)文件,將數(shù)據(jù)轉(zhuǎn)換為圖像進(jìn)行顯示;
8) 客戶端清除圖像緩存。
服務(wù)器端主要由CServerDlg、CMulticastAdmin和CSendPictureThread三個(gè)類組成。CServerDlg為服務(wù)器端的對(duì)話框類,可對(duì)組播IP和端口以及圖像索取路徑進(jìn)行設(shè)置,同時(shí)具備圖像顯示功能。服務(wù)器端界面如圖3所示。CMulticastAdmin為組播類,通過使用2.2版本的WinSock DLL初始化Socket函數(shù)庫(kù)。CServerDlg通過調(diào)用CMulticastAdmin中部分函數(shù)實(shí)現(xiàn)組播的創(chuàng)建、發(fā)送和銷毀。CSendPictureThread是為適應(yīng)高分辨率圖像數(shù)據(jù)量大而設(shè)計(jì)的發(fā)送線程。CServerDlg調(diào)用CSendPictureThread完成數(shù)據(jù)的發(fā)送。
圖3 服務(wù)器端界面顯示
CServerDlg、CMulticastAdmin和CSendPictureThread三個(gè)類的調(diào)用關(guān)系見圖4。
圖4 服務(wù)器端類調(diào)用關(guān)系圖
由于高分辨率圖像占用空間較大,常規(guī)數(shù)據(jù)幀無(wú)法通過單次發(fā)送完成圖像傳輸,所以需要通過分包的方式通過多次發(fā)送完成數(shù)據(jù)傳輸。分包實(shí)現(xiàn)代碼如下:
ULONG nCount=UFlieLength/ONEFRAMELENGH+1;//計(jì)算發(fā)送幀數(shù)量
if (UFlieLength/ONEFRAMELENGH%1024==0)
{
--nCount;
}
char*pDataBuffer;
pDataBuffer=new char[ONEFRAMELENGH];//分配數(shù)據(jù)幀空間
ZeroMemory(pDataBuffer,ONEFRAMELENGH);
for(ULONGi=0;i { File.Seek(i*ONEFRAMELENGH,CFile::begin); UINT nBufferLength=File.Read(pDataBuffer,ONEFRAMELENGH);//獲取圖像數(shù)據(jù) STU_FRAME CurDataFrame; ZeroMemory(&CurDataFrame,sizeof(STU_FRAME)); CurDataFrame.nFrameLength=nBufferLength; memcpy(&CurDataFrame.chFrame,pDataBuffer,nBufferLength);//給發(fā)送幀賦值 AddFrametoList(CurDataFrame);//將發(fā)送幀加入發(fā)送列表由發(fā)送線程發(fā)送至組播地址 } 客戶端由CClientDlg、CMulticastAdmin和CRcvPictureThread三個(gè)類組成。CClientDlg為客戶端的對(duì)話框類,可對(duì)組播IP和端口以及圖像緩存路徑進(jìn)行設(shè)置。客戶端界面如圖5所示。CMulticastAdmin為與服務(wù)器端相同的組播類。CClientDlg通過調(diào)用CMulticastAdmin中部分函數(shù)實(shí)現(xiàn)本地IP加入組播地址以及組播數(shù)據(jù)接收線程的啟動(dòng)和停止。CRcvPictureThread是處理組播數(shù)據(jù)的線程,該線程主要處理兩類數(shù)據(jù),一類為圖像的基本信息,另一類為圖像的數(shù)據(jù)信息,為確保在先接收到圖像的基本信息,本軟件初始化雙組播地址確保圖像基本信息擁有優(yōu)先被處理能力。CClientDlg調(diào)用CRcvPictureThread完成數(shù)據(jù)的緩存和圖像顯示??蛻舳思嫒輬D像灰度圖轉(zhuǎn)換、圖像另存、格式轉(zhuǎn)換和分辨率調(diào)節(jié)等功能,可滿足基本圖像處理要求。 圖5 客戶端界面顯示 CClientDlg、CMulticastAdmin和CRcvPictureThread三個(gè)類的調(diào)用關(guān)系與服務(wù)器端類調(diào)用關(guān)系類似??蛻舳嗽谑褂媒M播技術(shù)接收數(shù)據(jù)前需要將本地IP加入組播地址,本軟件自動(dòng)獲取本地IP,調(diào)用CMulticastAdmin中的void SetLocalIP(CString strIP)和BOOL CreateReceiver(void)函數(shù)完成本地IP加入。實(shí)現(xiàn)代碼如下: CString strIP; char strHostName[100]={0}; if(SOCKET_ERROR!=gethostname(strHostName,sizeof(strHostName)))//獲取計(jì)算機(jī)全名 { hostent*Localhp; Localhp=gethostbyname(strHostName);//通過計(jì)算機(jī)全名獲取主機(jī)信息 if(Localhp!=NULL&&Localhp->h_addr!=NULL) { strIP=inet_ntoa(*(struct in_addr*)hp->h_addr);//得到本地IP theApp.m_pMulticast->SetLocalIP(strIP);//將本地IP加入組播地址中 } } BOOL bRtn=theApp.m_pMulticast->CreateReceiver();//創(chuàng)建組播接收線程 本軟件實(shí)現(xiàn)組播傳輸主要依靠組播類CMulticastAdmin。CMulticastAdmin為服務(wù)器端提供了組播IP和組播端口設(shè)置函數(shù)、組播創(chuàng)建和銷毀函數(shù)以及數(shù)據(jù)發(fā)送函數(shù),為客戶端提供了本地IP加入組播函數(shù)、啟動(dòng)和停止接收線程函數(shù)以及銷毀組播函數(shù),CMulticastAdmin結(jié)構(gòu)設(shè)計(jì)見圖6。通過組播類的調(diào)用,既達(dá)到了多用戶圖像共享的目的,也有效降低了網(wǎng)絡(luò)負(fù)載,可謂一舉兩得。 使用組播傳輸時(shí),需要使用通信雙方認(rèn)知的D類地址作為廣播地址發(fā)送向目的端口。D類地址范圍為224.0.0.0—239.255.255.255,其中224.0.0.0—224.0.0.255為預(yù)留組播地址(永久組地址),用戶不可使用;224.0.1.0—238.255.255.255為用戶可用組播地址,本軟件采用238.8.8.8作為默認(rèn)組播地址,用戶也可根據(jù)實(shí)際情況設(shè)置符合路由協(xié)議的組播地址;239.0.0.0—239.255.255.255屬于本地管理組播地址,僅在特定范圍有效。在傳輸過程中使用的路由器、集線器、交換機(jī)和防火墻等設(shè)備需要具備組播傳輸模式,尤其在跨網(wǎng)段傳輸過程中必須打開三層交換機(jī)的組播路由協(xié)議(通常為PIM稀疏模式),有時(shí)還需設(shè)置TTL(Time To Live),避免數(shù)據(jù)幀在網(wǎng)絡(luò)中循環(huán)收發(fā)。相信隨著科技水平的不斷進(jìn)步,組播傳輸應(yīng)用更加廣泛,組播模式必將成為網(wǎng)絡(luò)傳輸設(shè)備中的必備模式。 圖6 CMulticastAdmin類圖 本軟件通過組播傳輸方式實(shí)現(xiàn)了高分辨率圖像的一對(duì)多共享,其實(shí)不光是圖像共享,任何信息都可通過組播方式實(shí)現(xiàn)共享,尤其是大容量信息共享時(shí)更能體現(xiàn)出組播傳輸?shù)膬?yōu)越性能。同時(shí)在保證互聯(lián)互通的基礎(chǔ)上,任意終端方均可創(chuàng)建組播成為服務(wù)器端,客戶端只需以訂閱的形式加入組播地址便可完成資源共享,這種有效降低網(wǎng)絡(luò)負(fù)載、應(yīng)用靈活的網(wǎng)絡(luò)傳輸方式不僅僅服務(wù)于醫(yī)療、網(wǎng)絡(luò)教育以及視頻會(huì)議領(lǐng)域,還會(huì)對(duì)工業(yè)生產(chǎn)產(chǎn)生重大影響。2.2 客戶端設(shè)計(jì)
2.3 類CMulticastAdmin的設(shè)計(jì)
3 相關(guān)知識(shí)
4 結(jié)束語(yǔ)