資源描述:
《基于udp多播聊天室》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、1設(shè)計題目基于UDP多播技術(shù)的群聊服務器及其客戶端2開發(fā)環(huán)境C語言,Linux3設(shè)計要求1.運行在Linux系統(tǒng)平臺上2.C語言編程3.基于TCP/IPsocket編程4.基于UDP多播技術(shù)5.每一個多播組成員針對多播組全體成員發(fā)送消息并接收來自每一個多播組成員的消息6.(盡量)使用多線程技術(shù)7.當多個多播組成員同時發(fā)送消息時要避免沖突,保證信息的正確與不丟失。4流程圖客戶端和服務器程序運行的流程圖如下:其中每個客戶端都是如此同服務器端進行通訊的。戶數(shù)據(jù)處理客到客戶數(shù)據(jù)阻塞直到接收數(shù)據(jù)應答數(shù)據(jù)請求5詳細設(shè)計1.。2.關(guān)于server端的設(shè)計步驟如下:(1)初始化本地(server)的套接字
2、地址結(jié)構(gòu)localaddrmemset(&localaddr,0,sizeof(structsockaddr_in));localaddr.sin_family=AF_INET;localaddr.sin_port=htons(atoi(argv[2]));localaddr.sin_addr.s_addr=htonl(INADDR_ANY);//設(shè)置端口重用intopt=SO_REUSEADDR;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));(2)為套接字綁定本地地址協(xié)議if(bind(sockfd,(struct
3、sockaddr*)&localaddr,sizeof(localaddr))==-1){perror("[Bind()error.]");exit(1);}(3)初始化組播的套接字地址結(jié)構(gòu)memset(&peeraddr,0,sizeof(structsockaddr_in));peeraddr.sin_family=AF_INET;if(inet_pton(AF_INET,argv[1],&peeraddr.sin_addr)<=0){printf("[WrongmulticastIPaddress]");exit(0);}peeraddr.sin_port=htons(atoi(
4、argv[2]));(4)sever端處理接收數(shù)據(jù)while(1){memset(msg,0,255);//printf("%s%dttttt%d",msg,a++,(strlen(msg)-1));if(read(sockfd,msg,255,0)<=0){perror("read:");exit(1);}if((strlen(msg)-1)>0){printf("[-fromClient-]%s",msg);printf("
5、--------------------------------------------------------------------
6、"
7、);if((num=sendto(sockfd,msg,3,0,(structsockaddr*)&peeraddr,sizeof(structsockaddr_in)))==-1){perror("[childprocess-----sendto]");exit(1);}}}}1.關(guān)于client端的設(shè)計步驟如下:(1)初始化本地的套接字地址結(jié)構(gòu)memset(&localaddr,0,sizeof(structsockaddr_in));localaddr.sin_port=htons(atoi(argv[2]));localaddr.sin_addr.s_addr=htonl(IN
8、ADDR_ANY);(2)初始化加入組播的結(jié)構(gòu)體if(inet_pton(AF_INET,"172.17.20.251",&mcaddr.imr_interface)<=0)//此處輸入本機IP,為組播的結(jié)構(gòu)體初始化本機ip,以加入組播{perror("[MCAddrIp---failure]");exit(0);}if(inet_pton(AF_INET,argv[1],&mcaddr.imr_multiaddr)<=0){printf("[WrongmulticastIPaddress]");exit(0);}//printf("ip:%s",inet_ntoa(mcaddr.
9、imr_multiaddr));fflush(stdout);//刷新輸出緩沖區(qū)(3)加入多播組if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mcaddr,sizeof(structip_mreq))<0){perror("[setsockopterror---joinmulticastfailed]");exit(4);}//設(shè)置端口重用intopt=SO_R