IP多播及編程_第1頁
IP多播及編程_第2頁
IP多播及編程_第3頁
IP多播及編程_第4頁
IP多播及編程_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、IP多播(也稱多址廣播或組播)技術,是一種允許一臺或多臺主機(多播源)發(fā)送單一數(shù)據(jù) 包到多臺主機(一次的,同時的)的TCP/IP網絡技術。多播作為一點對多點的通信,是節(jié) 省網絡帶寬的有效方法之一。在網絡音頻/視頻廣播的應用中,當需要將一個節(jié)點的信號傳 送到多個節(jié)點時,無論是采用重復點對點通信方式,還是采用廣播方式,都會嚴重浪費網 絡帶寬,只有多播才是最好的選擇。多播能使一個或多個多播源只把數(shù)據(jù)包發(fā)送給特定的多 播組,而只有加入該多播組的主機才能接收到數(shù)據(jù)包。目前,IP多播技術被廣泛應用在網 絡音頻/視頻廣播、AOD/VOD、網絡視頻會議、多媒體遠程教育、“pus!技術(如股票行情 等) 和虛擬

2、現(xiàn)實游戲等方面。一、IP多播技術簡介IP多播地址和多播組IP多播通信必須依賴于IP多播地址,在IPv4中它是一個D類IP地址,范圍從 到55,并被劃分為局部 鏈接多播地址、預留多播地址和管理權限多播地址三 類。其中,局部鏈接多播地址范圍在55,這是為路由協(xié)議和其它用途保 留的地址,路由器并不轉發(fā)屬于此范圍的IP包;預留多播地址為55, 可用于全球范圍(如Internet)或網絡協(xié)議;管理權限多播地址為55, 可供組織內部使用,類

3、似于私有IP地址,不能用于Internet,可限制多播范圍。使用同一個IP多播地址接收多播數(shù)據(jù)包的所有主機構成了一個主機組,也稱為多播組。 一個多播組的成員是隨時變動的,一臺主機可以隨時加入或離開多播組,多播組成員的數(shù) 目和所在的地理位置也不受限制,一臺主機也可以屬于幾個多播組。此外,不屬于某一個 多播組的主機也可以向該多播組發(fā)送數(shù)據(jù)包。IP多播技術的硬件支持要實現(xiàn)IP多播通信,要求介于多播源和接收者之間的路由器、集線器、交換機以及主 機均需支持IP多播。目前,IP多播技術已得到硬件、軟件廠商的廣泛支持。(1)主機支持 IP 多播通信的平臺包括 Windows CE 2.1、Windows 9

4、5、Windows 98、Windows NT 4 和Windows 2000等,運行這些操作系統(tǒng)的主機都可以進行IP多播通信。此外,新生產的網 卡也幾乎都提供了對IP多播的支持。(2)集線器和交換機目前大多數(shù)集線器、交換機只是簡單地把多播數(shù)據(jù)當成廣播來發(fā)送接收,但一些中、 高檔交換機提供了對IP多播的支持。例如,在3COM SuperStack 3 Swith 3300交換機上可啟 用802.1p或IGMP多播過濾功能,只為已偵測到IGMP數(shù)據(jù)包的端口轉發(fā)多播數(shù)據(jù)包。(3)路由器多播通信要求多播源節(jié)點和目的節(jié)點之間的所有路由器必須提供對Internet組管理協(xié)議(IGMP)、多播路由協(xié)議(如

5、PIM、DVMRP等)的支持。當一臺主機欲加入某個多播組時,會發(fā)出主機成員報告”的IGMP消息通知多播路由 器。當多播路由器接收到發(fā)給那個多播組的數(shù)據(jù)時,便會將其轉發(fā)給所有的多播主機。多 播路由器還會周期性地發(fā)出主機成員查詢”的IGMP消息,向子網查詢多播主機,若發(fā)現(xiàn)某 個多播組已沒有任何成員,則停止轉發(fā)該多播組的數(shù)據(jù)。此外,當支持IGMP v2的主機(如 Windows 98/2000計算機)退出某個多播組時,還會向路由器發(fā)送一條“離開組”的IGMP消 息,以通知路由器停止轉發(fā)該多播組的數(shù)據(jù)。但只有當子網上所有主機都退出某個多播組 時,路由器才會停止向該子網轉發(fā)該多播組的數(shù)據(jù)。使用多播路由協(xié)

6、議,路由器可建立起從多播源節(jié)點到所有目的節(jié)點的多播路由表,從 而實現(xiàn)在子網間轉發(fā)多播數(shù)據(jù)包。例如,PIM (協(xié)議獨立多播)就是一種多播路由協(xié)議,它 有兩種類型:稀疏模式(sparse- mode)和密集模式(dense-mode)。以Cisco 2621路由器為 例,啟用IP多播轉發(fā)功能的基本設置如下:c2621(config)# ip multicast-routing啟動IP多播,使路由器成為一個多播路由器c2621(config)# int f0/0配置快速以太網端口 0c2621(config-if)# ip pim dense-mode (或 sparse-mode)啟動 PIM,同

7、時激活 IGMP 協(xié)議c2621(config-if)# int f0/1 配置快速以太網端口1c2621(config-if)# ip pim dense-mode (或 sparse-mode)二、IP多播應用的編程方法在實際應用中,編程人員通常需要自己編制底層網絡應用程序來實現(xiàn)網上的底層通信, 如具體實現(xiàn)IP多播通信的功能。編制底層網絡應用程序通常要借助于網絡數(shù)據(jù)通信編程接 口,而在不同的操作系統(tǒng)中所提供的網絡編程接口是有所不同的,如在Microsoft Windows 環(huán)境下的網絡編程接口就是Windows套接字(Windows Socket,簡稱Winsock)。Winsock提供了

8、包括TCP/IP、IPX等多種通信協(xié)議下的編程接口。不同的Windows版本 支持不同的Winsock版本,其中Windows 95等早期版本本身只支持Winsock1.1 (16位)下 的編程(可以通過安裝相關的軟件包使其支持Winsock2.0),而Windows98、Windows NT4.0、 Windows 2000 則直接支持 Winsock2.0 (32 位)。Winsock2.0 是 Winsock1.1 的擴展,除兼容 Winsock1.1 API夕卜,還定義了一套可支持IP多播的與協(xié)議無關的API。使用Winsock 2.0實現(xiàn)IP多播的一般步驟如下:1.初始化Winsoc

9、k資源在使用 Winsock之前,必須調用WSAStartup()函數(shù)初始化 Windows Sockets DLL。它允許 應用程序或DLL指定Windows Sockets API要求的版本。2.創(chuàng)建套接字調用WSASocket()函數(shù)可以創(chuàng)建一個使用UDP協(xié)議的套接字,它是加入多播組的初始 化套接字,并且以后數(shù)據(jù)的發(fā)送和接收都在該套接字上進行。針對IP多播通信,可將參數(shù) dwFlags 設置為 WSA_FLAG_MULTIPOINT_C_LEAF、 WSA_FLAG_MULTIPOINT_D_LEAF 和 WSA_FLAG_OVERLAPPED的位和,指明IP多播通信在控制層面和數(shù)據(jù)層面

10、都是“無根的”, 只存在葉節(jié)點,它們可以任意加入一個多播組,而且從一個葉節(jié)點發(fā)送的數(shù)據(jù)會傳送到每一 個葉節(jié)點(包括它自己);創(chuàng)建的套接字具有重疊屬性。設置套接字的選項調用setsockopt(函數(shù)為套接字設置SO_REUSEADDR選項,以允許套接字綁扎到一個已 在使用的地址上。綁定套接字調用bind()函數(shù)綁定套接字,從而將創(chuàng)建好的套接字與本地地址和本地端口聯(lián)系起來。 對于多播通信來說,發(fā)送和接收數(shù)據(jù)通常采用同一個端口。設置多播套接字的模式WSAIoctl()函數(shù)的命令碼SIO_MULTICAST_LOOP用來允許或禁止多播通信時發(fā)送出去的 通信流量是否也能夠在同一個套接字上被接收(即多播返

11、回)。值得注意的是,在Windows 95/98/NT 4中,默認是允許多播返回,但不能設置禁止,否則會出錯;只有在Windows 2000 以上版本中,才能設置允許/禁止多播返回。WSAIoctl()函數(shù)的命令碼SIO_MULTICAST_SCOPE用來設置多播傳播的范圍,即生存時間 TTL。每當多播路由器轉發(fā)多播數(shù)據(jù)包時,數(shù)據(jù)包中的TTL值都會被減1,若數(shù)據(jù)包的TTL 減少到0,則路由器將拋棄該數(shù)據(jù)包。TTL的值是多少,多播數(shù)據(jù)便最多能經過多少個多播 路由器。例如,TTL值為0,則多播只能在本地主機 的多個套接字間傳播,而不能傳播到網 線”上;TTL值為1 (默認值),則多播數(shù)據(jù)遇到第一個

12、路由器,便會被它無情”地丟棄,不 允許傳出本地網絡之外,即只有同一個網絡內的多播組成員才能收到多播數(shù)據(jù)。加入一個多播組調用WSAJoinLeaf()函數(shù)可加入一個多播組并指定角色(發(fā)送者/接收者)。 調用時,參數(shù)dwFlags可指定套接字作為發(fā)送者(JL_SENDER_ONLY)、接收者 (JL_RECEIVER_ONLY)或身兼兩者(JL_BOTH)。調 用成功后會返回一個多播套 接字,調用closesocket()函數(shù)關閉該套接字就離開了多播組,此時可以調用 WSAJoinLeaf()函數(shù)再次加入多 播組。注意,對多播組數(shù)據(jù)的接收和發(fā)送不能在 該套接字上完成。向多播組發(fā)送數(shù)據(jù)調用sendt

13、o()函數(shù),可在指定的UDP套接字上向指定的多播組發(fā)送多播數(shù) 據(jù)。調用時,參數(shù)to應指向多播組的IP地址。值得注意的是,若一個應用程序 只是打算給多播組發(fā)送數(shù)據(jù),便不必加入一個多播組。8 .等待事件調用WSAAsyncSelect ()函數(shù),使套接字置于非阻塞模式,這時應用程序就 可在該套接字上接收以Windows消息為基礎的網絡事件通知。例如,若參數(shù) lEvent值為FD_READ,則應用程序可在套接字上接收到“數(shù)據(jù)正等待被讀入”的 通知。從多播組接收數(shù)據(jù)調用recvfrom函數(shù),可在指定的UDP套接字上讀取輸入數(shù)據(jù)。多播通信中 數(shù)據(jù)的發(fā)送與接收一般采用同一個端口,因此其發(fā)送套接字和接收套接

14、字是一樣 的。關閉套接字,釋放Winsock資源。在多播通信結束后,先調用closesocket()函數(shù)關閉多播套接字和UDP套接 字,然后調用WSACleanup ()函數(shù)結束對Windows Sockets DLL的使用。三、應用實例為了說明IP多播技術的應用方法,本人在Visual C+.NET環(huán)境下設計了一 個簡單的基于Windows Socket 2的IP多播應用程序,通過該例子讀者可以掌握 IP多播應用程序設計的一般方法。該程序的具體設計方法如下:在Visual Studio.NET中建立一個基于對話框的MFC項目 CMulticastSocket。注意在“高級功能”設置中不要選擇

15、“Windows套接字”, 這是因為MFC只支持Windows Socket 1而不支持Windows Socket 2。為了能使 用Winsock 2 API編程,在程序中應包含“winsock2.h”頭文件,并在項目中加 入ws2_32.lib的靜態(tài)庫,該靜態(tài)庫應設置在項目屬性的“鏈接器” “輸 入” “附加依賴項”中。在對話框(類名CCMulticastSocketDlg)資源中,設置它的Caption為 “WinSock 2多播應用程序”,并添加以下控件:靜態(tài)文本:Caption為“接收到的信息:”;編輯框:ID 為 IDC_RECEIVE_EDIT,Read Only、Auto Vs

16、croll、Vertical Scroll 和Multiline屬性值都為True靜態(tài)文本:Caption為“發(fā)送的信息:”編輯框:ID 為 IDC_SEND_EDIT第一個按鈕:Caption為“加入多播組(&J)”,ID為IDC_JOIN_BUTTON 第二個按鈕:Caption 為“多播發(fā)送(&S)”,ID 為 IDC_SEND_BUTTON 第三個按鈕:Caption為“離開多播組(&L)”,ID為IDC_LEAVE_BUTTON第四個按鈕:Caption 為“退出(&Q)”,ID 為 IDC_QUIT_BUTTON為兩個編輯框分別添加相關聯(lián)的CString類型的變量m_SendMes

17、sage和 m_ReceiveMessage;為四個按鈕添加相應的消息處理函數(shù);為對話框添加定時器 消息(用于定時顯示接收到的消息)及其消息處理函數(shù)。添加一個新的對話框資源,設置它的Caption為“加入多播組”,保留 默認的兩個按鈕控件,同時添加添加以下控件:靜態(tài)文本:Caption為“IP多播組地址:”編輯框:ID 為 IDC_IPADDRESS_EDIT靜態(tài)文本:Caption為“IP多播端口:”編輯框:ID 為 IDC_PORT_EDIT靜態(tài)文本:Caption為“生存時間:”編輯框:ID 為 IDC_TTL_EDIT復選框:Caption 為“多播返回:”,ID 為 IDC_LOOP

18、BACK_CHECK,Left Text 屬性值為True。為該對話框添加新的類CJoinGroupDlg,它的基類為CDialog,然后為該對 話框中的三個編輯框分別添加相關聯(lián)的變量,即 CSting m_IPAddress、UINT m_nPort、UINT m_nTTL;為復選框 添加相關聯(lián)的BOOL類型的變量m_Loopback。在 CMulticastSocketDlg.h 文件的前面添加 CJoinGroupDlg 的頭文件: #include “JoinGroupDlg.h”,并在 CCMulticastSocketDlg 類中添加了一個 CJoinGroupDlg 類實例對象

19、m_JoinDlg。為了能在對話框中接收網絡事件通知,應增加一個用戶自定義的消息及 消息處理函數(shù),具體實現(xiàn)方法如下:在CMulticastSocketDlg.h文件的前面自 定義消息:#define WM_SOCK_MSG(WM_USER+166),并在 afx_msg 塊中說明消息處 理函數(shù):afx_msg LRESULT OnSocketMsg (WPARAM wParam,LPARAM lParam);在 CMulticastSocketDlg.cpp文件中的消息映射塊中,使用ON_MESSAGE (WM_SOCK_MSG,OnSocketMsg )宏指令將消息映射到消息處理函數(shù)中,并具

20、體實現(xiàn) 消息處理函數(shù):LRESULT CCMulticastSocketDlg: OnSocketMsg(WPARAM wParam,LPARAM lParam)。該程序的主要代碼可參見程序清單,相關函數(shù)的詳細說明可參看Microsoft MSDN 幫助系統(tǒng)。為了節(jié)省篇幅,程序中省略了部分自動生成的和用于錯誤處理的代碼。程序清單: / CMulticastSocketDlg.cpp :實現(xiàn)文件#include stdafx.h”#include winsock2.h#include CMulticastSocket.h”#include CMulticastSocketDlg.h”DWORD

21、cbRet;SOCKET Sock,SockM; HYPERLINK file:/UDP file:/UDP 套接字,多播套接字BOOL bFlag,bJoin;SOCKADDR_IN local,Remote,From; file:/分別指向本地、多播組和數(shù)據(jù)來源的IP地址與端口int Fromlen;char ReceiveBuf32000; file:/接收緩沖區(qū)BOOL bDataReceived;BEGIN_MESSAGE_MAP(CCMulticastSocketDlg, CDialog)ON_BN_CLICKED(IDC_JOIN_BUTTON, OnBnClickedJoinB

22、utton)ON_BN_CLICKED(IDC_LEAVE_BUTTON, OnBnClickedLeaveButton)ON_BN_CLICKED(IDC_QUIT_BUTTON, OnBnClickedQuitButton)ON_BN_CLICKED(IDC_SEND_BUTTON, OnBnClickedSendButton)ON_WM_TIMER()ON_MESSAGE(WM_SOCK_MSG,OnSocketMsg)END_MESSAGE_MAP()BOOL CCMulticastSocketDlg:OnInitDialog()(CDialog:OnInitDialog();SetT

23、imer(1,100,NULL); file:/設置定時器Fromlen=sizeof(From);bDataReceived二TRUE;bJoin=FALSE;return TRUE; /除非設置了控件的焦點,否則返回TRUE void CCMulticastSocketDlg:OnBnClickedJoinButton() file:/加入多播組 (if(m_JoinDlg.DoModal()=IDOK)(WORD wVersionRequested;WSADATA wsaData;int北京中慶;wVersionRequested = MAKEWORD(2,2);北京中慶=WSAStar

24、tup(wVersionRequested, &wsaData); file:/初始化WinSock2 資源if(北京中慶!二0)(AfxMessageBox(不能加載Windows套接字動態(tài)鏈接庫,MB_OK);return;if (LOBYTE(wsaData.wVersion) !=2 | HIBYTE(wsaData.wVersion) !=2)(AfxMessageBox(WinSock DLL 不支持 2.0 版本,MB_OK);WSACleanup();return;file:/創(chuàng)建一個套接字Sock二WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UD

25、P,(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED| WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);bFlag=TRUE; file:/設置套接字選項,使套接字為可重用端口地址 setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag);file:/將套接字綁定到用戶指定端口及默認的接口memset(&local,0,sizeof(local);local.sin_family=AF_INET;local.si

26、n_port=htons(USHORT)m_JoinDlg.m_nPort);local.sin_addr.s_addr=htonl(INADDR_ANY);bind(Sock,(struct sockaddr FAR *)&local,sizeof(local);file:/設置多播數(shù)據(jù)報傳播范圍(生存時間TTL)WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&m_JoinDlg.m_nTTL,sizeof(int),NULL,0,&cbRet,NULL,NULL);file:/設置多播返回(LOOKBACK)BOOL nLoopBack=m_JoinDlg.m_Loo

27、pback;WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,sizeof(nLoopBack),NULL,0,&cbRet,NULL,NULL);memset(&Remote,0,sizeof(Remote);Remote.sin_family=AF_INET;Remote.sin_addr.s_addr=inet_addr(m_JoinDlg.m_IPAddress);Remote.sin_port=htons(m_JoinDlg.m_nPort);file:/加入到指定的多播組,并指定為既作為發(fā)送者又作為接收者(JL_BOTH)SockM二WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),NULL,NULL,NULL,NULL,JL_BOTH);WSAAsyncSelect(Sock,m_hWnd,WM_SOCK_MSG,FD_READ); file:/注冊網絡消息 及其網絡事件bJoin=TRUE; void CCMulticastSocketDlg:OnBnClickedSendButton() file:/多播發(fā)送(if(bJoin)(UpdateData(TRUE);const

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論