UDP广播与多播

news/2024/6/23 8:16:10

一、UDP广播

1、广播的概念

  使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

  网络上的广播指:由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式。

2、广播的特点

  实现广播,离不开广播地址,同一个子网(局域网)的所有主机网卡都会接收所在网段广播地址的数据包。广播地址应用于局域网内的所有主机广播地址(Broadcast Address)是专门用于同时向网络中(通常指同一子网)所有工作站进行发送的一个地址。

  广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。

  其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

【UDP广播特点如下】:

  • 可以向广播域内的所有主机发送数据 ;

  • 不能够跨越不同的网络,被路由器所隔离开。
    在这里插入图片描述

3、设置套接字选项

// 默认的情况下,不允许发送广播数据包,需要修改套接口选项
int setsockopt( int sockfd, int level, int optname,const void *optval, socklen_t optlen);
/*
sockfd:套接字;
level:SOL_SOCKET;
optname:SO_BROADCAST;
optval:int opt=1,传入&opt;
optlen:sizeof(opt);
*/

4、UDP广播的实现

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main()
{unsigned short port = 8080; // 设置端口号,该端口号的进程可以接收到广播数据char *server_ip = "255.255.255.255"; // 受限广播地址int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 初始化套接字if (sockfd < 0){perror("socket");exit(1);}// 初始化套接字地址相关信息struct sockaddr_in dest_addr;// 清空数组bzero(&dest_addr, sizeof(dest_addr));// 设置为ipv4dest_addr.sin_family = AF_INET;// 把主机字节序转换为网络字节序(port)dest_addr.sin_port = htons(port); // 把主机字节序转换为网络字节序(IP)inet_pton(AF_INET, server_ip, &dest_addr.sin_addr);printf("send data to UDP server %s : %d\n", server_ip, port);// 设置为广播类型int opt = 1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));char send_buf[512] = "hello";// 发送数据到同一个网段的其他子网sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));// 关闭套接字描述符close(sockfd);return 0;
}

二、UDP多播

1、多播的概念

  单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。

  IP 多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的 TCP/IP 网络技术。多播作为一点对多点的通信,数据的收发仅仅在同一分组中进行,是节省网络带宽的有效方法之一。在网络应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。

2、多播的地址

  IP 多播通信必须依赖于 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,可限制多播范围。
在这里插入图片描述

3、多播的特点

【优点】:

  • 多播服务端针对特定多播地址只发送一次数据,但是组内的所有客户端都能收到数据;

  • 与单播一样,多播是允许在广域网即Internet上进行传输的,而广播仅仅在同一局域网上才能进行;

  • 服务器的总带宽不受客户端带宽的限制;

  • 加入特定的多播组即可接收发往该多播组的数据。

【缺点】:

  • 多播与单播相比没有纠错机制,当发生错误的时候难以弥补,但是可以在应用层来实现此种功能;

  • 多播的网络支持存在缺陷,需要路由器及网络协议栈的支持。

4、设置套接字选项

// 默认的情况下,不允许发送广播数据包,需要修改套接口选项
int setsockopt( int sockfd, int level, int optname,const void *optval, socklen_t optlen);
/*
sockfd:套接字;
level:IPPROTO_IP;
optname:IP_MULTICAST_LOOP;IP_ADD_MEMBERSHIP;IP_DROP_MEMBERSHIP
optval:int opt=1,传入&opt;
optlen:sizeof(opt);
*/

5、UDP多播的实现

【服务器】:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>int main()
{int sockfd;// 本地地址struct sockaddr_in local_addr;int err = -1;// 多播组IPchar group[16] = "224.0.0.88";// 创建套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){perror("socket");exit(1);}// IP相关信息初始化bzero(&local_addr, sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_addr.s_addr = htonl(INADDR_ANY);local_addr.sin_port = htons(8000);// IP地址绑定套接字err = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));if (err < 0){perror("bind");exit(1);}// 设置回环许可,控制数据允许会送到本地的回环接口int loop = 1;err = setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &LOOP, sizeof(loop));if (err < 0){perror("setsockopt");exit(1);}// 初始化多播地址结构体struct ip_mreq mreq;// 设置多播组IP,类似于创建QQ群mreq.imr_multiaddr.s_addr = inet_addr(group);// 将本机加入多播组,类似于加群mreq.imr_interface.s_addr = htonl(INADDR_ANY);// 设置套接字选项,加入多播组err = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));if (err < 0){perror("setsockopt");exit(1);}char buf[512];for (int times = 0; times < 5; ++times){socklen_t addr_len = sizeof(local_addr);bzero(&buf, sizeof(buf));// 接收数据int n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&local_addr, &addr_len);if (n == -1)perror("recvfrom");printf("Recv %d message from server : %s\n", times, buf);sleep(1);}// 设置套接字选项,离开多播组err = setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));close(sockfd);return 0;
}

【客户端】:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>int main(int argc, char **argv)
{int sockfd; // 套接字文件描述符struct sockaddr_in dest_addr; // 目标ipchar buf[] = "BROADCAST TEST DATA";sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 建立套接字if (sockfd == -1){perror("socket()");return -1;}// 初始化目标 ip 信息memset(&dest_addr, 0, sizeof(dest_addr));dest_addr.sin_family = AF_INET;               dest_addr.sin_addr.s_addr = inet_addr("224.0.0.88"); // 目的地址,为多播地址dest_addr.sin_port = htons(8000);   // 多播服务器的端口也是 8000// 向多播地址发送数据while(1){int n = sendto(sockfd, buf, strlen(buf), 0,(struct sockaddr*)&dest_addr, sizeof(dest_addr));if( n < 0){perror("sendto()");return -1;}      sleep(1);}return 0;
}

参考:https://blog.csdn.net/lianghe_work/article/details/45765851
https://blog.csdn.net/lianghe_work/article/details/45171167
https://blog.csdn.net/wqc_CSDN/article/details/51588769
https://www.cnblogs.com/lidabo/p/5865045.html


https://www.xjx100.cn/news/444366.html

相关文章

基于 UDP 的 组播、广播详解

背景 有些时候我们在网络通信中也需要用到 组播(多播)、广播。现在我们来介绍如何实现。 建议&#xff1a;在此之前&#xff0c;关闭防火墙。 ubuntu&#xff1a; service ufw stop windows&#xff1a; 控制面板关闭 有关知识 基本概念 单播&#xff1a;两个主机间单对单的…

广播 UDP 发送与接收

发送方&#xff1a; /* * 文件名称&#xff1a;sendto.c * 创 建 者&#xff1a; * 创建日期&#xff1a;2022年09月08日 * 描 述&#xff1a; */ #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <arpa/…

UDP 单播、广播和多播

阅读目录(Content) 目录 一、UDP广播 二、UDP多播 1、多播&#xff08;组播&#xff09;的概念 2、广域网的多播 3、多播程序设计的框架 4、多播实现代码 三、UDP广播与单播 广播与单播的比较 使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器…

UDP广播的实现

一、广播的概念 广播&#xff1a;由一台主机向该主机所在子网内的所有主机发送数据的方式。 任何一个网段最后一个地址就是广播的地址 例如&#xff1a;192.168.5.103主机发送广播信息&#xff0c;那么&#xff0c;广播地址为192.168.5.255 则192.168.5.1~192.168.5.254所有…

UDP广播

概述&#xff1a; 网络上的广播指&#xff1a;由一台主机向该主机所在子网内&#xff08;同一个局域网&#xff09;的所有主机发送数据的方式。实现广播&#xff0c;离不开广播地址&#xff0c;同一个子网&#xff08;局域网&#xff09;的所有主机网卡都会接收所在网段广播地…

四波混频/三波混频

四波混频 四波混频是由约瑟夫森电感的类克尔非线性引起的&#xff0c;满足 L J − 1 &#xff08; ϕ &#xff09; ≈ &#xff08; 1 − γ ′ ϕ 2 &#xff09; L J 0 − 1 L_J^{-1}&#xff08;\phi&#xff09;\approx&#xff08;1-\gamma\phi^2&#xff09;L_{J0}^{-1…

UDP之广播

目录 一.IP地址简介二.广播的实现原理三.广播的Server代码实现 1.setsockopt&#xff1a;给socketfd开放广播权限2.指定发送给Client的端口 说明&#xff1a;UDP广播的Server端为什么要指定Client的端口具体实现四.UDP之广播C/S模型五.UDP之广播C/S模型代码 ServerClient 一.IP…

用udp实现广播通信

特点&#xff1a; 1.数据传输不用建立连接&#xff0c;所以不可靠&#xff08;符合udp协议的特点&#xff09; 2.数据的发送是面向整个子网的&#xff0c;任何一台在子网内的计算机都可以接收到相同的数据&#xff1b; 3.广播用于udp和原始IP,不能用于TCP 用途&#xff1a; 1.定…