SylixOS下UDP组播测试程序

ops/2024/10/11 11:13:05/

SylixOSUDP_0">SylixOS下UDP组播测试

测试效果截图如下:
在这里插入图片描述

在这里插入图片描述

udp_8">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_160">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
*********************************************************************************************************/

http://www.ppmy.cn/ops/50028.html

相关文章

专业媒体公关-北京-上海-60城媒体邀约服务机构-51媒体网

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 「51媒体」提供的媒体邀约服务致力于帮助企业或机构邀请全国范围内的媒体进行现场报道宣传。 媒体邀约的重要性 媒体邀约是一种有效的宣传手段&#xff0c;可以帮助企业或活动在公众中…

图神经网络实战(14)——基于节点嵌入预测链接

图神经网络实战&#xff08;14&#xff09;——基于节点嵌入预测链接 0. 前言1. 图自编码器2. 变分图自编码器3. 实现变分图自编码器小结系列链接 0. 前言 我们已经了解了如何使用图神经网络 (Graph Neural Networks, GNN) 生成节点嵌入&#xff0c;我们可以使用这些嵌入执行矩…

Flink的简单学习五

一 动态表与连续查询 1.1 动态表 1.是flink的支持流数据Table API 和SQL的核心概念。动态表随时间的变化而变化 2.在流上面定义的表在内部是没有数据的 1.2 连续查询 1.永远不会停止&#xff0c;结果是一张动态表 二 Flink SQL 2.1 sql行 1.先启动启动flink集群 yarn-see…

springboot接入springai-openAi代理和智谱ai调用示例

这里写自定义目录标题 背景配置具体代码总结 背景 一说到调用openAI的api或者做一些小项目&#xff0c;大部分例子都是python或者node实现的&#xff0c;后来发现spring出了对于openai的支持框架&#xff0c;所以尝试用一用。这里是SpringAI的地址&#xff0c;有兴趣的可以去官…

m4s转mp3——B站缓存视频提取音频

前言 しかのこのこのここしたんたん&#xff08;鹿乃子乃子虎视眈眈&#xff09;非常之好&#xff0c;很适合当闹钟&#xff0c;于是缓存了视频&#xff0c;想提取音频为mp3 直接改后缀可乎&#xff1f;格式转换工具&#xff1f; 好久之前有记录过转MP4的&#xff1a; m4s转为…

Kafka之ISR机制的理解

文章目录 Kafka的基本概念什么是ISRISR的维护机制ISR的作用ISR相关配置参数同步过程示例代码总结 Kafka中的ISR&#xff08;In-Sync Replicas同步副本&#xff09;机制是确保数据高可用性和一致性的核心组件。 Kafka的基本概念 在Kafka中&#xff0c;数据被组织成主题&#xf…

单调栈(续)、由斐波那契数列讲述矩阵快速降幂技巧

在这里先接上一篇文章单调栈&#xff0c;这里还有单调栈的一道题 题目一&#xff08;单调栈续&#xff09; 给定一个数组arr&#xff0c; 返回所有子数组最小值的累加和 就是一个数组&#xff0c;有很多的子数组&#xff0c;每个数组肯定有一个最小值&#xff0c;要把所有子…

前端框架是什么

前端框架是预先编写好的JavaScript代码集合&#xff0c;旨在帮助开发者快速搭建Web应用程序的界面和交互逻辑。以下是一些常见的前端框架&#xff0c;按照字母顺序排列&#xff0c;并简要介绍其特点&#xff1a; Angular 由Google开发&#xff0c;原名AngularJS&#xff0c;后…