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

UDP多对多组播通信

广播和多播仅应用于UDP。TCP是一个面向连接的协议,TCP一定是点对点的,一点是两个主机来建立连接的,TCP肯定是单播。只有UDP才会使用广播和组播。

如下示例实现一个UDP多对多的组播通信,进程中有收、发两个线程,分别表示往组播发送、接收数据。

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>// 组播地址必须是D类地址,224.0.0.0~239.255.255.255
#define GROUP_IP "239.0.0.1"
#define GROUP_PORT 8888
#define MAX_MESSAGE 128void *sender(void *arg) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {printf("Sender alloc socket failed! %s", strerror(errno));pthread_exit(NULL);}struct sockaddr_in addr;memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(GROUP_IP);addr.sin_port = htons(GROUP_PORT);while(1) {char message[MAX_MESSAGE];printf("Enter message to send: ");fgets(message, MAX_MESSAGE, stdin);sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&addr, sizeof(addr));}close(sockfd);pthread_exit(NULL);
}void *receiver(void *arg) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {printf("Receiver alloc socket failed! %s", strerror(errno));pthread_exit(NULL);}struct sockaddr_in addr;memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(GROUP_IP);addr.sin_port = htons(GROUP_PORT);struct ip_mreq mreq;mreq.imr_multiaddr.s_addr = inet_addr(GROUP_IP);mreq.imr_interface.s_addr = htonl(INADDR_ANY);/* 加入组播 */int ret = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));if (ret < 0) {printf("IP_ADD_MEMBERSHIP failed! %s", strerror(errno));pthread_exit(NULL);}/* 设置端口复用,多个进程监听同一端口 */ret =  setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &mreq, sizeof(mreq));if (ret < 0) {printf("SO_REUSEADDR failed! %s", strerror(errno));pthread_exit(NULL);}ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));if (ret < 0) {printf("Bind failed! %s", strerror(errno));pthread_exit(NULL);}char message[MAX_MESSAGE];struct sockaddr_in sender_addr;socklen_t sender_len = sizeof(sender_addr);while(1) {recvfrom(sockfd, message, MAX_MESSAGE, 0, (struct sockaddr *)&sender_addr, &sender_len);printf("Received message from %s:%d - %s\n", inet_ntoa(sender_addr.sin_addr), ntohs(sender_addr.sin_port), message);}close(sockfd);pthread_exit(NULL);
}int main() {pthread_t threadA, threadB;pthread_create(&threadA, NULL, sender, NULL);pthread_create(&threadB, NULL, receiver, NULL);pthread_join(threadA, NULL);pthread_join(threadB, NULL);return 0;
}

运行结果如下:

在这里插入图片描述

使用任意节点发送消息,其它的节点都能收到。

相关文章:

UDP多对多组播通信

广播和多播仅应用于UDP。TCP是一个面向连接的协议&#xff0c;TCP一定是点对点的&#xff0c;一点是两个主机来建立连接的&#xff0c;TCP肯定是单播。只有UDP才会使用广播和组播。 如下示例实现一个UDP多对多的组播通信&#xff0c;进程中有收、发两个线程&#xff0c;分别表…...

Linux技术---部署PXE服务器实现批量安装操作系统

部署PXE服务器实现批量安装操作系统 部署PXE服务器实现批量安装操作系统 部署PXE服务器实现批量安装操作系统1.安装相关服务组件1.1 安装tftp和xinetd1.2 安装DHCP服务1.3 准备 Linux 内核、初始化镜像文件、 PXE 引导程序、安装FTP服务并准备安装源1.4 配置启动菜单文件1.5 验…...

日志:打印技巧

一、概览 Unity日志打印技巧 常规日志打印彩色日志日志存储与上传日志开关日志双击溯源 二、常规日志打印 1、打印Hello World 调用堆栈可以很好的帮助我们定位问题&#xff0c;特别是报错的Error日志 Debug.Log("Hello World");Debug.Log("This is a log m…...

二叉树的常见操作

建立树 复制二叉树 计算深度 计算总结点数 计算叶子结点数...

CSS 根据子元素选择父元素,并设置父元素的样式

场景举例&#xff1a;当子元素有增加了一个class时&#xff0c;需要影响其父元素的样式 可以使用":has"伪类来实现选择父元素的效果 <style>.parent:has(.child){background-color: #eee;}p{width:100px;border:1px solid #000;} </style> <body>…...

onnx转trt时,关于动态shape自动配置默认值的脚本

onnx转trt时&#xff0c;关于动态shape自动配置默认值&#xff0c;一般需要指定3个shape&#xff0c;分别是最小最优与最大。但是我们在测试时不想写那么多的代码&#xff0c;能否自动实现3个shape的配置&#xff0c;这里实现了一版。 import osimport tensorrt as trt import…...

实验室无法培养的菌,原来可以这么研究!

厌氧氨氧化&#xff08;anammox&#xff09;细菌在全球氮循环和废水氮去除中发挥着至关重要的作用&#xff0c;由于anammox细菌生长缓慢、难以培养等特点&#xff0c;对其生态学和生物学特性知之甚少。近日&#xff0c;凌恩生物合作客户重庆大学陈猷鹏教授团队在《Science of t…...

Xed编辑器开发第一期:使用Rust从0到1写一个文本编辑器

这是一个使用Rust实现的轻量化文本编辑器。学过Rust的都知道&#xff0c;Rust 从入门到实践中间还隔着好几个Go语言的难度&#xff0c;因此&#xff0c;如果你也正在学习Rust,那么恭喜你&#xff0c;这个项目被你捡到了。本项目内容较多&#xff0c;大概会分三期左右陆续发布&a…...

农业自动气象监测站:赋能智慧农业的新动力

在信息化、智能化快速发展的今天&#xff0c;农业领域也迎来了前所未有的变革。其中&#xff0c;农业自动气象监测站作为智慧农业的重要组成部分&#xff0c;正在发挥着越来越重要的作用。它们如同农业生产的“眼睛”和“耳朵”&#xff0c;实时感知和记录着大气的微妙变化&…...

2-6 任务 猜数小游戏(单次版)

本任务要求编写一个猜数小游戏&#xff08;单次版&#xff09;&#xff0c;游戏规则是计算机产生一个0到100之间的随机整数&#xff0c;用户通过输入猜测的数字进行猜测&#xff0c;根据猜测情况给出提示&#xff0c;直到猜对为止。编程思路是利用while循环和多分支结构实现永真…...

springboot 定时任务解决方案

Scheduled (springboot 自带的 注解) 基于注解Scheduled默认为单线程&#xff0c;开启多个任务时&#xff0c;任务的执行时机会受上一个任务执行时间的影响。 EnableScheduling注解&#xff1a; 在配置类上使用&#xff0c;开启计划任务的支持&#xff08;类上&#xff09;。…...

谷粒商城实战(024 业务-订单模块-分布式事务1)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第284p-第p290的内容 简介 模拟积分服务出异常&#xff0c;前方的锁库存事务未回滚&#xff0c;这时候就需要分布式事务 本地事务 事务的隔离…...

.NET使用Microsoft.IdentityModel.Tokens对SAML2.0登录断言校验

如题。使用SAML单点登录对IDP返回的Response断言使用微软提供的Microsoft.IdentityModel.Tokens对断言&#xff08;Assertion&#xff09;进行校验。 首先需要安装Muget包&#xff0c;Microsoft.IdentityModel.Tokens和Microsoft.IdentityModel.Tokens.Saml。 简易示例代码如…...

性能测试学习二

瓶颈的精准判断 TPS曲线 tps图 响应时间图 拐点在哪里呢? 这是一个阶梯式增加的场景,拐点在第二个压力阶梯上就出现了,因为响应时间增加了,tps增加的却不多,在第三个阶段时,tps增加的就更少了,响应时间也在不断增加,所以性能瓶颈在加剧,越往后越明显【tps的增长,…...

小丑的身份证和复印件 (BFS + Floyd)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 2 10 (JOKERjoke #####asdr) 输出 12 思路&#xff1a; 根据题意&#xff0c;要求最短时间&#xff0c;实际上也可以理解为最短距离。 所以应该联想到有关最短距离的算法&…...

C++类与对象(上)

C类与对象 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式&#xff1a; 类的访问限定符及封装访问限定符 封装类的作用域类的实例化类对象模型如何计算类对象的大小结构体内存对齐规则&#xff1a; this指针 面向过程和面向对象初步认识 C语言是面向过程的&…...

Exchanger的 常用场景及使用示例

Exchanger的 常用场景及使用示例 Exchanger是Java并发包中的一个工具类&#xff0c;它用于两个线程之间交换数据。当两个线程都到达同步点并调用exchange()方法时&#xff0c;它们会交换数据然后继续执行。Exchanger特别适用于那些需要两个线程进行协作&#xff0c;交换数据或…...

Spring AI项目Open AI对话接口开发指导

文章目录 创建Spring AI项目配置项目pom、application文件controller接口开发接口测试 创建Spring AI项目 打开IDEA创建一个新的spring boot项目&#xff0c;填写项目名称和位置&#xff0c;类型选择maven&#xff0c;组、工件、软件包名称可以自定义&#xff0c;JDK选择17即可…...

决策规划仿真平台的搭建

以下内容笔记据来自于b站up主忠厚老实的老王&#xff0c;视频&#xff1b;链接如下&#xff1a; 自动驾驶决策规划算法第二章第一节 决策规划仿真平台搭建_哔哩哔哩_bilibili 使用到的软件有matlab、prescan、carsim以及visual stadio。 我电脑上软件的版本是matlab2022a&am…...

RustGUI学习(iced/iced_aw)之扩展小部件(十八):如何使用badge部件来凸显UI元素?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第十八篇,主要讲述badge标记部件的使用,会结合实…...

基于RP2040与CircuitPython的互动声光按钮:从硬件到代码的完整实现

1. 项目概述&#xff1a;一个能听会“说”的互动按钮几年前&#xff0c;我第一次接触嵌入式开发时&#xff0c;被那些能感知物理世界并做出回应的“智能”小玩意儿深深吸引。从简单的闪烁LED&#xff0c;到能根据环境光调整亮度的灯带&#xff0c;再到能播放声音的互动装置&…...

Perplexity新闻搜索失效真相:LLM缓存机制、地域策略与时间戳偏移的三重干扰(内部技术备忘录节选)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity新闻资讯搜索 Perplexity 是一款以实时性、引用可追溯性和多源聚合为特色的 AI 搜索工具&#xff0c;其“新闻资讯搜索”功能专为技术从业者与研究人员设计&#xff0c;支持按时间范围、可信信源&a…...

别再只存字节了!用C语言共用体(Union)在EEPROM里优雅存储浮点数和结构体(STM32实战)

嵌入式数据存储进阶&#xff1a;用共用体实现EEPROM中的浮点数与结构体存储 在嵌入式开发中&#xff0c;数据存储是每个工程师都无法回避的挑战。当我们需要将设备校准参数、运行日志或用户配置等非字节型数据保存到EEPROM时&#xff0c;传统的逐字节读写方法往往显得笨拙且容易…...

RAG vs LoRA:AI产品选型困境终结者!产品经理必看的技术选型指南

本文深入剖析了AI产品开发中RAG与LoRA技术的选型困境&#xff0c;指出两者并非竞争关系&#xff0c;而是基于不同场景的产品判断失误。文章从概念解析入手&#xff0c;通过生动类比区分了RAG&#xff08;知识库增强&#xff09;与LoRA&#xff08;模型微调&#xff09;的核心差…...

从内存条到手机主板:盘点不同场景下过孔尺寸选择的实战经验与避坑指南

从内存条到手机主板&#xff1a;不同场景下过孔尺寸选择的实战经验与避坑指南 在高速PCB设计中&#xff0c;过孔的选择往往被工程师视为"细节问题"&#xff0c;但正是这些看似微小的设计决策&#xff0c;决定了产品的信号完整性、电源完整性和最终可靠性。从内存条的…...

第六届计算机、遥感与航空航天国际学术会议(CRSA 2026)

第六届计算机、遥感与航空航天国际学术会议&#xff08;CRSA 2026&#xff09;将于2026年6月26-28日在中国辽宁-沈阳举行。计算机、遥感与航空航天国际学术会议为来自世界各地的研究学者、工程师、学会会员以及相关领域的专家们提供一个关于“计算机科学”、“遥感技术与应用”…...

别再只调参了!用PyTorch玩转声纹识别:从EcapaTdnn到CAM++,7大模型实战对比与避坑指南

别再只调参了&#xff01;用PyTorch玩转声纹识别&#xff1a;从EcapaTdnn到CAM&#xff0c;7大模型实战对比与避坑指南 声纹识别技术正在从实验室走向工业界&#xff0c;成为身份认证领域的新宠。不同于传统密码或指纹&#xff0c;声纹识别通过分析语音中的生物特征实现非接触式…...

【亲测免费】 Zynq平台网络芯片RTL8211FD配置资源推荐

Zynq平台网络芯片RTL8211FD配置资源推荐 【下载地址】Zynq使用网络芯片RTL8211FD资源文件 本仓库提供了一个用于Zynq平台使用网络芯片RTL8211FD的资源文件。由于Xilinx的源代码默认不支持RTL8211FD&#xff0c;本资源文件中的程序可以替代Xilinx的默认配置&#xff0c;使得Zynq…...

Google 的 IDE 演进小史

不知道你平时用的 IDE 是什么&#xff1f;小七的工程师同事有在用 Vim 的&#xff0c;也有 Emacs 党&#xff0c;IntelliJ 全家桶也有人在用&#xff0c;用得最多的可能是 VS Code。只要代码能写好、工具链能跑通&#xff0c;似乎大家没有必要使用同一个 IDE。 Google 早年也是…...

3步掌握抖音内容批量下载技巧:无水印视频保存终极指南

3步掌握抖音内容批量下载技巧&#xff1a;无水印视频保存终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…...