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控 ...
随机推荐
- mysql入门与进阶
MySQL入门与进阶 需求:对一张表中的数据进行增删改查操作(CURD) C:create 创建 U:update 修改 R:read 读|检索 查询 D:delete 删除涉及技术:数据库 1.数据 ...
- 仔细说明CLOSE_WAIT状态的原因
CLOSE_WAIT状态!!! 服务器收到客户端FIN报文后 服务器端口回复了ack,没有回复FIN报文. 1 说明客户端后面不会再向服务器发送用户层的数据了, 2 客户端 没有回复FIN 报文嘛 ...
- Java - 关于子类父类的向上转型,向下转型
以下Animal为父类,Dog,Cat作为子类,分别继承Animal class Animal{ public void shout(){ System.out.println("叫了一声& ...
- Oracle运算符收录(易忘记,但是又很重要的运算符)
Create Table Test6( id ), name ), age ), sex ) ) 1. || 符 字符串连接字符串,注意:文字和日期一定嵌入在单引号里面 select ID,Nam ...
- Python数据类型(元组)
文章内容参考了教程:http://www.runoob.com/python/python-basic-syntax.html#commentform Python 元组 Python的元组与列表类似 ...
- TortoiseGit学习系列之Git和TortoiseGit的区别
不多说,直接上干货! Git和TortoiseGit的区别: TortoiseGit的安装和使用依赖Git.
- swift与OC混编之调用函数
在桥接头文件里#import oc的.h文件,整个swift工程都能使用该oc文件,在.h里暴露的方法都能被该工程使用 //oc文件 TestOC.h #import @interface TestO ...
- C++11并发编程:多线程std::thread
一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改.现在在C++11中只需使用语 ...
- SSL评测
首先在这个网站上测试一下自己的服务器究竟处于什么水平 https://www.ssllabs.com/ssltest/
- Jquery中和ajax有关的方法
Jquery关于ajax有一系列的方法函数,单单知道$.ajax()显然是不够的,接下来我们对该系列的方法函数逐一研究下. ajaxComplete(callback).ajaxError(callb ...