/* -*- 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;
}