单播、组播(多播)、广播概念及C语言编程demo
创始人
2025-05-30 20:06:21
0

背景

日常的网络编程中,不管是TCP还是UDP,应用程序主要是基于单播,即点对点通信,对组播和广播涉及的相对少。这里先用通俗的例子解析一下这三者的区别:

  1. 单播:有具体目标地址的帧从源到达目标地址的过程。比如你对张三喊“张三”,哪么只有张三答应你.
  2. 多播(组播):帧送往定义在一组内的地址。比如你喊:姓张的请举手,那么只有姓张才会举手回应你,其他不姓张的人,就不会举手。
  3. 广播:把帧发往所有能到达的地址。比如你在学校的广播中喊“今天放假”。哪么全校的同学都能听到,然后欢呼。

特别注意:组播和广播是通过UDP实现的,TCP不支持组播和广播

组播、广播的应用场景:
在IOT物联网领域,组播和广播一般可用作设备的搜索发现,设备启动,并且有网络能力后,会通过组播或广播,向局域网内发布自己的设备信息,然后其他设备就能够发现感兴趣的设备,进而跟这些局域网内的设备通信。

组播编程

组播地址范围

组播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从 224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:

  1. 局部链接多播地址范围在 224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;
  2. 预留多播地址为 224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;
  3. 管理权限多播地址为 239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有 IP 地址,不能用于 Internet,可限制多播范围。

我们一般使用224.0.0.0~224.0.0.255范围作为组播地址,比如mDNS协议,就使用224.0.0.251固定地址。

组播编程demo

组播监听demo

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include // 接收组播地址为224.0.0.88  的信息
int main(int argc,char *argv[]){int socked=socket(AF_INET,SOCK_DGRAM,0);if(socked<0){perror("socket failed!");return -1;}char group[16]="224.0.0.88";struct sockaddr_in local_addr;memset(&local_addr,0,sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_addr.s_addr = htonl(INADDR_ANY);local_addr.sin_port = htons(8888);int ret = bind(socked, (struct sockaddr*)&local_addr, sizeof(local_addr));if(ret<0){perror("bind failed !");return -1;}struct ip_mreq mreq;mreq.imr_multiaddr.s_addr = inet_addr(group);mreq.imr_interface.s_addr = htonl(INADDR_ANY);/***  int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);* param:*      optname*          * IP_MULTICAST_LOOP 支持多播数据回送*          * IP_ADD_MEMBERSHIP 加入多播组*          * IP_DROP_MEMBERSHIP 离开多播组*      optval*          * IP_MULTICAST_LOOP 选项对应传入 unsigned int 来确认是否支持多播数据回送*          * IP_ADD_MEMBERSHIP 传入 ip_mreq*          * IP_DROP_MEMBERSHIP 传入 ip_mreq** */ret=setsockopt(socked,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));if(ret<0){perror("setsockopt failed !");return -1;}else{printf("setsockopt success\n");}char buf[1024];int length=0;struct sockaddr_in sender;socklen_t sender_len=sizeof(sender);while (1){memset(buf, 0, sizeof(buf));length=recvfrom(socked, buf, sizeof(buf), 0, (struct sockaddr*)&sender,&sender_len);buf[length]='\0';printf("%s %d : %s\n",inet_ntoa(sender.sin_addr),ntohs(sender.sin_port),buf);}setsockopt(socked, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));close(socked);return 0;
}

组播发送demo

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include //向组播地址为224.0.0.88的组发送信息
int main() {int cnt = 0;char group_addr[16]="224.0.0.88";int socked=socket(AF_INET,SOCK_DGRAM,0);if(socked<0){perror("socket failed!");return -1;}struct sockaddr_in remote_addr;memset(&remote_addr,0,sizeof(remote_addr));remote_addr.sin_family=AF_INET;remote_addr.sin_addr.s_addr=inet_addr(group_addr);remote_addr.sin_port=htons(8888);char buf[1024];int length=0;while(1){memset(buf, 0, sizeof(buf));sprintf(buf, "this is a group udp msg[%d].\n", cnt++);length=sendto(socked,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(remote_addr));printf("Send Message%s\n",buf);sleep(1);}close(socked);return 0;
}

广播编程

广播地址:255.255.255.255

广播demo

广播监听demo

#include
#include
#include          
#include 
#include 
#include 
#include 
#include int main(int argc  ,char *argv[])
{if(argc<3){printf("input fail lose ip port");exit(1);}int sockfd;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("fail to sockfd");exit(1);}struct sockaddr_in mysockaddr;mysockaddr.sin_family = AF_INET;mysockaddr.sin_port =htons(atoi(argv[2]));mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);socklen_t addrlen= sizeof(mysockaddr);if(bind(sockfd,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("fail to bind");exit(1);}char buf[1024];struct sockaddr_in sendsockaddr;socklen_t sendaddrlen=sizeof(sendsockaddr);while(1){	memset(buf, 0, sizeof(buf));if(recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&sendsockaddr,&sendaddrlen)==-1){perror("fail to recvfrom");exit(1); }printf("[%s ‐ %d]: %s\n", inet_ntoa(sendsockaddr.sin_addr), ntohs(sendsockaddr.sin_port),buf);}close(sockfd);return 0;}

广播发送demo

#include
#include
#include          
#include 
#include 
#include 
#include int main(int argc  ,char *argv[])
{if(argc<3){printf("error lose ip port\n");exit(1);}int sockfd;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("fail to sockfd");exit(1);}int on =1;if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on))==-1){perror("fail to setsockopt");exit(1);}struct sockaddr_in mysockaddr;mysockaddr.sin_family = AF_INET;mysockaddr.sin_port =htons(atoi(argv[2]));mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);socklen_t addrlen= sizeof(mysockaddr);char buf[128];while(1){	fgets(buf,sizeof(buf),stdin);if(sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("fail to sendto");exit(1);}	    	}close(sockfd);return 0;  
}

小结

  1. 单播是点对点通信。
  2. 组播是一对多通信。
  3. 广播是一对全部通信。
  4. 组播和广播针对的是UDP,TCP不支持。
  5. 在物联网应用中,组播和广播可以用作设备局域网内搜索发现,mDNS就是通过组播技术实现。

相关内容

热门资讯

每周股票复盘:传音控股(688... 截至2025年7月25日收盘,传音控股(688036)报收于76.2元,较上周的74.69元上涨2....
上海第六批土拍收官:全国单价地... 观点网7月25日,为期两日的上海六批次8宗地土拍落下帷幕,热度再创新高。 第二日出让的3宗地块分布于...
“国补”来了!第三批690亿元... 关注我们哦! 国家发展改革委下达今年第三批690亿元超长期特别国债支持消费品以旧换新资金 2025年...
和讯投顾黄杰:股市最近应该买阴... 今天怎么操作?和讯投顾黄杰分析,今天的策略是尾盘低吸科技低吸小票,或者明天低吸科技低吸小票,这是我的...
市场监管总局:已暂停充电宝及电... 7月25日,市场监管总局消息,从2024年开始将充电宝及其关键部件锂电池纳入CCC认证管理,近日正组...
门店“转卖”会员,把消费者当什... 预付式消费以其便捷与优惠在健身、教培、美容等行业广泛应用。针对预付式消费门店完全“跑路”的情况,相关...
财政部:上半年共发行超长期特别... 上证报中国证券网讯(记者 李苑)财政部国库支付中心副主任唐龙生25日在财政部新闻发布会上表示,上半年...
调查:A股、美股、黄金即将发生... 来源:华尔街情报圈 一系列即将发生的事件可能会扰乱日趋平静的市况,下周市场将有很多事情需要消化。 ...
运行总体平稳 支出力度加大 新华社北京7月25日电(申铖 欧阳剑环)财政部25日发布的上半年财政收支半年报显示,今年以来,财政运...
情暖老党员!日照银行东港中心支... 大众网记者 陈璐 日照报道 为传承党的优良传统,践行社会责任,近日,日照银行东港中心支行党委组织党员...
石头扫地机二次上市虽不性感,但... 来源:晚点LatePost 虽然扫地机已与机器人概念脱钩,但国内品牌商正与持续增长的确定性挂钩...
交易限额!两大交易所出手,焦煤... 当下最火爆的两个期货品种——焦煤、碳酸锂,7月25日都迎来了交易限额要求。 7月25日,根据交易所通...
晶方科技涨0.90%,成交额8... 来源:新浪证券-红岸工作室 7月25日,晶方科技涨0.90%,成交额8.73亿元,换手率4.65%,...
新央企中国雅江集团,董事长、总... 中国三峡集团网站消息,7月19日,中国三峡集团董事长、党组书记刘伟平在西藏林芝与 中国雅江集团董事长...
人身险预定利率研究值再下调 保... 7月25日,中国保险行业协会公布最新普通型人身保险产品预定利率研究值,1.99%的数值较上一期下调了...
近半数投顾机构被罚,超六成涉虚... 文/王占全 导语 2025年证券投顾行业再掀监管风暴!黑龙江证监局日前对容维公司开出年内第二张罚单,...
新一轮Meme股热潮迎微妙转折... 高盛集团交易部门周五表示,新一轮Meme股热潮推动一批小型公司股价大涨后,其客户对押注无盈利科技股下...
增持未在规定时间内停止交易!荣... 浙江省证监局近日发布关于对浙江荣盛控股集团有限公司采取出具警示函措施的决定。 经查,荣盛控股集团于...
72岁“稀土大王”蒋泉龙被踢出... 红星资本局7月25日消息,近期,A股稀土板块行情持续火热,热度也蔓延到了港股。不过,港股上市公司、家...
上半年30个省份“半年报”出炉... 贝壳财经原创出品 记者 张晓翀 任婉晴 任娇 董怡楠 编辑 陈莉 截至7月25日发稿时,全国30个...