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

UDP 广播/组播

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址xxx.xxx.xxx.255,将消息发送到在同一广播网络上的每个主机,广播/组播只能用udp进行实现

 函数:int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_toptlen);

参数:
sockfd:要设置的套接字描述符。
level:选项定义的层次。或为特定协议的代码(如IPv4,IPv6,TCP,SCTP),或为通用套接字代码(SOL_SOCKET)。
optname:选项名。level对应的选项,一个level对应多个选项,不同选项对应不同功能。
optval:指向某个变量的指针,该变量是要设置新值的缓冲区。可以是一个结构体,也可以是普通变量
optlen:optval的长度。

关于optname的可选项,根据你需要的功能进行设置

当leve为SOL_SOCKET时,optname可以有以下选项(一部分)
SO_BROADCAST     允许发送广播数据            int
SO_DEBUG        允许调试                int
SO_LINGER        延迟关闭连接          struct linger
SO_OOBINLINE      带外数据放入正常数据流         int
SO_RCVBUF        接收缓冲区大小             int
SO_SNDBUF        发送缓冲区大小             int
SO_RCVLOWAT      接收缓冲区下限             int
SO_SNDLOWAT      发送缓冲区下限             int
SO_RCVTIMEO       接收超时           struct timeval
SO_SNDTIMEO       发送超时           struct timeval

流程:socket---setsockopt----sendto---close  值得注意的是 你的接收端必须和发送端保持一致的端口号,用广播地址进行发送,只要在同一局域网,且端口号一致的,都会收到发送端的消息,广播地址可以用ifconfig进行查看,接收方只需要接收就行了

出现的错误:发送端和接收端没有问题,但接收端死活接收不到消息,用准确的ip地址发就可以,用广播地址就是接收不到消息,后面我把接收端的ip地址改成:INADDR_ANY ,就可以

INADDR_ANY:表示本机上所有的ip地址,转换过来就是0.0.0.0,因为电脑不止一块网卡。多网卡情况下,ip地址也就多了

udp广播 发送端
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <unistd.h>void main(int argc,char ** argv)
{if(argc != 3){printf("argc error!\n");exit(-1);}int fd;char buf[128];struct sockaddr_in client;//1.socketfd = socket(AF_INET,SOCK_DGRAM,0);if(fd < 0){perror("socket");}elseprintf("socket succeed!\n");//2.setsockoptint so_broadcast = 1;setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof(so_broadcast));//SO_BROADCAST:为配置广播选项,// so_broadcast :0,关闭广播;1:开
启广播client.sin_family = AF_INET;client.sin_port = htons(atoi(argv[2]));inet_aton(argv[1],&client.sin_addr);//3.sendtowhile(1){memset(buf,'\0',sizeof(buf));printf("请输入您要发的消息:");gets(buf);if(!strncasecmp(buf,"quit",4)){break;}sendto(fd,buf,sizeof(buf),0,(struct sockaddr *)&client,sizeof(client));}printf("客户端已退出-----\n");//4.closeclose(fd);
}

组播弥补了广播的不足,他是将想要收到消息的主机,通过组播地址加入到这个组播,只有加入了组播的主机,才会收到消息,组播地址范围:224.0.0.0 到 239.255.255.255

流程:socket--bind-- 加入多播组(结构体)---setsockopt(打开组播)---recvfrom---close

发送端只需要和接收端保持一致的端口号,用组播地址进行发送,加入到组播的主机就会收到消息

struct ip_mreq          
{ struct in_addr imn_multiaddr; // 多播组 IP,struct in_addr imr_interface;   // 将谁的IP添加到多播组 
};

组播接收端

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define SIZE 128void main(int argc,char **argv)
{int fd;int bFlag;char buf[128];struct sockaddr_in server;struct sockaddr_in client;//1.socketfd = socket(AF_INET,SOCK_DGRAM,0);if(fd < 0){printf("socket error!\n");}elseprintf("socket succeed!\n");//2.bindserver.sin_family = AF_INET;server.sin_port = htons(8881);//inet_aton(argv[1],&server.sin_addr);server.sin_addr.s_addr = INADDR_ANY;bFlag = bind(fd,(struct sockaddr *)&server,sizeof(struct sockaddr_in));if(bFlag < 0){printf("绑定失败\n");}elseprintf("绑定成功!\n");//3.加入多播组struct ip_mreq zuBo;//组播相关的结构体zuBo.imr_multiaddr.s_addr = inet_addr("224.0.0.1");//加入多播组 224.0.0.1~239.255.255.254zuBo.imr_interface.s_addr = INADDR_ANY;//本机加入多播组//4.设置网络属性 setsockoptint req = 1;setsockopt(fd,IPPROTO_IP,IP_DROP_MEMBERSHIP,&req,sizeof(req));//5.recvfromwhile(1){memset(buf,'\0',sizeof(buf));recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr *)&client,sizeof(client));printf("来自组播:%s:%s\n",inet_ntoa(client.sin_addr),buf);}//6.close
}

 

相关文章:

UDP 广播/组播

广播UDP与单播UDP的区别就是IP地址不同&#xff0c;广播使用广播地址xxx.xxx.xxx.255&#xff0c;将消息发送到在同一广播网络上的每个主机&#xff0c;广播/组播只能用udp进行实现 函数:int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_topt…...

高效创作助手:ChatGPT最新版实现批量撰写聚合文章的全新水平

随着人工智能技术的不断发展&#xff0c;ChatGPT最新版作为一款智能创作助手&#xff0c;实现了批量撰写聚合文章的全新水平。它能够在短时间内生成高质量的文章&#xff0c;极大地提高了创作效率。本文将从随机8-20个方面对ChatGPT最新版进行详细的阐述&#xff0c;让我们一起…...

Python中的包是什么,如何创建和使用包?

在Python中&#xff0c;包是一种将相关模块分组在一起的方式。它可以让我们更好地组织和重用代码。 一个Python包实际上是一个文件夹&#xff0c;其中包含该包的Python模块和其他资源文件&#xff08;例如配置文件、数据文件等&#xff09;。包的根目录通常包含一个名为__init…...

Spring Cloud Alibaba Seata(二)

目录 一、Seata 1、Seata-AT模式 1.1、具体案例 1.2、通过Seata的AT模式解决分布式事务 2、Seata-XA模式 3、Seata-TCC模式 4、Seata-SAGA模式 一、Seata 1、Seata-AT模式 概念&#xff1a;AT模式是一种无侵入的分布式事务解决方案&#xff0c;在 AT 模式下&#xff0c…...

如何在 MySQL 中使用 COALESCE 函数

1. 简介 在 MySQL 中&#xff0c;COALESCE 函数可以用来返回参数列表中的第一个非空值。如果所有参数都为空&#xff0c;则返回 NULL。本文将介绍 COALESCE 函数的语法和用法&#xff0c;并通过示例演示其效果。 2. 语法 COALESCE 函数的语法如下所示&#xff1a; COALESCE(…...

Python爬虫之Scrapy框架系列(22)——初识分布式爬虫scrapy_redis

目录: 分布式爬虫(Scrapy\_redis):1.简单介绍:2.Scrapy_redis的安装:分布式爬虫(Scrapy_redis): 官方文档:https://scrapy-redis.readthedocs.io/en/stable/1.简单介绍: scrapy_redis是一个基于Redis的Scrapy组件,用于scrapy项目的分布式部署和开发。 特点: 分布…...

ChatGPT的前世今生

原文首发于博客文章ChatGPT发展概览 ChatGPT 是OpenAI开发的人工智能聊天机器人程序&#xff0c;于2022年11月推出。该程序使用基于 GPT-3.5、GPT-4 架构的大语言模型并以强化学习训练。ChatGPT目前仍以文字方式交互&#xff0c;而除了可以用人类自然对话方式来交互&#xff0c…...

WireShark常用协议抓包与原理分析

1.ARP协议(地址解析协议) nmap 发现网关nmap -sn 192.168.133.2wireshark 抓请求包和响应包 arp请求包内容 arp响应包内容 总结:请求包包含包类型(request),源IP地址,源MAC地址,目标IP地址,目标MAC地址(未知,此处为全0);响应包包含包类型(reply),源IP地址,源…...

Mysql数据库操作总结

文章目录 1. DDL(Data Definition Language - 数据定义语言)1.1 数据库1.2 数据表(创建查询删除)1.3 数据表(修改) 2. 数据类型2.1 数值2.2 字符2.3 日期 3. 字段约束3.1 约束3.2 主键约束修改3.3 主键自增 联合主键 4. DML(Data Manipulation Language - 数据操作语言)4.1 添…...

在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P2)

大家好&#xff0c;下篇分享咱们继续来说警探角色的重新拓扑、UV、材质贴图和渲染处理。 重新拓扑/UV 这是对我来说最不有趣的部分——重新拓扑。它显然是实时角色中非常重要的一部分&#xff0c;不容忽视&#xff0c;因为它会影响大量的 UV、绑定和后期渲染&#xff0c;这里…...

如何在大规模服务中迁移缓存

当您启动初始服务时&#xff0c;通常会过度设计以考虑大量流量。但是&#xff0c;当您的服务达到爆炸式增长阶段&#xff0c;或者如果您的服务请求和处理大量流量时&#xff0c;您将需要重新考虑您的架构以适应它。糟糕的系统设计导致难以扩展或无法满足处理大量流量的需求&…...

【GPT LLM】跟着论文学习gpt

GPT1开山之作&#xff1a;Improving language understanding by generative pre-training 本文提出了gpt1&#xff0c;即使用无标签的数据对模型先进行训练&#xff0c;让模型学习能够适应各个任务的通用表示&#xff1b;后使用小部分 task-aware的数据对模型进行微调&#xff…...

【玩转Docker小鲸鱼叭】Docker容器常用命令大全

在 Docker 核心概念理解 一文中&#xff0c;我们知道 Docker容器 其实就是一个轻量级的沙盒&#xff0c;应用运行在不同的容器中从而实现隔离效果。容器的创建和运行是以镜像为基础的&#xff0c;容器可以被创建、销毁、启动和停止等。本文将介绍下容器的这些常用操作命令。 1、…...

专项练习11

目录 一、选择题 1、执行下列选项的程序&#xff0c;输出结果不是Window对象的是&#xff08;&#xff09; 2、以下哪些代码执行后 i 的值为10&#xff1a; 二、编程题 1、判断 val1 和 val2 是否完全等同 2、统计字符串中每个字符的出现频率&#xff0c;返回一个 Object&…...

ASP.NET+SQL通用作业批改系统设计(源代码+论文)

随着网络高速地融入当今现代人的生活,学校对网络技术的应用也在不断地提高。学校的教学任务十分复杂,工作也很繁琐,在教学任务中,作业的批改也是一个很重要的环节。为了提高老师工作效率,减轻教师的工作强度,提高作业批改的灵活性,《通用作业批改系统》的诞生可以说是事在…...

基于深度学习的高精度打电话检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度打电话检测识别系统可用于日常生活中或野外来检测与定位打电话目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的打电话目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…...

Vue搭建智能文本检索视频界面

前言 随着人工智能技术的发展&#xff0c;智能文本检索已经成为了一种非常流行的技术。在视频领域中&#xff0c;智能文本检索技术可以帮助用户快速找到自己需要的视频片段&#xff0c;提高用户的观看体验。本文将介绍如何使用Vue框架搭建一个智能文本检索视频界面&#xff0c…...

软考A计划-系统集成项目管理工程师-一般补充知识-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…...

springboot-内置Tomcat

一、springboot的特性之一 基于springboot的特性 自动装配Configuretion 注解 二、springboot内置Tomcat步骤 直接看SpringApplication方法的代码块 总纲&#xff1a; 1、在SpringApplication.run 初始化了一个上下文ConfigurableApplicationContext configurableApplica…...

Flink流批一体计算(2):Flink关键特性

目录 Flink关键特性 流式处理 丰富的状态管理 丰富的时间语义支持 Data pipeline 容错机制 Flink SQL CEP in SQL Flink 应用程序可以消费来自消息队列或分布式日志这类流式数据源&#xff08;例如 Apache Kafka 或 Kinesis&#xff09;的实时数据&#xff0c;也可以从各…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

基于Uniapp的HarmonyOS 5.0体育应用开发攻略

一、技术架构设计 1.混合开发框架选型 &#xff08;1&#xff09;使用Uniapp 3.8版本支持ArkTS编译 &#xff08;2&#xff09;通过uni-harmony插件调用原生能力 &#xff08;3&#xff09;分层架构设计&#xff1a; graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时&#xff0c;需要考虑以下参数&#xff0c;然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...