您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > TcpIP-基于WinSock2的IP多播应用程序
福建农林大学计算机与信息学院(程序设计类课程)实验报告课程名称:网络环境编程姓名:系:计算机科学与技术专业:计算机科学与技术年级:09级学号:指导教师:职称:2012年6月11日福建农林大学计算机与信息学院实验报告系:计算机科学与技术专业:计算机科学与技术年级:09级姓名:学号:实验室号田实验楼513计算机号79实验时间:5.28指导教师签字:成绩:实验四基于WinSock2的IP多播应用程序一、实验目的1.理解IP多播的基本原理。2.掌握网际组管理协议IGMP。3.掌握基于WinSock2的多播应用程序设计方法。二、实验环境与设备本实验在实际因特网环境下进行操作,需要的设备有:一台PC机,VC++.NET5以上版本软件。三、实验原理1.IGMP操作加入多播组:主机和路由器都可以加入一个多播组。当某个主机中的一个进程申请加入一个多播组时,主机将发送一个成员关系报告报文到它所在的IP子网的多播路由器上;路由器接收到该申请后将检查它的群组成员关系表,看该主机是否已经在群组中。如果该主机不在群组关系表中(即第一次申请),随即将自己的IP模块做相应的准备,以便开始接收来自该多播组传来的数据。如果这台主机是它所在的IP子网中第一台加入该多播组的主机,则多播路由器将通过路由信息的交换加入多播分布树退出多播组:当主机发现在一个特定的多播组中已经没有进程时,就发送退出报告。多播路由器收到退出报告后,并不立即删除这个群组,而是针对该群组发送查询报文。当在指定的时间内没有收到相关主机(和路由器)对该群组的成员关系报告时,就意味着在本网络上已经没有该群组成员,此时,多播路由器将删除该群组。否则继续保留该群组。查询成员关系:由于多播组中的成员关系是动态变化的,并且有些变化是由于异常事件而引起的,例如某个群组的某台成员主机因异常而关机,此时多播路由器将永远接收不到其退出报告。为了实时掌握群组的成员组成,IGMP提供了一种机制来监控其某个网络上的所有主机和路由器,以便确定群组和主机或路由器之间的关系。2.支持多播的应用程序接口加入一个多播组;离开一个多播组;为调整范围对一个多播数据的IP数据报中的TTL值进行设定;为多播传输和接收设定本地的接口;禁止输出多播数据回送。具体应用程序接口函数如下表。四、实验内容以winsock2为基础。设计一个简单的多播应用程序,运行界面可以参照如下所示。其中包括绑定本地套接字、加入多播组、退出多播组、向多播阻发送数据等操作。五、实验步骤1.初始化WinSock资源//初始化WinSock2资源,检查系统是否安装了WinSock2以上版本wVersionRequested=MAKEWORD(2,2);err=WSAStartup(wVersionRequested,&wsaData);2.创建套接字Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED|WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);bFlag=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.设置多播数据报生存时间TTL//设置多播数据报传播范围(生存时间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.sin_addr.s_addr=inet_addr((char*)m_IPAddress);Remote.sin_port=htons((USHORT)m_nRemotePort);SockM=WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),NULL,NULL,NULL,NULL,JL_BOTH);//加入多播组closesocket(SockM);//离开多播组6.向多播组发送数据sendto(Sock,strMessage,nSize,0,(sockaddr*)&Remote,sizeof(Remote));7.从多播组接收数据recvfrom(Sock,ReceiveBuf,32000,0,(sockaddr*)&From,&Fromlen);8.关闭套接字,释放WinSock资源closesocket(SockM);//关闭多播套接字,退出多播组closesocket(Sock);//关闭UDP套接字,结束数据的收发WSACleanup();//释放WinSock资源六、实验报告要求要有运行截图。点击开始的时候绑定本地端口,并且加入组播当点击发送后七、参考程序教材P154.
本文标题:TcpIP-基于WinSock2的IP多播应用程序
链接地址:https://www.777doc.com/doc-2851523 .html