tp.c
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的更多相关文章
- tp框架实现验证码
今天来看一个小插件. tp框架是怎么实现验证码的. 又到了我们千篇一律的时候了,首先呢,先做一个用来显示的html界面名为:zhuce.html <!DOCTYPE html PUBLIC &q ...
- tp框架验证信息
今天在这里我们学习一下tp框架里面怎么做验证. 验证又分为两种:静态验证.动态验证 首先,我们还是先做一个html界面,名为add.html.代码如下: <!DOCTYPE html PUBLI ...
- tp框架实现ajax
不墨迹,直接进主题. tp框架实现ajax 首先,我们先做一个testajax.html用来显示页面(只是一个简单的下拉列表^_^) <!DOCTYPE html PUBLIC "-/ ...
- tp框架的增删改查
首先,我们来看一下tp框架里面的查询方法: 查询有很多种,代码如下: <?php namespace Admin\Controller; use Think\Controller; class ...
- tp基础,文件存储路径
tp框架的几点注意事项: 1.tp框架结构MVC模式2.MVC模式最终访问的是方法,不是具体 页面3.控制器用驼峰法命名4.约定胜于配置 index.php:入口文件 Application:应用程序 ...
- tp框架之自动验证表单
tp框架的create自动加载表单的方法可以自动根据自己定义的要求来验证表单里面的内容,但是由于是在后台执行代码,会拖慢程序运行速度,所以还是建议通过前端js来进行判断,后台只进行数据库的查询以及传值 ...
- tp框架之分页与第三方类的应用
1.先把分页类放在根目录下,比如放在某个模块下 2.在类里面写入命名空间,注意类名的格式(类名要与里面的方法名一致) 3.在需要的方法里面按照路径进行实例化,然后就可以使用了 方法: public f ...
- tp中使用分页技术
1 public function showList() { $m_ld = D ( 'guangxi_ld' ); $page = I ( 'get.p', 1 ); // 在配置中获取分页值 $p ...
- tp框架之Model类与命名空间
1.获取系统常量信息 public function shuchu() { var_dump(get_defined_constants()); } 2.跨控制器或跨模块调用 function dia ...
- TP框架 ---空控制器和空操作
通过之前的学习我们知道了index.php是一个入口文件,如果没有这个入口文件的话,我们需要自己创建! [视图模板文件创建] 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控 ...
随机推荐
- SD341X-SD343H管网法兰式伸缩蝶阀厂家,SD341X-SD343H管网法兰式伸缩蝶阀价格 - 专题栏目 - 无极资讯网
无极资讯网 首页 最新资讯 最新图集 最新标签 搜索 SD341X-SD343H管网法兰式伸缩蝶阀 无极资讯网精心为您挑选了(SD341X-SD343H管网法兰式伸缩蝶阀)信息,其中包含了(SD3 ...
- 实习没事干之自学redis
什么是Redis--http://how2j.cn/frontroute Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语 ...
- 关于cg语言中求法向量 N=mul(worldMatrix_IT,normal); 的随笔
解释一下标题,N是变换到世界坐标后的法向量,worldMatrix_IT是变换矩阵worldMatrix的逆的转置矩阵,normal就是模型坐标的法向量. 对于点p,我们根据变换矩阵M(即worldM ...
- how to run windows programs on a MAC?
How to run windows programs on a MAC? We could use wine or Wine Bottler which is based on wine and p ...
- dfs.replication、dfs.replication.min/max及dfs.safemode.threshold.pct
一.参数含义 dfs.replication:设置数据块应该被复制的份数: dfs.replication.min:所规定的数据块副本的最小份数: dfs.replication.max:所规定的数据 ...
- unity下载资源存储-生成md5
IEnumerator GetText() { using (UnityWebRequest request = UnityWebRequest.Get("localhost:80/txt/ ...
- 快速部署简单私有云CloudStack(上)
前言: 亲身用了大半年,没出过重大毛病,也就是服务挂了,跟服务器也没啥关系.如果想更深入学习cloudstack可以试试高级网络,我是一直用的简单网络(扁平网络). 由来:CloudStack的前身是 ...
- 44个 Javascript 变态题解析
原题来自: http://javascript-puzzlers.herokuapp.com/ 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44... 当初笔者做这套题的时候不仅怀疑智商, ...
- 深入理解JavaScript系列(48):对象创建模式(下篇)
介绍 本篇主要是介绍创建对象方面的模式的下篇,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码. 模式6:函数语法糖 函数语法糖是为一个对象快速添加方法(函数)的扩展,这个主要是利用pro ...
- sublime text 3 主题更换
1.安装colorsublime,里面收藏了大量的主题 2.要选择主题的时候,Ctrl+Shift+P 打开Package Control,输入color,如图 3.Enter,进入选择列表,键盘上下 ...