软件1141《Linux操作系统》结业大作业题题目:基于UDP多播技术的群聊服务器及其客户端要求:1.运行在Linux系统平台上2.C语言编程3.基于TCP/IPsocket编程4.基于UDP多播技术5.每一个多播组成员针对多播组全体成员发送消息并接收来自每一个多播组成员的消息,至少要求三个多播组成员。6.(尽量)使用多线程技术7.当多个多播组成员同时发送消息时要避免冲突,保证信息的正确与不丢失。8.第12周五上午12点以前交(电子版发到指定邮箱)程序源码(加注释)及其运行结果截屏图。9.源码及其运行结果不得与人雷同。课程报告内容及格式要求:2.1.程序源码及其简要注释;2.2.调试过程中出现的问题及相应解决办法;2.3.总体运行情况与结果分析讨论2.4上交结果:课程报告和程序源码。2.1.程序源码及其简要注释服务器的源代码如下:#includestdio.h#includestring.h#includeunistd.h#includesys/types.h#includesys/socket.h#includestdlib.h#includenetinet/in.h#includearpa/inet.h#includepthread.h#definePORT1234#defineMAXDATASIZE100#defineBUFLEN255intmain(intargc,char*argv[]){structARG*arg;structsockaddr_inpeeraddr;intsockfd,on=1;intnum,i;charmsg[BUFLEN+1];pthread_ttid;socklen_tlen;charbuf[MAXDATASIZE];/*要求运行时输入ip地址和端口号*/if(argc!=3){printf(usage:%sipaddressport\n,argv[0]);exit(0);}/*套接字的设置*/sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){fprintf(stderr,socketcreatingerrorintserv.c\n);exit(1);}/*设置广播方式SO_BROADCAST*/setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int));memset(&peeraddr,0,sizeof(structsockaddr_in));peeraddr.sin_family=AF_INET;if(inet_pton(AF_INET,argv[1],&peeraddr.sin_addr)=0){printf(WrongdestIPaddress\n);exit(0);}peeraddr.sin_port=htons(atoi(argv[2]));len=sizeof(peeraddr);/*服务器无限循环接收消息的代码*/while(1){num=recvfrom(sockfd,buf,MAXDATASIZE,0,(structsockaddr*)&peeraddr,&len);//服务器接收消息if(num0){perror(recvfrom()error\n);exit(1);}buf[num]='\0';//设置字符串数组内容结束/*发送客户端传来的消息*/sendto(sockfd,buf,sizeof(buf),0,(structsockaddr*)&peeraddr,len);}close(sockfd);}客户端的源代码如下:#includestdio.h#includestring.h#includeunistd.h#includesys/types.h#includesys/socket.h#includestdlib.h#includenetinet/in.h#includenetdb.h#definePORT1234#defineMAXDATASIZE100#defineBUFLEN255intmain(intargc,char*argv[]){structsockaddr_inlocaladdr;intsockfd,n,num;charbuf[MAXDATASIZE],sendbuf[MAXDATASIZE];pid_tpid;charmsg[BUFLEN+1];/*运行客户端时输入端口号*/if(argc!=2){printf(usage:%sport\n,argv[0]);exit(0);}/*设置套接字*/sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd0){fprintf(stderr,socketcreatingerrorintcli.c\n);exit(1);}memset(&localaddr,0,sizeof(structsockaddr_in));/*设置端口号*/localaddr.sin_port=htons(atoi(argv[1]));localaddr.sin_addr.s_addr=htonl(INADDR_ANY);intopt=SO_REUSEADDR;/*设置套接字选项为SO_REUSEADDR,让端口释放后可立即使用*/setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));if(bind(sockfd,(structsockaddr*)&localaddr,sizeof(structsockaddr_in))0){fprintf(stderr,binderrorintcli.c\n);exit(2);}/*客户端无限循环发送消息并接收消息,当用户输入Exit的时候退出。但是这里有一点没做好,就是客户端必须先发送才能接收,我在使用多线程的过程中遇到了困难*/while(1){/*提示输入消息,5秒后发送给服务器*/printf(sendyourmessage:(send\Exit\exit));scanf(%s,sendbuf);sleep(5);sendto(sockfd,sendbuf,strlen(sendbuf),0,(structsockaddr*)&localaddr,sizeof(localaddr));socklen_tlen;len=sizeof(localaddr);while(1){/*接收服务器广播的消息*/if((num=recvfrom(sockfd,buf,MAXDATASIZE,0,(structsockaddr*)&localaddr,&len))==-1){printf(recvfrom()error\n);exit(1);}buf[num]='\0';printf(ReciveMessage:%s.\n,buf);sleep(2);break;}/*比较用户输入的消息与”Exit是否一样,一样就break退出”*/if(strcmp(buf,Exit)==0)break;}close(sockfd);}显示如下图1:图1评分标准:i.基本完成程序,有多播概念,但编译、执行有错,有课程报告——及格ii.基本完成程序,有多播概念,编译通过,但执行结果有错,有课程报告——中iii.较好完成程序,执行结果基本正确,有课程报告——良iv.圆满完成程序,执行结果完全正确,课程报告正确——优v.源程序、执行程序和课程报告有缺者——不及格