Linux网络编程之---组播和广播
一.组播
1.概述
单播地址标识单个IP 接口,广播地址标识某个子网的所有IP 接口,
多播地址标识一组IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部),
多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收,
也就是说由运行相应多播会话应用系统的主机上的接口接收。
另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用。a.组播既可以用于局域网,也可以用于广域网
b.客户端需要加入多播组,才能接收到多的数据
2.api介绍
int setsockopt(int sockfd, int level, int opetname, const void *optval, socklen_t optlen)服务器设置多播的信息,外出接口-level : IPPROTO_IP- optname : IP_MULTICAS_IF- optval : struct in_addr客户端加入到多播组-level : IPPROTO_IP-optname : IP_ADD_MEMBERSHIP-optval : struct mreqn
3.服务端和客户端代码实现
3.1.serer
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int udp_sockfd = socket(AF_INET,SOCK_DGRAM,0);if(udp_sockfd == -1){perror("socket");exit(-1);}//设置多播的属性,设置外出接口struct in_addr imr_multiaddr;inet_pton(AF_INET,"239.0.0.10",&imr_multiaddr.s_addr);setsockopt(udp_sockfd,IPPROTO_IP,IP_MULTICAST_IF,&imr_multiaddr,sizeof(imr_multiaddr));//创建客户端的地址信息struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr("239.0.0.10"); //广播地址server.sin_port = htons(8000);int num = 0;while(1){char sendBuf[128];sprintf(sendBuf,"hello,client-----%d\n",num++);//发送数据sendto(udp_sockfd,sendBuf,strlen(sendBuf)+1,0,(const struct sockaddr*)&server,sizeof(server));printf("组播数据:%s\n",sendBuf);sleep(1);}close(udp_sockfd);return 0;
}
3.2.client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd = socket(PF_INET, SOCK_DGRAM, 0);if(fd == -1) {perror("socket");exit(-1);} struct in_addr in;// 2.客户端绑定本地的IP和端口struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(9999);addr.sin_addr.s_addr = INADDR_ANY;int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));if(ret == -1) {perror("bind");exit(-1);}struct ip_mreq op;inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr);op.imr_interface.s_addr = INADDR_ANY;// 加入到多播组setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op));// 3.通信while(1) {char buf[128];// 接收数据int num = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);printf("server say : %s\n", buf);}close(fd);return 0;
}
二.广播
1.概述
向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,
每个广播消息都包含一个特殊的IP地址,这个P中子网内主机标志部分的二进制全部为1。a.只能在局域网中使用
b.客户端需要绑定服务器广播使用的端口,才可以接收到广播消息
2.api介绍
//设置广播属性的函数
int setsockopt(int sockfd, int level, int opetname, const void *optval, socklen_t optlen)-sockfd : 文件描述符-level : SOL_SOCKET-optname : SO_BROADCAST-optval : int 类型的值,为1表示允许广播-optlen : optval的大小
3.服务端和客户端代码实现
3.1 server
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int udp_sockfd = socket(AF_INET,SOCK_DGRAM,0);if(udp_sockfd == -1){perror("socket");exit(-1);}//设置广播int opt = 1;setsockopt(udp_sockfd,SOL_SOCKET,SO_BROADCAST,(const void*)&opt,sizeof(opt));//创建一个广播的地址struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr("192.168.26.255"); //广播地址server.sin_port = htons(8000);int num = 0;while(1){char sendBuf[128];sprintf(sendBuf,"hello,client-----%d\n",num++);//发送数据sendto(udp_sockfd,sendBuf,strlen(sendBuf)+1,0,(const struct sockaddr*)&server,sizeof(server));printf("广播数据:%s\n",sendBuf);sleep(1);}close(udp_sockfd);return 0;
}
3.2 client
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>int main()
{int udp_sockfd = socket(AF_INET,SOCK_DGRAM,0);if(udp_sockfd == -1){perror("socket");exit(-1);}//创建一个广播的地址struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(8000);if(bind(udp_sockfd,(const struct sockaddr*)&server,sizeof(server)) == -1){perror("bind");exit(-1);}char buf[128];while(1){int num = recvfrom(udp_sockfd,buf,sizeof(buf),0,NULL,NULL);printf("server say: %s\n",buf);}close(udp_sockfd);return 0;
}
相关文章:
Linux网络编程之---组播和广播
一.组播 1.概述 单播地址标识单个IP 接口,广播地址标识某个子网的所有IP 接口, 多播地址标识一组IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部), 多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收…...
Apache Dolphinscheduler可视化 DAG 工作流任务调度系统
Apache Dolphinscheduler 关于 一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 DolphinScheduler 的主要特性如下: 易于部署,提供四种部署方式&am…...
docker 部署共享文档ZFile
1、拉取ZFile镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/tirling-pdf/zfile:latest 2、创建文件夹和进入文件夹 mkdir zfile && cd zfile 3、创建docker-compose.yml配置文件。 vim docker-compose.yml version: 3.3 service…...
面试题之JVM
一、Java虚拟机基本概念 题目1:Java虚拟机(JVM)是什么? 选项: A. 一种编程语言 B. 一个可以执行Java字节码的虚拟机进程 C. 一个操作系统 D. 一个数据库 参考答案:B 解析:Java虚拟机是一个可…...
二叉树的深搜(不定期更新。。。。。)
二叉树的深搜 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉…...
WebLLM Chat:无服务器、私密的AI聊天体验
简介 什么是 Web-LLM ? Web-LLM 是一个高性能的浏览器内语言模型推理引擎,允许用户在没有服务器支持的情况下直接在网页浏览器中进行语言模型推理。它利用 WebGPU 进行硬件加速,从而实现强大的 LLM 操作。Web-LLM 完全兼容 OpenAI API,支持…...
C#中的模拟服务器与客户端建立连接
创建一个控制台项目,命名为Server,模拟服务器端。在同一个解决方案下,添加新项目,命名为Client,模拟客户端。在服务器端与客户端之间建立TCP连接,并在客户端发送消息,在服务器端输出。 Server项…...
【深度学习】利用Java DL4J 构建和训练医疗影像分析模型
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s…...
application.yml 和 bootstrap.yml
在 Spring Boot 中,application.yml 和 bootstrap.yml 都是用来配置应用程序的属性文件,通常用于环境配置、服务配置等。但是,它们有一些不同的用途和加载顺序。以下是它们之间的主要区别: 1. application.yml: 主要…...
使用uniapp开发小程序场景:在百度地图上调用接口返回的设备相关信息并展示
首先在百度地图开发者平台注册微信小程序开发密钥下载百度地图SDK-bmap-wx.min.js,下载地址在项目入口index.html页面进行引入页面中进行调用,代码示例如下<map id"map" longitude"108.95" latitude"34.34" scale"3" :m…...
ubuntu22.04 使用可以用的镜像源获取你要的镜像
默认的是不行的 不管pull啥镜像 仍然会出现这个错误 Error response form daemon:Get "https://registry-1.docker.io/v2": net/http: request canceled while waiting for connection (Client.Timeout exceeded while await) 操作方法是 如果在目录没有/etc/docker…...
Flume——sink连接hdfs的参数配置(属性参数+时间参数)
这可不是目录 配置文件官网说明属性参数时间参数 配置文件官网说明 可以参考官网的说明 属性参数 属性名称默认值说明channel-type-组件类型名称,必须是hdfshdfs.path-HDFS路径,例如:hdfs://mycluster/flume/mydatahdfs.filePrefixFlumeDa…...
python+docker实现分布式存储的demo
test.py代码 #test.py from flask import Flask, request, jsonify import requests import sys import threadingapp Flask(__name__)# 存储数据 data_store {}# 节点列表,通过环境变量传入 nodes [] current_node Noneapp.route(/set, methods[POST]) def …...
go-blueprint create exit status 1
1. 异常信息 2024/12/06 10:59:19 Could not initialize go.mod in new project exit status 1 2024/12/06 10:59:19 Problem creating files for project. exit status 1 Error: exit status 12. 排查思路 手动进行go mod init查看手动的报错解决报错 3. 解决问题 发现是GO11…...
如何更改Git用户名 - 本地与全局设置指南
在开发过程中,当使用Git作为版本控制系统时,可能会遇到需要更改用户名的情况,适时更新Git配置是保持项目管理效率的重要环节。更改Git用户名可以帮助确保您的提交反映了当前的用户身份,这对于项目的协作和历史记录跟踪至关重要。 …...
Node.js JWT认证教程
Node.js JWT认证教程 1. 项目介绍 JSON Web Token (JWT) 是一种安全的跨域身份验证解决方案,在现代Web应用中广泛使用。本教程将详细讲解如何在Node.js中实现JWT认证。 2. 项目准备 2.1 初始化项目 # 创建项目目录 mkdir nodejs-jwt-auth cd nodejs-jwt-auth# …...
【青牛科技】应用于音频信号处理系统的D258 是由两个独立的高增益运算放大器组成
概述: D258是由两个独立的高增益运算放大器组成。可以是单电源工作,也可以是双电源工作,电源的电流消耗与电源电压大小无关。应用范围包括变频放大器、DC增益部件和所有常规运算放大电路。 主要特点: ● 可单电源或双电源 工作 ● 在一个封…...
HTML Input 文件上传功能全解析:从基础到优化
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
小程序 —— Day1
组件 — view和scroll-view view 类似于HTML中的div,是一个块级元素 案例:通过view组件实现页面的基础布局 scroll-view 可滚动的视图区域,用来实现滚动列表效果 案例:实现纵向滚动效果 scroll-x属性:允许横向滚动…...
4.5 TCP 报文段的首部格式
欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言1 TCP 报文段的基本结构2 固定部分2.1 源端口与目的端口2.2 序号2.3 确认号2.4 数据偏移2.5 保留字段2.6 控制位2.7 窗口2.8 检验和2.9 紧急指针 3 可变部分3.1 选项3.2 填…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
