ns2輸出調試信息及trace

在使用NS2進行協議仿真的過程中,對於調試信息的輸出通常採取三兩種方式,一種是使用fprintf,另一種是sprintf。

1、 fprintf

       將格式化數據寫入流式文件中

       fprintf(stderr, "%s: got my own REQUEST\n", __FUNCTION__);   //其中stderr是標準錯誤輸出,這裏會輸出到控制檯上

2、sprintf

       2.1 輸出到字符串中

       sprintf(logtarget_->pt_->buffer(), "THIS IS A TEST!!!");
       logtarget_->pt_->dump();

       //這裏的THIS IS A TEST就是要輸出的內容,實際上這裏是採用字符串流的方式將文本輸出到了.tr文件中

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* logtarget_; 

對這個變量的初始化,可以在command函數中。

logtarget_ = (Trace*)TclObject::lookup(argv[2]);

 這樣就可以通過logtarget_在任何時候,把要寫入的信息寫入到Trace文件中去。如:

sprintf(logtarget_->pt_->buffer(),"hello world");
logtarget_
->pt_->dump();    //寫入緩存

 

Trace文件的寫入技巧:

每向buffer()寫入一次數據,就需要dump()一次。如果在dump()之前又執行了一次sprintf,那後一次會黑覆蓋前一次的內容,即buffer的指針並不會自動移動。如果要實現指針移動,就要記住每次寫入後的offset。

sprintf(logtarget_->pt_->buffer(),"hello world");
sprintf(logtarget_
->pt_->buffer(),"Hi");
logtarget_
->pt_->dump();
//只有"Hi","hello world"被覆蓋了。



sprintf(logtarget_->pt_->buffer(),"hello world");
offset 
= strlen(logtarget->pt_->buffer());
sprintf(logtarget_
->pt_->buffer() + offset,"Hi");
logtarget_
->pt_->dump();

sprintf(logtarget_
->pt_->buffer(),"hello world");
logtarget_
->pt_->dump();
sprintf(logtarget_
->pt_->buffer(),"Hi");
logtarget_
->pt_->dump();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章