当前位置: 首页 > news >正文

lv8 嵌入式开发-网络编程开发 18 广播与组播的实现

目录

1 广播

1.1 什么是广播?

1.2 广播地址

1.3 广播的实现

2 组播

2.1 分类的IP地址

2.2 多播 IP 地址

2.3 组播的实现


1 广播

1.1 什么是广播?

数据包发送方式只有一个接受方,称为单播

如果同时发给局域网中的所有主机,称为广播

只有用户数据报(使用UDP协议)套接字才能广播

1.2 广播地址

  • 一个网络内主机号全为1的IP地址为广播地址
  • 发到该地址的数据包被所有的主机接收
  • 255.255.255.255在所有网段中都代表广播地址

1.3 广播的实现

广播的实现

sender.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>
#include <string.h>#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;int main(int argc, char *argv[])
{int fd = -1;Addr_in peeraddr;socklen_t peerlen = sizeof(peeraddr);char buf[BUFSIZ] = {};/*参数检查*/if(argc < 3){fprintf(stderr, "%s<multiaddr><port>", argv[0]);exit(EXIT_FAILURE);}/*创建套接字*/if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)ErrExit("socket");/*允许广播*/int on = 1;setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));/*设置通信结构体*/peeraddr.sin_family = AF_INET;peeraddr.sin_port = htons(atoi(argv[2]));if(!inet_aton(argv[1], &peeraddr.sin_addr) ){fprintf(stderr, "Invalid address\n");exit(EXIT_FAILURE);}while(1){fgets(buf, BUFSIZ, stdin);sendto(fd, buf, strlen(buf)+1, 0, (Addr *)&peeraddr, peerlen);}return 0;
}

 receiver.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;int main(int argc, char *argv[])
{int fd = -1;Addr_in myaddr, peeraddr;socklen_t peerlen = sizeof(peeraddr);char buf[BUFSIZ] = {};/*参数检查*/if(argc < 3){fprintf(stderr, "%s<addr><port>", argv[0]);exit(EXIT_FAILURE);}/*创建套接字*/if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)ErrExit("socket");/*设置通信结构体*/myaddr.sin_family = AF_INET;myaddr.sin_port = htons(atoi(argv[2]));if(!inet_aton(argv[1], &myaddr.sin_addr) ){fprintf(stderr, "Invalid address\n");exit(EXIT_FAILURE);}/*绑定通信结构体*/if( bind(fd, (Addr *)&myaddr, sizeof(Addr_in)) )ErrExit("bind");while(1){recvfrom(fd, buf, BUFSIZ, 0, (Addr *)&peeraddr, &peerlen);printf("[%s:%d]%s\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port), buf);}return 0;
}

2 组播

2.1 分类的IP地址

2.2 多播 IP 地址

  • 在 IP 多播数据报的目的地址需要写入多播组的标识符。
  • 多播组的标识符就是 IP 地址中的 D 类地址(多播地址)。地址范围:224.0.0.0 ~ 239.255.255.255
  • 每一个 D 类地址标志一个多播组。
  • 多播地址只能用于目的地址,不能用于源地址。

2.3 组播的实现

  • 创建用户数据报套接字
  • 加入多播组
  • 绑定组播IP地址和端口
  • 等待接收数据
struct ip_mreqn {struct in_addr imr_multiaddr;  /*IP 组播组地址*/struct in_addr imr_address;   /*本地接口的IP地址*/int                   imr_ifindex;   /*本地网卡的编号*/
}
if(setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0){
perror("setsockopt");
exit(0);
}

sender.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>
#include <string.h>#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;int main(int argc, char *argv[])
{int fd = -1;Addr_in peeraddr;socklen_t peerlen = sizeof(peeraddr);char buf[BUFSIZ] = {};/*参数检查*/if(argc < 3){fprintf(stderr, "%s<multiaddr><port>", argv[0]);exit(EXIT_FAILURE);}/*创建套接字*/if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)ErrExit("socket");/*设置通信结构体*/peeraddr.sin_family = AF_INET;peeraddr.sin_port = htons(atoi(argv[2]));if(!inet_aton(argv[1], &peeraddr.sin_addr) ){fprintf(stderr, "Invalid address\n");exit(EXIT_FAILURE);}while(1){fgets(buf, BUFSIZ, stdin);sendto(fd, buf, strlen(buf)+1, 0, (Addr *)&peeraddr, peerlen);}return 0;
}

receiver.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <strings.h>#define ErrExit(msg) do {perror(msg); exit(EXIT_FAILURE);} while(0)
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;int main(int argc, char *argv[])
{int fd = -1;Addr_in myaddr, peeraddr;socklen_t peerlen = sizeof(peeraddr);struct ip_mreqn mreq;char buf[BUFSIZ] = {};/*参数检查*/if(argc < 3){fprintf(stderr, "%s<addr><port>", argv[0]);exit(EXIT_FAILURE);}/*创建套接字*/if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0)ErrExit("socket");/*加入多播组*/bzero(&mreq, sizeof(mreq) );if(!inet_aton(argv[1], &mreq.imr_multiaddr) ){fprintf(stderr, "Invalid address\n");exit(EXIT_FAILURE);}if(setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0){perror("setsockopt");exit(0);}/*设置通信结构体*/myaddr.sin_family = AF_INET;myaddr.sin_port = htons(atoi(argv[2]));if(!inet_aton(argv[1], &myaddr.sin_addr) ){fprintf(stderr, "Invalid address\n");exit(EXIT_FAILURE);}/*绑定通信结构体*/if( bind(fd, (Addr *)&myaddr, sizeof(Addr_in)) )ErrExit("bind");while(1){recvfrom(fd, buf, BUFSIZ, 0, (Addr *)&peeraddr, &peerlen);printf("[%s:%d]%s\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port), buf);}return 0;
}

相关文章:

lv8 嵌入式开发-网络编程开发 18 广播与组播的实现

目录 1 广播 1.1 什么是广播&#xff1f; 1.2 广播地址 1.3 广播的实现 2 组播 2.1 分类的IP地址 2.2 多播 IP 地址 2.3 组播的实现 1 广播 1.1 什么是广播&#xff1f; 数据包发送方式只有一个接受方&#xff0c;称为单播 如果同时发给局域网中的所有主机&#xff0…...

前端面试题个人笔记(后面继续更新完善)

文章目录 填空题部分简答题部分 if有好答案请各位大佬们在底下评论上&#xff0c;感谢 填空题部分 1、常见的css选择器 2、getElementById获取元素的&#xff08;DOM&#xff09;对象 简答题部分 1、介绍一下你对RESTful API的理解以及它的优势&#xff1f; 答&#xff1a; …...

软件设计之工厂方法模式

工厂方法模式指定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 结构关系如下&#xff1a; 可以看到&#xff0c;客户端创建了两个接口&#xff0c;一个AbstractFactory&#xff0c;负责创建产品&#xff0c;一个Product&#xff0c;负责产品的实现。ConcreteF…...

【Linux】shell运行原理及权限

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法&#xff1a;算法专栏 C头疼…...

OA系统和ERP系统有什么区别?

在当今的企业管理领域&#xff0c;协同办公管理系统和ERP系统是两个非常重要的工具。它们在企业的日常运营中扮演着不同的角色&#xff0c;有着各自独特的功能和优势。那么&#xff0c;OA系统和ERP系统到底有什么区别呢&#xff1f;协同办公管理系统又是如何在这两者之间发挥协…...

c语言之strcat函数使用和实现

文章目录 前言一、strcat函数使用二、实现方法 前言 c语言之strcat 函数使用和实现 一、strcat函数使用 原型&#xff1a; char *strcat ( char * destination, const char * source );strcat追加拷贝,追加到目标空间后面&#xff0c;目标空间必须足够大&#xff0c;能容纳下…...

Halo-Theme-Hao文档:如何设置导航栏?

本篇文章会教你如何配置导航栏&#xff0c;最终效果参考如下。 感谢 Lanbin、小孙同学 等同学的贡献&#xff08;语雀参与编辑&#xff09;。 1标题 进入站点后台 点击左侧面板中的 主题 点击上方的 导航 修改 标题字段即可 2主菜单 主菜单即网站导航栏中间部分的菜单 进入站点…...

【Java学习之道】Java网络编程API介绍

引言 在Java中&#xff0c;进行网络编程的主要方式是通过Java网络编程API。这些API提供了一组类和接口&#xff0c;用于创建网络应用&#xff0c;如TCP和UDP通信、URL访问等。在这一节中&#xff0c;我们将带你领略Java网络编程API的魅力。 一、InetAddress InetAddress类是表…...

[论文笔记]SimCSE

引言 今天带来一篇当时引起轰动的论文SimCSE笔记,论文题目是 语句嵌入的简单对比学习。 SimCSE是一个简单的对比学习框架,它可以通过无监督和有监督的方式来训练。 对于无监督方式,输入一个句子然后在一个对比目标中预测它自己,仅需要标准的Dropout作为噪声。这种简单的…...

设置按键中断,按键1按下,LED亮,再按一次,灭按键2按下,蜂鸣器响。再按一次,不响按键3按下,风扇转,再按一次,风扇停

src/key_it.c #include"key_it.h" //GPIO初始化 void all_led_init() {//RCC使能RCC->MP_AHB4ENSETR | (0X1<<4);//设置PE10 PF10 PE8为输出GPIOE->MODER & (~(0X3<<20));GPIOE->MODER | (0X1<<20);//设置推挽输出GPIOE->OTYPER…...

深拷贝和浅拷贝的主要区别

在JavaScript中&#xff0c;深拷贝和浅拷贝的主要区别在于它们处理对象属性的方式。 浅拷贝&#xff08;Shallow Copy&#xff09;只复制对象的引用&#xff0c;而不是实际的对象。因此&#xff0c;如果你修改了复制的对象&#xff0c;原始对象也会受到影响。 深拷贝&#xf…...

Git Cherry Pick的使用

cherry-pick命令的基本用法 cherry-pick命令的基本语法如下&#xff1a; git cherry-pick <commit>其中&#xff0c;<commit>是要应用的提交的哈希值或分支名。该命令会将指定的提交应用到当前分支上&#xff0c;并创建一个新的提交。 使用场景 cherry-pick命令…...

vue3后台管理框架之基础配置

配置vite.config.js import { defineConfig } from viteimport vue from vitejs/plugin-vueexport default defineConfig(({ command, mode }) > {//const env loadEnv(mode, process.cwd(), ) //获取环境变量return {// 打包devbase: ./,// 开发环境server: {port: 5002,…...

Easysearch压缩模式深度比较:ZSTD+source_reuse的优势分析

引言 在使用 Easysearch 时&#xff0c;如何在存储和查询性能之间找到平衡是一个常见的挑战。Easysearch 具备多种压缩模式&#xff0c;各有千秋。本文将重点探讨一种特别的压缩模式&#xff1a;zstd source_reuse&#xff0c;我们最近重新优化了 source_reuse,使得它在吞吐量…...

扩散模型的系统性学习(一):DDPM的学习

文章目录 一、学习的资料1.1 对于扩散模型的发展过程的综述1.2对论文中涉及的公式以及公式对应的代码的解读1.3github中对于各模型实现的代码1.4相关基础知识的学习 二、DDPM的学习2.1 DDPM总体知识的梳理2.2相关代码的解读2.2.1unet 代码块2.2.2高斯扩散代码块2.2.3 实验流程代…...

注意力屏蔽(Attention Masking)在Transformer中的作用 【gpt学习记录】

填充遮挡&#xff08;Padding Masking&#xff09;&#xff1a; 未来遮挡&#xff08;Future Masking&#xff09;&#xff1a;...

MyBatisPlus详解

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、MyBatis…...

组合数的计算

C: 即从a个元素中选取b个元素的组合数。 LL C(int a, int b) {LL res 1;for (int i a, j 1; j < b; i --, j )res res * i / j;return res; } A: 表示从a个元素中选取b个元素进行排列的情况数。 LL P(int a, int b) {LL res 1;for (int i a; i > a - b; i--){res…...

linux之shell记录

shell属于一种很容易学习的程序设计语言&#xff0c;依赖于功能强大的命令可以编写提高开发效率的脚本。这里记录一下常用的shell相关的知识点。 持续更新中。。。 1、在linux或mac中查看使用的shell echo $SHELL /bin/bashshell是一种脚本语言&#xff0c;就会有解释器来执行…...

外卖大数据案例

一、环境要求 HadoopHiveSparkHBase 开发环境。 二、数据描述 meituan_waimai_meishi.csv 是某外卖平台的部分外卖 SPU&#xff08;Standard Product Unit &#xff0c; 标准产品单元&#xff09;数据&#xff0c;包含了外卖平台某地区一时间的外卖信息。具体字段说明如下&am…...

Cytron PS2 Shield嵌入式驱动与极坐标映射原理

1. 项目概述Cytron PS2 Shield 是一款专为 Arduino 平台设计的 PlayStation 2&#xff08;PS2&#xff09;游戏手柄通信扩展板&#xff0c;其核心功能是将标准 PS2 手柄的串行协议解析为嵌入式系统可直接读取的结构化数据。该 Shield 通过 UART 接口与主控 MCU 连接&#xff0c…...

3步解锁:让老旧电脑流畅运行Windows 11的终极精简方案

3步解锁&#xff1a;让老旧电脑流畅运行Windows 11的终极精简方案 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 在数字时代&#xff0c;系统性能直接影响工作效…...

Realistic Vision V5.1镜像免配置部署教程:Docker+本地模型路径自动校验

Realistic Vision V5.1镜像免配置部署教程&#xff1a;Docker本地模型路径自动校验 1. 项目概述 Realistic Vision V5.1虚拟摄影棚是基于Stable Diffusion 1.5生态顶级写实模型开发的本地化工具&#xff0c;专为追求摄影级人像效果的用户设计。这个解决方案通过Docker容器化技…...

从一次存储故障复盘说起:深入理解FC SAN中WWN、WWPN、WWNN的区别与实战应用

从一次存储故障复盘说起&#xff1a;深入理解FC SAN中WWN、WWPN、WWNN的区别与实战应用 那天凌晨三点&#xff0c;我被一阵急促的电话铃声惊醒。客户的核心数据库集群突然失去存储连接&#xff0c;业务完全停滞。当我赶到现场时&#xff0c;运维团队已经尝试了重启服务器、更换…...

Qwen2.5-72B-Instruct-GPTQ-Int4实战案例:新能源电池BMS日志分析与故障模式推演

Qwen2.5-72B-Instruct-GPTQ-Int4实战案例&#xff1a;新能源电池BMS日志分析与故障模式推演 1. 项目背景与模型介绍 新能源电池管理系统(BMS)是电动汽车和储能系统的核心组件&#xff0c;每天产生大量运行日志数据。传统分析方法依赖人工经验&#xff0c;效率低下且难以发现潜…...

如何为Unity游戏添加自定义功能:BepInEx插件框架的全方位实战指南

如何为Unity游戏添加自定义功能&#xff1a;BepInEx插件框架的全方位实战指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity Mono、IL2CPP和.NET框架游戏…...

3分钟解决NCM格式难题:ncmdumpGUI让你的音乐重获自由 [特殊字符]

3分钟解决NCM格式难题&#xff1a;ncmdumpGUI让你的音乐重获自由 &#x1f3b5; 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐的NCM格式文件…...

Windows 11 零基础搞定 Coze Studio 本地部署:Docker 配置 + 豆包模型实战

Windows 11 零基础搞定 Coze Studio 本地部署&#xff1a;Docker 配置 豆包模型实战 1. 环境准备与Docker安装 对于Windows 11用户来说&#xff0c;Docker是运行Coze Studio的基础环境。与Linux或macOS不同&#xff0c;Windows平台需要特别注意虚拟化支持和镜像源配置。 硬…...

Qwen2-VL-2B-Instruct环境配置详解:Anaconda虚拟环境管理与依赖冲突解决

Qwen2-VL-2B-Instruct环境配置详解&#xff1a;Anaconda虚拟环境管理与依赖冲突解决 每次准备跑一个新的大模型&#xff0c;最头疼的往往不是模型本身&#xff0c;而是环境配置。特别是像Qwen2-VL-2B-Instruct这种多模态模型&#xff0c;它需要PyTorch、Transformers、CUDA&am…...

macOS效率工具:Dozer极简菜单栏管理方案

macOS效率工具&#xff1a;Dozer极简菜单栏管理方案 【免费下载链接】Dozer Hide menu bar icons on macOS 项目地址: https://gitcode.com/gh_mirrors/do/Dozer 在现代工作环境中&#xff0c;macOS用户常常面临菜单栏图标过多导致的视觉混乱问题。随着各类应用程序的安…...