本站小編為你精心準備了多網卡計算機組播通信技術研究參考范文,愿這些范文能點燃您思維的火花,激發您的寫作靈感。歡迎深入閱讀并收藏。
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的信號槽等機制實現組播數據的接收。本文可為相關開發人員提供技術參考。
作者:劉彥平 單位:太原衛星發射中心