在NS2的仿真中,经常需要重复地用到一些TCL命令或者固定的C++用法。现初步汇总如下:
TCL 命令:$ns at time task$ns simple-link $ns duble-linkC++:获得当前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++实际影像的引用。