基于UDP多播聊天室.docxVIP

  • 5
  • 0
  • 约7.23千字
  • 约 11页
  • 2021-01-16 发布于山东
  • 举报
设计题目 基于 UDP 多播技术的群聊服务器及其客户端 开发环境 C 语言, Linux 设计要求 运行在 Linux 系统平台上 C 语言编程 基于 TCP/IP socket编程 基于 UDP 多播技术 每一个多播组成员针对多播组全体成员发送消息并接收来自每一个多播组成员的消 息 (尽量)使用多线程技术 当多个多播组成员同时发送消息时要避免冲突,保证信息的正确与不丢失。 流程图 客户端和服务器程序运行的流程图如下: 其中每个客户端都是如此同服务器端进行通讯的。 处理客 户数据  数据请求 数据应答 5 详细设计 。 关于 server 端的设计步骤如下: 1)初始化本地( server)的套接字地址结构 localaddr memset(localaddr,0,sizeof(struct sockaddr_in)); localaddr.sin_family=AF_INET; localaddr.sin_port=htons(atoi(argv[2])); 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,argv[1],peeraddr.sin_addr)=0) { printf([Wrong multicast IP address]\n); exit(0); } peeraddr.sin_port=htons(atoi(argv[2])); (4)sever 端处理接收数据 while(1) { memset(msg,0,255); //printf(%s%d\t\t\t\t\t%d\n,msg,a++,(strlen(msg)-1)); if(read(sockfd,msg,255,0) = 0) { perror(read:); exit(1); } if((strlen(msg)-1)0) {printf([-fromClient-]%s\n,msg); printf(|--------------------------------------------------------------------|\n); if((num = sendto(sockfd,msg,3,0,(struct sockaddr *)peeraddr,sizeof(struct sockaddr_in))) == -1) { perror([child process-----sendto]\n); exit(1); } } } } 关于 client 端的设计步骤如下: (1)初始化本地的套接字地址结构 memset(localaddr,0,sizeof(struct sockaddr_in)); localaddr.sin_port=htons(atoi(argv[2])); 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,argv[1],mcaddr.imr_multiaddr)=0) { printf([Wrong multicast IP address]\n); exit(0); } //printf(ip:%s\n,inet_ntoa(mcaddr.imr_multiaddr)); fflush(stdout);// 刷新输出缓冲区 加入多播组 if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,mcaddr,sizeof(struct ip_mreq))0) { perror([setsockopt e

文档评论(0)

1亿VIP精品文档

相关文档