在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