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. MongoDB wiredTiger存储引擎下的存储方式LSM和B-Tree比较

    前段时间做拦截件监控的时候把拦截件生命期存入mongodb,因生命期有各种变化,因此对此表的更新写操作非常多,老大给我看了一篇文章,才知道mongodb已经支持lsm存储方式了. 原文如连接:http ...

  2. C语言中malloc函数与free函数

    - malloc函数 全称是memory allocation,中文叫动态内存分配,用于申请一块连续的.指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑 ...

  3. 《数据密集型应用系统设计》读书笔记-ch1可靠、可扩展与可维护的应用系统

    我们以Twitter为例,使用其2012年11月发布的数据.Twitter的两个典型业务操作是: - 发布tweet消息: 用户可以快速推送新消息到所有的关注者,平均大约4.6k request/se ...

  4. unity3d vscode

    原来unity3d里assets store有一个插件,下载就行了,插件名就叫vscode 下载完了之后,preference里就会出现,vscode,Enable Integration 这一项勾上 ...

  5. ETL 工具下载全集 包括 Informatica Datastage Cognos( 持续更新)

    Datastage 8.0 BT种子下载:http://files.cnblogs.com/taven/Datastage_8.0.rar Informatica PowerCenter 8.6.0 ...

  6. java里面如何提升编写速度

    一般情况下,编写程序,是在规定的时间内,并且在一段时间内很好的按成,那么就必须要套用现成的东西.在一个新的功能中,如何调用现成的东西呢,那么就是使用第三方包或者是使用自己总结的代码库.接来下是自己看到 ...

  7. WeUI logo专为微信设计的 UI 库 WeUI

    http://www.oschina.net/p/weui?fromerr=FnwHyWAb http://weui.github.io/weui/

  8. [转]真正了解CSS3背景下的@font face规则

    本文转自:http://www.zhangxinxu.com/wordpress/2017/03/css3-font-face-src-local/ by zhangxinxu from http:/ ...

  9. Opencv中图像的遍历与像素操作

    Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0 ...

  10. gradle 构建的 Spring Boot 使用 logback

           文章讲的是配置和使用,入门请看文档先. what 目的: 可以实现log不同级别的日志记录,例如info 在一个文件夹内,另一个级别的在另一个文件夹内. how 配置依赖项 //log ...