




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 设计题目基于UDP多播技术的群聊服务器及其客户端2 开发环境C语言,Linux3设计要求1. 运行在Linux系统平台上2. C语言编程3. 基于TCP/IP socket编程4. 基于UDP多播技术5. 每一个多播组成员针对多播组全体成员发送消息并接收来自每一个多播组成员的消息6. (尽量)使用多线程技术7. 当多个多播组成员同时发送消息时要避免冲突,保证信息的正确与不丢失。4 流程图客户端和服务器程序运行的流程图如下:其中每个客户端都是如此同服务器端进行通讯的。户数据处理客到客户数据阻塞直到接收数据应答数据请求5 详细设计1. 。2. 关于server端的设计步骤如下:(1)初始化本地(server)的套接字地址结构localaddrmemset(&localaddr,0,sizeof(struct sockaddr_in);localaddr.sin_family=AF_INET;localaddr.sin_port=htons(atoi(argv2);localaddr.sin_addr.s_addr = htonl(INADDR_ANY);/设置端口重用int opt = SO_REUSEADDR;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt);(2)为套接字绑定本地地址协议if(bind(sockfd,(struct sockaddr *)&localaddr,sizeof(localaddr)=-1)perror(Bind() error.);exit(1);(3)初始化组播的套接字地址结构memset(&peeraddr,0,sizeof(struct sockaddr_in);peeraddr.sin_family=AF_INET;if(inet_pton(AF_INET,argv1,&peeraddr.sin_addr)=0) printf(Wrong multicast IP addressn); exit(0);peeraddr.sin_port=htons(atoi(argv2);(4)sever端处理接收数据 while(1) memset(msg,0,255);/printf(%s%dttttt%dn,msg,a+,(strlen(msg)-1); if(read(sockfd,msg,255,0) 0) printf(-fromClient-%sn,msg); printf(|-|n);if(num = sendto(sockfd,msg,3,0,(struct sockaddr *)&peeraddr,sizeof(struct sockaddr_in) = -1) perror(child process-sendton); exit(1); 3. 关于client端的设计步骤如下:(1)初始化本地的套接字地址结构memset(&localaddr,0,sizeof(struct sockaddr_in);localaddr.sin_port=htons(atoi(argv2);localaddr.sin_addr.s_addr=htonl(INADDR_ANY);(2)初始化加入组播的结构体if(inet_pton(AF_INET,172.17.20.251,&mcaddr.imr_interface)=0)/此处输入本机IP,为组播的结构体初始化本机ip,以加入组播perror(MCAddr Ip-failure);exit(0);if(inet_pton(AF_INET,argv1,&mcaddr.imr_multiaddr)=0) printf(Wrong multicast IP addressn); exit(0);/printf(ip:%sn,inet_ntoa(mcaddr.imr_multiaddr);fflush(stdout);/刷新输出缓冲区(3)加入多播组if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(struct ip_mreq) 0) /父进程用于发送信息 strcpy(nameMsg,argv3); strcat(nameMsg,:); fgets(msg,255,stdin); printf(|-|n); strncat(nameMsg,msg,strlen(msg); if(strlen(msg)-1)0) if(n = sendto(sockfd,nameMsg,strlen(nameMsg),0,(struct sockaddr *)&server,sizeof(server) = -1) perror(parent process-sendton); exit(1); (7) 子进程用于接收信息 else if(pid = 0) /子进程用于接收信息memset(msg,0,255); if(read(sockfd,msg,255,0) 0) printf(-fromServer-%sn,msg); printf(|-|n); else perror(fork error);4. 运行时需注意(1) 服务器端服务器运行时,只需要在运行命令中./s 224.1.5.3 1234(2) 客户端客户端需要按每个机器的ip进行设置,然后编译执行,才能运行成功在编译client前分别将其中的本机ip和服务器的ip,否则bind出错./c 224.1.5.3 1234 y./c 224.1.5.3 1234 p6运行结果运行结果如下图:1.其中一台pc做sever端的截图如下2.另外有两台pc做服务器端截图如下 (pc1上的截图)(pc2上的截图)7 总结自己此次实验及平时所学于一身,是我们这学期网络编程的一个综合运用,难度比平时的作业的都大。起初是不知道如何下手,但是通过反复的看平时的作业,查阅课本,和上网收集资料后加上自己的一些理解,终于我还是编写了出来,从此次实验中,我才算理解socket套接字,IPv4套接字地址结构的具体内容及其设置(初始化)TCP和UDP通信的条件设置,真正知道什么是组播,如何加入一个组播组。对于线程,虽然线程效率高并占用的资源少,但是我的使用不是和熟练,所以此次实验我使用的是进程。为了避免客户端和服务器中收发信息冲突,我使用父线程和子线程分别负责信息的接收和发送。源程序/服务器server端的程序如下#include #include #include #include #include #include #define BUFLEN 255int main(int argc,char *argv) struct sockaddr_in peeraddr,localaddr; pid_t pid;int sockfd,on=1;int num,i;char msgBUFLEN;int a=1;if(argc!=3) printf(Please input command like./%sn,argv0); exit(0); sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd0) printf(Socket creating errorn); exit(1);/初始化本地(server)的套接字地址结构localaddrmemset(&localaddr,0,sizeof(struct sockaddr_in);localaddr.sin_family=AF_INET;localaddr.sin_port=htons(atoi(argv2);localaddr.sin_addr.s_addr = htonl(INADDR_ANY);/设置端口重用int opt = SO_REUSEADDR;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt);/为套接字绑定本地地址协议if(bind(sockfd,(struct sockaddr *)&localaddr,sizeof(localaddr)=-1)perror(Bind() error.);exit(1);/初始化组播的套接字地址结构memset(&peeraddr,0,sizeof(struct sockaddr_in);peeraddr.sin_family=AF_INET;if(inet_pton(AF_INET,argv1,&peeraddr.sin_addr) 0) /父进程用于接收信息memset(msg,0,255);/printf(%s%dttttt%dn,msg,a+,(strlen(msg)-1); if(read(sockfd,msg,255,0) 0) printf(-fromClient-%sn,msg); printf(|-|); else if(pid = 0) /子进程用于发送信息/printf(%s%dttttt%dn,msg,a+,(strlen(msg)-1); if(num = sendto(sockfd,msg,strlen(msg),0,(struct sockaddr *)&peeraddr,sizeof(struct sockaddr_in) = -1) perror(child process-sendton); exit(1); else perror(fork error);/客户端client的程序如下:#include #include #include #include #include #include #define BUFLEN 255int main(int argc,char* argv) struct sockaddr_in localaddr,server; int sockfd,n; pid_t pid; struct ip_mreq mcaddr; char nameMsgBUFLEN,msgBUFLEN;int a=1;if(argc4) printf(Please input command like./%sn,argv0); exit(0); sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd0) fprintf(stderr,Socket creating errorn); exit(1);/初始化server的套接字地址结构memset(&server,0,sizeof(struct sockaddr_in);server.sin_family = AF_INET;server.sin_port=htons(atoi(argv2);if(inet_pton(AF_INET,172.17.20.52,&server.sin_addr)=0)/此处输入服务器的IP,初始化server的ipperror(Server Ip-failure);exit(0);/初始化本地的套接字地址结构memset(&localaddr,0,sizeof(struct sockaddr_in);localaddr.sin_port=htons(atoi(argv2);localaddr.sin_addr.s_addr=htonl(INADDR_ANY);/初始化加入组播的结构体if(inet_pton(AF_INET,172.17.20.251,&mcaddr.imr_interface)=0)/此处输入本机IP,为组播的结构体初始化本机ip,以加入组播perror(MCAddr Ip-failure);exit(0);if(inet_pton(AF_INET,argv1,&mcaddr.imr_multiaddr)=0) printf(Wrong multicast IP addressn); exit(0);/printf(ip:%sn,inet_ntoa(mcaddr.imr_multiaddr);fflush(stdout);/刷新输出缓冲区/加入多播组if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(struct ip_mreq) 0) /父进程用于发送信息 strcpy(nameMsg,argv3); strcat(nameMsg,:); fgets(msg,255,stdin); printf(|-|n); strncat(nameMsg,msg,strlen(msg); if(strlen(msg)-1)0)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小白兔过河题目及答案
- 2025高考英语试题分类汇编:词类、短语辨析含解析
- 2025长期合作协议范本
- 2025授权贷款合同代理书模板
- 2025年建筑架子工(普通架子工)测试题(含答案)
- 物态变化实验试题及答案
- 2025项目部合同管理规程
- 2025年3月药学练习题库(含答案)
- 2025年国家特种设备安全管理人员A证考试题库(含答案)
- 2025养殖场租赁合同协议书
- 重症护理的护理课件
- 《电梯企业介绍》课件
- 《风景区概述》课件
- (完整版)书籍装帧设计
- 汉字形旁分类及其组字表
- NY-T 4251-2022 牧草全程机械化生产技术规范
- 代建项目安全生产管理办法20191226
- GB/T 26463-2011羰基合成脂肪醇
- 静脉治疗护理质量评价标准
- 连铸坯质量控制与缺陷控制课件
- 沥青混合料低温弯曲试验2002363
评论
0/150
提交评论