在NS2的模擬中,經常需要重複地用到一些TCL命令或者固定的C++用法。現初步匯總如下:
TCL 命令:
$ns at time task
$ns simple-link
$ns duble-link
C++:
獲得當前TCL解譯器: TCL& tcl=TCL::instance();
在C++中執行指定命令: tcl.EvalC()
獲得目前時間: double cur=Simulator:instance().clock();
與節點處理相關的命令: 1. 獲得指定包頭: 方法1. hdr_*::access(packet); 方法2:宏 HDR_* (packet)
#define HDR_CMN(p) (hdr_cmn::access(p))
#define HDR_ARP(p) (hdr_arp::access(p))
#define HDR_MAC(p) (hdr_mac::access(p))
#define HDR_MAC802_11(p) ((hdr_mac802_11 *)hdr_mac::access(p))
#define HDR_MAC_TDMA(p) ((hdr_mac_tdma *)hdr_mac::access(p))
#define HDR_SMAC(p) ((hdr_smac *)hdr_mac::access(p))
#define HDR_LL(p) (hdr_ll::access(p))
#define HDR_HDLC(p) ((hdr_hdlc *)hdr_ll::access(p))
#define HDR_IP(p) (hdr_ip::access(p))
#define HDR_RTP(p) (hdr_rtp::access(p))
#define HDR_TCP(p) (hdr_tcp::access(p))
#define HDR_SCTP(p) (hdr_sctp::access(p))
#define HDR_SR(p) (hdr_sr::access(p))
#define HDR_TFRC(p) (hdr_tfrc::access(p))
#define HDR_TORA(p) (hdr_tora::access(p))
#define HDR_IMEP(p) (hdr_imep::access(p))
#define HDR_CDIFF(p) (hdr_cdiff::access(p)) /* chalermak's diffusion*/
//#define HDR_DIFF(p) (hdr_diff::access(p)) /* SCADD's diffusion ported into ns */
#define HDR_LMS(p) (hdr_lms::access(p))
2 根據傳入的對象全域ID值 獲得C++對象的引用。
TclObject::lookup(*)
這裡,傳入的值 是每個TClObject對應的 全域唯一ID值。一般是以 _o+integer的形式出現,如 _o4
其實,TclObbject的ID值,是在create_shadow函數中,通過o->name(argv[0])傳入的;而這個argv[0]的值便是OTCL指令碼中,執行new OTCL對象時,由OTCL的 SplitObject 的 getid 方法返回的;
因此,假設我們能夠獲得TCLObject的具體類型,並且又知道它的這個全域唯一ID值,便可以通過Tcl::lookup(ID)來獲得,然後再強制轉換成具體類型便可。(其實 lookup是在TCL類中實現的非靜態成員函數,TclObject只不過是通過TCL類的靜態執行個體instance來間接調用罷了;而有趣的是,每個TclObject對象在儲存時,也是通過TCL類的非靜態成員函數 enter 實現的)
節點 有一個 getid ,但它返回的是節點的id 對應著節點的地點(預設情況下) , 與全域的ID 是不同的概念。因此,就算獲得了節點的ID值,也不能獲得該節點的C++實際影像的引用。