您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 基于-广播模型的通信程序设计
集美大学计算机工程学院实验报告课程名称:TCP/IP协议与通信程序设计班级:实验成绩:实验项目名称:基于广播模型的通信程序设计学号:上机实践日期:2016-06-02实验项目编号:11组号:1上机实践时间:2学时一、实验目的了解广播编程的原理,掌握使用广播套接字编写通信程序二、实验内容与设计思想编写基于广播通信模型的服务器端和客户端通信程序,要求编程实现服务器端与客户端之间广播数据传递。服务器端向所有客户端发送“今天是个好日子!”广播消息,客户端收到并在本地显示给用户。在上述通信程序的基础上进行改进,实现服务器端发送的“今天是个好日子!”广播消息,仅限于本组内所有主机才能接收到。三、实验使用环境操作系统:MicrosoftWindowsXPSP2编程环境:VisualC++6.0四、实验步骤和调试过程广播源代码:服务器端:#includeinitsock.h#includestdio.h#includewindows.hCInitSocktheSock;voidmain(){//创建UDP套接字SOCK_DGRAMSOCKETs=::socket(AF_INET,SOCK_DGRAM,0);//设置套接字的工作选项,有效SO_BROADCAST选项BOOLbBroadcast=TRUE;//SOL_SOCKET表示应用层级别,SO_BROADCAST表示工作选项为设置套接字传播和接收广播消息::setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char*)&bBroadcast,sizeof(BOOL));//设置广播地址,这里的广播端口号是4567SOCKADDR_INbcast;bcast.sin_family=AF_INET;bcast.sin_addr.s_addr=INADDR_BROADCAST;//::inet_addr(255.255.255.255);bcast.sin_port=htons(4567);//端口号用来说明参与通信的进程//发送广播charsz[]=今天是个好日子!\r\n;printf(发送广播数据:\n%s\n,sz);while(TRUE){::sendto(s,sz,strlen(sz),0,(sockaddr*)&bcast,sizeof(bcast));::Sleep(5000);}}客户端:#includeinitsock.h#includestdio.h#includewindows.hCInitSocktheSock;voidmain(){SOCKETs=::socket(AF_INET,SOCK_DGRAM,0);//首先要绑定一个本地地址,指明广播端口号SOCKADDR_INsin;sin.sin_family=AF_INET;sin.sin_addr.S_un.S_addr=INADDR_ANY;sin.sin_port=::ntohs(4567);if(::bind(s,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR){printf(bind()failed\n);return;}//接收广播printf(开始在4567端口接收广播数据...\n\n);SOCKADDR_INaddrRemote;intnLen=sizeof(addrRemote);charsz[256];while(TRUE){intnRet=::recvfrom(s,sz,256,0,(sockaddr*)&addrRemote,&nLen);if(nRet0){sz[nRet]='\0';printf(sz);}}}执行结果:组播源代码:服务器端:#includeinitsock.h#includestdio.h#includewindows.hCInitSocktheSock;voidmain(){//创建UDP套接字SOCK_DGRAMSOCKETs=::socket(AF_INET,SOCK_DGRAM,0);//设置套接字的工作选项,有效SO_BROADCAST选项BOOLbBroadcast=TRUE;//SOL_SOCKET表示应用层级别,SO_BROADCAST表示工作选项为设置套接字传播和接收广播消息::setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char*)&bBroadcast,sizeof(BOOL));//设置广播地址,这里的广播端口号(电台)是4567SOCKADDR_INbcast;bcast.sin_family=AF_INET;bcast.sin_addr.s_addr=::inet_addr(234.64.71.88);bcast.sin_port=htons(4567);//端口号用来说明参与通信的进程//发送广播printf(服务器端开始向4567端口发送多播数据...\n\n);charsz[]=今天是个好日子(第一组)\r\n;printf(发送多播数据\n%s\n,sz);while(TRUE){::sendto(s,sz,strlen(sz),0,(sockaddr*)&bcast,sizeof(bcast));::Sleep(5000);}}客户端:#includeInitsock.h#includestdio.h#includewindows.h#includeWs2tcpip.hstructip_mreq_source{structin_addrimr_multiaddr;structin_addrimr_sourceaddr;structin_addrimr_interface;};#defineIP_ADD_SOURCE_MEMBERSHIP15//初始化Winsock库CInitSocktheSock;voidmain(){//SOCKETs=::socket(AF_INET,SOCK_DGRAM,0);SOCKETs=::socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//允许其它进程使用绑定的地址BOOLbReuse=TRUE;::setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&bReuse,sizeof(BOOL));//绑定到4567端口sockaddr_insi;si.sin_family=AF_INET;si.sin_port=::ntohs(4567);si.sin_addr.S_un.S_addr=INADDR_ANY;::bind(s,(sockaddr*)&si,sizeof(si));//设置ip_mreq_source结构ip_mreq_sourcemcast;mcast.imr_interface.s_addr=::inet_addr(192.168.73.136);//本地IP地址接口mcast.imr_multiaddr.s_addr=::inet_addr(234.64.71.88);//多播地址为234.64.71.88mcast.imr_sourceaddr.s_addr=::inet_addr(192.168.73.136);//(带源地址)添加源地址//设置套接字选项为网络层级别IPPROTO_IP,相应的工作选项为加入多播IP_ADD_MEMBERSHIP::setsockopt(s,IPPROTO_IP,IP_ADD_SOURCE_MEMBERSHIP,(char*)&mcast,sizeof(mcast));//接收多播组数据printf(客户端开始接收多播组234.64.71.88上的数据...\n);charbuf[1280];intnAddrLen=sizeof(si);while(TRUE){intnRet=::recvfrom(s,buf,strlen(buf),0,(sockaddr*)&si,&nAddrLen);if(nRet!=SOCKET_ERROR){buf[nRet]='\0';printf(buf);}else{intn=::WSAGetLastError();break;}}}执行结果:五、实验小结1.进行广播通信时接收程序(即要接收数据的客户端)只需要绑定到特定的端口号。调用recvfrom函数即可接收到广播数据,其中端口号用来说明参与通信的进程。2.TCP通信中recv函数仅会从数据发送方接收数据,UDP通信中recvfrom还会增加返回数据发送方的地址及其大小的参数3.Sleep函数中的单位为ms而sleep函数中的单位为s4.为了减轻网络负担,避免资源无谓浪费,采用多播的地址将数据包发送到网络节点的一个集合而非每个节点5.执行的时候出现需要自定义IP_ADD_SOURCE_MEMBERSHIP的值为156.用win10的系统发现不能接收到数据六、附录《网络编程技术与应用》
本文标题:基于-广播模型的通信程序设计
链接地址:https://www.777doc.com/doc-7273490 .html