⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 realaudio.cc

📁 diff serve for ns-2, work for version 2.29
💻 CC
字号:
/* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *////* * realaudio.cc * Copyright (C) 2000 by the University of Southern California * $Id: realaudio.cc,v 1.6 2005/08/25 18:58:11 johnh Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * * The copyright of this module includes the following * linking-with-specific-other-licenses addition: * * In addition, as a special exception, the copyright holders of * this module give you permission to combine (via static or * dynamic linking) this module with free software programs or * libraries that are released under the GNU LGPL and with code * included in the standard release of ns-2 under the Apache 2.0 * license or under otherwise-compatible licenses with advertising * requirements (or modified versions of such code, with unchanged * license).  You may copy and distribute such a system following the * terms of the GNU GPL for this module and the licenses of the * other code concerned, provided that you include the source code of * that other code when and as the GNU GPL requires distribution of * source code. * * Note that people who make modified versions of this module * are not obligated to grant this special exception for their * modified versions; it is their choice whether to do so.  The GNU * General Public License gives permission to release a modified * version without this exception; this exception also makes it * possible to release a modified version which carries forward this * exception. * *///// RealAudio traffic model that simulates RealAudio traffic based on a set of// traces collected from Broadcast.com//#ifndef lintstatic const char rcsid[] =    "@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/realaudio/realaudio.cc,v 1.6 2005/08/25 18:58:11 johnh Exp $ (USC/ISI)";#endif#ifndef WIN32 #include <sys/time.h>#endif#include "random.h"#include "trafgen.h"#include "ranvar.h"class RA_Traffic : public TrafficGenerator { public:	RA_Traffic();	int loadCDF(const char* filename);        int lookup(double u);	virtual double value();	virtual double interpolate(double u, double x1, double y1, double x2, double y2);	virtual double next_interval(int&); protected:	void init();	double ontime_;  /* average length of burst (sec) */	double offtime_; /* average idle period (sec) */	double rate_;    /* send rate during burst (bps) */	double interval_; /* inter-packet time at burst rate */	double burstlen_; /* average # packets/burst */	unsigned int rem_; /* number of packets remaining in current burst */        double minCDF_;         // min value of the CDF (default to 0)	double maxCDF_;         // max value of the CDF (default to 1)	int interpolation_;     // how to interpolate data (INTER_DISCRETE...)	int numEntry_;          // number of entries in the CDF table	int maxEntry_;          // size of the CDF table (mem allocation)	CDFentry* table_;       // CDF table of (val_, cdf_)	RNG* rng_;//        EmpiricalRandomVariable Offtime_ ;//      EmpiricalRandomVariable Ontime_ ;};static class RATrafficClass : public TclClass { public:	RATrafficClass() : TclClass("Application/Traffic/RealAudio") {} 	TclObject* create(int, const char*const*) {		return (new RA_Traffic());	}} class_ra_traffic;RA_Traffic::RA_Traffic() : minCDF_(0), maxCDF_(1), maxEntry_(32), table_(0){	bind("minCDF_", &minCDF_);	bind("maxCDF_", &maxCDF_);	bind("interpolation_", &interpolation_);	bind("maxEntry_", &maxEntry_);	bind_time("burst_time_", &ontime_);	bind_time("idle_time_", &offtime_);	bind_bw("rate_", &rate_);	bind("packetSize_", &size_);	rng_ = RNG::defaultrng();}void RA_Traffic::init(){        int res = loadCDF("offtimecdf");//      int res1 = Ontime_.loadCDF("ontimecdf");        timeval tv;	gettimeofday(&tv, 0);        if (res < 0)  printf("error:unable to load offtimecdf");	interval_ = ontime_ ;	burstlen_ = (double) ( rate_ * (ontime_ + offtime_))/ (double)(size_ << 3);	rem_ = 0;	if (agent_) {		agent_->set_pkttype(PT_REALAUDIO);                agent_->set_pkttype(PT_UDP);}}double RA_Traffic::next_interval(int& size){//	double t = Ontime_.value() ;	double o = value() ; //off-time is taken from CDF	double t = ontime_ ; //fixed on-time//	double o = offtime_ ;//	o = o * ran ;	if (rem_ == 0) {		/* compute number of packets in next burst */		rem_ = int(burstlen_ + .5);		//recalculate the number of packet sent during ON-period if		// off-time is mutliple of 1.8s		if (o > offtime_ ) {	           double b = 		   // (double) ( rate_ * (ontime_ + o))/ (double)(size_ << 3);		   (double) ( rate_ * (t + o))/ (double)(size_ << 3);		   rem_ = int(b);		}//		if (ran > 0.8 ) rem_++ ;//		if (ran < 0.2 ) rem_-- ;		/* make sure we got at least 1 */		if (rem_<= 0)			rem_ = 1;			/* start of an idle period, compute idle time */		t += o ;	}		rem_--;	size = size_;	return(t);}int RA_Traffic::loadCDF(const char* filename){	FILE* fp;	char line[256];	CDFentry* e;	fp = fopen(filename, "r");	if (fp == 0)		return 0;	if (table_ == 0)		table_ = new CDFentry[maxEntry_];	for (numEntry_=0;  fgets(line, 256, fp);  numEntry_++) {		if (numEntry_ >= maxEntry_) {	// resize the CDF table			maxEntry_ *= 2;			e = new CDFentry[maxEntry_];			for (int i=numEntry_-1; i >= 0; i--)				e[i] = table_[i];			delete table_;			table_ = e;		}		e = &table_[numEntry_];		// Use * and l together raises a warning		sscanf(line, "%lf %*f %lf", &e->val_, &e->cdf_);	}	return numEntry_;}double RA_Traffic::value(){	if (numEntry_ <= 0)		return 0;	double u = rng_->uniform(minCDF_, maxCDF_);	int mid = lookup(u);	if (mid && interpolation_ && u < table_[mid].cdf_)		return interpolate(u, table_[mid-1].cdf_, table_[mid-1].val_,				   table_[mid].cdf_, table_[mid].val_);	return table_[mid].val_;}double RA_Traffic::interpolate(double x, double x1, double y1, double x2, double y2){	double value = y1 + (x - x1) * (y2 - y1) / (x2 - x1);	if (interpolation_ == INTER_INTEGRAL)	// round up		return ceil(value);	return value;}int RA_Traffic::lookup(double u){	// always return an index whose value is >= u	int lo, hi, mid;	if (u <= table_[0].cdf_)		return 0;	for (lo=1, hi=numEntry_-1;  lo < hi; ) {		mid = (lo + hi) / 2;		if (u > table_[mid].cdf_)			lo = mid + 1;		else hi = mid;	}	return lo;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -