日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

NS3入门--first.cc

發布時間:2023/12/31 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NS3入门--first.cc 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因為實驗的需要,被迫從OMNet++轉戰到NS3,哎,OMNet還沒鬧明白呢…這大概就是先帝創業未半而中道崩殂吧!呸呸呸,今天看一下NS3中examples中tutorial的第一個例程first.cc

一、NS3編程邏輯

大概是這樣的:
1.頭文件
2.命名空間:(using namespace ns3),將ns3項目和非ns3項目區分開。在ns3使用標準庫函數時需要添加std名字空間,如“std::cout”,“std::min()”等。
3.NS_LOG_COMPONENT_DEFINE(“firstscriptExample”) //允許腳本中使用log系統中的宏定義打印輔助信息。
4.main()函數中的準備工作,如讀取命令行參數,設置最小模擬時間單元,開啟log組件等。
5.建立網絡拓撲,Node,Channel,NetDevice.

  • 創建節點
  • 配置通道屬性
  • 創建信道并連接節點

6.安裝TCP/IP協議簇
7.安裝應用程序:application,有很多不同的分組收發定義,如BulkSendApplication使用了貪婪分組分發模型。OnOffApplication使用了ON/OFF分組分發模型。
8.數據生成
9.啟動與結束

  • 生成節點(如網卡,應用程序,協議棧等),一個節點可以安裝多個NetDevice,鏈接多個channel,擁有多個IP地址。
  • 安裝網絡設備(如CSMA.WIFI)
  • 安裝協議棧:ns-3一般是TCP/IP協議棧
  • 安裝應用層協議
  • 其他配置(節點是否要移動)
  • 創建節點,創建鏈路類型,創建具有鏈路類型的設備,為節點裝載協議棧,設置節點和網絡的IP,配置業務應用,開始仿真。

注:內容來自B站UP主:沒有名字的路人one,(https://www.bilibili.com/video/BV1DK411V7mR?seid=5988030599815315648)

二、first.cc詳解

這個博主寫的好詳細啊,轉載記錄一下
https://blog.csdn.net/qq_41816035/article/details/86648514

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Software Foundation;** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/ //頭文件 #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/internet-module.h" #include "ns3/point-to-point-module.h" #include "ns3/applications-module.h"//使用ns3命名空間 using namespace ns3;//日志組件 NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");//主函數 int main (int argc, char *argv[]) { //開啟命令行傳參數CommandLine cmd;cmd.Parse (argc, argv); //使兩個日志組件生效,兩個組件被內建在Echo Client和Echo Server的應用中,日志級別為INFO。當 仿真產生數據分組發送和接收時,對應的應用就會輸出相應的日志消息到相關的日志模塊。通過程序的輸 出了解程序執行的細節。Time::SetResolution (Time::NS);LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO); //生成網絡節點,NodeContainer類是ns3的一個helper類,能一次操作多個節點,并把指向這2個對象的 指針存儲在系統之中。如果一個設備Helper類想安裝設備到大量相似的節點,就可以使用NodeContainer 類型的變量做參數。此處相當于生成兩個計算機空殼。NodeContainer nodes;nodes.Create (2); //實際中物理連接兩臺計算機成為網絡一般來說需要網卡和網線,ns3中將對應的物理實體抽象為網絡設 和信道兩個概念,下面的語句就實現了網絡節點物理連接。Helper類是一族類,幾乎所有的模塊都有相應 的一個或若干個Helper類,負責把網絡設備連接到節點、信道,配置IP地址等普遍任務。 PointToPointHelper類負責設置網絡設備和信道屬性,并通過Install方法把設備安裝到節點中。信道和 網絡設備是對應的。第一行初始化了一個對象pointToPoint,而接下來的一行從上層的角度告訴 PointToPointHelper對象當創建一個PointToPointNetDevice對象時使用“5Mbit/s”來作為數據速率。 從細節方面將,字符串“DataRate:與PointToPointNetDevice的一個屬性相對應。與它類似, PointToPointChannel也有一個Delay屬性告訴PointToPointHelper使用“2ms”作為每一個被創建的點到 點信道的傳輸延時值。PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms")); //正如使用NodeContainer拓撲助手對象來模擬創建節點,我們會讓PointToPointHelper來做關于創 建、配置和安裝設備的工作。需要一個保存所有被創建的NetDevice對象列表,所以使用一個 NetDeviceContainer對象來存放它們,就像使用一個NodeContainer對象來存放自身所創建節點。現在 有一個包含兩個節點NodeContainer對象,有一個準備在2個節點之間創建PointToPointNetDevice和 wirePointToPointChannel對象的PointToPointHelper對象。下面兩行代碼會完成設備和信道的配置。 第一行聲明了上面提到的設備容器,第二行完成了主要工作。PointToPointHelper的Install()方法以 一個Node Container對象最為參數,在Install()方法內,一個NetDevice Container被創建了。當調 用了pointToPoint.Install(nodes)后,會有2個節點,每一個節點安裝了點到點網絡設備,在它們之 間是一個點到點信道。2個設備會被配置在一個有2ms傳輸延時的信道上以5Mbit/s的速率傳輸數據。NetDeviceContainer devices;devices = pointToPoint.Install (nodes); //為計算機安裝協議棧,InternetStackHelper會為每一個節點容器中的節點安裝一個網絡協議棧,主要是IP層。InternetStackHelper stack;stack.Install (nodes);//Ipv4AddressHelper為一個地址助手對象,告訴它應該從10.1.1.0開始以子網掩碼為255.255.255.0分 配地址,地址分配默認是從1開始并單調增長,為節點上的設備設置IP地址。Ipv4AddressHelper address;address.SetBase ("10.1.1.0", "255.255.255.0");//這行完成了真正的地址配置。在ns3中使用Ipv4Interface對象將一個IP地址同一個設備關聯起來。需 要一個Ipv4InterfaceContainer保存對象列表。現在有了一個安裝了協議棧,配置了IP地址類的點到點 的網絡。這時所要做的事情時運用它來產生數據通信。Ipv4InterfaceContainer interfaces = address.Assign (devices); //下面的代碼用來安裝服務器端應用程序、設置端口號,這個并非應用本身,是一個用來幫助創建真正應 用的對象。除非我們告訴這個助手服務器和客戶端所共知的一個端口號,否則這個助手是不會起任何作 用。UdpEchoServerHelper echoServer (9); //UdpEchoServerHelper對象有一個Install方法,實際上是這個方法的執行,才初始化回顯服務器的應 用,并將應用連接到一個節點上去。安裝方法把NodeContainer當作一個參數,這里有一個C++隱式轉換, 此轉換以nodes.Get(1)的結果作為參數,最終這個未命名的NOdeContainer被送到Install方法中。 echoServer.Install將會在管理節點的NodeContainer容器索引號為1的機節點上安裝一個 UdpEchoServerApplication。安裝會返回一個容器,這個容器中包含了指向所有被助手創建的應用指 針。應用對象需要一個時間參數來開始產生數據通信并且可能在一個可選的時間點停止。這兩個方法以 Time對象為參數,使用了一種明確的C++轉換序列來獲得C++雙精度的1.0,并且用一個Seconds轉換來把 它轉換到ns3的Time對象。下面幾行會使echo服務應用在1s時開始(生效)并在10s時停止(失效)。ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));serverApps.Start (Seconds (1.0));serverApps.Stop (Seconds (10.0)); //設置客戶端應用層,客戶端應用的設置與服務器端類似。也有一個UdpEchoClientHelper來管理 UdpEchoClientApplication。然而,對于echi客戶端,需要設置5個不同的屬性。首先2個屬性是在 UdpEchoClientHelper的創建過程中被設置的。按照助手構造函數的格式,把RemoteAddress和 RemotePort屬性傳遞給了助手(實際上是作為助手構造函數的2個必須參數傳遞的)。在界面容器中位置 0的界面對象將會和節點容器中位置0的節點對象對應.下面第一行告訴它設置客戶端的遠端地址為服務器節 點的IP地址。同樣告訴它準備發送第二個數據分組到端口9 。MaxPackets屬性告訴客戶端所允許它在模擬 期間能發送的最大數據分組個數。Inteval屬性告訴客戶端2個數據分組之間要等待多長時間。而 PacketSize屬性告訴客戶端它的數據分組應該承載多少數據。UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);echoClient.SetAttribute ("MaxPackets", UintegerValue (1));echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); //和服務端類似,客戶端在服務端生效1s后才開始。ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));clientApps.Start (Seconds (2.0));clientApps.Stop (Seconds (10.0)); //啟動模擬器,這是用全局變量來運行模擬器。當Simulator::Run被調用時,系統會開始遍歷預設事件 列表并執行。當執行完剩下的事情就是清理,銷毀所有被創建的事件。Simulator::Run ();Simulator::Destroy ();return 0; }

三、main函數邏輯

//1.創建節點 NodeContainer nodes; nodes.Create(2);//2.定義網卡網線(網絡設備和信道), PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));//3.完成設備和信道的配置,將網絡設備和信道裝載到節點上NetDeviceContainer devices;devices = pointToPoint.Install (nodes);//4. 安裝協議棧InternetStackHelper stack;stack.Install (nodes);//5.設置IP地址Ipv4AddressHelper address;address.SetBase ("10.1.1.0", "255.255.255.0");//6.配置IP地址Ipv4InterfaceContainer interfaces = address.Assign (devices)//7.監聽9號端口UdpEchoServerHelper echoServer (9);//8.定義服務器端連接屬性。使用install方法將Application安裝在節點上。Application在第1s開始運行并接受9號端口的數據,并在10s停止ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));serverApps.Start (Seconds (1.0));serverApps.Stop (Seconds (10.0));//9.配置客戶端屬性UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); //客戶端助手類UdpEchoClientHelper在節點0創建一個客戶端應用echoClientechoClient.SetAttribute ("MaxPackets", UintegerValue (1)); //允許發送的最大數據分組個數echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0))); //2個數據分組之間需要間隔的時間echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); // 數據分組的大小(承載多少數據)10.定義客戶端連接屬性,在模擬啟動后2s向節點1的9號端口發送一個1024bit的UDP數據包,在模擬啟動后10停止。ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));clientApps.Start (Seconds (2.0));clientApps.Stop (Seconds (10.0));11.啟動與結束Simulator::Run ();Simulator::Destroy ();return 0;

總結

以上是生活随笔為你收集整理的NS3入门--first.cc的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。