在使用NS2进行协议仿真的过程中,对于调试信息的输出通常采取三两种方式,一种是使用fprintf,另一种是sprintf。
1、 fprintf
2、sprintf
2.2 输出到tcl
char out[100];
// Prepare the output to the Tcl interpreter. Calculate the round
// trip time
sprintf(out, "%s recv %d %3.1f", name(),
hdrip->src_.addr_ >> Address::instance().NodeShift_[1],
(Scheduler::instance().clock()-hdr->send_time) * 1000);
Tcl& tcl = Tcl::instance();
tcl.eval_r(out);
#in tcl scripts, for example Agent/Ping protocol
Agent/Ping instproc recv {from rtt} {
$self instvar node_
puts "node [$node_ id] received ping answer from \
$from with round-trip-time $rtt ms."
}
Trace文件的写入需要包的发送和接收触发,但是也可在程序 中控件它的发生。这时我们需要一个Trace*变量:
Trace*
对这个变量的初始化,可以在command函数中。
logtarget_
sprintf(logtarget_->pt_->buffer(),"hello
logtarget_->pt_->dump();
Trace文件的写入技巧:
每向buffer()写入一次数据,就需要dump()一次。如果在dump()之前又执行了一次sprintf,那后一次会黑覆盖前一次的内容,即buffer的指针并不会自动移动。如果要实现指针移动,就要记住每次写入后的offset。
sprintf(logtarget_->pt_->buffer(),"hello
sprintf(logtarget_->pt_->buffer(),"Hi");
logtarget_->pt_->dump();
//只有"Hi","hello
sprintf(logtarget_->pt_->buffer(),"hello
offset
sprintf(logtarget_->pt_->buffer()
logtarget_->pt_->dump();
或
sprintf(logtarget_->pt_->buffer(),"hello
logtarget_->pt_->dump();
sprintf(logtarget_->pt_->buffer(),"Hi");
logtarget_->pt_->dump();