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

📄 pingreq.cc

📁 NS2目前广泛采用的网络模拟软件
💻 CC
字号:
#include "PingReq.h"int hdr_PingReq::offset_;static class PingReqHeaderClass: public PacketHeaderClass {	public:	 PingReqHeaderClass():PacketHeaderClass("PacketHeader/PingReq",	 						sizeof(hdr_PingReq)) {	 			bind_offset(&hdr_PingReq::offset_);	 }}class_PingReqhdr;static class PingReqClass: public TclClass {	public:	 PingReqClass():TclClass("Agent/PingReq") {}	 TclObject* create(int, const char*const*) {	 	return (new PingReqAgent());	}}class_PingReq;PingReqAgent::PingReqAgent():Agent(PT_PingReq), ReqTimer_(this), RecvTimer_(this), SendTimer_(this), 				latest_(0),turn_(0), running_(0), resultIndex_(0), received_(0), sent_(0), maxSample_(0), lostPackage(0), recvPackage(0) {	int i;	for(i=0;i<65535;i++) {		result_[i] = 0;		time_[i] = 0;	}	lossFile=NULL;	bind("packetSize_", &size_);	bind("MaxReqIntv_", &MaxReqInterval_);	bind("MinReqIntv_", &MinReqInterval_);	bind("Step_", &step_);}void ReqTimer::expire(Event*) {	if(t_->running_ == 1) {		t_->SendProbes();		resched(10);	}}void RecvTimer::expire(Event*) {	int i;	double MaxRTT = 0;	t_->loss[t_->resultIndex_] = (double)t_->received_/100;		//if no sample has received in this turn(all lost), then RTT of this turn is 1.2*(maxSample has ever received)	if(t_->received_ == 0) {		t_->result_[t_->resultIndex_] = 1.2*t_->maxSample_;	}	else {		for(i=0;i<t_->received_;i++) {			if(t_->turn_RTT_[i] > MaxRTT)				MaxRTT = t_->turn_RTT_[i];		}		for(i=0;i<t_->received_;i++) {			t_->result_[t_->resultIndex_] += t_->turn_RTT_[i];		}		for(i=0;i<10-t_->received_;i++) {			t_->result_[t_->resultIndex_] += (1.2*MaxRTT);		}		t_->result_[t_->resultIndex_] /= 10;		if(t_->result_[t_->resultIndex_] > t_->maxSample_) {			t_->maxSample_ = t_->result_[t_->resultIndex_];		}}	t_->resultIndex_++;	t_->turn_++;}void SendTimer::expire(Event*) {	if(t_->sent_ != 100) {		t_->SendOneProbe();		t_->sent_++;		resched(0.02);	}}void PingReqAgent::SendOneProbe() {	Packet* pkt;	hdr_PingReq* PingReq_pkt;	pkt = allocpkt();	PingReq_pkt = hdr_PingReq::access(pkt);	PingReq_pkt->ret = 0;	PingReq_pkt->time = Scheduler::instance().clock();	PingReq_pkt->turn = turn_;	target_->recv(pkt);}	void PingReqAgent::SendProbes() {	//Packet* pkt[10];	//hdr_PingReq* PingReq_pkt[10];	sent_ = 0;	SendTimer_.resched(0.02);	received_ = 0; //prepare for receive stat.	RecvTimer_.resched(5);	time_[resultIndex_] = Scheduler::instance().clock();}			void PingReqAgent::recv(Packet* p, Handler*) {	hdr_PingReq* PrRecv = hdr_PingReq::access(p);			int i;	if(PrRecv->ret == 1) {		if(PrRecv->turn == turn_) {			turn_RTT_[received_] = Scheduler::instance().clock() - PrRecv->time;			received_++;			if(received_ == 100) {				RecvTimer_.cancel();				for(i=0;i<received_;i++) {					result_[resultIndex_] += turn_RTT_[i];				}				result_[resultIndex_] /= received_;				loss[resultIndex_] = 0.00;				resultIndex_++;				turn_++;				if(result_[resultIndex_] > maxSample_) {					maxSample_ = result_[resultIndex_];				}			}		}	}					if(PrRecv->ret == 0) {		Packet* pkt = allocpkt();		hdr_PingReq* PrSnd = hdr_PingReq::access(pkt);		PrSnd->ret = 1;		PrSnd->time = PrRecv->time;		PrSnd->turn = PrRecv->turn;		target_->recv(pkt);	}	Packet::free(p);}	int PingReqAgent::command(int argc, const char*const* argv){	if (argc ==2) {		if(strcmp(argv[1], "start") == 0) {			running_ = 1;			SendProbes();			ReqTimer_.resched(10);			return(TCL_OK);		}		else if(strcmp(argv[1], "stop") == 0) {			running_ = 0;			return(TCL_OK);		}		else if(strcmp(argv[1],"report") == 0) {			running_ = 0;			printf("SampleRTT: %d\n", resultIndex_);			for(int i=0;i<resultIndex_;i++) {				if(recordFile!=NULL)                    fprintf(recordFile, "%f\t%f\n",time_[i],result_[i]); //unit: s				if(lossFile!=NULL)                    fprintf(lossFile, "%f\t%4.2f\n",time_[i],loss[i]); //unit: null				if(recordTime!=NULL)                    fprintf(recordTime, "%f\n", time_[i]);			}			running_ = 1;			return(TCL_OK);		}		else if(strcmp(argv[1],"e2e_report") == 0) {			running_ = 0;			printf("recvPackage: %d\n", recvPackage);			printf("lostPackage: %d\n", lostPackage);			recordFile = fopen("e2e.out","w");			recordTime = fopen("e2e.time", "w");			for(int i=0;i<resultIndex_;i++) {				if(recordFile!=NULL)                    fprintf(recordFile, "%f\n",result_[i]); //unit: s				if(recordTime!=NULL)                    fprintf(recordTime, "%f\n",time_[i]);			}			running_ = 1;			return(TCL_OK);		}	}	if (argc == 3) {		if(strcmp(argv[1], "recordfile") == 0) {			recordFile = fopen(argv[2], "w");			return(TCL_OK);		}		if(strcmp(argv[1], "timefile") == 0) {			recordTime = fopen(argv[2], "w");			return(TCL_OK);		}		if(strcmp(argv[1], "lossfile") == 0) {			lossFile = fopen(argv[2], "w");			return(TCL_OK);		}	}			return(Agent::command(argc,argv));}

⌨️ 快捷键说明

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