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

《TCP/IP网络编程》阅读笔记--多播与广播

目录

1--多播

2--多播代码实例

3--广播

4--广播代码实例


1--多播

        多播方式的数据传输是基于 UDP 完成的,多播数据包的格式与 UDP 数据包相同;

        多播与 UDP 的区别:UDP 数据传输以单一目标进行,多播数据同时传递到加入(注册)特定组的大量主机;

多播的数据传输特点:

        ① 多播服务器端针对特定多播组,只发送一次数据;

        ② 即使只发送 1 次数据,该组内的所有客户端都会接收数据;

        ③ 多播组数可在 IP 地址范围内任意增加;

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

        多播组使用的是 D 类IP地址(224.0.0.0~239.255.255.255);

        为了传递多播数据包,必须设置 TTL(Time to Live);TTL 用整数表示,每经过 1 个路由器 TTL 就会减 1,当 TTL 变为 0 时数据包无法再被传递;

// 与 TTL 相关的协议层是 IPPROTO_IP,选项名为IP_MULTICAST_TTL
// 以下伪代码将 TTL 设置为 64
int send_sock;
int time_live = 64;
send_sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST, (void*) &time_live, sizeof(time_live));// 与加入多播组相关的协议层是 IPPROTO_IP,选项名为IP_ADD_MEMBERSHIP
// 以下伪代码实现加入多播组
int recv_sock;
struct ip_mreq join_adr;
...
recv_sock = socket(PFINET, SOCK_DGRAM, 0);
...
join_adr.imr_multiaddr.s_addr = "多播组地址信息";
join_adr.imr_interface.s_addr = "加入多播组的主机地址信息";
setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)& join_adr, sizeof(join_adr));
...struct ip_mreq{struct in_addr imr_multiaddr; // 表示加入的多播组IP地址struct in_addr imr_interface; // socket所属主机的IP地址,可以使用 INADDR_ANY
} 

2--多播代码实例

发送端:

// gcc news_sender.c -o news_sender
// ./news_sender 224.1.1.2 9190#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define TTL 64
#define BUF_SIZE 30void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char* argv[]){int send_sock;struct sockaddr_in mul_adr;int time_live = TTL; // 初始化 TTL 大小FILE* fp;char buf[BUF_SIZE];if(argc != 3){printf("Usage: %s <GroupIP> <PORT>\n", argv[0]);exit(1);}send_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&mul_adr, 0, sizeof(mul_adr));mul_adr.sin_family = AF_INET;mul_adr.sin_addr.s_addr = inet_addr(argv[1]); // 多播IPmul_adr.sin_port = htons(atoi(argv[2])); // 多播端口setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*)&time_live, sizeof(time_live));if((fp = fopen("news.txt", "r")) == NULL){error_handling("fopen() error");}while(!feof(fp)){fgets(buf, BUF_SIZE, fp);sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&mul_adr, sizeof(mul_adr));sleep(2);}fclose(fp);close(send_sock);return 0;
}

接收端:

// gcc news_receiver.c -o news_receiver
// ./news_receiver 224.1.1.2 9190
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char* argv[]){int recv_sock;int str_len;char buf[BUF_SIZE];struct sockaddr_in adr;struct ip_mreq join_adr;if(argc != 3){printf("Usage: %s <GroupIP> <PORT>\n", argv[0]);exit(1);}recv_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&adr, 0, sizeof(adr));adr.sin_family = AF_INET;adr.sin_addr.s_addr = htonl(INADDR_ANY);adr.sin_port = htons(atoi(argv[2])); // 多播端口if(bind(recv_sock, (struct sockaddr*) &adr, sizeof(adr)) == -1){error_handling("bind() error");}join_adr.imr_multiaddr.s_addr = inet_addr(argv[1]); // 设置接收的多播地址join_adr.imr_interface.s_addr = htonl(INADDR_ANY); // 设置本机地址// 设置 IP_ADD_MEMBERSHIP 可选项,允许加入多播组setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));while(1){str_len = recvfrom(recv_sock, buf, BUF_SIZE-1, 0, NULL, 0);if(str_len < 0){break;}buf[str_len] = 0;fputs(buf, stdout);}close(recv_sock);return 0;
}

3--广播

        广播也可以实现一次性向多个主机发送数据,但广播只能向同一网络中的主机传输数据;广播基于 UDP 完成,其根据 IP 地址的不同,可以分为:直接广播和本地广播;

        直接广播的 IP 地址中除了网络地址外,其余主机地址全部设置为 1,例如向网络地址 192.12.34. 中所有的主机传输数据时,可以向 192.12.34.255 传输;

        本地广播中使用的 IP 地址限定为 255.255.255.255,例如192.32.24网络中的主机向 255.255.255.255 传输数据时,数据将传递到 192.32.24 网络中的所有主机;

// 数据通信中使用的 IP 地址是与 UDP 示例的唯一区别
// 默认生成的 socket 会阻止广播,因此需要使用以下伪代码更改默认设置
// 调用 setsockopt() 函数,将 SO_BROADCAST 选项设置为 bcast 变量中的值 1
int send_sock;
int bcast = 1;
...
send_sock = socket(PF_INET, SOCK_DGRAM, 0);
...
setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void*)& bcast, sizeof(bcast));
...

4--广播代码实例

发送端:

// gcc news_sender_brd.c -o news_sender_brd
// ./news_sender_brd 255.255.255.255 9190#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char* argv[]){int send_sock;struct sockaddr_in broad_adr;FILE* fp;char buf[BUF_SIZE];int so_brd = 1;if(argc != 3){printf("Usage: %s <Broadcast_IP> <PORT>\n", argv[0]);exit(1);}send_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&broad_adr, 0, sizeof(broad_adr));broad_adr.sin_family = AF_INET;broad_adr.sin_addr.s_addr = inet_addr(argv[1]); // 广播IPbroad_adr.sin_port = htons(atoi(argv[2])); // 广播端口// 允许数据广播setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));if((fp = fopen("news.txt", "r")) == NULL){error_handling("fopen() error");}while(!feof(fp)){fgets(buf, BUF_SIZE, fp);sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&broad_adr, sizeof(broad_adr));sleep(2);}close(send_sock);return 0;
}

接收端:

// gcc news_receiver_brd.c -o news_receiver_brd
// ./news_receiver_brd 9190
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char* argv[]){int recv_sock;struct sockaddr_in adr;int str_len;char buf[BUF_SIZE];if(argc != 2){printf("Usage: %s <PORT>\n", argv[0]);exit(1);}recv_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&adr, 0, sizeof(adr));adr.sin_family = AF_INET;adr.sin_addr.s_addr = htonl(INADDR_ANY);adr.sin_port = htons(atoi(argv[1])); // 接收的广播端口if(bind(recv_sock, (struct sockaddr*) &adr, sizeof(adr)) == -1){error_handling("bind() error");}while(1){str_len = recvfrom(recv_sock, buf, BUF_SIZE-1, 0, NULL, 0);if(str_len < 0){break;}buf[str_len] = 0;fputs(buf, stdout);}close(recv_sock);return 0;
}

相关文章:

《TCP/IP网络编程》阅读笔记--多播与广播

目录 1--多播 2--多播代码实例 3--广播 4--广播代码实例 1--多播 多播方式的数据传输是基于 UDP 完成的&#xff0c;多播数据包的格式与 UDP 数据包相同&#xff1b; 多播与 UDP 的区别&#xff1a;UDP 数据传输以单一目标进行&#xff0c;多播数据同时传递到加入&#xff…...

聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展

【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售&#xf…...

本地缓存Caffeine的缓存过期淘汰策略

本地缓存是一种将数据存储在应用程序的内存中&#xff0c;以加速数据访问的技术。缓存的数据可以是频繁访问的数据&#xff0c;以减少对慢速数据源&#xff08;如数据库或网络&#xff09;的访问。缓存通常有一些缓存过期淘汰策略&#xff0c;以确保缓存中的数据保持最新和有效…...

激光焊接汽车尼龙塑料配件透光率测试仪

激光塑性成型技术是近年来塑性加工界出现的一种新技术。通常塑料主要是通过加热加压依赖模具成型。这对于单品种、大批量生产是有效的&#xff1b;而对于各种不同形状的塑料制件则需要昂贵的模具‚装置也较庞大。 高度聚焦的激光束垂直照射在待变形的板料上‚由于塑料直接吸收激…...

2023年高校大数据实验室建设方案

大数据实验室建设方案具体内容包括&#xff1a;人才培养方案建设、课程资源建设、师资建设、实验室建设、教学服务建设。 泰迪打造国内领先的大数据人工智能及课程资源&#xff0c;包括&#xff1a;商务数据分析实训管理平台、云计算资源管理平台、大数据编程实训平台、商务数据…...

计网第五章(运输层)(一)

在前面的博客中&#xff0c;总是说主机之间进行通信。但实际上通信的真正的实体是位于通信两端主机中的进程。 一、运输层基本概述 运输层的任务就是为运行在不同主机上的应用进程提供直接的通信服务&#xff0c;运输层的协议又称为端到端协议。运输层中使用不同的端口来对应…...

ILS解析漏洞复现

搭建好ILS后&#xff0c;访问127.0.0.1:8000 写一个phpinfo的脚本 可以看到。现在是不能访问的 赋予 IIS 解析 phpinfo 能力 打开服务器管理器&#xff0c;打开 IIS 管理器 点击处理程序映射 再次访问&#xff0c;发现程序可以访问 将index.php改为index.png 此时php脚本自然是…...

0067__Git学习(1.本地仓库与暂存区)

Git学习&#xff08;1.本地仓库与暂存区&#xff09;_git暂存区_听枫1122的博客-CSDN博客 git的本地仓库在哪里_git本地仓库在哪里_二十英里法则的博客-CSDN博客...

Mac端交互式原型设计 Axure RP 8 for Mac汉化

Axure RP 8是一款专业的交互原型设计工具&#xff0c;它被广泛应用于用户体验设计、界面设计和产品原型制作等领域。该软件提供了丰富的功能和工具&#xff0c;使用户能够创建出具有高度交互性和可视化效果的原型。 Axure RP 8的主要特点和功能包括&#xff1a; 1. 快速原型&a…...

GO语言网络编程(并发编程)Sync

GO语言网络编程&#xff08;并发编程&#xff09;Sync 1、Sync 1.1.1. sync.WaitGroup 在代码中生硬的使用time.Sleep肯定是不合适的&#xff0c;Go语言中可以使用sync.WaitGroup来实现并发任务的同步。 sync.WaitGroup有以下几个方法&#xff1a; 方法名 功能 (wg * WaitG…...

如何在 Ubuntu 上安装 Nagios?

Nagios 的功能 Nagios 的一些关键功能包括&#xff1a; 主机和服务监控&#xff1a; Nagios 允许您使用提供实时状态数据的插件来监控主机&#xff08;可以是物理机或虚拟机&#xff09;以及 HTTP、SSH 和 SMTP 等服务。此功能使您能够全面了解整个基础设施的运行状况和可用性…...

汽车技术发展趋势及我国节能与新能源汽车技术

一、世界汽车技术发展趋势 汽车技术正向着低碳化、信息化、智能化方向发展&#xff1b;“三化”趋势成为世界主要汽车强国、主要车企共同的战略选择。 主要汽车战略及方向 在“三化”趋势下&#xff0c;各汽车强国在汽车节能技术、新能源汽车技术、智能网联汽车技术等方面持续…...

如何实现负载均衡

在如今互联网应用日益火热的背景下&#xff0c;为了保证应用程序的高可用性和高性能&#xff0c;负载均衡变得越来越重要。负载均衡是指将传入的请求分配到多个服务器上&#xff0c;以避免单一服务器的过载&#xff0c;提高系统的可用性和性能。而PHP作为一种广泛使用的服务器端…...

Jetsonnano B01 笔记3:GPIO上拉下拉-输入输出读取

今日继续我的jetsonnano学习之路&#xff0c;今日学习的是GPIO的上拉下拉&#xff0c;输入输出的读取&#xff0c;文章贴出完整操作步骤过程&#xff0c;贴出源码。 目录 Linux常用文件命令&#xff1a; ls&#xff08;list&#xff09;列表&#xff1a; man&#xff1a; …...

COMO-ViT论文阅读笔记

Low-Light Image Enhancement with Illumination-Aware Gamma Correction and Complete Image Modelling Network 这是一篇美团、旷视、深先院、华为诺亚方舟实验室、中国电子科技大学 五个单位合作的ICCV2023的暗图增强论文&#xff0c;不过没有开源代码。 文章的贡献点一个是…...

智慧燃气:智慧燃气发展的讨论

关键词&#xff1a;智慧燃气、智能管网、智慧燃气系统、智能燃气、智慧燃气建设、智慧燃气平台 智慧燃气是什么&#xff1f; 智慧燃气是以智能管网建设为基础&#xff0c;利用先进的通信、传感、储能、微电子、数据优化管理和智能控制等技术&#xff0c;实现天然气与其他能源…...

音视频会议需要哪些设备配置

音视频会议需要哪些设备配置&#xff1f;音视频会议需要&#xff1a;视频会议摄像头、麦克风、扬声器、显示设备、网络连接设备、视频会议服务器、视频会议软件等。 1. 视频会议摄像头&#xff1a;用于捕捉与传输视频图像&#xff0c;可以选择高清摄像头&#xff0c;提供更出色…...

性能测试 —— Jmeter事务控制器

事务&#xff1a; 性能测试中&#xff0c;事务指的是从端到端&#xff0c;一个完整的操作过程&#xff0c;比如一次登录、一次 筛选条件查询&#xff0c;一次支付等&#xff1b;技术上讲&#xff1a;事务就是由1个或多个请求组成的 事务控制器 事务控制器类似简单控制器&…...

【Tomcat7部署Springboot版本不兼容问题】

Tomcat7部署Springboot版本不兼容 报错网上解决方案tomcat7可以部署springboot哪些版本分析原因解决方法 报错 SEVERE: Unable to deploy collapsed ear in war StandardEngine[Catalina].StandardHost[localhost].StandardContext[/demo] org.apache.openejb.OpenEJBException…...

RabbitMQ消息中间件

RabbitMQ消息中间件 RabbitMQ简介windows下安装RabbitMQRabbitMQ基本概念RabbitMQ简单模式RabbitMQ工作队列模式RabbitMQ发布订阅模式RabbitMQ路由模式RabbitMQ主题模式RabbitMQ RPC模式RabbitMQ发布确认模式...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...