SylixOS下UDP组播测试程序
SylixOS下UDP组播测试
测试效果截图如下:


udp组播发送测试程序。
/*********************************************************************************************************
**
** 中国软件开源组织
**
** 嵌入式实时操作系统
**
** SylixOS(TM) LW : long wing
**
** Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文 件 名: umc_send.c
**
** 创 建 人: Hou.JinYu (侯进宇)
**
** 文件创建日期: 2024 年 06 月 05 日
**
** 描 述: udp multicast send test program
*********************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#include <netdb.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
/*********************************************************************************************************
** 名称: getInaddr_s2v
** 功能: 将字符串网络地址转为数值型网络地址
** 输入: pAddrString 字符串网络地址
** 输出: 数值型网络地址
*********************************************************************************************************/
struct sockaddr_in getInaddr_s2v (CHAR *pAddrString)
{in_addr_t in_addr;in_port_t in_port;CHAR in_string[32];CHAR *pcPtr;struct sockaddr_in addr = {0, AF_INET, 0, {INADDR_ANY}};if (pAddrString == NULL) {return (addr);}strncpy(in_string, pAddrString, sizeof(in_string) - 1);pcPtr = strchr(in_string, ':');if (pcPtr == NULL) {return (addr);}*pcPtr = '\0';in_addr = inet_addr(in_string);if (IPADDR_NONE == in_addr) {return (addr);}in_port = strtoul(pcPtr + 1, NULL, 10);if (in_port == 65535) {return (addr);}memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = in_addr;addr.sin_port = htons(in_port);return (addr);
}
/*********************************************************************************************************
** 名称: main
** 功能: 入口函数
** 输入: argc 参数个数
** argv 参数列表
** 输出: 错误号
*********************************************************************************************************/
int main (int argc, char *argv[])
{int sock;int iLoop = 0;struct ip_mreq mreq;struct sockaddr_in selfaddr = {0, AF_INET, 0, {INADDR_ANY}};struct sockaddr_in groupaddr = {0, AF_INET, 0, {INADDR_ANY}};if (argc == 1) {printf("umc_send groupaddr [selfaddr]\n");return (0);}if (argc > 1) {groupaddr = getInaddr_s2v(argv[1]);}if (argc > 2) {selfaddr = getInaddr_s2v(argv[2]);}if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {perror("Socket creation failed");return (0);}if (argc > 2) {if (bind(sock, (struct sockaddr *)&selfaddr, sizeof(selfaddr)) < 0) {perror("bind failed");close(sock);return (0);}}if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &iLoop,sizeof(iLoop)) < 0) {printf("setsockopt error!\n");close(sock);return (0);}mreq.imr_multiaddr.s_addr = groupaddr.sin_addr.s_addr;mreq.imr_interface.s_addr = selfaddr.sin_addr.s_addr;if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {perror("setsockopt IP_ADD_MEMBERSHIP failed");close(sock);return (0);}while (1) {const char *message = "udp multicast send test!";if (sendto(sock, message, strlen(message), 0, (struct sockaddr *)&groupaddr, sizeof(groupaddr)) < 0) {perror("Sending data failed");} else {printf("udp send test ok\n");}sleep(1);}close(sock);return (0);
}
/*********************************************************************************************************END
*********************************************************************************************************/
udp组播接收测试程序。
/*********************************************************************************************************
**
** 中国软件开源组织
**
** 嵌入式实时操作系统
**
** SylixOS(TM) LW : long wing
**
** Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文 件 名: umc_recv.c
**
** 创 建 人: Hou.JinYu (侯进宇)
**
** 文件创建日期: 2024 年 06 月 05 日
**
** 描 述: udp multicast recv test program
*********************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#include <netdb.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
/*********************************************************************************************************
** 名称: getInaddr_s2v
** 功能: 将字符串网络地址转为数值型网络地址
** 输入: pAddrString 字符串网络地址
** 输出: 数值型网络地址
*********************************************************************************************************/
struct sockaddr_in getInaddr_s2v (CHAR *pAddrString)
{in_addr_t in_addr;in_port_t in_port;CHAR in_string[32];CHAR *pcPtr;struct sockaddr_in addr = {0, AF_INET, 0, {INADDR_ANY}};if (pAddrString == NULL) {return (addr);}strncpy(in_string, pAddrString, sizeof(in_string) - 1);pcPtr = strchr(in_string, ':');if (pcPtr == NULL) {return (addr);}*pcPtr = '\0';in_addr = inet_addr(in_string);if (IPADDR_NONE == in_addr) {return (addr);}in_port = strtoul(pcPtr + 1, NULL, 10);if (in_port == 65535) {return (addr);}memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = in_addr;addr.sin_port = htons(in_port);return (addr);
}
/*********************************************************************************************************
** 名称: main
** 功能: 入口函数
** 输入: argc 参数个数
** argv 参数列表
** 输出: 错误号
*********************************************************************************************************/
int main (int argc, char *argv[])
{int sock;int optval = 1;socklen_t fromlen;struct ip_mreq mreq;struct sockaddr_in selfaddr = {0, AF_INET, 0, {INADDR_ANY}};struct sockaddr_in groupaddr = {0, AF_INET, 0, {INADDR_ANY}};struct sockaddr_in fromaddr = {0, AF_INET, 0, {INADDR_ANY}};if (argc < 3) {printf("umc_recv groupaddr selfaddr\n");return (0);}groupaddr = getInaddr_s2v(argv[1]);selfaddr = getInaddr_s2v(argv[2]);selfaddr.sin_port = groupaddr.sin_port;if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {perror("Socket creation failed");return (0);}if (bind(sock, (struct sockaddr *)&selfaddr, sizeof(selfaddr)) < 0) {perror("bind failed");close(sock);return (0);}// 设置地址重用,可选,用于在同一台机器上的多个进程接收同一组播流。否则同一时刻只能有一路socket能收到组播。if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {perror("setsockopt SO_REUSEADDR failed");close(sock);return (0);}// 加入组播组mreq.imr_multiaddr.s_addr = groupaddr.sin_addr.s_addr;mreq.imr_interface.s_addr = selfaddr.sin_addr.s_addr;if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {perror("setsockopt IP_ADD_MEMBERSHIP failed");close(sock);return (0);}while (1) {ssize_t len;char buf[2048];fromlen = sizeof(fromaddr);len = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&fromaddr, &fromlen);if (len < 0) {perror("recvfrom failed");break;}buf[len] = '\0';printf("recv %d byte from %s:%d : %s\n",(INT)len, inet_ntoa(fromaddr.sin_addr), ntohs(fromaddr.sin_port), buf);}// 离开组播组,通常在程序退出前执行if (setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {perror("setsockopt IP_DROP_MEMBERSHIP failed");}close(sock);return (0);
}
/*********************************************************************************************************END
*********************************************************************************************************/相关文章:
SylixOS下UDP组播测试程序
SylixOS下UDP组播测试 测试效果截图如下: udp组播发送测试程序。 /********************************************************************************************************* ** ** 中国软件开源组织 ** ** …...
Web前端快速开发平台:革命性工具,提升开发效率的新篇章
Web前端快速开发平台:革命性工具,提升开发效率的新篇章 在数字化时代的浪潮中,Web前端技术的快速发展与变革正在重塑我们的数字世界。为了应对这种快速变化,Web前端快速开发平台应运而生,为开发者们提供了更加高效、便…...
内窥镜系统设计简介
内窥镜系统设计简介 1. 源由2. 系统组成2.1 光学系统2.2 机械结构2.3 电子系统2.4 软件系统2.5 安全性和合规性2.6 研发与测试2.7 用户培训与支持 3. 研发过程3.1 光学系统Step 1:镜头设计Step 2:光源Step 3:成像传感器 3.2 机械结构Step 1&a…...
使用Spring Boot实现Redis多数据库缓存
Redis多数据库存储实现用户行为缓存 在我的系统中,为了优化用户行为数据的存储与访问效率,我引入了Redis缓存,并将数据分布在不同的Redis数据库中。通过这种方式,可以减少单一数据库的负载,提高系统的整体性能。 主要…...
揭秘newSingleThreadExecutor:深度解析与源码探秘
1. 概述 newSingleThreadExecutor是Java线程池框架中Executors类的一个静态方法,它返回一个线程池实例,该线程池维护一个单一的工作线程来执行任务。这个线程池的特性在于它保证了所有提交的任务会按照它们在队列中的顺序依次执行,而不会并发执行。它适用于需要保证任务顺序…...
使用python绘制三维散点图
使用python绘制三维散点图 三维散点图三维散点图的用途效果代码 三维散点图 三维散点图(3D Scatter Plot)是一种用于展示三维数据的图表。与二维散点图类似,三维散点图通过点在三维空间中的位置来表示数据点的三个特征。每个点在 x、y 和 z …...
Vue51-插件
一、插件的定义 vue里面的插件,类似于游戏的外挂。 vue中插件的本质:一个对象,里面必须包含install方法。 二、插件的使用 2-1、创建一个插件js文件(写在src中plugins.js) 2-2、应用插件:Vue.use(插件) …...
python将一个整数转为字符串列表
如果你想要将一个整数转换为字符串列表,其中每个数字(0-9)都是列表中的一个元素,你可以先将整数转换为字符串,然后遍历这个字符串,将每个字符添加到列表中。这里是一个简单的示例: # 假设你有一…...
PTA 6 - 20 汉诺塔问题(py 递归)
这道题是一道比较典型的递归问题,他跟斐波那契数列的本质是一样的,大家自己动手推理一下,非常好推 参考代码: def hanoi(n,a,b,c):global stepif n 1:print(a,"->",c)step 1else:hanoi(n-1,a,c,b)print(a,"…...
深度学习Day-20:DenseNet算法实战 乳腺癌识别
🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客 🍖 原作者:[K同学啊 | 接辅导、项目定制] 一、 基础配置 语言环境:Python3.8编译器选择:Pycharm深度学习环境: torch1.12.1c…...
给类设置serialVersionUID
第一步打开idea设置窗口(setting窗口默认快捷键CtrlAltS) 第二步搜索找到Inspections 第三步勾选主窗口中Java->Serializations issues->下的Serializable class without serialVersionUID’项 ,并点击“OK”确认 第四步鼠标选中要加…...
Android之实现两段颜色样式不同的文字拼接进行富文本方式的显示
一、使用SpannableString进行拼接 1、显示例子 前面文字显示红色,后面显示白色,显示在一个TextView中,可以自动换行 发送人姓名: 发送信息内容2、TextView <TextViewandroid:id"id/tv_msg"android:layout_width"wrap_c…...
GenICam标准(五)
系列文章目录 GenICam标准(一) GenICam标准(二) GenICam标准(三) GenICam标准(四) GenICam标准(五) GenICam标准(六) 文章目录 系列文…...
《人生海海》读后感
麦家是写谍战的高手,《暗算》《风声》等等作品被搬上荧屏后,掀起了一阵一阵的收视狂潮。麦家声名远扬我自然是知道的,然而我对谍战似乎总是提不起兴趣,因此从来没有拜读过他的作品。这几天无聊时在网上找找看看,发现了…...
SpringBoot自定义Starter及原理分析
目录 1.前言2.环境3.准备Starter项目4.准备AutoConfigure项目4.1 准备类HelloProperties4.2 准备类HelloService4.3 准备类HelloServiceAutoConfiguration4.4 创建spring.factories文件并引用配置类HelloServiceAutoConfiguration4.5 安装到maven仓库 5.在其他项目中引入自定义…...
YOLOv10网络架构及特点
YOLOv10简介 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型组件,YOLOv…...
基于单片机的多功能智能小车设计
第一章 绪论 1.1 课题背景和意义 随着计算机、微电子、信息技术的快速发展,智能化技术的发展速度越来越快,智能化与人们生活的联系也越来越紧密,智能化是未来社会发展的必然趋势。智能小车实际上就是一个可以自由移动的智能机器人,比较适合在人们无法工作的地方工作,也可…...
Python时间序列分析库
Sktime Welcome to sktime — sktime documentation 用于ML/AI和时间序列的统一API,用于模型构建、拟合、应用和验证支持各种学习任务,包括预测、时间序列分类、回归、聚类。复合模型构建,包括具有转换、集成、调整和精简功能的管道scikit学习式界面约定的交互式用户体验Pro…...
算法设计与分析 实验1 算法性能分析
目录 一、实验目的 二、实验概述 三、实验内容 四、问题描述 1.实验基本要求 2.实验亮点 3.实验说明 五、算法原理和实现 问题1-4算法 1. 选择排序 算法实验原理 核心伪代码 算法性能分析 数据测试 选择排序算法优化 2. 冒泡排序 算法实验原理 核心伪代码 算…...
FPGA NET
描述 网络是一组相互连接的引脚、端口和导线。每条电线都有一个网名 识别它。两条或多条导线可以具有相同的网络名称。所有电线共享一个公用网络 名称是单个NET的一部分,并且连接到这些导线的所有引脚或端口都是电气的 有联系的。 当net对象在 将RTL源文件细化或编译…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
