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

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录

  • 1.前言
  • 2.mping工具编译
  • 3.mping工具使用
    • 3.1 参数说明
    • 3.1 组播播发(-s)
    • 3.1 组播播发(-r)
    • 3.3 Linux下mping测试
  • 4.Linux组播udp_sender及udp_reciver使用
    • 4.1 udp_sender源码
    • 4.1 udp_reciver源码
    • 4.3 编译方法
    • 4.4 测试使用
      • 4.4.1 udp_sender
      • 4.4.2 udp_reciver

1.前言

UDP组播测试对于局域网内数据链路测试十分必要,轻量化和易用性是首要考虑的问题,使用mping作为UDP组播测试工具,能够非常方便的进行linux、Windows等平台的组播测试。本文第4章还提供了基于C/C++的udp_sender和udp_reciver组播源码,可以在Linux下编译执行。

2.mping工具编译

GITHUB:https://github.com/tongxinCode/mping
或使用如下链接(go源码+build可执行程序)
CSDN:https://download.csdn.net/download/Axugo/89070577
官方给出的编译方法:

# windows
SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build -o mping.exe main.go
# linux
SET CGO_ENABLED=0
SET GOOS=linux 
SET GOARCH=amd64 
go build -o mping main.go
# linux arm
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=arm
go build -o mping main.go

3.mping工具使用

以Windows为例,将编译好的mping.exe拷贝至C:\Windows\System32路径下,即可全局使用

3.1 参数说明

mping.exe -h

可以得到如下

mping version: mping/1.8.1
Usage: ./mping [-h] [-s sendGroup] [-r receiveGroup] [-l localAddress] [-S sourceAddress] [-m message] [-i interval] [-log path]Options:-C int[number] the limit number of sending packets(-1 means no limits) (default -1)-S string[ip[:port]] must determine the peer source ip if using SSM (default "127.0.0.1:8888")-c    whether to count Packet loss rate(default false)-e string['ascii','utf8','gbk'] change the content of sending (default "ascii")-h    this help-i int[number] change the interval between package sent (unit:Nanosecond) (default 1000000000)-l string[ip[:port]] must choose your local using interface (default "127.0.0.1:8888")-log string[/tmp/] or [C:\] determine whether to log, Path e.g ./, Forbidden / (default "/")-m string[string] change the content of sending (default "Init Data")-p int[number] the size of payload data(0 means use 1472 Bytes payloads) (default -1)-proto stringchoose a lua script to parse udp data, function Parse(dataBytes) must be included (default "*.lua")-r string[group:port] receive packet from group (default "239.255.255.255:9999")-s string[group:port] send packet to group (default "239.255.255.255:9999")-testsend and receive locally to examinate a test(default false)-timesend real time as the content to examinate(default false)-x    whether to show the hex data(default false)

3.1 组播播发(-s)

将组播信息播发至本机的19901端口

mping.exe -s 127.0.0.1:19901

在这里插入图片描述

3.1 组播播发(-r)

从19901端口接收播发的组播信息

mping.exe -r 224.0.0.8:19901

在这里插入图片描述

3.3 Linux下mping测试

在这里插入图片描述

4.Linux组播udp_sender及udp_reciver使用

4.1 udp_sender源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>//#define MULTICAST_GROUP "224.0.0.1"
//#define PORT 10000int main(int argc,char *argv[]) {if(argc<3){printf("ERROR: argc<3 !\n");printf("Example: ./udp_sender 224.0.0.8 18044 \n\n");return 0;}int PORT=atoi(argv[2]);char *MULTICAST_GROUP=argv[1];struct sockaddr_in addr;int sock;char message[] = "This is a multicast test message...";// 创建UDP套接字sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置组播TTL(生存时间)int ttl = 1;if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) {perror("setsockopt failed");exit(EXIT_FAILURE);}// 设置组播目标地址和端口memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);addr.sin_port = htons(PORT);while (1) {// 发送消息if (sendto(sock, message, strlen(message), 0, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("sendto failed");exit(EXIT_FAILURE);}printf("udp_sender send msg to %s %d YES!\n\n",MULTICAST_GROUP,PORT);sleep(1);  // 每秒发送一次消息}// 关闭套接字close(sock);return 0;
}

4.1 udp_reciver源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>//#define MULTICAST_GROUP "224.0.0.1"
//#define PORT 10000
#define MAX_BUFFER_SIZE 1024//第一个参数:组播IP 
//第二个参数:组播端口int main(int argc,char *argv[]) {if(argc<3){printf("ERROR: argc<3 !\n");printf("Example: ./udp_reciver 224.0.0.8 18044 \n\n");return 0;}int PORT=atoi(argv[2]);char *MULTICAST_GROUP=argv[1];struct sockaddr_in addr;int sock;char buffer[MAX_BUFFER_SIZE];ssize_t nbytes;// 创建UDP套接字sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置套接字选项,允许多个进程绑定到相同的地址和端口int reuse = 1;if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {perror("setsockopt failed");exit(EXIT_FAILURE);}// 绑定到特定地址和端口memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = htonl(INADDR_ANY);addr.sin_port = htons(PORT);if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 加入组播组struct ip_mreq mreq;mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP);mreq.imr_interface.s_addr = htonl(INADDR_ANY);if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) {perror("setsockopt failed");exit(EXIT_FAILURE);}printf("wait receive multimessage...\n");while (1) {// 接收消息nbytes = recvfrom(sock, buffer, sizeof(buffer), 0, NULL, 0);if (nbytes < 0) {perror("recvfrom failed");exit(EXIT_FAILURE);}printf("Have receive multimessage from %s %d\n",MULTICAST_GROUP,PORT);printf("%.*s\n", (int)nbytes, buffer);}// 关闭套接字close(sock);return 0;
}

4.3 编译方法

gcc sender.c -o udp_sender
gcc recver.c -o udp_reciver

4.4 测试使用

4.4.1 udp_sender

./udp_sender 224.0.0.8 19901

在这里插入图片描述

4.4.2 udp_reciver

./udp_reciver 224.0.0.8 19901

在这里插入图片描述

相关文章:

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录 1.前言2.mping工具编译3.mping工具使用3.1 参数说明3.1 组播播发&#xff08;-s&#xff09;3.1 组播播发&#xff08;-r&#xff09;3.3 Linux下mping测试 4.Linux组播udp_sender及udp_reciver使用4.1 udp_sender源码4.1 udp_reciver源码4.3 编译方法4.4 测试使用4.4…...

Linux基础篇:文件系统介绍——根目录下文件夹含义与作用介绍

Linux文件系统介绍——文件夹含义与作用 Linux文件系统是一个组织和管理文件的层次结构。它包括了目录、子目录和文件&#xff0c;这些都是按照一定的规则和标准进行组织的。以下是Linux文件系统的一些关键组成部分&#xff1a; 1./bin&#xff1a; 该目录包含了系统启动和运…...

vulhub中Apache Solr RemoteStreaming 文件读取与SSRF漏洞复现

Apache Solr 是一个开源的搜索服务器。在Apache Solr未开启认证的情况下&#xff0c;攻击者可直接构造特定请求开启特定配置&#xff0c;并最终造成SSRF或任意文件读取。 访问http://your-ip:8983即可查看Apache Solr后台 1.访问http://your-ip:8983/solr/admin/cores?indexI…...

PHP在线加密系统网站源码

源码介绍 PHP在线加密系统网站源码&#xff0c;这个是sg的加密,免费可用(目前)并不会收费 源码说明&#xff1a;下载直接上传即可 下载地址 蓝奏云下载&#xff1a;https://wfr.lanzout.com/i6c331togiji...

【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法

文章目录 前言位图什么是位图简单实现一个自己的位图位图的应用场景 布隆过滤器位图的缺陷及布隆过滤器的提出布隆过滤器的概念简单实现一个自己的布隆过滤器布隆过滤器的优缺点布隆过滤器的应用场景 海量数据处理 前言 哈希思想的在实际中的应用除了哈希表这个数据结构之外还…...

蓝桥杯(5):python动态规划DF[2:背包问题]

1 0-1背包介绍【每件物品只能拿1件或者不拿】 1.1 简介 贪心是不可以的&#xff01;&#xff01;&#xff01; 1.2 状态 及状态转移 转移解释&#xff1a;要么不选 则上一个直接转移过来【dp[i-1][j]】&#xff0c;要么是选这个之后体积为j 则上一个对应的就是【dp[i-1][j-wi]…...

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机&#xff1a;新零售时代的便捷消费革命 在新零售的浪潮中&#xff0c;智能无人售货机作为一个创新的消费模式&#xff0c;已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求&#xff0c;还能通过建立多样化和多层次的消费体…...

4月04日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 地震预警App被曝收10元年费&#xff0c;回应称仅限苹果系统 &#x1f30d; 2024清明档首日票房破2亿 &#x1f30b; 浙江省杭州市余杭区设立2亿元网络微短剧发展基金 &#x1f381; 抖音拟以超 7.5 亿元收购海联金汇旗下…...

C++数据结构——顺序表——数值统计

C数据结构——顺序表——数值统计 接着上一篇的顺序表模板。 输入数组&#xff0c;统计数组中的负数、零、正数的个数。第一个数字,表示数组有几个数,当n为0时&#xff0c;输入结束&#xff0c;不做处理。 例如&#xff1a; 输入6 0 1 2 3 -1 0 输出1 2 3 int main() {int n;…...

Linux+HA高可用24X7的安全保证

一&#xff0e; 介绍作为服务器&#xff0c;需要提供一定的24X7的安全保证&#xff0c;这样可以防止关键节点的宕机引起系统的全面崩溃。利用OpenSource开源软件&#xff0c;完成系统的高可靠双机热备方案。基于linux的 HA软件可靠稳定&#xff0c;比使用商业版本的HA软件降低成…...

【Tomcat】Apache官方结束Tomcat 8.5分支版本技术支持

根据 Apache 官方发布的声明&#xff0c;Apache官方将于2024年3月31日后正式结束对于Tomcat 8.5这个分支版本的技术支持&#xff0c;包括以下几点&#xff1a; 1&#xff09;不太可能继续为 8.5 分支发布新的版本&#xff1b; 2&#xff09;仅影响 8.5 分支的漏洞将不会被解决&…...

Go 源码之读写锁 sync.RWMutex

Go 源码之读写锁 sync.RWMutex 文章目录 Go 源码之读写锁 sync.RWMutex一、简介二、源码(一)RWMutex数据结构(二)Lock(三)Unlock(四)TryRLock(五)Rlock(六)RUnlock三、常见问题1. 什么是CAS,什么是原子操作2. 写操作是如何阻止写操作的3. 写操作是如何阻止读操作的…...

大数据实验统计-1、Hadoop安装及使用;2、HDFS编程实践;3、HBase编程实践;4、MapReduce编程实践

大数据实验统计 1、Hadoop安装及使用&#xff1b; 一&#xff0e;实验内容 Hadoop安装使用&#xff1a; 1&#xff09;在PC机上以伪分布式模式安装Hadoop&#xff1b; 2&#xff09;访问Web界面查看Hadoop信息。 二&#xff0e;实验目的 1、熟悉Hadoop的安装流程。 2、…...

PyTorch搭建Informer实现长序列时间序列预测

目录 I. 前言II. InformerIII. 代码3.1 输入编码3.1.1 Token Embedding3.1.2 Positional Embedding3.1.3 Temporal Embedding 3.2 Encoder与Decoder IV. 实验 I. 前言 前面已经写了很多关于时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从i…...

firefox切换本地服务和全球服务的方法

方法1&#xff1a;“设置”>“同步">“切换全球/本地服务器” https://jingyan.baidu.com/article/1974b2898523bbb5b1f774e2.html 方法2&#xff1a;地址栏输入about:config&#xff0c;搜索首选项名称里输入identity.fxaccounts.autoconfig.uri&#xff0c;填入…...

Windows下用CMake编译PugiXML及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 PugiXML是什么&#xff1f; PugiXML 是一个用于解析和操作 XML 文档的 C 库。它提供了简单易用的接口&#xff0c;能够高效地加载…...

python-基础篇-字符串、列表、元祖、字典-列表

文章目录 2.3.2列表2.3.2.1列表介绍2.3.2.1.1列表的格式2.3.2.1.2打印列表 2.3.2.2列表的增删改查2.3.2.2.1列表的遍历2.3.2.2.1.1使用for循环2.3.2.2.1.2使用while循环 2.3.2.2.2添加元素("增"append, extend, insert)2.3.2.2.2.1append 2.3.2.2.2.2extend2.3.2.2.2…...

Qt控件样式设置其一(常见方法及优缺点)

如果你对Qt有基本的了解&#xff0c;应该知道它的一大优点是跨平台&#xff0c;可以在不同的系统中编译运行。但在我看来&#xff0c;Qt还有另外一个优点&#xff0c;就是制作界面比较方便和灵活&#xff0c;能够实现主流静态效果的桌面应用。&#xff08;如果需要实现比较灵动…...

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准&#xff1a; 用例表达清楚&#xff0c;无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…...

最优算法100例之33-字符串/数字的排列组合问题

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 字符串/数字的排列组合问题 void dfs(int deep){if(deep == n){//输出}for(int i = 0; i < n; i++){if(flag[i] == 0){d[d…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...