NS2相關學習 完成乙個新的協議(1)

2021-07-29 08:35:15 字數 2416 閱讀 6367

接下來要進入對我來說老大難的環節了,從表面的tcl慢慢進入到後端的c++,一起加油學習吧~

在本節學習中,將給出乙個在ns中實現新的協議的例子。但是可以想見的是,如果由我們自己來完成這個工作,勢必要對ns2十分的熟悉並且要對c++的相關知識有一定了解(課程中有這門課,表示hold不住,學精一門語言是多麼重要)。在開始這項工作以前,讀者應該先至少要了解tcl與c++之間的聯絡。可以從 學 的3.1-3.3開始。

下面首先來列舉一下3.1-3.3到底說了什麼東西。

3.1 concept overview

為什麼選擇兩種語言? ns使用兩種語言,因為模擬器有兩種不同的事情需要做。 一方面,協議的詳細模擬需要一種系統程式語言,可以有效地操縱位元組,資料報頭和實現在大資料集上執行的演算法。 對於這些任務,執行時速度很重要,周轉時間(執行模擬,查詢錯誤,修復錯誤,重新編譯,重新執行)不太重要。——選擇了c++

另一方面,網路研究的很大一部分涉及到稍微變化的引數或配置,或者很快地探索了一些場景。 在這些情況下,迭代時間(更改模型並重新執行)更為重要。 由於配置執行一次(在模擬開始時),這部分任務的執行時間不太重要。——選擇了tcl

什麼時候使用c++呢?① 在做任何需要處理流的每個資料報的東西;② 以未預期的方式更改現有c ++類的行為;

什麼時候使用tcl呢? ① 用於配置,設定和「一次性」的東西;② 通過操作現有的c ++物件來執行所需的操作;

3.2 **概述

在〜tclcl /中定義了一些類。我們只專注於ns中使用的六個:

① tclsectionsec類:tcl包含c ++**將用於訪問直譯器的方法。

② tclobjectsectionsec類:tclobject是在編譯層次結構中也被映象的所有模擬器物件的基類。

③ tclclasssectionsec類:tclclass定義了解釋類層次結構以及允許使用者例項化tclobject的方法。

④ tclcommandsectionsec類:tclcommand用於定義簡單的全域性直譯器命令。 

⑤ embeddedtclsectionsec類:embeddedtcl類包含載入更高階別內建命令的方法,使配置模擬更容易。

⑥ instvarsectionsec類:instvar類包含訪問c ++成員變數作為otcl例項變數的方法。

3.3 tcl類

tcl ../tcl / tcl.h封裝了otcl直譯器的實際例項,並提供了訪問和與該直譯器通訊的方法。 該類提供了以下操作的方法:

① 獲取對tcl例項的引用;

② 通過直譯器呼叫otcl程式;

③ 將結果**給直譯器;

④ 報告錯誤情況,統一退出; 

⑤ 儲存和查詢「tclobjects」;

⑥ 得到直接訪問直譯器的方法;

在下面6個小節中仔細分析這六個方面;

該類的單個例項在〜tclcl / tcl.cc中宣告為靜態成員變數; 程式設計師必須獲得對該例項的引用以訪問本節中描述的其他方法。 訪問此例項所需的語句是:

tcl&tcl = tcl :: instance();
②呼叫otcl程式

通過例項tcl呼叫otcl命令有四種不同的方法。他們 的呼叫方式有本質上的不同。 每個函式將乙個字串傳遞給直譯器,然後在全域性上下文中對該字串求值。 如果直譯器返回tcl_ok,這些方法將返回給呼叫者。 另一方面,如果直譯器返回tcl_error,則方法將呼叫tkerror。 使用者可以過載此過程,以選擇性地忽略某些型別的錯誤。 otcl程式設計的複雜性超出了本文件的範圍。

③ 返回值

當直譯器呼叫c ++方法時,它會將結果返回到私有成員變數tcl_-result中。 有兩種方法可用於設定此變數。

[const char* $s$]tcl.result../tcl/tcl.htcl::result

將結果字串$ s $傳回給直譯器。

[const char* fmt, ...]tcl.resultf../tcl/tcl2.cctcl::resultf

varargs(3)以上變體使用vsprintf(3)格式化結果,將結果字串傳回給直譯器。(翻譯無能。。。。)

同樣,當c ++方法呼叫otcl命令時,直譯器將返回tcl_-result中的結果。

tcl.result ../ tcl / tcl.htcl :: result必須用於檢索結果。 請注意,結果是乙個字串,必須轉換成適合於結果型別的內部格式。

tcl.evalc("simulator set numberinte***ces_");

char* ni = tcl.result}();

if (atoi(ni) != 1)

tcl.evalc("simulator set numberinte***ces_ 1");

NS2相關學習 無線網(2)

在這裡,我們將完成乙個簡單的無線多跳場景 首先,定義的引數如下所示 set val chan channel wirelesschannel set val prop propagation tworayground set val netif phy wirelessphy set val mac...

ns2相關學習 tcl指令碼編寫(1)

新建乙個 例項 set ns new simulator 為了讓nam檔案和trace檔案有地方可以依託,我們要開啟.nam檔案進行寫入,並且使用控制代碼nf set nf open out.nam w ns namtrace all nf 設定拓撲圖 1 設定節點的指令碼語言 建了兩個節點,叫n0...

NS2下實現乙個無線網路廣播包的大致流程

在路由層廣播乙個包 packet p packet alloc 產生乙個包 struct hdr cmn ch hdr cmn p 增加普通包頭 struct hdr ip ih hdr ip p 增加ip包頭 設定其他內容 ih daddr ip broadcast 目的位址設定為廣播位址 sch...