当前位置: 首页 > news >正文

C/S架构学习之组播

  • 组播:
  • 过多的广播会占用网络带宽,产生广播风暴的现象,从而影响正常的通信活动;
  • 组播(或者多播)是局域网内部的通信,只有加入到某个多播组的主机才能收到数据;
  • 组播的方式既可以发给多个主机,又能避免广播带来过多的网络负载;
  • 组播地址:D类地址:“224.0.0.1~239.255.255.254”;
  • 设置组播的流程:
  • 发送方(UDP的客户端):
  • 一、创建用户数据报套接字(socket函数):
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket error");exit(-1);}
  • 二、填充组播信息结构体( struct sockaddr_in):
	struct sockaddr_in serveraddr;socklen_t serveraddr_len = sizeof(serveraddr);memset(&serveraddr,0,serveraddr_len);serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(M_IP);serveraddr.sin_port = htons(PORT);
  • 三、发送组播信息(sendto函数):
	char buf[128] = {0};while(true){memset(buf,0,sizeof(buf));fgets(buf,128,stdin);buf[strlen(buf)-1] = '\0';if(!strncmp(buf,"quit",4)){break;}//给服务器发送数据if(-1 == (sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&serveraddr,serveraddr_len))){perror("sendto error");exit(-1);}}
  • 四、关闭用户数据报套接字(close函数):
 	close(sockfd);
  • 接收方(UDP的服务器):
  • 一、创建用户数据报套接字(socket函数):
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket error");exit(-1);}
  • 二、填充组播信息结构体(struct sockaddr_in):
	struct sockaddr_in serveraddr,clientaddr;socklen_t serveraddr_len = sizeof(serveraddr);socklen_t clientaddr_len = sizeof(clientaddr);memset(&serveraddr,0,serveraddr_len);serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(M_IP);serveraddr.sin_port = htons(PORT);
  • 三、用户数据报套接字和广播信息结构体绑定(bind函数):
	if(-1 == (bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len))){perror("bind error");exit(-1);}
  • 四、设置加入多播组(setsockopt函数):
	struct ip_mreqn {struct in_addr imr_multiaddr; struct in_addr imr_address;   int            imr_ifindex;   };struct ip_mreqn multi_group;multi_group.imr_address.s_addr = INADDR_ANY;multi_group.imr_multiaddr.s_addr = inet_addr(M_IP);multi_group.imr_ifindex = 0;if(-1 == (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&multi_group,sizeof(multi_group)))){perror("setsockopt error");exit(-1);}
  • 五、接收组播信息(recvfrom函数):
	char buf[128] = {0};while(true){memset(buf,0,sizeof(buf));if(-1 == recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,&clientaddr_len)){perror("recvfrom error");exit(-1);}printf("客户端[%s:%d]发来数据[%s]\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),buf);}
  • 六、关闭用户数据报套接字(close函数):
 	close(sockfd);
http://www.lryc.cn/news/219834.html

相关文章:

  • vue package.json Script配置讲解
  • wagtail的使用
  • 【JavaScript】零碎知识点总结_2
  • P1182 数列分段 Section II 题解
  • vscode1.83远程连接失败
  • Leetcode-141 环形链表
  • 深入了解汽车级功率MOSFET NVMFS2D3P04M8LT1G P沟道数据表
  • C 作用域规则
  • Go中第一类函数
  • Linux内核分析(五)--IO机制原理与系统总线
  • oracle-sql语句执行过程
  • 京东数据分析:2023年9月京东打印机行业品牌销售排行榜
  • Flutter 自签名证书
  • 观察者模式——解决解耦的钥匙
  • MATLAB和西门子SMART PLC UDP通信
  • 打造高效运营底座,极智嘉一体化软件系统彰显科技威能
  • sqlsugar查询数据库下的所有表,批量修改表名字
  • 如何用 GPT-4 全模式(All Tools)帮你高效学习和工作?
  • Cesium 展示——移动拖拽实体
  • javaSE学习笔记-未完
  • 分享一下微信小程序里怎么创建会员卡功能
  • 吴恩达《机器学习》5-6:向量化
  • 《面向对象软件工程》笔记——1-2章
  • 1400台光刻机,ASML突然大举倾销,外媒惊呼中国芯片进展太快了
  • Leetcode—187.重复的DNA序列【中等】
  • inno setup 运行时进行文件复制和替换
  • 睿思BI已支持3D图形
  • ARCGIS---dem生成高程点
  • 2034:D 类音频功率放大器的引脚排列
  • 计算机网络第4章-IPv4