美章网 资料文库 多网卡计算机组播通信技术研究范文

多网卡计算机组播通信技术研究范文

本站小编为你精心准备了多网卡计算机组播通信技术研究参考范文,愿这些范文能点燃您思维的火花,激发您的写作灵感。欢迎深入阅读并收藏。

多网卡计算机组播通信技术研究

Qt是诺基亚公司开发的具有优良跨平台特性的C++图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级图形用户界面所需的所有功能。Qt完全面向对象且很容易扩展,并且允许真正地组件编程,已经成为全球众多成功应用程序的基础。Qt最初主要是为跨平台软件开发提供统一、精美的图形用户编程接口而设计,同时也提供了优秀且统一的网络编程接口。

Qt的类库类似于MFC的开发库,但Qt的类库封装了适应不同操作系统访问的细节,是支持跨平台的类库,这正是Qt的魅力所在。由于Qt具有良好的跨平台性,可以减少开发者在不同开发平台下应用程序的工作量,可预见Qt的应用将更加广泛。网络编程是软件开发的主要内容之一,传统方法大多利用套接字Socket进行编程,由于套接字包含了众多的函数和数据结构,因此较难掌握与使用。Qt将与网络编程有关的函数和数据结构封装成各种类,使开发人员不用面对各种复杂的API函数与数据结构,缩短了开发周期,保证了代码的高效与简洁。但是,在多网卡计算机环境中使用Qt提供的QUdpSocket类开发应用程序进行组播数据收发时,会出现无法绑定到指定网卡接收数据的现象。本文主要通过对Qt中与UDP组播通信有关的类进行深入研究,解决Qt开发软件在多网卡计算机环境中无法绑定到指定网卡的问题。

1组播通信原理及问题描述

组播即IP多播技术始于上世纪80年代,1988年SteveDeering首次在其博士论文当中提出了IP多播的概念。在TCP/IP通信中有3种通信方式,即单播、广播和组播。单播为一对一的信息传送,对服务质量要求高。广播使用子网内的特殊IP地址,IP地址最后一段为255,进行广播时子网内所有电脑均可收到数据报,通信量巨大,智能低,所以不被允许跨越网段。组播使用IP分组的概念,在路由中建立IP组,并在子网中充分利用硬件多播的方式进行信息传送,组播通过路由传送是允许跨越网段的。由于在子网中利用了硬件多播的方式,不参加组播组的电脑不会收到组播数据报,所以实现了广播,又有效控制了流量,增大了广播范围。

1.1组播通信原理组播使用IPv4网络中的D类IP地址,范围从224.0.0.0至239.255.255.255,在这个范围当中没有任何主机,而专门用于组播,所以D类IP不允许出现在任何形式的源地址当中[6]。组播开始时,进程首先申请加入一个组播组,之后由主机向路由器发出加入组播组的申请,路由器向所有可以联系到的路由器发出申请,以便接收组播数据。这样就完成了加入组播组的工作。发送组播数据时,先将数据打包进一个UDP数据报,然后发送到路由器,路由器在可以联系到的路由当中使用同一个组的路由,并进行转发。不在同一组的路由和主机不会接收到本组的数据报[8]。通过这种方式既扩大了通信范围,又有效抑制了通信数据量。组播使用IGMP协议(InternetGroupManagementProtocol)进行管理。要进行组播的主机必须要有IGMP协议的支持。同时,组播也必须有支持组播的路由器支持,在已有的部分路由器当中,组播并不是默认启动的服务。

1.2问题现象在Windows平台上,本文利用Qt4.8.6开发环境开发了一个基于Qt的Udp组播通信数据接收软件。以下是程序中涉及到组播通信的部分代码段。上述代码段中,创建一个接收发送的组播Udp数据类ReceiveData,在ReceiveData类的构造函数中,首先创建一个udpSocket的组播接收套接字,接着利用bind函数将接收组播数据的udpSocket套接字绑定到本地计算机指定的数据接收网卡和端口号,并设置端口复用;最后将udpSocket套接字加入到指定的组播组,并通过connect函数建立信号槽连接来接收发送的Udp组播数据。在单网卡的计算机上运行上述组播数据接收程序时,Udp组播通信数据接收正常。然而,在具有多个网卡的计算机上运行上述组播数据接收程序时,出现了程序无法接收发送的Udp组播通信数据的现象。

2解决方案

通过Qt提供的帮助文件,仔细研究了QUdpSocket类的使用,确认了上述代码没有问题。经过多次试验,最终将多网卡计算机(本文研究中涉及到的多网卡计算机实际安装了3块网卡)中剩下的两块网卡停用后,重新启动上述组播数据接收程序,发现可以接收到组播数据。因此,认为Qt开发库中提供的QUdpSocket类中的bind函数存在Bug,无法在多网卡的计算机中绑定指定的网卡来接收组播数据。因此,本文将套接字绑定到指定网卡接收Udp组播数据的类UdpBindFunction中,以下是创建的UdpBindFunction类的主要代码。上述代码段中,在UdpBindFunction类的构造函数中,首先使用WSAStartup载入合适的Winsock动态链接库,并利用WSASocket函数创建一个SOCK_DGRAM数据报类型的套接字ssend,并设置允许其它套节字也接收此套节字所监听端口的地址;其次,创建一个sockaddr_in结构体,通过设置结构体的sin_family、sin_port、sin_addr属性,分别指定了socket套接字编程的协议族、存储的端口号、存储的IP地址,使用bind函数将套接字ssend绑定到指定的组播接收端口上;然后,创建一个ip_mreq结构体,通过设置该结构体的imr_multiaddr、imr_address属性,分别指定组播组的IP地址和本地多网卡计算机上需要绑定的网卡IP地址,并使用setsockopt函数设置套接字选项加入组播组;最后,将创建的UdpSocket套接字通过QUdpSocket类提供的setSocketDescriptor函数,将创建的套接字ssend与利用QUdpSocket类创建的套接字udpSocket联系在一起,进而可以使用Qt开发库提供的connect函数建立信号槽连接来接收发送的Udp组播通信数据。经过反复实验验证,利用UdpBindFunction类创建的udp组播通信程序可以在多网卡计算机上绑定到指定的网卡接收组播数据。

3结语

本文使用Qt开发库自带的QUdpSocket类创建的Udp组播通信程序在多网卡计算机中,无法绑定到指定的网卡接收组播数据。通过深入研究Up组播通信的原理和无法接收Udp组播数据的机理,指出了Qt开发库中提供的QUdpSocket类中的bind函数存在Bug,无法在多网卡计算机中绑定到指定的网卡接收组播数据。最后,通过UdpBindFunction类将创建的套接字绑定到多网卡计算机的特定网卡接收组播数据,并巧妙地与利用QUdpSocket类创建的套接字联系在一起,进而可以方便的利用Qt的信号槽等机制实现组播数据的接收。本文可为相关开发人员提供技术参考。

作者:刘彦平 单位:太原卫星发射中心