带宽测试初探(UDP发包方式)
突然想起一个毕设的遗留问题----对实际带宽估计。
当时想到一个简单的方式对网络情况不复杂的带宽进行测试,可行性还需进一步确认。论坛里无人答复,默泪点击打开链接
大致原理:在链路上没有其他数据流量的情况下,用高于带宽的吞吐量发送UDP包,然后在收端统计收包或丢包数量,对实际带宽进行估计。
程序很简单,定义一个包含序列号的UDP包,链路两端一收一发,最后统计收发包数量即可。
PS:当时还统计了双方时间戳,用于测量两端时延,没有去掉该部分直接附上来了
包定义:
#ifndef STRUCT_H
#define STRUCT_Hstruct udp_packet
{long int sendtime; //发送时间戳unsigned long int seq; //数据包序列号
};#endi
发送端:
#include<stdio.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/time.h>
#include<string.h>
#include<time.h>
#include"struct.h"#define MAX_BUF_SIZE 1500
#define INTERVAL 1000
#define SENDSIZE 48 //设置包大小和发送间隔以控制流量int main(int argc, char* argv[])
{if(argc != 3){printf("Usage: ./%s IP port_number",argv[0]);exit(1);} char sendbuf[MAX_BUF_SIZE];int sockfd;struct timeval sendtimeval,send_interval;struct sockaddr_in hostaddr;struct udp_packet udp_data;hostaddr.sin_family = AF_INET;hostaddr.sin_port = htons(atoi(argv[2]));hostaddr.sin_addr.s_addr = inet_addr(argv[1]);send_interval.tv_sec = 0;send_interval.tv_usec = INTERVAL;if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0){printf("Creat Socket Failed !\n");exit(1);}elseprintf("Create Socket Success !\n");udp_data.seq = 0;while(1){int temp = select(0, NULL, NULL, NULL, &send_interval);if(temp == -1){continue;}gettimeofday(&sendtimeval,0);printf("%u %u",sendtimeval.tv_sec,sendtimeval.tv_usec);udp_data.sendtime = 1000000 * sendtimeval.tv_sec + sendtimeval.tv_usec;memset(sendbuf,0x00,MAX_BUF_SIZE);memcpy(sendbuf,&udp_data,sizeof(struct udp_packet));//!!printf("packetsize is : %d\n",sizeof(udp_data));if ((sendto(sockfd,sendbuf,SENDSIZE,0,(struct sockaddr*)&hostaddr,sizeof(hostaddr))) < 0 ){printf("Fail to send the udp packet \n");}else{printf("seq is: %ld \n",udp_data.seq);printf("local send time is: %ld\n",udp_data.sendtime);}udp_data.seq++;}close(sockfd);return 0;
}
接收端:
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<errno.h>
#include"struct.h"#define MAX_BUF_SIZE 1500int main(int argc,char* argv[])
{if (argc != 2){printf("./%s portnumber",argv[0]);exit(1);}int sockfd;long localtime;FILE *fp;struct sockaddr_in localaddr,remoteaddr;struct timeval recvtime;char recvbuf[MAX_BUF_SIZE];struct udp_packet udp_data;memset(&localaddr,0x00,sizeof(struct sockaddr_in));localaddr.sin_family = AF_INET;localaddr.sin_port = htons(atoi(argv[1]));localaddr.sin_addr.s_addr = htonl(INADDR_ANY);//本机IPif ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0){printf("Create socket failed !\n");exit(1);}elseprintf("Create socket success !\n");if ((bind(sockfd,(struct sockaddr*)&localaddr,sizeof(localaddr))) < 0){printf("Bind port failed !\n");exit(1);}elseprintf("Bind port success !\n");if ((fp = fopen("/home/simon/delay/recvdata.txt","w+")) == NULL ){perror("fopen error");exit(1);}elseprintf("Success to create the receive file!\n");int remoteaddr_len = sizeof(struct sockaddr);while(1){if (recvfrom(sockfd,recvbuf,MAX_BUF_SIZE,0,(struct sockaddr*)&remoteaddr,&remoteaddr_len) < 0){printf("Fail to receive data!\n");}else{printf("receiving... \n");struct udp_packet* t_data = (struct udp_packet*)recvbuf;gettimeofday(&recvtime,0);localtime = 1000000*recvtime.tv_sec + recvtime.tv_usec;fprintf(fp,"%ld %ld %ld\n", t_data -> seq, localtime, t_data -> sendtime);//输出到txt文件方便统计}}fclose(fp);close(sockfd);return(0);
}
用TP-LINK TL-WR740N 路由器分别限制带宽 1.5M、2M实测结果如下:
如果这个测试方法可行,路由器的端口带宽控制也就能达标百分之七八十
带宽测试初探(UDP发包方式)相关推荐
- 【SemiDrive源码分析】【MailBox核间通信】47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试(理论分析篇)
[SemiDrive源码分析][MailBox核间通信]47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试(理论分析篇) 一.Android & RTOS ...
- 带宽测试工具 iperf3
带宽测试工具-iperf3 iperf3是一款带宽测试工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数. 安装 操作系统:centos7.0 软 ...
- Linux服务器网卡信息获取以及带宽测试
Linux下测试带宽流量信息 查找了很多文章都使用的工具进行信息查看和获取,好巧不巧公司的服务器是内网环境,yum wget都获取不到,想本地下载上传后安装发现还需要下载很多依赖包一同安装. 懒癌晚期 ...
- 网卡带宽测试软件iPerf背景与使用
iperf是一个网络性能测试工具,采用C语言开发,开源,并且跨平台. iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失. 一 ...
- CentOS--iperf带宽测试
iperf 是一个基于C/S模型的纯带宽测试软件,可以测试网卡的吞吐量. iperf的好处是纯粹发包和接收,防止硬盘拖后腿,影响测试结果. 本文以千兆网卡Bcom 5720 进行测试,环境CentOS ...
- 4测试命令_局域网带宽测试工具-iPerf3
工具名称:iPerf3 官网: https://iperf.fr/ 简介:用于TCP,UDP和SCTP的终极速度测试工具: 功能:跨平台(Windows,Linux,Android,MacOS X,F ...
- udp发包工具_利用nginx的第四层协议stream模块实现UDP端口的负载均衡
1.服务 Nginx1.9以上版本 UDP 服务 1:8011 UDP 服务 2:8012 2.Nginx 配置 编译安装参数:--with-stream stream 模块主要配 ...
- socket通信——通过Udp传输方式,将一段文字数据发送出去
需求:通过Udp传输方式,将一段文字数据发送出去 定义一个Udp发送端 思路: 1.建立updsocket服务 2.提供数据,并将数据封装到数据包中. 3.通过socket服务的发送功能,将数据包发出 ...
- Java中测试异常的多种方式
Java中测试异常的多种方式 参考文章: (1)Java中测试异常的多种方式 (2)https://www.cnblogs.com/huang0925/p/3663074.html 备忘一下.
最新文章
- width用计算机英语,计算机的英语词汇
- 虚拟机安装 xp步骤(参照百度文库)
- 【目标检测】单阶段算法--YOLOv2详解
- Netty实现长连接简单例子
- COM 组件实现事件、通知
- Bootstrap3的简单入门
- 如何在股票软件画波浪?波浪原理?初级应用画线
- led同步回显到计算机屏幕,手把手教您如何将笔记本电脑的画面投屏到LED大屏幕上显示,音视频同步传输...
- laser_filters源码整体分析
- 修改hosts不管用。为什么修改127.0.0.1指向的域名,访问域名却弹出别的网站
- OSChina 周四乱弹 ——老司机的幼年日常
- excel 域 邮件合并_如何获得免费的电子邮件域(5种快速简便的方法)
- 阿里云购买的域名绑定腾讯云的空间
- [青少年CTF]Misc—Easy by 周末
- 《冰雪的言语》诗集之《云霄钝剑》
- nyoj- 一笔画问题
- 用win+r启动常用程序和文档【最绿色最高效】
- 【实时数仓】DWM层订单宽表之需求分析、订单和订单明细关联源码
- 模电实训:低频信号发生及处理电路
- 科普贴 关于Android的音频SRC处理,音质问题
热门文章
- Java练习题 类 先创建一个Point类,然后定义Trianglele类。在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,然后定义两个方法求三角形的周长、面积。
- 易诚互动在创业板更新招股书:上半年出现亏损,极其依赖阿里云
- 利用Python进行数据分析(Ⅴ)
- 基于BAS算法实现复杂网络社区发现问题——附python代码
- PHP输出一段励志的话,100句关于励志的话,青春励志的话,写得好的励志句子
- python辗转相除_使用辗转相除法求两个数的最大公因数(python实现)
- java for循环 写法_java中for循环的6种写法
- c语言作业存款,C语言编程实现怎样存钱利最大
- FCHD: A fast and accurate head detector快速准确的人头检测代码预测出来的边界框位置不准确的解决方法
- java设置小数点格式_java指定小数点后位数格式