免费网站app下载,营销型品牌网站建设价格,成都网站建设收费,四川门户网站建设1、什么是组播 在上一篇博客中#xff0c;对UDP的广播通信进行了由浅入深的总结梳理#xff0c;本文继续对UDP的知识体系进行探讨#xff0c;旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间#xff0c;在一个局域网内#xff0c;将某些主机添加到组中…1、什么是组播 在上一篇博客中对UDP的广播通信进行了由浅入深的总结梳理本文继续对UDP的知识体系进行探讨旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间在一个局域网内将某些主机添加到组中并设置一个组地址。将数据发送到组播地址时加入到该组的所有主机都能接收到数据。 组播、单播和广播都是报文传输的一种方式。 单播是主机间一对一的通信模式设备只会将数据发送到唯一指定的接收者。 广播是主机间一对所有的通信模式设备会将数据发送到网络中的所有可能的接收者。设备简单地将它收到的任何广播报文都复制并转发到除该报文到达的接口外的每个接口。广播处理流程简单不用选择路径。 组播是主机间一对多的通信模式 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。类似于生活中较为常见的群聊功能在群内的所有群员都可以在群内发送消息给群友也可以接收到来自任意群友的消息。 为了帮助读者更进一步的理解UDP的单播、组播和广播功能绘制了如下所示的总结图。 2、IP地址分类 因为组播通信需要设置IP地址且必须是D类IP地址但是考虑到每位博客读者的基础不同知识贮备有较大差距所以在这一小部分简单讲解一下IP地址的分类及用途在后面程序设计中需要用到这个E类IP地址。 IP地址 网络号 主机号 网络号指的是不同的网络 主机号指的是同一个网段下用来识别不同的主机。那也就是说主机号所占的位数越多在该网段下的主机数越多。
A类地址保留给政府机构使用 A类IP地址就由1字节的网络地址和3字节主机地址组成网络地址的最高位必须是“0” A类地址范围 1.0.0.1 - 126.255.255.254
B类地址分配给中等规模的公司 B类IP地址就由2字节的网络地址和2字节主机地址组成网络地址的最高位必须是“10”。 B类地址范围 128.0.0.1 - 191.255.255.254
C类地址分配给任何需要的人 C类IP地址就由3字节的网络地址和1字节主机地址组成网络地址的最高位必须是“110”。 C类地址范围 192.0.0.1 - 223.255.255.254
D类地址用于组播 组播地址不同于单播地址它并不属于特定某个主机而是属于一组主机。一个组播地址表示一个群组需要接收组播报文的接收者都加入这个群组。 D类地址范围 224.0.0.1 - 239.255.255.254
E类地址用于实验 E类地址范围 240.0.0.1 - 255.255.255.254
特殊地址每一个字节都为0的地址“0.0.0.0”对应于当前主机 INADDR_ANY —代表当前主机所有的地址 127001 回环地址 — 在当前主机内部自动形成闭环的网络 — 主要用于主机内部不同的应用程序间通信 如果已经确定当前客户端 和 服务器 都是在同一台主机上运行那么可以使用本地回环地址
3、组播的特点及应用
(1)、特点
效率高组播传输的数据包只需要经过一次发送操作就可以同时传输到多个接收者可以有效地降低网络传输的负载。可扩展性组播支持动态加入和退出组播组能够自适应地处理组播成员的加入和离开。IP组播地址在IPv4中组播使用D类地址224.0.0.0至239.255.255.255而在IPv6中组播地址以ff00::/8开头。这些特殊地址用于标识不同的组播组使路由器能够识别并正确转发组播报文。路由协议的支持为有效管理组播流量互联网工程任务组(IETF)定义了几种专门的组播路由协议如PIMProtocol Independent Multicast、DVMRPDistance Vector Multicast Routing Protocol等它们帮助确定最有效的路径来分发组播数据。不可靠性与普通的UDP一样组播只提供不可靠的数据传输服务。如果某个接收者没有接收到数据包发送者不会得到任何提示或反馈信息。
(2)、应用
多媒体流媒体在局域网或广域网上传输音视频流快速向多个接收者发送相同的视频和音频数据。分布式应用的数据分发实现高效的数据分发例如在大型集群环境下广播服务的状态信息。网络游戏用于多人联机游戏使多个玩家能够同时收到相同的游戏状态和动作。网络广播向多个设备广播事件和消息例如路由器向所有连接的设备发送网络配置信息。实时数据更新用于实时的数据更新例如在金融行业订阅财经数据的实时更新。
4、组播的通信流程 组播通信的发送端程序与普通UDP发送端创建流程几乎一致区别在于其目标IP地址需要换成D类IP地址。 组播通信的接收端则是需要在普通UDP接收端程序的基础上增加一步“加群”的操作即将当前的IP地址设置到组播地址中。 5、组播通信的程序
(1)、组播发送端步骤
①、创建UDP套接字
int socketfd socket(AF_INET,SOCK_DGRAM,0);
②、发送数据往组播地址(224.0.0.10 )里面发送数据
struct sockaddr_in sendAddr;//IPV4地址结构体变量
sendAddr.sin_family AF_INET;
sendAddr.sin_port htons(GROUPPORT);
sendAddr.sin_addr.s_addr inet_addr(GROUPADDR);//一定是组播地址
sendto(socketfd, buf, strlen(buf), 0, (struct sockaddr *)sendAddr, sizeof(sendAddr));
③、关闭套接字
close(socketfd);
(2)、组播接收端步骤
①、创建UDP套接字
int socketfd socket(AF_INET, SOCK_DGRAM, 0);
②、设置组播ip初始化 组播结构体
函数原型#include arpa/inet.hint inet_pton(int af, const char *src, void *dst);//函数原型
函数参数af 你要选择哪一种协议族 IPV4 --》AF_INET 还是 IPV6--》AF_INET6src: 本地IP地址dst将本地IP地址转为网络IP地址存储到这里
函数功能将本地IP地址转为网络IP地址
函数返回值成功返回0 失败返回-1//配置方法
struct ip_mreq vmreq;
inet_pton(AF_INET, 224.0.0.10, vmreq.imr_multiaddr); // 组播地址
inet_pton(AF_INET, 192.168.63.2, vmreq.imr_interface); // 需要添加到组的ip
③、加入组播属性设置套接字 可以接收组播信息
setsockopt(socketfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, vmreq, sizeof(vmreq));
④、绑定地址
struct sockaddr_in saddr;
saddr.sin_family AF_INET;
saddr.sin_port htons(atoi(argv[1]));
saddr.sin_addr.s_addr htonl(INADDR_ANY); //htonl(INADDR_ANY) 代表 主机所有的地址
bind(socketfd, (struct sockaddr *)saddr, sizeof(saddr));
⑤、接收数据
recvfrom(......)
(3)、组播实现程序
①、组播发送端
#includestdio.h
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include arpa/inet.h
#include string.h#define GROUPADDR 224.0.0.10 //组播地址
#define GROUPPORT 10000int main()
{printf(组播发送端.....\n);//1、创建UDP数据报套接字int socketfd socket(AF_INET,SOCK_DGRAM,0);if(socketfd -1){perror(socket error);return -1;}//2、发送数据往组播地址(224.0.0.10 )里面发送数据struct sockaddr_in sendAddr;//IPV4地址结构体变量sendAddr.sin_family AF_INET;sendAddr.sin_port htons(GROUPPORT);sendAddr.sin_addr.s_addr inet_addr(GROUPADDR);//一定是组播地址while(1){char buf[1024]{0};printf(data:);scanf(%s,buf); sendto(socketfd,buf,strlen(buf),0,( struct sockaddr *)sendAddr,sizeof(sendAddr));}//3、关闭 close(socketfd);return 0;
}
②、组播接收端
#includestdio.h
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include arpa/inet.h
#include string.h#define OWNADDR 192.168.112.109 //接收端的IP地址 当前ubuntu的IP地址
#define GROUPADDR 224.0.0.10 //组播地址
#define GROUPPORT 10000int main()
{printf(组播接收端.....\n);//1、创建UDP套接字int socketfd socket(AF_INET,SOCK_DGRAM,0);if(socketfd -1){perror(socket error);return -1;}//2、定义组播结构体struct ip_mreq vmreq;//3、设置组播ip初始化 组播结构体inet_pton(AF_INET,GROUPADDR,vmreq.imr_multiaddr); // 组播地址inet_pton(AF_INET,OWNADDR,vmreq.imr_interface); // 需要添加到组的ip//4加入组播属性也就是设置这个套接字 可以接收组播信息setsockopt(socketfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,vmreq,sizeof(vmreq));//5绑定地址struct sockaddr_in saddr;saddr.sin_family AF_INET;saddr.sin_port htons(GROUPPORT);saddr.sin_addr.s_addr htonl(INADDR_ANY); //htonl(INADDR_ANY) 代表 主机所有的地址bind(socketfd,(struct sockaddr *)saddr,sizeof(saddr));//6接收数据struct sockaddr_in otherAddr;int len sizeof(struct sockaddr_in);while(1){char buf[1024]{0};recvfrom(socketfd,buf,sizeof(buf),0, (struct sockaddr *)otherAddr,len);printf(来自 %s:%u recv:%s\n,inet_ntoa(otherAddr.sin_addr),ntohs(otherAddr.sin_port),buf);}//关闭 close(socketfd);return 0;
}