基于组播的图像共享软件设计

2020-08-20 08:56成世汉
山西电子技术 2020年4期
关键词:服务器端调用线程

成世汉

(山西大众电子信息产业集团有限公司,山西 太原 030024)

0 引言

组播传输已经服务于医疗、网络教育以及视频会议等领域,随着支持组播传输的路由器、交换机和集线器等网络设备的发展将使组播技术得到进一步完善和推广。相较于单播传输面对多接收方时网络延时大、阻塞严重的情况,组播仅需要单次发送数据包,只有加入组播地址的接收方会接收到数据,网络传输效率显著提高,同时规避了广播传输浪费网络带宽的情况。本软件采用C/S模型,服务器端对图像进行分包后发送至组播地址,客户端将本地IP加入组播,接收数据帧并完成组包后显示图像。下面将对软件设计进行具体介绍。

1 设计思路

本软件提供服务器端和客户端,发送方为服务器端,接收方为客户端,设计思路如图1所示。

图1 图像共享设计思路

具体设计思路如下:

1) 服务器端设置组播地址和端口,客户端将本地IP加入该组播地址;

2) 服务器端获取图像文件的名称和大小,计算发送帧数量;

3) 服务器端向组播地址发送图像文件的名称、大小以及发送帧数量信息,发送帧格式如图2所示;

图2 发送帧格式

4) 客户端接收并解析接收到的图像文件名称、大小以及发送帧数量信息;

5) 客户端根据图像文件的大小创建缓存文件;

6) 服务器端根据发送帧数对图像文件进行分包,将数据帧依次发送至组播地址;

7) 客户端接收并存储接收到的数据帧,通过接收线程处理数据,当接收帧数量与接收到的发送帧数量信息相等时关闭存储文件,将数据转换为图像进行显示;

8) 客户端清除图像缓存。

2 软件设计

2.1 服务器端设计

服务器端主要由CServerDlg、CMulticastAdmin和CSendPictureThread三个类组成。CServerDlg为服务器端的对话框类,可对组播IP和端口以及图像索取路径进行设置,同时具备图像显示功能。服务器端界面如图3所示。CMulticastAdmin为组播类,通过使用2.2版本的WinSock DLL初始化Socket函数库。CServerDlg通过调用CMulticastAdmin中部分函数实现组播的创建、发送和销毁。CSendPictureThread是为适应高分辨率图像数据量大而设计的发送线程。CServerDlg调用CSendPictureThread完成数据的发送。

图3 服务器端界面显示

CServerDlg、CMulticastAdmin和CSendPictureThread三个类的调用关系见图4。

图4 服务器端类调用关系图

由于高分辨率图像占用空间较大,常规数据帧无法通过单次发送完成图像传输,所以需要通过分包的方式通过多次发送完成数据传输。分包实现代码如下:

ULONG nCount=UFlieLength/ONEFRAMELENGH+1;//计算发送帧数量

if (UFlieLength/ONEFRAMELENGH%1024==0)

{

--nCount;

}

char*pDataBuffer;

pDataBuffer=new char[ONEFRAMELENGH];//分配数据帧空间

ZeroMemory(pDataBuffer,ONEFRAMELENGH);

for(ULONGi=0;i

{

File.Seek(i*ONEFRAMELENGH,CFile::begin);

UINT nBufferLength=File.Read(pDataBuffer,ONEFRAMELENGH);//获取图像数据

STU_FRAME CurDataFrame;

ZeroMemory(&CurDataFrame,sizeof(STU_FRAME));

CurDataFrame.nFrameLength=nBufferLength;

memcpy(&CurDataFrame.chFrame,pDataBuffer,nBufferLength);//给发送帧赋值

AddFrametoList(CurDataFrame);//将发送帧加入发送列表由发送线程发送至组播地址

}

2.2 客户端设计

客户端由CClientDlg、CMulticastAdmin和CRcvPictureThread三个类组成。CClientDlg为客户端的对话框类,可对组播IP和端口以及图像缓存路径进行设置。客户端界面如图5所示。CMulticastAdmin为与服务器端相同的组播类。CClientDlg通过调用CMulticastAdmin中部分函数实现本地IP加入组播地址以及组播数据接收线程的启动和停止。CRcvPictureThread是处理组播数据的线程,该线程主要处理两类数据,一类为图像的基本信息,另一类为图像的数据信息,为确保在先接收到图像的基本信息,本软件初始化双组播地址确保图像基本信息拥有优先被处理能力。CClientDlg调用CRcvPictureThread完成数据的缓存和图像显示。客户端兼容图像灰度图转换、图像另存、格式转换和分辨率调节等功能,可满足基本图像处理要求。

图5 客户端界面显示

CClientDlg、CMulticastAdmin和CRcvPictureThread三个类的调用关系与服务器端类调用关系类似。客户端在使用组播技术接收数据前需要将本地IP加入组播地址,本软件自动获取本地IP,调用CMulticastAdmin中的void SetLocalIP(CString strIP)和BOOL CreateReceiver(void)函数完成本地IP加入。实现代码如下:

CString strIP;

char strHostName[100]={0};

if(SOCKET_ERROR!=gethostname(strHostName,sizeof(strHostName)))//获取计算机全名

{

hostent*Localhp;

Localhp=gethostbyname(strHostName);//通过计算机全名获取主机信息

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();//创建组播接收线程

2.3 类CMulticastAdmin的设计

本软件实现组播传输主要依靠组播类CMulticastAdmin。CMulticastAdmin为服务器端提供了组播IP和组播端口设置函数、组播创建和销毁函数以及数据发送函数,为客户端提供了本地IP加入组播函数、启动和停止接收线程函数以及销毁组播函数,CMulticastAdmin结构设计见图6。通过组播类的调用,既达到了多用户图像共享的目的,也有效降低了网络负载,可谓一举两得。

3 相关知识

使用组播传输时,需要使用通信双方认知的D类地址作为广播地址发送向目的端口。D类地址范围为224.0.0.0—239.255.255.255,其中224.0.0.0—224.0.0.255为预留组播地址(永久组地址),用户不可使用;224.0.1.0—238.255.255.255为用户可用组播地址,本软件采用238.8.8.8作为默认组播地址,用户也可根据实际情况设置符合路由协议的组播地址;239.0.0.0—239.255.255.255属于本地管理组播地址,仅在特定范围有效。在传输过程中使用的路由器、集线器、交换机和防火墙等设备需要具备组播传输模式,尤其在跨网段传输过程中必须打开三层交换机的组播路由协议(通常为PIM稀疏模式),有时还需设置TTL(Time To Live),避免数据帧在网络中循环收发。相信随着科技水平的不断进步,组播传输应用更加广泛,组播模式必将成为网络传输设备中的必备模式。

图6 CMulticastAdmin类图

4 结束语

本软件通过组播传输方式实现了高分辨率图像的一对多共享,其实不光是图像共享,任何信息都可通过组播方式实现共享,尤其是大容量信息共享时更能体现出组播传输的优越性能。同时在保证互联互通的基础上,任意终端方均可创建组播成为服务器端,客户端只需以订阅的形式加入组播地址便可完成资源共享,这种有效降低网络负载、应用灵活的网络传输方式不仅仅服务于医疗、网络教育以及视频会议领域,还会对工业生产产生重大影响。

猜你喜欢
服务器端调用线程
实时操作系统mbedOS 互斥量调度机制剖析
Linux环境下基于Socket的数据传输软件设计
基于国产化环境的线程池模型研究与实现
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
基于Qt的安全即时通讯软件服务器端设计
基于Qt的网络聊天软件服务器端设计
基于C/S架构的嵌入式监控组态外设扩展机制研究与应用
计算机中的多线程问题
利用RFC技术实现SAP系统接口通信