calculate throughput

 /* gput.c: out.tr¤ò²òÀϤ·¤Æ¥¹¥ë¡¼¥×¥Ã¥ÈÆÃÀ­¤ò·×»»¤¹¤ë
* out.et¤ò²òÀϤ·¤ÆºÆÁ÷¥¿¥¤¥à¥¢¥¦¥È¤ÎȯÀ¸Í­Ìµ¤ò³Îǧ¤¹¤ë
* gput <trace file> <event trace file > <required node> <granlarity>
* (e.g.,) ./gput out.tr out.et 1 1.0 > goodput.dat
* last line output: <goodput>Mbps <isIncast> <transmitted bytes>Byte \
* <transmission time>s <first_recv_time>s <last_recv_time>s
* <isIncast>: 0 = fales (not incast); 1 = true (incast)
*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MAXFLOW 128
#define SW_NODE 0 typedef struct rcvd_t {
int seqno;
int flow_id;
struct rcvd_t *next;
} rcvd_t; rcvd_t head; int isnew (int seqno, int flow_id)
{
rcvd_t *rcvd = head.next; while ( rcvd ){
if ( rcvd->seqno == seqno && rcvd->flow_id == flow_id ) return ;
rcvd = rcvd->next;
} // true
return ;
} void updatercvd (int seqno, int flow_id)
{
rcvd_t *rcvd; if ( NULL == (rcvd = (rcvd_t *)malloc(sizeof(rcvd_t))) ) {
fprintf(stderr, "Memory Allocation Error.\n");
exit();
} rcvd->seqno = seqno;
rcvd->flow_id = flow_id;
rcvd->next = head.next;
head.next = rcvd;
} void freercvd (rcvd_t *rcvd)
{
if (rcvd->next) freercvd(rcvd->next);
free(rcvd);
rcvd = NULL;
} int main ( int argc, char **argv )
{
FILE *fp_ns, *fp_et;
int tx, rx, packet_size, flow_id, sequence, packet_id,
node, cwnd;
unsigned long int sum,sum_all;
char buffer[], event, packet_type[], flags[], tx_address[],
rx_address[], event_type[], is_rto;
double time, clock, granularity, first_recv_time, last_recv_time, throughput;
double last_sent_time[MAXFLOW]; // Init
head.next = NULL;
first_recv_time = 100000.0;
last_recv_time = -1.0;
int i;
for(i = ; i < MAXFLOW; i++) last_sent_time[i] = -1.0; // Open Trace file (out.ns)
if ( NULL == ( fp_ns = fopen ( argv[], "r" ) ) ) {
fprintf ( stderr, "Can't open %s\n", argv[] );
return ;
} // Open Event Trace file (out.et)
if ( NULL == ( fp_et = fopen ( argv[], "r" ) ) ) {
fprintf ( stderr, "Can't open %s\n", argv[] );
return ;
} node = atoi ( argv[] );
granularity = atof ( argv[] ); // Goodput Calculation
for ( sum = , sum_all = , clock = 0.0; feof ( fp_ns ) == ; ) {
/* 1¹Ôʬ¤Î¥Ç¡¼¥¿¤ò²òÀÏ */
fgets ( buffer, , fp_ns );
sscanf ( buffer, "%c %lf %d %d %s %d %s %d %s %s %d %d",
&event, &time, &tx, &rx, packet_type, &packet_size, flags, &flow_id,
tx_address, rx_address, &sequence, &packet_id ); /* ³ºÅö¤¹¤ë¥Ç¡¼¥¿¥é¥¤¥ó¤«³Îǧ¤¹¤ë */
// exception check
if ( flow_id >= MAXFLOW ) {
printf("MAXFLOW ERROR! flow_id:%d\n", flow_id);
return ;
} // for counting retransmission timeout
if ( event == '+' && rx == SW_NODE
&& last_sent_time[flow_id] < time )
last_sent_time[flow_id] = time; // for calculating goodput
if ( event != 'r' ) continue;
if ( strcmp(packet_type, "tcp") != ) continue;
if ( rx != node ) continue; /* ¥¹¥ë¡¼¥×¥Ã¥È¤Î·×»» Mbps*/
if ( ( time - clock ) > granularity ) {
throughput = ( (double) sum / granularity ) * 8.0 / 1000.0 / 1000.0;
clock += granularity;
printf ( "%f\t%f\t%d\n", clock, throughput, sum );
sum = ;
} // is newdata? (uncount unnecessary restransmission)
if ( isnew(sequence, flow_id) ){
updatercvd(sequence, flow_id);
if ( first_recv_time > time) first_recv_time = time;
last_recv_time = time;
sum += packet_size;
sum_all += (unsigned long int)packet_size;
}
} // for throughput = ( (double) sum_all / (last_recv_time - first_recv_time) )
* 8.0 / 1000.0 / 1000.0; // Count Retransmisson Timeout Event from Event Trace file
for ( is_rto = ; feof ( fp_et ) == ; ) {
/* 1¹Ôʬ¤Î¥Ç¡¼¥¿¤ò²òÀÏ */
fgets ( buffer, , fp_et );
sscanf ( buffer, "%c %lf %d %d %s %s %d %d %d",
&event, &time, &tx, &rx, packet_type, event_type, &flow_id,
&sequence, &cwnd ); if ( time > last_sent_time[flow_id] ) continue;
if ( strcmp(event_type, "TIMEOUT") == ) is_rto = ;
} printf ( "%f\t%d\t%u\t%f\t%f\t%f\n",
throughput, is_rto, sum_all, last_recv_time - first_recv_time,
first_recv_time, last_recv_time); fclose ( fp_ns );
fclose ( fp_et ); freercvd( head.next ); return ;
}

tp.c的更多相关文章

  1. tp框架实现验证码

    今天来看一个小插件. tp框架是怎么实现验证码的. 又到了我们千篇一律的时候了,首先呢,先做一个用来显示的html界面名为:zhuce.html <!DOCTYPE html PUBLIC &q ...

  2. tp框架验证信息

    今天在这里我们学习一下tp框架里面怎么做验证. 验证又分为两种:静态验证.动态验证 首先,我们还是先做一个html界面,名为add.html.代码如下: <!DOCTYPE html PUBLI ...

  3. tp框架实现ajax

    不墨迹,直接进主题. tp框架实现ajax 首先,我们先做一个testajax.html用来显示页面(只是一个简单的下拉列表^_^) <!DOCTYPE html PUBLIC "-/ ...

  4. tp框架的增删改查

    首先,我们来看一下tp框架里面的查询方法: 查询有很多种,代码如下: <?php namespace Admin\Controller; use Think\Controller; class ...

  5. tp基础,文件存储路径

    tp框架的几点注意事项: 1.tp框架结构MVC模式2.MVC模式最终访问的是方法,不是具体 页面3.控制器用驼峰法命名4.约定胜于配置 index.php:入口文件 Application:应用程序 ...

  6. tp框架之自动验证表单

    tp框架的create自动加载表单的方法可以自动根据自己定义的要求来验证表单里面的内容,但是由于是在后台执行代码,会拖慢程序运行速度,所以还是建议通过前端js来进行判断,后台只进行数据库的查询以及传值 ...

  7. tp框架之分页与第三方类的应用

    1.先把分页类放在根目录下,比如放在某个模块下 2.在类里面写入命名空间,注意类名的格式(类名要与里面的方法名一致) 3.在需要的方法里面按照路径进行实例化,然后就可以使用了 方法: public f ...

  8. tp中使用分页技术

    1 public function showList() { $m_ld = D ( 'guangxi_ld' ); $page = I ( 'get.p', 1 ); // 在配置中获取分页值 $p ...

  9. tp框架之Model类与命名空间

    1.获取系统常量信息 public function shuchu() { var_dump(get_defined_constants()); } 2.跨控制器或跨模块调用 function dia ...

  10. TP框架 ---空控制器和空操作

    通过之前的学习我们知道了index.php是一个入口文件,如果没有这个入口文件的话,我们需要自己创建! [视图模板文件创建] 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控 ...

随机推荐

  1. JMeter工具接口性能压力测试分析与优化

    最近公司做的项目,要求对相关接口做性能压力测试,在这里记录一下分析解决过程. 压力测试过程中,如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大,TPS逐渐降低等.而问题定位分析通常情 ...

  2. ubuntu 16 .04常见指令整理

    删除类指令   sudo rm -rf 文件名  //该指令为直接删除指令 -------------------------------------------------------------- ...

  3. (转)Linux服务器SNMP常用OID

    原文:https://www.haiyun.me/archives/linux-snmp-oid.html 收集整理一些Linux下snmp常用的OID,用做服务器监控很不错.服务器负载: 1 2 3 ...

  4. (转)Uri详解之——Uri结构与代码提取

    前言:依然没有前言…… 相关博客:1.<Uri详解之——Uri结构与代码提取>2.<Uri详解之二——通过自定义Uri外部启动APP与Notification启动> 上几篇给大 ...

  5. spring、springmvc和mybatis整合(java config方式)

    之前项目中使用ssm框架大多是基于xml的方式,spring3.0以后就提供java config的模式来构建项目,并且也推荐使用这种方式,自从接触过springboot后,深深感受到这种纯java配 ...

  6. [目录]hybrid app 开发实战(基于ionic,cordova,angularjs)

    序:为什么要写这个系列 第一章:hybrid app开发之技术选型 第二章:ionic,cordova,phonegap关系浅析 第三章:ionic环境搭建之windows篇 第四章:ionic环境搭 ...

  7. hadoop命令详解

    一.用户命令1.archive命令 (1).什么是Hadoop archives?Hadoop archives是特殊的档案格式.一个Hadoop archive对应一个文件系统目录. Hadoop ...

  8. Cucumber capybara 每个Scenario登陆一次

    hook.rb中添加: After do |scenario| Capybara.current_session.instance_variable_set(:@touched, false)end ...

  9. CentOS 7下使用yum安装MySQL5.7

    1.卸载 1.1先停掉mysql进程,没有安装过的可以直接跳过 pkill - mysqld rpm -qa|grep -i mysql 1.2用命令 yum -y remove -.el7.x86_ ...

  10. python 包管理工具Pipenv

    Kenneth Reitz的最新工具Pipenv可以用于简化Python项目中依赖项的管理. 它汇集了Pip,Pipfile和Virtualenv的功能,是一个强大的命令行工具. 入门 首先使用pip ...