ttcp测试网络吞吐量

计算机网络中的几个性能指标

带宽:用来表示网络的通信线路传送数据的能力,通常是指单位时间内从网络中的某一点通过另一点的最高数据率,即网络设备所支持的最高速度
吞吐量:表示单位时间内通过某个网络(或信道、接口)的数据量。

代码位置及分析

ttcp代码位置:muduo-master/examples/ace/ttcp

ttcp_blocking.cc就是简单的客户端服务端通信(阻塞IO),通信的过程中加入测试的逻辑

客户端主要函数

void transmit(const Options& opt)
{struct sockaddr_in addr = resolveOrDie(opt.host.c_str(), opt.port);printf("connecting to %s:%d\n", inet_ntoa(addr.sin_addr), opt.port);int sockfd = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);assert(sockfd >= 0);int ret = ::connect(sockfd, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr));if (ret){perror("connect");printf("Unable to connect %s\n", opt.host.c_str());::close(sockfd);return;}printf("connected\n");muduo::Timestamp start(muduo::Timestamp::now());	// 发送前记录时间struct SessionMessage sessionMessage = { 0, 0 };sessionMessage.number = htonl(opt.number);sessionMessage.length = htonl(opt.length);if (write_n(sockfd, &sessionMessage, sizeof(sessionMessage)) != sizeof(sessionMessage)){perror("write SessionMessage");exit(1);}const int total_len = static_cast<int>(sizeof(int32_t) + opt.length);PayloadMessage* payload = static_cast<PayloadMessage*>(::malloc(total_len));assert(payload);payload->length = htonl(opt.length);for (int i = 0; i < opt.length; ++i){payload->data[i] = "0123456789ABCDEF"[i % 16];}// 发送的数据总量double total_mb = 1.0 * opt.length * opt.number / 1024 / 1024;printf("%.3f MiB in total\n", total_mb);for (int i = 0; i < opt.number; ++i){int nw = write_n(sockfd, payload, total_len);assert(nw == total_len);int ack = 0;int nr = read_n(sockfd, &ack, sizeof(ack));assert(nr == sizeof(ack));ack = ntohl(ack);assert(ack == opt.length);}::free(payload);::close(sockfd);// 计算出时间差double elapsed = timeDifference(muduo::Timestamp::now(), start);	// 数据总量/时间,单位 mb\sprintf("%.3f seconds\n%.3f MiB/s\n", elapsed, total_mb / elapsed);
}

服务端的主要函数

void receive(const Options& opt)
{int sockfd = acceptOrDie(opt.port);struct SessionMessage sessionMessage = { 0, 0 };if (read_n(sockfd, &sessionMessage, sizeof(sessionMessage)) != sizeof(sessionMessage)){perror("read SessionMessage");exit(1);}sessionMessage.number = ntohl(sessionMessage.number);sessionMessage.length = ntohl(sessionMessage.length);printf("receive number = %d\nreceive length = %d\n",sessionMessage.number, sessionMessage.length);const int total_len = static_cast<int>(sizeof(int32_t) + sessionMessage.length);PayloadMessage* payload = static_cast<PayloadMessage*>(::malloc(total_len));assert(payload);for (int i = 0; i < sessionMessage.number; ++i){payload->length = 0;if (read_n(sockfd, &payload->length, sizeof(payload->length)) != sizeof(payload->length)){perror("read length");exit(1);}payload->length = ntohl(payload->length);assert(payload->length == sessionMessage.length);if (read_n(sockfd, payload->data, payload->length) != payload->length){perror("read payload data");exit(1);}int32_t ack = htonl(payload->length);if (write_n(sockfd, &ack, sizeof(ack)) != sizeof(ack)){perror("write ack");exit(1);}}::free(payload);::close(sockfd);
}

还有非阻塞IO版的,也就是ttcp.cc,大部份依照回调函数的方式实现

测试

环境:两条桥联的虚拟机(Centos)

阻塞io

[wang@localhost bin]$./ttcp_blocking -t ip -l 1024000
port = 5001
buffer length = 1024000
number of buffers = 8192
8000.000 MiB in total
40.412 seconds
197.960 MiB/s

非阻塞io

[wang@localhost bin]$ ./ttcp_muduo -t ip -l 1024000
port = 5001
buffer length = 1024000
number of buffers = 8192
INFO  payload bytes 8388608000 - ttcp.cc:69
8000.000 MiB transferred
198.619 MiB/s

两种方式吞吐量差不多

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

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

相关文章

Qt下载地址与版本选择指南

为了方便下载Qt不迷路&#xff0c;也为了大家选择适合自己的Qt版本&#xff0c;特此列举一下常用的版本和下载地址。 目前本人常用5.12.12版本。 Qt4的最后一个版本&#xff1a;4.8.7 下载地址 最稳定最经典的版本&#xff0c;如果是qt4的其他版本&#xff0c;强烈升级到次版…

企业微信私域:精细化运营与深度挖掘新策略

随着数字化营销时代的到来&#xff0c;私域流量成为了企业竞相争夺的宝贵资源。企业微信&#xff0c;作为连接企业与客户的重要桥梁&#xff0c;其在私域运营中的价值日益凸显。本文将深入探讨企业微信私域的价值、运营策略及注意事项&#xff0c;帮助企业更好地利用企业微信私…

Android使用AlertDialog实现弹出菜单

最近又开始捣鼓APP&#xff0c;许多api , class都忘记怎么用了&#xff0c;楼下使用AlertDialog实现个弹出菜单&#xff0c;结果直接crash&#xff0c;查了半天&#xff0c;终于即将&#xff0c;记录一下…… 1 实现代码 AlertDialog.Builder mBuilder new AlertDialog.Builde…

人工智能对数据分析领域的影响是什么?

人工智能&#xff08;AI&#xff09;对数据分析领域的影响深远且不断演进。这一领域的技术革新和应用拓展正在推动数据分析从传统的基于规则的方法转变为基于机器学习和深度学习的自动化方法。 人工智能极大地提高了数据分析的效率和准确性。传统的数据分析通常依赖于分析师的…

自动驾驶(八十五)---------端到端要来了

特斯拉FSD V12据说马上要推送国内&#xff0c;看油管视频貌似效果很好&#xff0c;这不得不引起警觉&#xff0c;端到端的自动驾驶真的要来了! 自动驾驶行业里的芸芸众生将不得不面临新一轮的洗牌。 我从不怀疑新技术更新迭代的速度&#xff0c;看看SpaceX发火箭的情况就知道&a…

MySQL B+索引的工作原理及应用

引言 在数据库系统中&#xff0c;索引是优化查询、提高性能的关键技术之一。特别是在MySQL数据库中&#xff0c;B树索引作为最常用的索引类型&#xff0c;对数据库性能有着至关重要的影响。本文旨简单解析MySQL中B树索引的工作原理&#xff0c;帮助学生朋友们更好地理解和利用…

微信小程序实时日志使用,setFilterMsg用法

实时日志 背景 为帮助小程序开发者快捷地排查小程序漏洞、定位问题&#xff0c;我们推出了实时日志功能。开发者可通过提供的接口打印日志&#xff0c;日志汇聚并实时上报到小程序后台。开发者可从We分析“性能质量->实时日志->小程序日志”进入小程序端日志查询页面&am…

嵌入式学习Day18

一、输入两个数&#xff0c;实现排序 代码&#xff1a; #!/bin/bashread -p "please enter n m:" n m if [ $n -gt $m ] thentemp$nn$mm$temp fi echo $n $m运行结果 二、输入一个数判断是否水仙花数 代码&#xff1a; echo narcissistic number read -p "p…

SpringCloud Ribbon介绍

SpringCloud Ribbon介绍 Ribbon的负载均衡策略 Ribbon提供了多种内置的负载均衡策略&#xff0c;具体包括以下几种&#xff1a; 轮询策略&#xff08;Round Robin&#xff09;默认&#xff1a;请求按顺序分发到服务实例&#xff0c;如果有新的请求则重新开始循环。权重策略&…

Hive——DDL(Data Definition Language)数据定义语句用法详解

1.数据库操作 1.1创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)];IF NOT EXISTS&#xff1a;可选参数&#xff0c;表示如果数据库已经存在&#xff0c…

【Ant-Desgin 头像上传框】限制数量为1张图片,base64,其他需求可以改我组件中的代码

Ant-Desgin 头像上传框 样式图参数主要代码UpLoad 组件父组件 样式图 图片数量限制为1&#xff0c;当选择了图片后&#xff0c;需要切换图像时需点击头像完成切换 参数 /*** description: 图片上传组件* param {*} action: 上传地址* param {*} width: 宽度* param {*} height…

三级等保建设及测评技术方案书(Word原件2024)

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

语气确定词库再nlp领域怎么应用?

语气确定词库在NLP领域的应用探索 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;语气确定词库是一项至关重要的资源。它对于理解和分析文本中的情感、态度以及语义倾向具有极其重要的意义。在日常的微服务、RPC等技能实践中&#xff0c;也深感NLP技术对于提升系…

C++友元friend

简介&#xff1a;C友元的作用是让外部的对象&#xff08;全局函数、类、类成员函数&#xff09;能够访问到某个类里面的private修饰的数据&#xff0c;因此&#xff0c;必然是使用方法或者函数来操作数据。 1、全局函数做友元 使用全局函数做友元&#xff0c;函数接收一个对象&…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(四)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 7 - 9节&#xff09; P7《06.ArkUI组件-Text》 本节我们继续学习 Text 文本组件&#xff1a; reaources目录下有3个主要的目录&…

Java使用SpringBoot和EasyExcel 实现动态数据导出实战

Java使用SpringBoot和EasyExcel 实现动态数据导出实战 1、前言2、【资源地址】3、代码示例(demo)4、目前Java实现数据导出为Excel方式5、依赖6、总结 1、前言 工作中有用到将数据导出为Excel的场景&#xff0c;在此记录下。在日常开发中&#xff0c;Excel文件处理是一项常见的…

MySQL随便聊----之SQL的简单了解

一、含义 结构化查询语言&#xff0c;针对所有关系型数据库进行操作的语法 每一种数据库操作语法都存在不同的地方,操作相同的其实就是SQL语法,不同语法称之为该数据库操作软件的"方言" 二、通用语法 1. SQL 语句可以单行或多行书写&#xff0c;以分号结尾。 2. 可使…

JSON六种值类型的写法

JSON&#xff08;JavaScript Object Notation&#xff09;是一种人类可读的文本数据格式。它源于JavaScript&#xff0c;标准开放&#xff0c;格式要求更为严格&#xff0c;独立于具体编程语言&#xff0c;常用于数据交换。 列举一段JSON数据&#xff0c;解释JSON六种值类型的…

C基础语法速览

叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.数据类型1.1.数据类型的常见分类1.2.数据类型的符号修饰1.3.数据…

店匠科技技术产品闪耀,引领新质生产力发展

在科技飞速发展的今天,新质生产力正成为推动社会进步和经济高质量发展的核心力量。店匠科技,作为一家致力于为全球B2C电商提供产品和技术解决方案的领先企业,其技术产品不仅体现了新质生产力的创新特质,更在推动电商行业转型升级中发挥了重要作用。 新质生产力,以创新为主导,摆…