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. vue 打印

    vue 方法 第一种方法:通过npm 安装插件 1,安装  npm install vue-print-nb --save 2,引入  安装好以后在main.js文件中引入  import Print ...

  2. 关于DES加密之选择更新版

    数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款 ...

  3. CentOS 6.5中配置RabbitMQ

    先配置erlang依赖环境 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel 安装erlang 1 ...

  4. Message Queue基本使用说明

    一.安装Message Queue: 在Win7之前,控制面板,添加删除组件(Windows Message Queue). Win7~Win8:控制面板,程序和功能,启用或关闭Windows功能(找 ...

  5. Bash编程(6) String操作

    1. 拼接 1) 简单的字符串拼接如:PATH=$PATH:$HOME/bin.如果拼接的字符串包含空格或特殊字符,需要使用双引号括起,如: var=$HOME/bin # 注释并不是赋值的一部分 v ...

  6. CentOS 升级 openSSH

    openSSH作为linux远程连接工具,容易受到攻击,必须更新版本来解决,低版本有如下等漏洞: a. OpenSSH 远程代码执行漏洞(CVE-2016-10009) b.  OpenSSH aut ...

  7. 在打印窗口,打印视图View的子视图结构图

    在打印窗口,打印视图View的子视图结构图,使用 po [self.view recursiveDescription];

  8. win8及以上2012 R2,virtualbox 5.0.20安装centOS6以上各种注意事项

    问题: Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso 1.先下载适合win8及2012 R2以上系统适用的virtualbox最新版5.0.20 ...

  9. .net iis excel导出问题

    碰到几个问题的解决方法 1.当我远程服务器时才可以导出excel!!关闭了远程就不行... 解决:运行mmc -32组件服务 ->DCOM Config->Microsoft Excel  ...

  10. 限流(三)Redis + lua分布式限流

    一.简介 1)分布式限流 如果是单实例项目,我们使用Guava这样的轻便又高性能的堆缓存来处理限流.但是当项目发展为多实例了以后呢?这时候我们就需要采用分布式限流的方式,分布式限流可以以redis + ...