突然想起一个毕设的遗留问题----对实际带宽估计。

当时想到一个简单的方式对网络情况不复杂的带宽进行测试,可行性还需进一步确认。论坛里无人答复,默泪点击打开链接

大致原理:在链路上没有其他数据流量的情况下,用高于带宽的吞吐量发送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发包方式)相关推荐

  1. 【SemiDrive源码分析】【MailBox核间通信】47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试(理论分析篇)

    [SemiDrive源码分析][MailBox核间通信]47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试(理论分析篇) 一.Android & RTOS ...

  2. 带宽测试工具 iperf3

    带宽测试工具-iperf3 iperf3是一款带宽测试工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数. 安装 操作系统:centos7.0 软 ...

  3. Linux服务器网卡信息获取以及带宽测试

    Linux下测试带宽流量信息 查找了很多文章都使用的工具进行信息查看和获取,好巧不巧公司的服务器是内网环境,yum wget都获取不到,想本地下载上传后安装发现还需要下载很多依赖包一同安装. 懒癌晚期 ...

  4. 网卡带宽测试软件iPerf背景与使用

    iperf是一个网络性能测试工具,采用C语言开发,开源,并且跨平台. iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失. 一 ...

  5. CentOS--iperf带宽测试

    iperf 是一个基于C/S模型的纯带宽测试软件,可以测试网卡的吞吐量. iperf的好处是纯粹发包和接收,防止硬盘拖后腿,影响测试结果. 本文以千兆网卡Bcom 5720 进行测试,环境CentOS ...

  6. 4测试命令_局域网带宽测试工具-iPerf3

    工具名称:iPerf3 官网: https://iperf.fr/ 简介:用于TCP,UDP和SCTP的终极速度测试工具: 功能:跨平台(Windows,Linux,Android,MacOS X,F ...

  7. udp发包工具_利用nginx的第四层协议stream模块实现UDP端口的负载均衡

    1.服务  Nginx1.9以上版本  UDP 服务 1:8011  UDP 服务 2:8012 2.Nginx 配置  编译安装参数:--with-stream  stream 模块主要配 ...

  8. socket通信——通过Udp传输方式,将一段文字数据发送出去

    需求:通过Udp传输方式,将一段文字数据发送出去 定义一个Udp发送端 思路: 1.建立updsocket服务 2.提供数据,并将数据封装到数据包中. 3.通过socket服务的发送功能,将数据包发出 ...

  9. Java中测试异常的多种方式

    Java中测试异常的多种方式 参考文章: (1)Java中测试异常的多种方式 (2)https://www.cnblogs.com/huang0925/p/3663074.html 备忘一下.

最新文章

  1. width用计算机英语,计算机的英语词汇
  2. 虚拟机安装 xp步骤(参照百度文库)
  3. 【目标检测】单阶段算法--YOLOv2详解
  4. Netty实现长连接简单例子
  5. COM 组件实现事件、通知
  6. Bootstrap3的简单入门
  7. 如何在股票软件画波浪?波浪原理?初级应用画线
  8. led同步回显到计算机屏幕,手把手教您如何将笔记本电脑的画面投屏到LED大屏幕上显示,音视频同步传输...
  9. laser_filters源码整体分析
  10. 修改hosts不管用。为什么修改127.0.0.1指向的域名,访问域名却弹出别的网站
  11. OSChina 周四乱弹 ——老司机的幼年日常
  12. excel 域 邮件合并_如何获得免费的电子邮件域(5种快速简便的方法)
  13. 阿里云购买的域名绑定腾讯云的空间
  14. [青少年CTF]Misc—Easy by 周末
  15. 《冰雪的言语》诗集之《云霄钝剑》
  16. nyoj- 一笔画问题
  17. 用win+r启动常用程序和文档【最绿色最高效】
  18. 【实时数仓】DWM层订单宽表之需求分析、订单和订单明细关联源码
  19. 模电实训:低频信号发生及处理电路
  20. 科普贴 关于Android的音频SRC处理,音质问题

热门文章

  1. Java练习题 类 先创建一个Point类,然后定义Trianglele类。在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,然后定义两个方法求三角形的周长、面积。
  2. 易诚互动在创业板更新招股书:上半年出现亏损,极其依赖阿里云
  3. 利用Python进行数据分析(Ⅴ)
  4. 基于BAS算法实现复杂网络社区发现问题——附python代码
  5. PHP输出一段励志的话,100句关于励志的话,青春励志的话,写得好的励志句子
  6. python辗转相除_使用辗转相除法求两个数的最大公因数(python实现)
  7. java for循环 写法_java中for循环的6种写法
  8. c语言作业存款,C语言编程实现怎样存钱利最大
  9. FCHD: A fast and accurate head detector快速准确的人头检测代码预测出来的边界框位置不准确的解决方法
  10. java设置小数点格式_java指定小数点后位数格式