UDP中的单播,多播,广播(代码实现)

文章目录

  • 1. UDP 单播(Unicast)示例
  • 2. UDP 广播(Broadcast)示例
  • 3. UDP 多播(Multicast)示例
      • 3.1 多播发送方示例
      • 3.2 多播接收方示例
  • 总结



1. UDP 单播(Unicast)示例

发送方向指定单个目标 IP 地址和端口发送数据,接收方绑定端口接收。

// UDP单播发送示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {int sockfd;struct sockaddr_in dest_addr;char *msg = "Hello UDP Unicast!";sockfd = socket(AF_INET, SOCK_DGRAM, 0);  // 创建UDP套接字if (sockfd < 0) {perror("socket error");return -1;}memset(&dest_addr, 0, sizeof(dest_addr));dest_addr.sin_family = AF_INET;dest_addr.sin_port = htons(12345);  // 目标端口inet_pton(AF_INET, "192.168.1.100", &dest_addr.sin_addr);  // 目标IPsendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); // 发送数据printf("UDP Unicast message sent.\n");close(sockfd);return 0;
}

2. UDP 广播(Broadcast)示例

向同一网段内所有主机发送数据,需要开启套接字广播权限。

// UDP广播发送示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {int sockfd;struct sockaddr_in broadcast_addr;char *msg = "Hello UDP Broadcast!";int broadcastEnable = 1;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket error");return -1;}// 允许广播权限if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)) < 0) {perror("setsockopt error");close(sockfd);return -1;}memset(&broadcast_addr, 0, sizeof(broadcast_addr));broadcast_addr.sin_family = AF_INET;broadcast_addr.sin_port = htons(12345);inet_pton(AF_INET, "192.168.1.255", &broadcast_addr.sin_addr); // 广播地址,一般是子网广播地址sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));printf("UDP Broadcast message sent.\n");close(sockfd);return 0;
}

3. UDP 多播(Multicast)示例

多播发送时,发送方把数据发到多播地址和端口;接收方需要加入多播组才能收到消息。

3.1 多播发送方示例

// UDP多播发送示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {int sockfd;struct sockaddr_in multicast_addr;char *msg = "Hello UDP Multicast!";sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket error");return -1;}memset(&multicast_addr, 0, sizeof(multicast_addr));multicast_addr.sin_family = AF_INET;multicast_addr.sin_port = htons(12345);inet_pton(AF_INET, "239.255.0.1", &multicast_addr.sin_addr);  // 多播地址,必须是224.0.0.0~239.255.255.255范围sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)&multicast_addr, sizeof(multicast_addr));printf("UDP Multicast message sent.\n");close(sockfd);return 0;
}

3.2 多播接收方示例

接收方需要加入多播组,才能接收到该组播发送的消息。

// UDP多播接收示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {int sockfd;struct sockaddr_in local_addr;struct ip_mreq mreq;char buf[256];int nbytes;socklen_t addrlen;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0) {perror("socket error");return -1;}// 绑定本地端口,监听多播数据memset(&local_addr, 0, sizeof(local_addr));local_addr.sin_family = AF_INET;local_addr.sin_port = htons(12345);local_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有本地接口if(bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)) < 0) {perror("bind error");close(sockfd);return -1;}// 加入多播组mreq.imr_multiaddr.s_addr = inet_addr("239.255.0.1"); // 多播组地址mreq.imr_interface.s_addr = htonl(INADDR_ANY);        // 本地接口if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {perror("setsockopt mreq error");close(sockfd);return -1;}printf("Waiting for multicast message...\n");addrlen = sizeof(local_addr);while(1) {nbytes = recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr*)&local_addr, &addrlen);if(nbytes < 0) {perror("recvfrom error");break;}buf[nbytes] = '\0';printf("Received multicast message: %s\n", buf);}// 离开多播组(可选)setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));close(sockfd);return 0;
}

总结

通信方式发送代码重点需要设置接收代码重点
单播直接 sendto 指定目标 IP/端口无需特殊设置bind 监听端口,recvfrom接收
广播设置 SO_BROADCAST 选项需要开启广播权限bind监听端口,recvfrom接收
多播发送到多播组地址(224~239)发送无需特殊设置bind监听端口 + IP_ADD_MEMBERSHIP加入组播

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91979.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络:卷积层

神经网络 卷积操作 例子&#xff1a; 输入&#xff1a;二维图像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷积核&#xff1a; [1,2,1] [0,1,0] [2,1,0] 然后需要将输入图像和卷积核转化为4维张量 为什么转为4维张量&#xff1f;因为卷积操作需要输入图像…

2.4 组件间通信Props(父传子)

父组件 在父组件模板上的子组件上加上属性值&#xff0c;属性值就是想要传递给子组件的信息。 例如&#xff1a; <template> <div class"Big-box"><testBox :personList"p"></testBox> </div> </template>子组件 子组…

从零开始学习 Redux:React Native 项目中的状态管理

Redux 是一个用于 JavaScript 应用程序的状态管理库&#xff0c;通常与 React 或 React Native 配合使用&#xff0c;帮助管理应用的状态和数据流。其核心原理是通过集中式的“单一数据源”来管理应用状态&#xff0c;避免组件之间的“层层传递”状态和副作用。 Redux 的原理单…

[特殊字符] CentOS 7 离线安装 MySQL 5.7 实验

&#x1f427; CentOS 7 离线安装 MySQL 5.7 实验 针对企业无互联网环境的系统&#xff0c;设计了如何在 CentOS 7 系统中&#xff0c;使用一台可以联网的主机&#xff08;NodeA&#xff09;为另一台无法联网的主机&#xff08;NodeB&#xff09;安装 MySQL 5.7 数据库及其依赖…

Redis 概率型数据结构实战指南

1. 为什么要用「近似」&#xff1f; 随着业务量爆发式增长&#xff0c;精确统计 的内存或 CPU 成本可能难以接受。例如&#xff1a; 统计一天内 唯一 IP 数 —— 用 SET 精确去重&#xff0c;百万 IP→占用数百 MB。统计海量商品销量、实时计算 P99 延迟、获取 TOP-N 热门页面……

Android开发工程师:Linux一条find grep命令通关搜索内容与文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多关键词搜索&#xff1a;使用正则表达式 pattern1|pattern2 同时搜索多个关键词&#xff08;如 activity|class&#xff09;单…

深入理解浏览器解析机制和XSS向量编码

URL 编码 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------浏览器解析不了。 页面识别在url解码之前&#xff0c;在…

ThinkPHP8极简上手指南:开启高效开发之旅

目录一、环境搭建1.1 安装 PHP1.2 安装 Composer二、安装 ThinkPHP8三、目录结构解析四、第一个简单示例&#xff1a;Hello, ThinkPHP84.1 创建控制器4.2 编写控制器方法4.3 配置路由4.4 访问测试五、进阶示例&#xff1a;数据库查询5.1 配置数据库连接5.2 创建模型5.3 编写查询…

智能制造之物料详解

在制造业业务系统中&#xff0c;物料流转贯穿“需求→采购→入库→生产→成品→交付”全流程&#xff0c;各系统通过数据协同实现物料状态、位置、数量的精准追踪。以下按流转阶段拆解&#xff1a;一、需求发起与计划阶段&#xff08;CRM/ERP/PLM主导&#xff09;1. 需求源头…

Qt的安装和环境配置

QT开发环境的搭建&#xff0c;需要安装3个部分&#xff0c;C编译器、Qt SDK(SDK是软件开发工具包)、QT的集成开发环境(IDE)Qt的3种集成开发环境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要额外的配置&#xff0c;但是有一些bug…

解析MCUboot的实现原理和Image结构

目录 概述 1 MCUboot的功能 1.1 代码包结构 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交换 2.5 Image 尾部数据结构 3 交换区 3.1 单交换区 3.2 Multiple Image boot 3.3 Image交换 4 交换状态&#xff08;swap statu…

YOLOv8目标检测项目代码详解与习题

YOLOv8目标检测项目代码详解与习题一、项目代码详解该代码是基于 YOLOv8 和 OpenCV 实现的图像目标检测项目&#xff0c;核心功能是加载预训练的 YOLOv8 模型&#xff0c;对指定图像进行目标检测&#xff0c;然后可视化检测结果并保存或显示。以下是逐行解析&#xff1a;# -*- …

gradle关于dependency-management的使用

1、相关文档Spring官方文档&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction仓库版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 对接FreeSwitch

1.增加Maven依赖<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…

限流算法与实现

费曼学习法学习限流算法为什么要限流mysql插入600次/秒超过这个阈值&#xff0c;要么使用mysql集群、要么限流&#xff0c;防止宕机有哪些算法固定窗口就是个计数器&#xff0c;一秒内超过阈值&#xff0c;不允许访问缺点&#xff1a;不均匀&#xff0c;跨越临界点的一秒内&…

Android本地浏览PDF(Android PDF.js 简要学习手册)

环境 Min SDK: 21 依赖&#xff1a; implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1" implementation "androidx.webkit:webkit:1.12.0"权限&#xff1a; <uses-permission android:name"android.permission.INTERNE…

CVE-2022-41128

概述CVE-2022-41128 是 Microsoft Internet Explorer&#xff08;IE&#xff09;浏览器中 JavaScript 引擎&#xff08;JScript/Chakra&#xff09;的一个 0day 漏洞&#xff08;披露时无官方补丁&#xff09;&#xff0c;属于内存破坏类漏洞&#xff0c;可被用于远程代码执行&…

基于LSTM的时间序列到时间序列的回归模拟

获取项目源码点击文末名片项目背景与目标 本项目旨在开发一种基于长短期记忆网络&#xff08;LSTM&#xff09;的模型&#xff0c;用于时间序列到时间序列的回归模拟任务。通过处理多组不同来源的时间序列数据&#xff0c;本模型的目标是从给定的输入序列中预测相应的输出序列。…

Linux基础命令详解:从入门到精通

本文整理了Linux系统中最常用的基础命令&#xff0c;每个命令都配有详细说明和具体示例&#xff0c;帮助你快速掌握Linux操作技巧。文章中用的终端是XShell,系统是Centos&#x1f4c1; 1. ls - 列出目录&#xff08;文件夹&#xff09;内容 功能&#xff1a;显示当前目录下的文…

正点原子stm32F407学习笔记10——输入捕获实验

一、输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例&#xff0c;用一个简图来 说明输入捕获的原理&#xff0c;如图所示&#xff1a;假定定时器工作在向上计数模式&#xff0c;图中 t1到t2 时间&#xff0c;就是我们需要测量的高电平时间。测…