1. 程式人生 > >在NS2中新增自己的應用模組

在NS2中新增自己的應用模組

新增屬於自己的應用MmApp,父類為Application,對應的OTcl類為Application/MmApp。

每一個應用都有傳輸層的代理來進行實際操作,因此定義一個UdpMmAgent,繼承之UdpAgent,對應的OTcl類為Agent/UDP/UDPMm。

同時,要定義應用層packet header的相關資訊,在packet header中加入應用相關資訊,定義MultimediaHeaderClass繼承之PacketHeaderClass,對應OTcl類為PacketHeader/Multimedia。

struct hdr_mm {

int ack;

int seq;

int nbytes;

double time;

int scale;//本應用的亮點,可以根據ack/Nack調整發送速率

static int offset_;

inline static int & offset() {return offset_;}

inline static hdr_mm* access(const Packet* p) {

return    (hdr_mm*) p->access(offset_); }

};這些是補充到packet header當中的資訊。

下面增加一個新類,向OTcl註冊新類,相應的OTcl類名。繫結新新增packet header的偏移

static class MultimediaHeaderClass : public PacketHeaderClass {

MultimediaHeaderClass (): PacketHeaderClass("PacketHeader/Multimedia",siezeof(hdr_mm)) {

bind_offset(&hdr_mm::offset_);

} class_mmhdr;

讓別人知道packet的型別,在packet.h中增加相應的資訊。PT_NTYPE前面增加下面兩句

PT_Multimedia;//在聯合體中宣告packet型別

name_[PT_Multimedia] = "Multimedia";//定義自己的packet型別,供別人查詢

在ns-packet.tcl中增加對Multimedia的操作,add-packet-header $proc

在MmApp中實現傳送

在其中包含一個定時器類,到時後條用MmApp的傳送函式,傳送packet出去。下面定義一個SendTimer定時器類

class SendTimer: public TimerHandler {

SendTimer(MmApp* t) : TimerHandler(), t_(t) {}

inline virtual void expire(Event*);//這個函式會執行定時器到時後的操作

MmApp* t_;}//指向對應的應用類

void SendTimer::expire(Event*) {

t_->send_mm_pkt();}//定時器到時傳送packet

在MmApp類中宣告包含SendTimer類。

MmApp::MmApp() : running_(0),send_timer(this),ack_timer(this) {

bind_bw("ratex_",&rate_[x]);

bind("pktsize_",&pktsize_);

bind_bool("random_",&random_);}

定義packet傳送函式

void MmApp::send_mm_pkt() {

hdr_mm mh_buf;

if(running_) {

agent_->sendmsg(pktsize_, (char*) &mh_buf); //將構造好的packet header傳給代理

double next_time_ = next_send_time();//計算下一個包的傳送時間

if(next_time_ > 0) send_timer_.reschd(next_time_);}

}

在AppMm中實現接受

當接收端接受到一個packet時,可以根據seq nbytes等資料作出統計,設計一個定時器類ack_timer_,當其expire()時候,呼叫send_ack_pkt()。然後,傳送端根據ack/nack資訊作出傳送調整。

在Agent類中增加兩個函式,//Agent.h

virtual int supportMM() { return 0; }

virtual void enableMM() {}

當OTcl使用command命令時(比如把應用attach-agent到代理時),要來查詢這些代理時候支援應用,儘管在UdpMmAgent已經定義了著兩個函式的實現,但是仍然需要在Agent中作出宣告

在App.h中為Application類增加接受資訊函式

virtual void recv_msg(int ntypes,const char* msg = 0) {}

最後在ns-defualt.tcl中為新增類設定預設引數,Application/MmApp set rate0_ 0.3mb 等!

總結

需要增加的C++原始檔

mm-app.h mm-app.cc udp-mm.h udp-mm.cc

為新增加的應用packet header註冊

packet.h   ns-packet.tcl

在Agent.h中增加對相關應用的註冊函式

supportMM()    enableMM()

在App.h中為應用父類增加接受訊息的函式

recv_msg()

在ns-defalt.tcl為新增加的C++類設定預設引數

為了對已有的NS增加模組,需要重新編譯程式碼。修改Makefile,在INCLUDE目錄中,新增新應用的目錄,在OBJ中新增mm-app.o udp-mm.o。最後,make clean, make depend ,make

模組測試

定義代理Agent/UDP/UDPmm和應用Application/MmApp,操作類似與CBR和UDP