跨平台的组播测试工具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

在这里插入图片描述

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

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

相关文章

android11 SystemUI入門之KeyguardPatternView解析

view层级树为&#xff1a; 被包含在 keyguard_host_view.xml中 。 <?xml version"1.0" encoding"utf-8"?> <!-- This is the host view that generally contains two sub views: the widget viewand the security view. --> <com.andro…

并发编程01-深入理解Java并发/线程等待/通知机制

为什么我们要学习并发编程&#xff1f; 最直白的原因&#xff0c;因为面试需要&#xff0c;我们来看看美团和阿里对 Java 岗位的 JD&#xff1a; 从上面两大互联网公司的招聘需求可以看到&#xff0c; 大厂的 Java 岗的并发编程能力属于标配。 而在非大厂的公司&#xff0c; 并…

Ubuntu22.04中基于Qt开发Android App

文章目录 前言在Ubuntu22.04中配置开发环境案例测试参考 前言 使用Qt开发手机应用程序是一种高效且灵活的选择。Qt作为一个跨平台的开发框架&#xff0c;为开发者提供了统一的开发体验和丰富的功能库。首先&#xff0c;Qt的跨平台性让开发者可以使用相同的代码库在不同的操作系…

Error: TF_DENORMALIZED_QUATERNION: Ignoring transform forchild_frame_id

问题 运行程序出现&#xff1a; Error: TF_DENORMALIZED_QUATERNION: Ignoring transform for child_frame_id “odom” from authority “unknown_publisher” because of an invalid quaternion in the transform (0.0 0.0 0.0 0.707) 主要是四元数没有归一化 Eigen::Quatern…

【PostgreSQL】技术传承:使用Docker快速部署PostgreSQL数据库

前言 PostgreSQL的重要贡献者Simon Riggs因一起坠机事故不幸离世。Simon Riggs是英国著名的软件与服务领导者&#xff0c;也是PostgreSQL的主要开发者和贡献者。事故发生在英国当地时间3月26日13:41分&#xff0c;当时他驾驶的私人通用航空Cirrus SR22飞机在英国达克斯福德机场…

java——文件上传

一、文件上传——简介 文件上传的简介&#xff1a;文件上传是指将本地计算机中的文件传输到网络上的服务器或另一台计算机上的过程。在 Web 开发中&#xff0c;文件上传通常指的是将用户通过 Web 页面提交的文件&#xff08;如图像、文档、音频、视频等&#xff09;传输到服务器…

设计模式总结-原型设计模式

原型设计模式 模式动机模式定义模式结构模式分析深拷贝和浅拷贝原型模式实例与解析实例一&#xff1a;邮件复制&#xff08;浅克隆&#xff09;实例二&#xff1a;邮件复制&#xff08;深克隆&#xff09; 模式动机 在面向对象系统中&#xff0c;使用原型模式来复制一个对象自…

MySQL 50 道查询题汇总,足以巩固大部分查询(附带数据准备SQL、题型分析、演示、50道题的完整SQL)

目录 MySQL 50 道查询题&#xff0c;足以巩固大部分查询数据准备&#xff1a;创建表sql添加表数据sql 50道查询题目汇总01 - 05 题&#xff1a;1、查询 “01” 语文成绩比 “02” 数学成绩高的学生的信息及课程分数2、查询 "01语文课程"比"02数学课程"成绩…

Linux云计算之网络基础9——园区网络架构项目

要求构建大型园区网络架构&#xff0c;方案如下&#xff1a; 园区A 园区c 公司B 要求&#xff1a; 1、A公司园区网络 一台汇聚层三层交换机&#xff0c;两台接入层二层交换机。 出口有一台路由器。 2、A园区有五台服务器。 分别为两台 WEB 服务器&#xff0c;…

java数据结构与算法刷题-----LeetCode405. 数字转换为十六进制数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 分组位运算 分组位运算 这道题正常来说可以用转换7进制的思想来&…

PTA C 1050 螺旋矩阵(思路与优化)

本题要求将给定的 N 个正整数按非递增的顺序&#xff0c;填入“螺旋矩阵”。所谓“螺旋矩阵”&#xff0c;是指从左上角第 1 个格子开始&#xff0c;按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列&#xff0c;满足条件&#xff1a;mn 等于 N&#xff1b;m≥n&#xff1b;且…

【蓝桥杯-读数据】

蓝桥杯-读数据 P8598 [蓝桥杯 2013 省 AB] 错误票据 P8598 [蓝桥杯 2013 省 AB] 错误票据 这道题本身很简单&#xff0c;最大的难点在于读入数据。 #include<bits/stdc.h> using namespace std; #define int long long const int N 2e5 10; int a[N]; signed main()…

探寻马来西亚服务器托管的优势与魅力

随着全球跨境业务的不断增加&#xff0c;境外服务器成为越来越受欢迎的选择。在这其中&#xff0c;马来西亚服务器备受关注&#xff0c;其机房通常位于马来西亚首都吉隆坡。对于客户群体主要分布在东南亚、澳大利亚和新西兰等地区的用户来说&#xff0c;马来西亚服务器是一个理…

SV学习笔记(七)

类型转换 写在前面 类型转换可以分为 静态转换和动态转换 。静态转换即需要在转换的表达式前 加上单引号 即可&#xff0c;该方式并不会对转换值做检查。如果发生转换失败&#xff0c;我们也无从得知。动态转换即需要使用 系统函数$cast(tgt&#xff0c; src) 做转换。静态转…

CountDownLatch 详解

CountDownLatch 用法详解 CountDownLatch 详解1 原理2 常见用法3 方法介绍4 示例及使用 CountDownLatch 详解 CountDownLatch&#xff08;倒计时门闩&#xff09;是Java并发包中的一个工具类&#xff0c;用于协调多个线程之间的同步。它允许一个或多个线程等待其他线程完成操作…

【软件工程】测试规格

1. 引言 1.1简介 本次的测试用例是基于核心代码基本开发完毕&#xff0c;在第一代系统基本正常运行后编写的&#xff0c;主要目的是为了后续开发与维护的便利性。 该文档主要受众为该系统后续开发人员&#xff0c;并且在阅读此文档前最后先阅读本系统的需求文档、概要设计文…

谷歌推出多模态视频模型,自动生成丰富动作视频

谷歌的研究人员推出了一款多模态扩散模型——VLOGGER。 用户只需要向VLOGGER输入图像、语音&#xff0c;就能生成带语音、丰富动作的人物视频。VLOGGER基于扩散模型开发而成&#xff0c;并提出了一种全新的架构&#xff0c;将文本生成图像模型与空间、时间控制相结合&#xff…

使用Python转换图片中的颜色

说明&#xff1a;最近在看梵高的画册&#xff0c;我手上的这本画册&#xff08;《文森特梵高》杨建飞 主编&#xff09;书中说&#xff0c;梵高用的颜料里有不耐久的合成颜料&#xff0c;原本的紫色褪成了我们现在所看到的灰蓝色。于是我想&#xff0c;能不能用程序将画中的颜色…

单链表的排序

目录 题目来源&#xff1a; 题目描述&#xff1a; 初始代码&#xff1a; 思路&#xff1a; 具体做法&#xff1a; 我的代码&#xff1a; 优化代码&#xff1a; 对比&#xff1a; 复习&#xff1a;List 基本介绍 常用方法 遍历方式 题目来源&#xff1a; 单链表的排…

MySQL常见锁探究

MySQL常见锁探究 1. 各种锁类型1.1 全局锁1.2 表级锁1.2.1 表锁1.2.2 元数据锁&#xff08;MDL&#xff09;1.2.3 意向锁1.2.4 AUTO-INC 锁 1.3 行级锁1.3.1 Record Lock1.3.2 Gap Lock1.3.3 Next-Key Lock 2. MySQL是如何加锁的&#xff1f;2.1 什么 SQL 语句会加行级锁&#…