📄 pingreq.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 + -