《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 完成的,多播数据包的格式与 UDP 数据包相同; 多播与 UDP 的区别:UDP 数据传输以单一目标进行,多播数据同时传递到加入ÿ…...
聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展
【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售…...
本地缓存Caffeine的缓存过期淘汰策略
本地缓存是一种将数据存储在应用程序的内存中,以加速数据访问的技术。缓存的数据可以是频繁访问的数据,以减少对慢速数据源(如数据库或网络)的访问。缓存通常有一些缓存过期淘汰策略,以确保缓存中的数据保持最新和有效…...
激光焊接汽车尼龙塑料配件透光率测试仪
激光塑性成型技术是近年来塑性加工界出现的一种新技术。通常塑料主要是通过加热加压依赖模具成型。这对于单品种、大批量生产是有效的;而对于各种不同形状的塑料制件则需要昂贵的模具‚装置也较庞大。 高度聚焦的激光束垂直照射在待变形的板料上‚由于塑料直接吸收激…...
2023年高校大数据实验室建设方案
大数据实验室建设方案具体内容包括:人才培养方案建设、课程资源建设、师资建设、实验室建设、教学服务建设。 泰迪打造国内领先的大数据人工智能及课程资源,包括:商务数据分析实训管理平台、云计算资源管理平台、大数据编程实训平台、商务数据…...
计网第五章(运输层)(一)
在前面的博客中,总是说主机之间进行通信。但实际上通信的真正的实体是位于通信两端主机中的进程。 一、运输层基本概述 运输层的任务就是为运行在不同主机上的应用进程提供直接的通信服务,运输层的协议又称为端到端协议。运输层中使用不同的端口来对应…...
ILS解析漏洞复现
搭建好ILS后,访问127.0.0.1:8000 写一个phpinfo的脚本 可以看到。现在是不能访问的 赋予 IIS 解析 phpinfo 能力 打开服务器管理器,打开 IIS 管理器 点击处理程序映射 再次访问,发现程序可以访问 将index.php改为index.png 此时php脚本自然是…...
0067__Git学习(1.本地仓库与暂存区)
Git学习(1.本地仓库与暂存区)_git暂存区_听枫1122的博客-CSDN博客 git的本地仓库在哪里_git本地仓库在哪里_二十英里法则的博客-CSDN博客...
Mac端交互式原型设计 Axure RP 8 for Mac汉化
Axure RP 8是一款专业的交互原型设计工具,它被广泛应用于用户体验设计、界面设计和产品原型制作等领域。该软件提供了丰富的功能和工具,使用户能够创建出具有高度交互性和可视化效果的原型。 Axure RP 8的主要特点和功能包括: 1. 快速原型&a…...
GO语言网络编程(并发编程)Sync
GO语言网络编程(并发编程)Sync 1、Sync 1.1.1. sync.WaitGroup 在代码中生硬的使用time.Sleep肯定是不合适的,Go语言中可以使用sync.WaitGroup来实现并发任务的同步。 sync.WaitGroup有以下几个方法: 方法名 功能 (wg * WaitG…...
如何在 Ubuntu 上安装 Nagios?
Nagios 的功能 Nagios 的一些关键功能包括: 主机和服务监控: Nagios 允许您使用提供实时状态数据的插件来监控主机(可以是物理机或虚拟机)以及 HTTP、SSH 和 SMTP 等服务。此功能使您能够全面了解整个基础设施的运行状况和可用性…...
汽车技术发展趋势及我国节能与新能源汽车技术
一、世界汽车技术发展趋势 汽车技术正向着低碳化、信息化、智能化方向发展;“三化”趋势成为世界主要汽车强国、主要车企共同的战略选择。 主要汽车战略及方向 在“三化”趋势下,各汽车强国在汽车节能技术、新能源汽车技术、智能网联汽车技术等方面持续…...
如何实现负载均衡
在如今互联网应用日益火热的背景下,为了保证应用程序的高可用性和高性能,负载均衡变得越来越重要。负载均衡是指将传入的请求分配到多个服务器上,以避免单一服务器的过载,提高系统的可用性和性能。而PHP作为一种广泛使用的服务器端…...
Jetsonnano B01 笔记3:GPIO上拉下拉-输入输出读取
今日继续我的jetsonnano学习之路,今日学习的是GPIO的上拉下拉,输入输出的读取,文章贴出完整操作步骤过程,贴出源码。 目录 Linux常用文件命令: ls(list)列表: man: …...
COMO-ViT论文阅读笔记
Low-Light Image Enhancement with Illumination-Aware Gamma Correction and Complete Image Modelling Network 这是一篇美团、旷视、深先院、华为诺亚方舟实验室、中国电子科技大学 五个单位合作的ICCV2023的暗图增强论文,不过没有开源代码。 文章的贡献点一个是…...
智慧燃气:智慧燃气发展的讨论
关键词:智慧燃气、智能管网、智慧燃气系统、智能燃气、智慧燃气建设、智慧燃气平台 智慧燃气是什么? 智慧燃气是以智能管网建设为基础,利用先进的通信、传感、储能、微电子、数据优化管理和智能控制等技术,实现天然气与其他能源…...
音视频会议需要哪些设备配置
音视频会议需要哪些设备配置?音视频会议需要:视频会议摄像头、麦克风、扬声器、显示设备、网络连接设备、视频会议服务器、视频会议软件等。 1. 视频会议摄像头:用于捕捉与传输视频图像,可以选择高清摄像头,提供更出色…...
性能测试 —— Jmeter事务控制器
事务: 性能测试中,事务指的是从端到端,一个完整的操作过程,比如一次登录、一次 筛选条件查询,一次支付等;技术上讲:事务就是由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发布确认模式...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
