基于udp协议的组播

article/2025/9/21 3:53:45
1. 广播的方式是发送给同一网段下的所有主机,过多的广播数据会占用大量带宽,会造成广播风暴, 影响正常通信;
2. 所以 主机之间一对 一组 的通信模式,即组播,只有加入了同一个组的主机可以收到此组内的所有数据 ;
3. 组播的 IP 地址: 224.0.0.0~239.255.255.255
组播创建步骤:
1、发送端:
创建报式套接字,填充接收端的IP和端口,发送数据
2、接收端(类似服务器:
创建报式套接字,加入多播组,绑定组播IP和端口,绑定自身IP和端口号,recvfrom
发送端代码
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/ipc.h>
#include<netinet/in.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\
}while(0)
#define PORT 8888 //端口号 1024~49151
#define GRP_IP "224.1.2.3"  //组播IP 224.0.0.0~239.255.255.255
int main(int argc, const char *argv[])
{//创建报式套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}//绑定发送端的IP和端口,非必须绑定//接收端必填struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(GRP_IP);char buf[128]="";ssize_t res = 0;while(1){//发送数据包bzero(buf,sizeof(buf));printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;//填写发送方if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("sendto success\n");}close(sfd);return 0;
}
接收端代码
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<sys/ipc.h>
#include<netinet/in.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\
}while(0)
#define PORT 8888 //端口号 1024~49151
#define GRP_IP "224.1.2.3"  //组播IP 224.0.0.0~239.255.255.255
int main(int argc, const char *argv[])
{//创建报式套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("socket");return -1;}//加入多播组struct ip_mreqn mq;mq.imr_multiaddr.s_addr = inet_addr(GRP_IP); //组播IPmq.imr_address.s_addr=inet_addr("192.168.31.168"); //本机IPmq.imr_ifindex=2;  //网络设备索引号if(setsockopt(sfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mq,sizeof(mq))<0){ERR_MSG("setsockopt");return -1;}printf("加入多播组成功\n");//填充接收端自身的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(GRP_IP);//绑定接收端的IP和端口,必须绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("bind success\n");char buf[128]="";ssize_t res = 0;struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);while(1){//接收数据包bzero(buf,sizeof(buf));res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(res<0){ERR_MSG("recvfrom");return -1;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);}close(sfd);return 0;
}

http://chatgpt.dhexx.cn/article/Y3fdIJpQ.shtml

相关文章

IPv4、IPv6地址、组播地址及子网子划分详解四

IPv4、IPv6地址、组播地址及子网子划分详解四 6、IPv66.1、国际IP地址分配方式&#xff1a;6.2、IPv6的结构6.3、IPv6地址简写方式6.4、地址类型6.4.1、单播地址6.4.2、组播地址6.4.3、任意播地址6.5、IPv6接口ID的生成方法 6、IPv6 IPv4地址总数2324,294,967,296 IPv6地址总数…

07-IP组播配置指导

1 组播概述 1.1 组播简介 作为一种与单播&#xff08;Unicast&#xff09;和广播&#xff08;Broadcast&#xff09;并列的通信方式&#xff0c;组播&#xff08;Multicast&#xff09;技术能够有效地解决单点发送、多点接收的问题&#xff0c;从而实现了网络中点到多点的高…

IPv4、IPv6地址、组播地址及子网子划分详解一

IPv4、IPv6地址、组播地址及子网子划分详解一 一、IPv4地址1、IP地址的定义2、IP术语3、IP地址的组成3.1、我们前面讲到IP地址是软件地址&#xff0c;那硬件地址是什么&#xff1f;3.2、IP地址的编址方案4、IP地址的分类4.1、网络地址4.2、保留的IP地址4.3、私有IP地址4.4、组播…

IPV6组播地址

在IPv4中广泛的使用单播、广播、组播的方式。而在IPv6的应用环境中&#xff0c;使用单播&#xff0c;组播、任意播的新方式&#xff0c;放弃广播的使用&#xff0c;换而言之&#xff0c;在IPv6的环境中不再有广播的存在。理解IPv6的组播地址有一个重要的前提&#xff1a;就是读…

IPV4组播地址解析以及IPV4地址详解

为了便于对IP地址进行管理, 根据IPv4地址的第一个字节,IPv4地址可以分为以下五类。 A类:0~127 B类:128~191 C类:192~223 D类:224~239,组播地址 E类:240~254,保留为研究测试使用 IPv4地址中有一些地址段有特殊用途,这些地址段及用途的说明如表所示。 IPV4组播地址解…

计算机网络——组播地址(多播地址、D类地址)详解——不断完善更新中

1、是什么 先看这张图&#xff0c;组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的取值范围是224~~239。 2、这些IP地址用来做什么 224.0.0.0&#xff5e;224.0.0.255为预留的组播地址&#xff0…

Android LBS

前言 本文以项目AOSP的源码为参考&#xff0c;描述基于Android的定位服务的实现流程&#xff0c;包括GPS定位&#xff0c;网络定位&#xff0c;GeoCoder等服务。以代码执行流程为主线&#xff0c;一步步分析定位的实现流程。由于Android Binder采用C/S的架构模式&#xff0c;所…

LSB和MSB,LSB first,MSBfirst

LSB LSB(Least Significant Bit)–最低有效位 MSB MSB(Most Significant Bit)–最高有效位 解释 加入下面是一个四位二进制的数值&#xff0c;一般和10进制都认为是左边是最高位&#xff0c;也就是MSB;对应的最右边就是LSB. LSB first和MSB first 这种一般出现先对传感…

OSPF,LSDB,LSA分类

dis cur c ospf //查看OSPF的配置 DD报文选举的是主从关系&#xff0c;不是选举DR和BDR LSA通告网段信息和通告拓扑信息 two-way&#xff1a;双向通信&#xff0c;邻居状态下&#xff0c;选举DR和BDR 进入exstar状态&#xff0c;发送第一个DD报文&#xff0c;DD报文的作用是…

IS-IS P2P网络下LSDB同步过程

P2P链路下IS-IS的LSDB数据库同步过程 抓包如下&#xff1a; 大概过程: IS-IS在P2P网络中邻居建立完成后只发送一次CSNP报文 双方都会发送一次CSNP&#xff0c;包含LSP的摘要信息&#xff0c;意思是告诉对方我有哪些网段信息如果其中一方的LSDB中没有对方的CSNP内的某条路由&a…

【OSPF-一类router、二类network】(根据lsdb画出拓扑)

目录 一、一类LSA-Router 每台交换机会产生一条类型为router的lsa&#xff0c;来描述自身直连网段信息&#xff08;通过dis ospf lsdb&#xff0c;查看router的条目&#xff0c;就能确定该区域内路由器的数目了&#xff09; 查看ospf相关信息的命令 二、二类lsa-network 由…

ISIS—ISIS中LSP(数据库)同步如何保证LSDB可靠性—04

目录 一、LSP基础知识&#xff1a;(链路状态更新&#xff0c;相当于OSPF的LSA) 二、ISIS中LSP&#xff08;数据库&#xff09;同步如何保证LSDB可靠性? ISIS LSP&#xff08;数据库&#xff09;同步机制 ①P2P网络&#xff1a; ②MA网络&#xff1a; ③特例问题&#xf…

【LAB4-Cisco】OSPF邻居建立过程与LSDB分析

实验需求 1、根据拓扑提示&#xff0c;对各路由启用OSPF路由协议并划分相应区域&#xff0c;并验证邻居关系以及数据库信息&#xff0c;从而保证内网全网互通。其中&#xff0c;要求R7上的回环口条目作为外部条目引进来。 2、新加入公司网络的Area 2 区域存在一定的接入安全隐患…

IS-IS LSDB详解(华为设备)

概述&#xff1a; IS-IS协议主要有两大功能&#xff1a;子网依赖功能和子网无关功能。子网依赖功能就是建立和维护邻接关系的功能&#xff0c;而子网无关功能则主要用于执行和管理和管理链路状态信息的交换和路由计算&#xff0c;具体可以分为四个过程。 更新过程。路由决策过…

1.1.6 LSDB同步

邻接关系 邻接建立过程 讲完了报文之后我们具体来看一下是怎么同步的&#xff0c;我们可以看到下图是我们LSDB的过程&#xff1a; 注意&#xff1a; 我们要注意&#xff0c;在到达同步过程之前我们先要达到2-way的状态&#xff0c;就是我们首先要有邻居状态的建立&#xff0c;才…

网络篇 OSPF的LSDB过载保护-52

目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 实验难度 2 实验复杂度3 一、实验原理 若没有正确规划网络或配置不好&#xff0c;可能出现大量的LSA&#xff0c;这些LSA会消耗掉本地的CPU和内存资源的。在Cisco IOS 12.3(7)和更晚的版本中&#xff0…

OSPF之链路状态数据库LSDB

OSPF链路状态数据库 原理概述&#xff1a; OSPF是一种基于链路状态的动态路由协议&#xff0c;每台 OSPF 路由器都会生成相关的LSA&#xff0c;并将这些LSA通告出去。路由器收到LSA后&#xff0c;会将它们存放在链路状态数据库LSDB中。 LSA有多种不同的类型&#xff0c;不同类型…

ORACLE生成自增唯一序列值的函数

“F_NEXT_VAL” 函数名 VAL 变量值 PRAGMA AUTONOMOUS_TRANSACTION 声明为自治事务 CREATE OR REPLACE FUNCTION "F_NEXT_VAL" RETURN INTEGER ASpragma autonomous_transaction;VAL INTEGER; BEGINSELECT t."VALUE" INTO VAL FROM SYS_SEQUECE t WHERE t…

Mysql和Oracle实现序列自增

/*ORACLE设置自增序列 oracle本身不支持如mysql的AUTO_INCREMENT自增方式&#xff0c;我们可以用序列加触发器的形式实现&#xff0c; 假如有一个表 T_WORKMATES&#xff0c;我们需要让学号PNO自增*/ --创建序列 SEQ_PNO CREATE SEQUENCE SEQ_PNO minvalue 1 --最小值为1 n…

如何实现 Oracle 的自增序列,两步轻松搞定

在实际项目开发过程中&#xff0c;设计数据库表时经常遇到需要主键自增的场景。那如何实现Oracle的主键自增呢&#xff0c;这里我们记录一种最常用的方式&#xff1a;sequence trigger。 就是利用Oralce的序号和触发器来实现字段的自增&#xff0c;下面直接来看一个完整的例子…