資源描述:
《tcp、ip-基于winsock 2的ip多播應用程序new》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、福建農(nóng)林大學計算機與信息學院(程序設計類課程)實驗報告課程名稱:網(wǎng)絡環(huán)境編程姓名:系:計算機科學與技術(shù)專業(yè):計算機科學與技術(shù)年級:09級學號:指導教師:職稱:2012年6月11日福建農(nóng)林大學計算機與信息學院實驗報告系:計算機科學與技術(shù)專業(yè):計算機科學與技術(shù)年級:09級姓名:學號:實驗室號田實驗樓513計算機號79實驗時間:5.28指導教師簽字:成績:實驗四基于WinSock2的IP多播應用程序一、實驗目的1.理解IP多播的基本原理。2.掌握網(wǎng)際組管理協(xié)議IGMP。3.掌握基于WinSock2的多播應用程序設計方法。二、實驗環(huán)境
2、與設備本實驗在實際因特網(wǎng)環(huán)境下進行操作,需要的設備有:一臺PC機,VC++.NET5以上版本軟件。三、實驗原理1.IGMP操作l加入多播組:主機和路由器都可以加入一個多播組。當某個主機中的一個進程申請加入一個多播組時,主機將發(fā)送一個成員關系報告報文到它所在的IP子網(wǎng)的多播路由器上;路由器接收到該申請后將檢查它的群組成員關系表,看該主機是否已經(jīng)在群組中。如果該主機不在群組關系表中(即第一次申請),隨即將自己的IP模塊做相應的準備,以便開始接收來自該多播組傳來的數(shù)據(jù)。如果這臺主機是它所在的IP子網(wǎng)中第一臺加入該多播組的主機,則多播
3、路由器將通過路由信息的交換加入多播分布樹l退出多播組:當主機發(fā)現(xiàn)在一個特定的多播組中已經(jīng)沒有進程時,就發(fā)送退出報告。多播路由器收到退出報告后,并不立即刪除這個群組,而是針對該群組發(fā)送查詢報文。當在指定的時間內(nèi)沒有收到相關主機(和路由器)對該群組的成員關系報告時,就意味著在本網(wǎng)絡上已經(jīng)沒有該群組成員,此時,多播路由器將刪除該群組。否則繼續(xù)保留該群組。l查詢成員關系:由于多播組中的成員關系是動態(tài)變化的,并且有些變化是由于異常事件而引起的,例如某個群組的某臺成員主機因異常而關機,此時多播路由器將永遠接收不到其退出報告。為了實時掌握群
4、組的成員組成,IGMP提供了一種機制來監(jiān)控其某個網(wǎng)絡上的所有主機和路由器,以便確定群組和主機或路由器之間的關系。2.支持多播的應用程序接口l加入一個多播組;l離開一個多播組;l為調(diào)整范圍對一個多播數(shù)據(jù)的IP數(shù)據(jù)報中的TTL值進行設定;l為多播傳輸和接收設定本地的接口;l禁止輸出多播數(shù)據(jù)回送。具體應用程序接口函數(shù)如下表。四、實驗內(nèi)容以winsock2為基礎。設計一個簡單的多播應用程序,運行界面可以參照如下所示。其中包括綁定本地套接字、加入多播組、退出多播組、向多播阻發(fā)送數(shù)據(jù)等操作。五、實驗步驟1.初始化WinSock資源//初始
5、化WinSock2資源,檢查系統(tǒng)是否安裝了WinSock2以上版本wVersionRequested=MAKEWORD(2,2);err=WSAStartup(wVersionRequested,&wsaData);2.創(chuàng)建套接字Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED
6、WSA_FLAG_MULTIPOINT_C_LEAF
7、WSA_FLAG_MULTIPOINT_D_LEAF);bFl
8、ag=TRUE;err=setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag));local.sin_family=PF_INET;local.sin_port=htons((USHORT)m_nPort);local.sin_addr.s_addr=htonl(INADDR_ANY);err=bind(Sock,(structsockaddrFAR*)&local,sizeof(local));3.設置多播數(shù)據(jù)報生存時間TTL//設置多播數(shù)據(jù)報傳
9、播范圍(生存時間TTL)err=WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&m_nTTL,sizeof(m_nTTL),NULL,0,&cbRet,NULL,NULL);4.設置多播返回//設置多播返回(LOOKBACK)err=WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,sizeof(nLoopBack),NULL,0,&cbRet,NULL,NULL);5.加入/離開一個多播組Remote.sin_family=PF_INET;Remote.s
10、in_addr.s_addr=inet_addr((char*)m_IPAddress);Remote.sin_port=htons((USHORT)m_nRemotePort);SockM=WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof