UDP多播

这篇具有很好参考价值的文章主要介绍了UDP多播。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、多播概念

1.1、多播

        多播又称为:组播。 一个人发数据,只有加入到多播组的人接收数据

1.2、多播的特点

    1、多播地址标示一组接口
    2、多播可以用于广域网使用
    3、在IPv4中,多播是可选的

1.3、多播地址 

IPv4的D类地址是多播地址
十进制:224.0.0.1~239.255.255.254
十六进制:E0.00.00.01~EF.FF.FF.FE

 组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,多播组的地址是D类IP,规定是224.0.0.0——239.255.255.255。

1.4、多播ip地址用处

224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用


224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet


224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效


239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效

1.5、多播地址向以太网MAC地址的映射

UDP多播

1.5.1、计算多播mac地址(mac地址占48位)

解题方法:组播地址MAC以01-00-5e开头(规定的),占25bit。由于MAC地址是48bit,而IP地址有32bit,因此需要从ip地址获取后23位。如何获取,最安全的又准确的方法:就是把IP地址,换成二进制数。第2个8位中的第1位规定为0,去掉前8位,再把剩下的二进制换成16进制,最后添加在01-00-5e后面即可

举例说明

例如 1、求224.128.129.130的组播MAC过程如下:

第一步:我们可以永远都知道多播mac地址前25位,都是01-00-5e(规定的)

第二步:把ip地址化为二进制 

        224.128.129.130的二进制形式

    1110 0000 1000 0000 1000 0001  1000 0010  把第2个8位中的第1位规定为0,即红色的1改为0

得:  1110 0000 0000 0000 1000 0001  1000 0010  把前8位去掉,即黑色部分去掉

得:  0000 0000 1000 0001  1000 0010  

第三步:把得出的二进制转化成16进制(0000 0000 1000 0001  1000 0010  

得:  00-81-82

第三步:合并

该ip的组播mac地址:01-00-5e-00-81-82

二、多播工作过程

多播不需要设置setsockopt(套接字选项)

比起广播,多播具有可控性,只有加入多播组的接收者才可以接收数据,否则接收不到

UDP多播

 2.1、分析发送端设置流程

 第一步:创建套接字——socket函数

第二步:设置为UDP协议和端口号(此端口为 对方的端口号 )

第三步:设置IPV4,由于使用的是多播,需要把ip地址 设为多播地址.

              多播地址范围:224.0.0.0——239.255.255.255。

第四步:设置传输为以太网,mac地址根据ip地址  (转看1.5示例)

2.2、分析如何传输与接收

第一步:把打包好数据包,发送到多播组里。

第二步:接收者想要接收到信息,必须要先加入多播组里

三、多播代码流程

发送者:
第一步:创建套接字 socket()
第二步:向多播地址发送数据 sendto()


接收者:
第一步:创建套接字 socket()
第二步:设置为加入多播组 setsockopt()第三步:将套接字与多播信息结构体绑定 bind()
第五步:接收数据

四、多播地址结构

在IPv4因特网域(AF_INET)中,多播地址结构体用如下结构体ip_mreq表示

UDP多播

 五、多播套接口选项(接收者需要使用此函数加入多播组)

头文件

            #include <sys/socket.h>
函数:

   int setsockopt(int socket, int level, int option_name,const void *option_value, socklen_t option_len);
功能:

           设置一个套接字的选项(属性)
参数:
            socket:文件描述符
            level:协议层次
                         IPPROTO_IP IP层次
           option_name:选项的名称
                                   IP_ADD_MEMBERSHIP 加入多播组
           option_value:设置的选项的值

结构体
          struct ip_mreq
 {
        struct in_addr imr_multiaddr; //组播ip地址
        struct in_addr imr_interface; //主机地址
        INADDR_ANY 任意主机地址(自动获取你的主机地址)
        };
           option_len:option_value的长度
 返回值:
               成功:0
               失败:‐1

多播设置

    mreq.imr_multiaddr.s_addr=inet_addr(argv[1]);
    mreq.imr_interface.s_addr=INADDR_ANY;//        INADDR_ANY获取自己的ip地址
    socklen_t optlen =sizeof(mreq);

    if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,optlen) < 0)
    {
        perror("fail to setsockopt");
        exit(1);
        }

5.1、发送者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

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);
		
 		}
    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;
	  
	}

 5.2、接收者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<string.h>

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 ip_mreq mreq;
	mreq.imr_multiaddr.s_addr=inet_addr(argv[1]);
	mreq.imr_interface.s_addr=INADDR_ANY;
	socklen_t optlen =sizeof(mreq);

	if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,optlen) < 0)
	{
		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);
    
	if(bind(sockfd,(struct sockaddr *)&mysockaddr,addrlen)==-1)
	{
		perror("fail to bind");
		exit(1);
		}
	char buf[128];
	struct sockaddr_in sendsockaddr;
	socklen_t sendaddrlen=sizeof(sendsockaddr);
	while(1)
	{	
      
	 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;
	  
	}

运行结果

UDP多播

 多播地址范围:224.0.0.0——239.255.255.255。

我设置了多播组地址为:224.0.0.2 端口号为8081

只要加入了224.0.0.2多播组地址并且端口号为8081的客户端,服务器绑定的多播组224.0.0.2都会接收到客户端发来的数据。文章来源地址https://www.toymoban.com/news/detail-459584.html

到了这里,关于UDP多播的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UDP多播:一对多数据收发

    1.先来回顾一下,UDP广播。一个服务器进行广播,那么同一网络的所有主机都会收到信息。那么这个时候,有可能并不是所有主机都需要收到广播数据信息,只是一部分主机需要收到广播数据信息而已。 2.UDP通信中的多播。多播是向 特定组 中的所有的主机发送数据的方法,多

    2024年02月12日
    浏览(32)
  • Netty接收UDP组播数据

    针对多网卡情况,绑定其中的一个网卡,接收UDP组播中的数据。

    2024年02月16日
    浏览(38)
  • W6100-EVB-PICO进行UDP组播数据回环测试(九)

            上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试,那么本章我们进行UDP组播数据回环测试。         组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的

    2024年02月11日
    浏览(40)
  • W5500-EVB-PICO进行UDP组播数据回环测试(九)

            上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试,那么本章我们进行UDP组播数据回环测试。         组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的

    2024年02月11日
    浏览(33)
  • W5100S-EVB-PICO进行UDP组播数据回环测试(九)

            上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试,那么本章我们进行UDP组播数据回环测试。         组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的

    2024年02月10日
    浏览(35)
  • UDP多播

    1.1、多播         多播又称为:组播。 一个人发数据,只有加入到多播组的人接收数据 1.2、多播的特点     1、多播地址标示一组接口     2、多播可以用于广域网使用     3、在IPv4中,多播是可选的 1.3、多播地址  IPv4的D类地址是多播地址 十进制:224.0.0.1~239.255.255.254 十六

    2024年02月06日
    浏览(24)
  • udp多点通信-广播-组播

    单播 每次只有两个实体相互通信,发送端和接收端都是唯一确定的。 主机之间的一对多的通信 所有的主机都可以接收到广播消息(不管你是否需要) 广播禁止穿过路由器(只能做局域网通信) 只有UDP可以广播 广播地址 有效网络号+全是1的主机号 192.168.50.123 -----》 192.168.5

    2024年02月05日
    浏览(37)
  • Qt-udp(组播)

    2024年02月11日
    浏览(35)
  • Java UDP通信详解:单播、广播、组播

    1.UDP是一种无连接、不可靠传输的协议; 2.将数据源IP、目的地IP和端口封装成数据包,不需要建立连接 ; 3.每个数据包的大小限制在64KB内; 4.发送不管对方是否准备好,接收方收到也不确认,故是不可靠的; 5.可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快

    2024年02月02日
    浏览(50)
  • 网络编程(三)—— UDP(单播、广播、组播)

    UDP协议的特点: 无连接 、不保证传输可靠(可能重复到达、失序、丢失、无字节流控制(数据传输快的会淹没慢的)) UDP传输 UDP 服务端(接收端)的搭建流程 UDP客户端(发送端)的搭建流程 通信流程 sendto 和 recvfrom 这两个函数一般在使用UDP协议时使用 sendto recvfrom 单播就

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包