
4 Ălevaade kontseptsioonist
4.1 Peamised abstraktsioonid
4.1.1 SÔlm (Node)
4.1.2 Rakendus (Application)
4.1.3 Kanal (Channel)
4.1.4 VÔrku seade (Net Device)
4.1.5 Topoloogia abimehed
4.2 Esimene ns-3 skript
4.2.1 Algne kood
4.2.2 Ăhendatud moodulid
4.2.3 ns3 nimede ruum
4.2.4 Logimine
4.2.5 Peamine funktsioon
4.2.6 Topoloogiliste abimeeste kasutamine
4.2.7 Rakenduse kasutamine
4.2.8 Simulaator
4.2.9 Teie stsenaariumi koostamine
4.3 ns-3 Allikasood
LĂŒhipeatĂŒkk 4
Kontseptsioonide ĂŒlevaade
Esimene asi, mida peame tegema enne, kui hakkame ns-3 koodi uurima vĂ”i kirjutama, on selgitada mĂ”ningaid pĂ”hikontseptsioone ja abstraktsioone sĂŒsteemis. Paljuski vĂ”ib see mĂ”nele tunduda ilmselge, kuid soovitame aega selle osa lugemiseks, et veenduda, et alustate tugeval alusel.
4.1 Peamised abstraktsioonid
Selles osas vaatame mÔningaid termineid, mida tavaliselt kasutatakse vÔrgus, kuid millel on ns-3-s kindel tÀhendus.
4.1.1 SÔlm (Node)
Internetijargoonis nimetatakse vĂ”rku ĂŒhendatud arvutit hostiks vĂ”i mĂ”nikord lĂ”pp-otsaks. Kuna ns-3 on vĂ”rgu simulaator, mitte Interneti simulaator, ei kasuta me teadlikult terminit host, kuna see on tihedalt seotud Interneti ja selle protokollidega. Selle asemel kasutame ĂŒldisemat terminit, mida kasutavad ka teised simulaatorid, mis pĂ€rineb graafiteooriast â sĂ”lm (node).
ns-3-s on arvutusseadmestiku pÔhijoonistus sÔlm. See abstraktsioon on C++ klassi Node kaudu esitatud. Klass NodeNode (sÔlm) pakub meetodeid arvutusseadmete esinduste haldamiseks simuleerimistes.
Peate mÔistma Node kui arvutit, millele lisate funktsionaalsust. Lisate selliseid asju nagu rakendused, protokollide virnad ja liidese kaardid koos draiveritega, mis vÔimaldavad arvutil kasulikku tööd teha. Kasutame ns-3-s sama pÔhimudelit.
4.1.2 Rakendus (Application)
Reeglina jagatakse tarkvara kahte laiemasse klassi. SĂŒsteemitarkvara korraldab erinevaid arvuti ressursse, nagu mĂ€lu, protsessori tsĂŒklid, ketas, vĂ”rk jne, vastavalt teatud arvutusmudelile. SĂŒsteemitarkvara ei kasuta tavaliselt neid ressursse ĂŒlesannete tĂ€itmiseks, mis tooksid kasutajale kohest kasu. EesmĂ€rgi saavutamiseks kĂ€ivitab kasutaja tavaliselt rakenduse, mis saab ja kasutab sĂŒsteemitarkvara hallatavaid ressursse.
Sageli tĂ”mmatakse piir sĂŒsteemitarkvara ja rakendustarkvara vahel, kui toimub privileegitaseme muutus, mis juhtub operatsioonisĂŒsteemi lĂ”ksudes. ns-3-s ei ole tegelikult operatsioonisĂŒsteemi kontseptsiooni ja seega ei ole privileegitaseme ega sĂŒsteemikĂ”nede mĂ”isted. Siiski on meil rakenduse idee. Nagu 'reaalses maailmas', töötavad programmeerimisrakendused arvutites, nii töötavad ns-3 rakendused ns-3 sĂ”lmedes, et hallata simuleeritud maailmas simuleerimist.
ns-3-s on kasutajaprogrammi pÔhivorm, mis genereerib modellimise aktiivsust, rakendus. See vorm on C++ klassi Application kaudu esindatud. Klass Application pakub meetodeid meie kasutajataseme rakenduste versioonide haldamiseks simulatsioonides. Arendajatelt oodatakse, et nad spetsialiseeriksid klassi Application objektorienteeritud programmeerimise kontekstis, et luua uusi rakendusi. Selles juhendis kasutame klassi Application spetsialiseerimisi, mida nimetatakse UdpEchoClientApplication ja UdpEchoServerApplication. Nagu oodata vÔis, koosnevad need rakendused klient/serveri rakenduste komplektist, mida kasutatakse vÔrgupakettide genereerimiseks ja echo-simulaatimiseks.
4.1.3 Kanal (Channel)
Reaalmaailmas saab arvuti ĂŒhendada vĂ”rguga. Tihti nimetatakse andmete edastamise keskkondi nendel vĂ”rgudel kanaliteks. Kui ĂŒhendate Etherneti kaabli seina pistikupessa, ĂŒhendate arvuti Etherneti sidekanaliga. Simuleeritud maailmas ns-3 on sĂ”lm ĂŒhendatud objektiga, mis esindab sidekanalit. Siin on peamine suhtlusaluse abstraktsioon kanalis ja seda esindab C++ klass Channel (kanal).
Klass ChannelChannel pakub meetodeid alamsĂŒsteemi objektide suhtluse juhtimiseks ja nende sĂ”lmede ĂŒhendamiseks. Kanaleid saavad arendajad ka spetsiifiliselt kohandada objektorienteeritud programmeerimise mĂ”istes. Kanalite spetsialiseerimine vĂ”ib mudeldada midagi nii lihtsat nagu juhtme. Spetsialiseeritud kanal vĂ”ib samuti mudeldada keerulisemaid asju, nagu suur Etherneti lĂŒliti vĂ”i kolmemÔÔtmeline ruum, mis on tĂ€is takistusi traadita vĂ”rkude korral.
KÀesolevas juhendis kasutame spetsialiseeritud versioone kanalist, mida nimetatakse CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel ja WifiChannelWifiChannel. CsmaChannel, mis mudeldab sidekanali versiooni, mis implementerib mitme juurdepÀÀsu keskkonna kande kontrolliga. See annab meile Etherneti-laadse funktsionaalsuse.
4.1.4 VÔrku seade (Net Device)
Varem oli niimoodi, et kui soovisite arvutit ĂŒhendada vĂ”rguga, pidite ostma teatud tĂŒĂŒpi vĂ”rgukaabli ja seadme, mida nimetatakse (PC terminoloogias) periferiaplaadiks, mille pidite arvutisse paigaldama. Kui periferiaplaadil olid mĂ”ned vĂ”rgu omadused, nimetati neid vĂ”rguliideseplaatideks vĂ”i vĂ”rgu kaartideks. TĂ€napĂ€eval tarnitakse enamikku arvutitest integreeritud vĂ”rgu liidese riistvaraga ja kasutajad ei nĂ€e neid eraldiseisvate seadmetena.
VĂ”rgu kaart ei tööta ilma tarkvara draiverita, mis haldab selle riistvara. Unixis (vĂ”i Linuxis) klassifitseeritakse osa periferiaseadmest seadmena. Seadmeid hallatakse seadme draiveritega (device drivers), samas kui vĂ”rgu seadmeid (NIC) hallatakse vĂ”rgu seadme draiverite abil (network device drivers) ja neid nimetatakse koos ĂŒldiselt vĂ”rgu seadmeteks (net devices). Unixis ja Linuxis viitate vĂ”rgu seadmetele selliste nimede kaudu nagu nĂ€iteks eth0.
ns-3-s hĂ”lmab vĂ”rgu seadme abstraktsioon nii tarkvarajuhte kui ka simuleeritud riistvara. Simulatsiooni ajal on vĂ”rgu seade 'paigaldatud' sĂ”lme, vĂ”imaldades tal suhelda teiste sĂ”lmedega kanalite kaudu. Nagu reaalsetes arvutites, vĂ”ib sĂ”lm olla ĂŒhendatud mitme kanali kaudu mitme seadmega. NetDevices.
VĂ”rgu seadme abstraktsioon on C++ klassiga NetDevice. Klass NetDevice tagab meetodid, et hallata ĂŒhendusi Node ja Channel objektidega; ning arendajad vĂ”ivad neid eriliselt kohandada objektorienteeritud programmeerimise mĂ”ttes. Selles juhendis kasutame mitmeid kohandatud versioone NetDevice nimega CsmaNetDevice, PointToPointNetDevice ja WifiNetDevice. Just nagu Etherneti vĂ”rgu adapter on mĂ”eldud vĂ”rgu jaoks Ethernet, CsmaNetDevice on mĂ”eldud koostööd CsmaChannel, PointToPointNetDevice on mĂ”eldud koostööd PointToPointChannel, vaid WifiNetDevice â on mĂ”eldud koostööd WifiChannel.
4.1.5 Topoloogia abimehed
Reaalses vĂ”rgus leiate host-arvuteid, millel on lisatud (vĂ”i sisseehitatud) vĂ”rgukaardid. ns-3-s ĂŒtleksime, et nĂ€ete sĂ”lmi, millel on ĂŒhendatud NetDevices. Suures simuleeritud vĂ”rgus tuleb teil organiseerida ĂŒhendusi paljude objektide vahel. Node, NetDevice ja Kanal.
Kuna NetDevices'i ĂŒhendamine sĂ”lmedega, NetDevices'i ĂŒhendamine kanalitega, IP-aadresse mÀÀramine jne. ns-3-s on tavaline ĂŒlesanne, et seda lihtsama teha, pakume me nn topoloogilisi abimehi. NĂ€iteks NetDevice'i loomiseks on vaja teha palju ns-3 tuuma operatsioonide samme, lisada MAC-aadress, paigutada see vĂ”rgu seadme Node-sse, seadistada sĂ”lme protokollide virna ja seejĂ€rel ĂŒhendada NetDevice Channeliga. Veelgi enam, et ĂŒhendada mitu seadet mitme punktiga kanalitega ning seejĂ€rel organiseerida eraldi vĂ”rgud ĂŒhtseks vĂ”rguks (Internetworks), on vajalik veel rohkem toimingute tegemist. Pakume topoloogilisi abivahendeid, mis ĂŒhendavad need paljud toimingud teie mugavuse huvides lihtsasti kasutatavasse mudelisse.
4.2 Esimene ns-3 skript
Kui olete seadistanud sĂŒsteemi, nagu ĂŒlalpool soovitatud, on teil ns-3 versioon kaustas nimega repos teie kodukataloogis. Liikuge kausta release
Kui teil ei ole sellist kausta, siis pole te ns-3 versiooni ehitamisel vÀljundkausta mÀÀranud, ehitage seda nii:
$ .\/waf konfigure âbuild-profile=release âout=build\/release,
$ .\/waf build
seal peate nÀgema katalooge, mis nÀevad vÀlja jÀrgmised:
AUTHORS examples scratch utils waf.bat*
bindings LICENSE src utils.py waf-tools
build ns3 test.py* utils.pyc wscript
CHANGES.html README testpy-output VERSION wutils.py
doc RELEASE_NOTES testpy.supp waf* wutils.pycLiikuge katalooge examples\/tutorial. Te peaksite seal nĂ€gema faili nimega first.cc. See on skript, mis loob lihtsa punkt-punkti ĂŒhenduse kahe sĂ”lme vahel ja edastab ĂŒhe paketi nende vahel. Vaatame seda skripti rida-realt, avades first.cc oma lemmikredaktoris.
4.2.1 Algne kood
Faili esimene rida on redaktori reĆŸiimi rida ) ja kui kasutatakse arendusrepo, siis versioonihaldussĂŒsteem Git. Enamik algajaid kasutajaid ei pea muretsema, kui nende seadistus teatab, et teatud tĂ€iendavad funktsioonid nsâ3 on puudu, kuid neile, kes soovivad tĂ€ielikku installimist, pakub projekt wiki, mis sisaldab lehekĂŒlgi, mis pakuvad palju kasulikke nĂ”uandeid ja nĂ€punĂ€iteid. Ăks selline leht on «Installimine» leht, kus on installimisjuhised erinevatele sĂŒsteemidele, mis on saadaval aadressil:. See ĂŒtleb emacsile, milliseid vormindamise (koodimise stiili) konventsioone me peame meie lĂ€htekoodis jĂ€rgima.
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */See on alati ĂŒsna vaieldav kĂŒsimus, seega peame selguse nimel seda tĂ€psustama, et kohe selle teelt Ă€ra vĂ”tta. Projekt nsâ3, nagu enamik suuremaid projekte, on vĂ”tnud kasutusele koodimisstandardi, millele kogu esitatud kood peab vastama. Kui soovite oma koodi projekti lisada, peate lĂ”puks vastama nsâ3 koodimisstandardile, nagu on kirjeldatud failis doc\/codingstd.txt vĂ”i nĂ€idatud projekti veebilehel: .
Soovitame teil harjuda nsâ3 koodi vĂ€limusega ja rakendada seda standardit iga kord, kui töötate meie koodiga. Kogu arendajate meeskond ja panustajad nĂ”ustusid sellega pĂ€rast mĂ”ningast virisemist. Ălaltoodud emacs reĆŸiimi rida lihtsustab Ă”iget vormindamist, kui kasutate redaktorit emacs.
Simulaator nsâ3 litsentseeritakse kasutades GNU Ăldine Avalik Litsents. NĂ€ete vastavat GNU juriidilist pĂ€ist iga nsâ3 levitamise faili kohal. Sageli nĂ€ete autoriĂ”iguse teadet ĂŒhe projekti nsâ3 osaleva asutuse kohta GPL-i teksti ja autori kohal, nagu allpool nĂ€idatud.
/*
* 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
*/4.2.2 Ăhendatud moodulid
Kood ise algab hulga kaasamise operaatoritega (include).
#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"Kuna aitada meie kĂ”rge tasemega skriptide kasutajatel hallata sĂŒsteemis olevaid paljusid pealkirjafaile, rĂŒhmitame need nende kasutamise pĂ”hjal suurtesse moodulitest. Pakume ĂŒhte pealkirjafaile, mis laadib rekursiivselt kĂ”ik antud moodulis kasutatavad pealkirjafailid. Selle asemel, et otsida, milline pealkiri teil vaja on ja saada Ă”igete sĂ”ltuvuste loend, anname teile vĂ”imaluse laadida failide rĂŒhma suure detailitasemega. See pole kĂ”ige efektiivsem lĂ€henemine, kuid see muudab skriptide kirjutamise kindlasti lihtsamaks.
Iga nsâ3 kaasatud fail paigutatakse kausta nimega ns3 (ehituskaust), et vĂ€ltida faili nimede konflikte koostamisprotsessi ajal. Fail ns3/core-module.h vastab nsâ3 moodulile, mille leiate kaustast src/core teie installitud vĂ€ljal. Selle kausta loendis leiate hulga pealkirjafaile. Kui teete ehituse, Waf paigutab avalikud pealkirjafaile kausta ns3 kaustas build/debug
Kui teil ei ole sellist kausta, siis pole te ns-3 versiooni ehitamisel vÀljundkausta mÀÀranud, ehitage seda nii:
$ ./waf configure âbuild-profile=debug âout=build/debug
$ .\/waf build
vÔi
$ ./waf configure âbuild-profile=optimized âout=build/optimized
$ .\/waf build
vÔi build/optimized, sÔltuvalt teie konfiguratsioonist. Waf teenib ka automaatselt kaasatud failide mooduli, et laadida kÔik avalikud pealkirjafailid. Kuna te jÀrgite selle juhendi varasemate etappide tÀielikult, olete kindlasti teinud
$ ./waf -d debug --enable-examples --enable-tests configureet seadistada projekt debug-kogumikuks, mis sisaldab nÀiteid ja teste. Olete ka teinud
$ ./wafet koguda projekti. Nii et nĂŒĂŒd, kui vaatate kausta ../..../build/debug/ns3, leiate seal, teiste seas, nende nelja mooduli pealkirjafailid, mis on loetletud ĂŒlal. Saate vaadata nende failide sisu ja avastada, et need sisaldavad kĂ”iki avalikke faile, mida vastavad moodulid kasutavad.
4.2.3 ns3 nimede ruum
JĂ€rgnev rida skriptis first.cc on nimede ruumi kuulutamine.
using namespace ns3;ns-3 projekt on rakendatud C++ nimede ruumis, mida nimetatakse ns3. See rĂŒhmitab kĂ”ik ns-3-ga seotud deklaratsioonid global nimete ruumi vĂ€ljapoole jÀÀvas ulatuses, mille ĂŒle loodame, et see aitab integreeruda muu koodiga. C++ operaatori kasutamine toob esile ns-3 nimede ruumi praeguses (globaal) deklaratiivses piirkonnas. See on erakordne viis öelda, et pĂ€rast seda deklaratsiooni ei ole teil vaja kasutada operaatorit ns3 :: scope igas ns-3 koodis, et seda kasutada. Kui te ei tunne nimede ruume, vaadake mis tahes C++ Ă”pikust ja vĂ”rrelge ns3 nimede ruumi std nimede ruumi ja deklaratsioonidega. using namespace std; vĂ€ljund operaatori nĂ€idetes cout ja voogud.
4.2.4 Logimine
JĂ€rgmine skripti rida on selline,
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");Kasutame seda vĂ€idet mugava kohana, et arutada meie dokumentatsioonisĂŒsteemi. DoxygenKui vaatate ns-3 projekti veebilehte, leiate navigeerimisribbonilt sildi "Dokumentatsioon". Kui valite selle lingi, jĂ”uate meie dokumentatsiooni lehele. Seal on link "Viimane vĂ€ljaanne", mis viib teid viimasest stabiilsest versioonist ns-3 dokumentatsiooni juurde. Kui valite lingi "API Documentation", jĂ”uate ns-3 API dokumentatsiooni lehele.
Lehe vasakul kĂŒljel leiate dokumentatsiooni struktuuri graafilise esitluse. Hea koht alustamiseks on "ns-3 moodulite raamat" ns-3 navigeerimise puu sees. Kui te laiutate Moodulid, nĂ€ete ns-3 moodulite dokumentatsiooni loetelu. Nagu eespool arutatud, on mooduli kontseptsioon siin otseselt seotud ĂŒlaltoodud failidega. ns-3 logimisalajaotust arutatakse jaotises Logimise mooduli kasutamine, seega tuleme selle juurde hiljem selles juhendis, kuid saate tutvuda ĂŒlaltoodud vĂ€itega, vaadates moodulit Tuumik, seejĂ€rel avage raamat Debugging tools, seejĂ€rel valige leht Logging. KlĂ”psake Logging.
NĂŒĂŒd peaksite vaatama dokumentatsiooni Doxygen mooduli jaoks Logging. LehekĂŒlje ĂŒlaosas makroside loendis nĂ€ete kirjet NS_LOG_COMPONENT_DEFINE. Enne lingile minekut vaadake kindlasti moduli logimist "Ăksikasjalik kirjeldus", et mĂ”ista selle toimimist tervikuna. Selleks vĂ”ite kerida alla vĂ”i valida diagrammi all "Rohkem...".
Kui teil on ĂŒldine arusaam sellest, mis toimub, jĂ€tkake ja vaadake konkreetse NS_LOG_COMPONENT_DEFINE dokumentatsiooni. Ma ei hakka siin dokumentatsiooni dubleerima, kuid kokkuvĂ”tteks vĂ”in öelda, et see rida kuulutab vĂ€lja logimiskomponendi nimega ei nĂ€e te uut teadet, kuna seotud ajakirjakomponent (FirstScriptExample) ei olnud lubatud. Et nĂ€ha oma sĂ”numit, peate lubama ajakirjakomponendi, mis vĂ”imaldab sisse ja vĂ€lja lĂŒlitada konsoolilogi sĂ”numeid nime alusel.
4.2.5 Peamine funktsioon
Skriptis nÀete jÀrgmisi ridu,
int
main (int argc, char *argv[])
{ See on lihtsalt peafunktsiooni vÀljakuulutamine teie programmil (skriptil). Nagu iga C++ programmis, peate mÀÀratlema peafunktsiooni, see kÀivitub esimesena. Siin pole midagi erilist. Teie ns-3 skript on lihtsalt C++ programm. JÀrgmine rida seadistab ajaraske 1 nanosekundi vÀÀrtuseks, mis on vaikimisi vÀÀrtus:
Time::SetResolution (Time::NS);Ajaraasi mÀÀrus vĂ”i lihtsalt mÀÀrus â see on vĂ€ikseim ajavÀÀrtus, mida saab kasutada (vĂ€ikseim tĂ”enĂ€oline erinevus kahe ajavÀÀrtuse vahel). Te saate mÀÀrust muuta ainult ĂŒks kord. Selle paindlikkuse tagamiseks vajalik mehhanism tarbib mĂ€lu, seega kui mÀÀrus on selgesĂ”naliselt seadistatud, vabastame mĂ€lu, et vĂ€ltida edasisi uuendusi. (Kui te ei mÀÀra mÀÀrust selgesĂ”naliselt, siis on see vaikimisi ĂŒks nanosekund ja mĂ€lu vabastatakse simulatsiooni alustamisel.)
JĂ€rgmistel kahel skripti real kasutatakse kahe sisseehitatud logimiskomponendi aktiveerimiseks, mis on rakendustes EchoClient ja EchoServer:
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);Kui olete lugenud Logging-komponendi dokumentatsiooni, siis nÀete, et on olemas mitu registratsiooni/detailiseerimise taset, mida saate iga komponendi jaoks lubada. Need kaks koodirida sisaldavad logimist tasemel INFO eho-klientide ja serverite jaoks. Selle taseme korral prinditakse rakendus simuleerimise kÀigus sÔnumeid pakettide saatmise ja vastuvÔtmise ajal.
NĂŒĂŒd liigume otse topoloogia loomise ja simuleerimise kĂ€ivitamise juurde. Kasutame topoloogiapoolikĂ”rvalisi objekte, et see töö vĂ”imalikult lihtsaks muuta.
4.2.6 Topoloogiliste abimeeste kasutamine
Kaks jÀrgmist koodirida meie skriptis loovad tegelikult ns-3 Node-objekte, mis esindavad arvuteid simuleerimisel.
NodeContainer nodes;
nodes.Create (2);Enne kui jĂ€tkame, leidkem dokumentatsioon klassi jaoks NodeContainer. Teine viis sellele klassile dokumentatsiooni juurde pÀÀsemiseks on klĂ”psata vahekaardil Classes lehtedelt Doxygen. Kui olete juba Doxygeni avanud, kerige lihtsalt lehe ĂŒlaossa ja valige vahekaart Classes. Peaksite nĂ€gema uut vahekaartide komplekti, millest ĂŒks on klasside loetelu. Selle vahekaardi all peaksite nĂ€gema kĂ”igi ns-3 klasside loetelu. Kerige alla, kuni leiate ns3::NodeContainer. Kui leiate klassi, valige see, et pÀÀseda klassi dokumentatsioonile.
Kuna me mĂ€letame, on meie ĂŒks peamisi abstraktsioone sĂ”lm. See esindab arvutit, millele kavatseme lisada selliseid asju nagu protokollide, rakenduste ja lisakaardid. Topoloogiapoolik NodeContainer pakub mugavat viisi, kuidas luua, hallata ja pÀÀseda juurde kĂ”ikidele objektidele Node, mille me loome simuleerimise kĂ€ivitamiseks. Ăks rida ĂŒlalpool lihtsalt kuulutab NodeContainer, mille me nimetame nodes. Teine rida kutsub vĂ€lja Create meetodi objektile nodes ja palub konteineril luua kaks sĂ”lme. Nagu on kirjeldatud Doxygen, palub konteiner sĂŒsteemis ns-3 luua kaks objekti Node ja salvestab viidatud sellele objektidele endasse.
Skriptis loodud sĂ”lmed praegu midagi ei tee. JĂ€rgmiseks sammuks topoloogia ehitamisel on meie sĂ”lmede ĂŒhendamine vĂ”rku. Lihtsaim vĂ”rguvorm, mida me toetame, on kahe sĂ”lme vaheline kahepunkti-side. Loome nĂŒĂŒd sellise ĂŒhenduse.
PointToPointHelper
Me loome kahepunktiĂŒhenduse, jĂ€rgides tuntud mustrit, kasutades topoloogiat abistavat objekti madalal tasemel töötamiseks, mis on vajalik ĂŒhenduse loomiseks. Tuletame meelde, et meie kaks peamist abstraktsiooni NetDevice ja Kanal. Reaalmaailmas vastavad need mĂ”isted umbkaudu perifeersetele kaartidele ja vĂ”rgukaablitele. Ăldiselt on need kaks asja tihedalt seotud, ja keegi ei saa loota nĂ€iteks seadmete Ethernet kaudu juhtmevaba kanali vahetamisele. Meie topoloogilised abistajad jĂ€rgivad seda tihedat seost ja seega kasutate selles stsenaariumis ĂŒhte objekti PointToPointHelper ns-3 objektide seadistamise ja ĂŒhendamise jaoks PointToPointNetDevice ja PointToPointChannel. JĂ€rgmised kolm rida stsenaariumis:
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));Esimene rida,
PointToPointHelper pointToPoint;loob virna objekti eksemplari PointToPointHelper. Ălemise taseme vaatenurgast ĂŒtleb jĂ€rgmine rida,
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));et objekt PointToPointHelper kasutaks vÀÀrtust â5 Mbit/sâ (viis megabitti sekundis) kui âDataRate».
Spetsiaalsemast vaatenurgast vastab rida âDataRateâ sellele, mida me nimetame atribuudiks PointToPointNetDevice. Kui vaatate Doxygen selle klassi jaoks ns3::PointToPointNetDevice ja meetodi dokumentatsiooni GetTypeId leiate loetelu atribuutidest, mis on mÀÀratletud seadme jaoks. Nende seas on atribuut âDataRateâ. Enamik nĂ€htavatest kasutajaobjektidest ns-3-s on sarnaste atribuutide loetelud. Kasutame seda mehhanismi simuleerimise lihtsaks seadistamiseks ilma uuesti kompileerimata, nagu nĂ€ete jĂ€rgmises osas.
Sarnaselt âDataRateâ PointToPointNetDevice'is leiate atribuudi âDelayâ, mis on seotud PointToPointChanneliga. Viimane rida,
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));ĂŒtleb PointToPointHelper kasutab vÀÀrtust â2 msâ (kaks millisekundit) punkti-punkti kanali leviku viivituse vÀÀrtusena, mille ta hiljem loob.
NetDeviceContainer
Kuni praeguseni on meil stsenaariumis NodeContainer, mis sisaldab kahte sĂ”lme. Meil on PointToPointHelper, mis on ette valmistatud objektide loomiseks PointToPointNetDevices ja nende ĂŒhendamiseks PointToPointChannel objekti abil. Nii nagu me kasutasime NodeContainer topologiat sĂ”lmede loomiseks, palume PointToPointHelper teha meie jaoks töö, mis on seotud meie seadmete loomise, seadistamise ja installimisega. Meil on vaja loetelu kĂ”igist loodud objektidest NetDevice, seetĂ”ttu kasutame NetDeviceContainer hoidmiseks, nagu me seda varem kasutasime NodeContainer meie loodud sĂ”lmede jaoks. JĂ€rgmised kaks koodirea
NetDeviceContainer seadmed;
devices = pointToPoint.Install(nodes);lÔpetavad seadmete ja kanali seadistamise. Esimene rida deklareerib seadmekonteineri, millest eelnevalt rÀÀgiti, ja teine teeb pÔhitegevuse. Meetod Installi objekti PointToPointHelper vastuvÔtavad NodeContainer nagu parameeter. Siseriiklikult NetDeviceContainer iga sÔlme jaoks, mis on NodeContainer loob (punkt-punkti suhtlemiseks peab neid olema tÀpselt kaks) PointToPointNetDevice loob ja salvestab seadmekonteineri. PointToPointChannel loob, ja sellega liidetakse kaks PointToPointNetDevices. PÀrast objektide loomist kasutatakse atribuutide, mis on salvestatud PointToPointHelper, vastavate atribuutide algatamiseks loodud objektides.
PĂ€rast kĂ”ne tĂ€itmist pointToPoint.Install(nodes) on meil kaks sĂ”lme, kummalgi on paigaldatud «punkt-punkt» vĂ”rguseade ja ĂŒks «punkt-punkt» kanal nende vahel. MĂ”lemad seadmed on seadistatud edastama andmeid kiirusel viis megabitti sekundis, edastusviivitus on kaks millisekundit.
InternetStackHelper
NĂŒĂŒd on meil seadistatud sĂ”lmed ja seadmed, kuid meie sĂ”lmedel ei ole protokollide stĂ€kke paigaldatud. JĂ€rgmised kaks koodirea hoolitsevad selle eest.
InternetStackHelper stack;
stack.Install(nodes);InternetStackHelper on topoloogiline abimees interneti stÀkkide jaoks, sarnaselt PointToPointHelper'ile kahepunkti vÔrguseadmete jaoks. Meetod Installi vÔtab NodeContainer'i parameetrina. TÀitmisel paigaldab see Interneti stÀgi (TCP, UDP, IP jne) iga konteineri sÔlme.
Ipv4AddressHelper
SeejÀrel peame meie seadmed siduma IP-aadressidega. Pakume topoloogiat abimeest IP-aadresside jaotamise haldamiseks. Ainus kasutajale nÀhtav API on baasi IP-aadressi ja alamvÔrgu maski seadmine, mida kasutatakse tegelike aadresside jaotamise teostamiseks (see toimub abimehe madalamal tasemel). JÀrgmised kaks koodirea meie nÀidis skriptis first.cc,
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");deklareerivad abistava objekti aadressi ja ĂŒtlevad sellele, et ta peaks hakkama mÀÀrama IP-aadresse vĂ”rgust 10.1.1.0, kasutades mÀÀramiseks bitimaski 255.255.255.0. Vaikimisi hakkavad mÀÀratud aadressid numbrist ĂŒks ja suurenevad monotoonselt, seega on esimene aadress, mis sellest baasist mÀÀratakse, 10.1.1.1, seejĂ€rel 10.1.1.2 jne. Tegelikult, madalal tasemel, mĂ€letab sĂŒsteem ns-3 kĂ”iki mÀÀratud IP-aadresse ja genereerib fataalse vea, kui te juhuslikult loote olukorra, kus sama aadress genereeritakse kaks korda (muide, seda viga on raske tĂ”rkeotsida).
JĂ€rgmine koodirida,
Ipv4InterfaceContainer interfaces = address.Assign(devices);teostab aadressi tegeliku mÀÀramise. Ns-3-s seome IP-aadressi seadmega, kasutades objekti Ipv4Interface. Just nagu me vajame mÔnikord loendit vÔrgu seadmetest, mille abistaja on loonud edasiseks kasutamiseks, vajame mÔnikord loendit objektidest Ipv4Interface. Ipv4InterfaceContainer pakub seda funktsionaalsust.
Oleme loonud punkt-punkt vĂ”rgu, kus on seadistatud protokollid ja mÀÀratud IP-aadressid. NĂŒĂŒd vajame igas sĂ”lmes rakendust, et genereerida liiklust.
4.2.7 Rakenduse kasutamine
Veel ĂŒks peamine abstraktsioon sĂŒsteemis ns-3 on Application (rakendus). Selles stsenaariumis kasutame kahte alusklassi spetsialiseerimist Application ns-3 nimelt UdpEchoServerApplication ja UdpEchoClientApplication. Nagu eelmistes juhtumites, kasutame abistavaid objekte baasobjektide seadistamiseks ja haldamiseks. Siin kasutame UdpEchoServerHelper ja UdpEchoClientHelperobjekte, et teha oma elu lihtsamaks.
UdpEchoServerHelper
JĂ€rgmised koodiread meie nĂ€idisfailis first.cc kasutatakse UDP echo serveri rakenduse seadistamiseks ĂŒhes varem loodud sĂ”lmes.
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));
serverApps.Start(Seconds(1.0));
serverApps.Stop(Seconds(10.0));Esimene koodirida eelnevas fragmentis loob UdpEchoServerHelper. Nagu tavaliselt, ei ole see rakendus iseenesest, vaid objekt, mis aitab meil luua reaalseid rakendusi. Ăks meie kokkulepetest on edastada vajalikud atribuudid abistava objekti konstruktorisse. Sel juhul ei saa abiline midagi kasulikku teha, kui talle ei ole antud sadama numbrit, millel server pakette ootab; see number peab olema teada ka kliendile. Antud juhul edastame konstruktorile abistaja sadama numbri. Konstruktor omakorda lihtsalt tĂ€idab SetAttribute antud vÀÀrtusega. Hiljem, soovi korral, saate SetAttribute abil mÀÀrata teise atribuudivÀÀrtuse 'Port'.
Sarnaselt paljudele teistele abistavatele objektidele, omab objekt UdpEchoServerHelper meetodit Installi. Selle meetodi tÀitmine loob tegelikult alusecho-serveri rakenduse ja seob selle sÔlmega. Huvitav on see, et meetod Installi vastuvÔtavad NodeContainter on parameetrina samuti nagu teised Installi meetodid, mida oleme nÀinud.
C++ vaikimisi teisendus, mis siin töötab, vĂ”tab meetodi node.Get (1) (mis tagastab nutika nĂ€itaja sĂ”lme objekti â Ptr) ja kasutab seda anonĂŒĂŒmse objekti konstruktoris NodeContainer, mis antakse edasi meetodile Installi. Kui te ei suuda C++ koodis kindlaks teha, millise allkirjaga meetod kompileeritakse ja tĂ€idetakse, otsige vaiksete teisenduste hulgast.
NĂŒĂŒd nĂ€eme, et echoServer.Install kavatseb paigaldada rakenduse UdpEchoServerApplication leitud NodeContainer, mida me kasutame oma sĂ”lmede haldamiseks, sĂ”lme indeksiga 1. Meetod Installi tagastab konteineri, mis sisaldab nĂ€itajaid kĂ”ikidele rakendustele (antud juhul ĂŒks, kuna me edastasime anonĂŒĂŒmse NodeContainer, mis sisaldab ĂŒhte sĂ”lme) loodud abilise poolt.
Rakendustel on vaja nĂ€idata hetke, mil genereerida liiklust 'start' ja vĂ”ib osutuda vajalikuks tĂ€iendavalt nĂ€idata aega, mil see peatada 'stop'.Me edastame mĂ”lemad parameetrid. Need ajad mÀÀratakse meetodite abil ApplicationContainer Alusta ja Peata. Need meetodid vĂ”tavad parameetreid tĂŒĂŒbiga Aeg. Sel juhul kasutame C++ selget teisenduste seeriat, et vĂ”tta C++ double 1.0 ja muundada see objektiks tnsâ3 Time, kasutades objekt Seconds'i sekunditeks konverteerimiseks. Pidage meeles, et muundamisreegleid vĂ”ib juhtida mudeli autor ja C++-l on oma reeglid, seega ei saa te alati loota, et parameetreid muudetakse nii, nagu te ootasite. Kaks rida,
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));toob kaasa selle, et echo-serveri rakendus kĂ€ivitatakse (lĂŒlitatakse automaatselt sisse) ĂŒhe sekundi pĂ€rast simuleerimise algust ja peatatakse (lĂŒlitatakse vĂ€lja) kĂŒmne sekundi jooksul simuleerimist. Kuna oleme kuulutanud simuleerimise sĂŒndmuse (rakenduse peatamise sĂŒndmus), mis toimub kĂŒmne sekundi pĂ€rast, simuleeritakse vĂ€hemalt kĂŒmme sekundit vĂ”rgu tööd.
UdpEchoClientHelper
Kliendirakendus echo konfigureeritakse praktikas sarnaselt serverile. On olemas pÔhielement, UdpEchoClientApplication, mida juhib
UdpEchoClientHelper.
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));Kuid echo-kliendi jaoks peame seadistama viis erinevat atribuut. Esimesed kaks attributi seadistatakse loomise ajal UdpEchoClientHelper. Edastame parameetrid, mida kasutatakse (abilises) atribuutide seadmiseks "RemoteAddress" ja "RemotePort" vastavalt meie kokkuleppele, vajalikud parameetrid abistaja konstruktorisse edastamiseks.
Kinnitame, et kasutasime Ipv4InterfaceContainer IP-aadresside jĂ€lgimiseks, mille oleme oma seadmetele mÀÀranud. Nullliides konteineris vastab nullist sĂ”lme IP-aadressile sĂ”lmede konteineris. Esimene liides konteineris vastab esimese sĂ”lme IP-aadressile sĂ”lmede konteineris. Seega loome koodi esimeses real (ĂŒleval) abistaja ja teatame talle, et kliendi eemalolev aadress on IP-aadress, mis on mÀÀratud sĂ”lmele, kus server asub. RÀÀgime ka, et peab korraldama pakettide saatmise ĂŒheksandale sadamale.
Atribuut «MaxPackets» teavitab klienti maksimaalsest pakettide arvust, mida me saame simuleerimise ajal saata. Atribuut «Interval» teavitab klienti, kui kaua oodata pakettide vahel, ja atribuut «PacketSize» teavitab klienti, kui suur peaks olema paketi koormus. Selle atribuutide kombinatsiooniga ĂŒtleb me klientidele, et nad saaksid saata ĂŒhe 1024-baidise paketi.
Nagu kĂ”neleja serveri puhul, seadistame ka kĂ”neleja kliendile atribuudid, Alusta ja Peata, kuid siin kĂ€ivitame kliendi ĂŒhe sekundi pĂ€rast serveri sisselĂŒlitamist (kaks sekundit pĂ€rast simuleerimise algust).
4.2.8 Simulaator
Selles etapis peame simuleerimise kÀivitama. See toimub globaalsete funktsioonide kaudu. Simulator::Run.
Simulator::Run ();Kui me varem kutsusime vÀlja meetodid,
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
...
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));oleme tegelikult ajakava sĂŒndmusi simulatoris 1,0 sekundiks, 2,0 sekundiks ja kaks sĂŒndmust 10,0 sekundiks. PĂ€rast vĂ€ljakutset Simulator::Run, hakkab sĂŒsteem vaatama ajakavale pandud sĂŒndmuste loendit ja neid tĂ€itma. Esiteks kĂ€ivitab see sĂŒndmuse 1,0 sekundi pĂ€rast, mis aktiveerib kĂ”neleja serveri rakenduse (see sĂŒndmus vĂ”ib omakorda ajakavale panna palju teisi sĂŒndmusi). Siis kĂ€ivitab see sĂŒndmuse, mis on ajakavas t = 2,0 sekundit, mis kĂ€ivitab kĂ”neleja kliendi rakenduse. Taaskord vĂ”ib see sĂŒndmus ajakavale panna veel palju sĂŒndmusi. KĂ”neleja kliendi kĂ€ivitamise sĂŒndmuse rakendamine alustab simuleerimise andmeedastusetappi, saates paketi serverisse.
Paketi serverisse saatmise akt kutsub esile sĂŒndmuste ahela, mis tehakse automaatselt taustal ja mis rakendab kĂ”neleja signaalide paketi saatmise mehhanismi vastavalt sĂŒnkroonimise parameetritele, mille oleme stsenaariumis seadnud.
KokkuvĂ”ttes, kuna saadame ainult ĂŒhe paketi (kĂ€tke, atribuut MaxPackets oli seadistatud ĂŒhiseks), sĂŒndmuste ahel, mille kĂ€ivitas see ainus kliendi kĂ”neleja pĂ€ring, lĂ”ppeb, ja simuleerimine lĂ€heb ooteaega. Kui see juhtub, on alles jÀÀvad ajakava sĂŒndmused serveri ja kliendi jaoks. Kui need sĂŒndmused tĂ€idetakse, ei jÀÀ enam sĂŒndmusi edasise töötlemise jaoks ja Peata tagastatakse kontroll. Simuleerimine on lĂ”petatud. Simulator::Run JÀÀnud on vaid enda taga koristamine. See toimub globaalsete funktsioonide vĂ€ljakutsumisega.
Simulator::Destroy Simulator::Destroy. Kuna abistavate funktsioone (vĂ”i madala taseme koodi nsâ3) kutsutakse, mis on korraldatud nii, et simulaatorisse on sisse ehitatud nupud kĂ”igi loodud objektide hĂ€vitamiseks. Te ei pea jĂ€lgima ĂŒhtegi neist objektidest iseseisvalt â kĂ”ik, mida te pidi tegema, oli helistada Simulator::Destroy ja vĂ€lja minna. Nsâ3 sĂŒsteem teeb selle raske töö teie eest. Meie esimese nsâ3 skripti, first.cc, ĂŒlejÀÀnud read teevad just seda:
Simulator::Destroy ();
return 0;
}Millal simulaator peatub?
Nsâ3 on diskreetse sĂŒndmuse simulaator (DE). Sellises simulaatoris on iga sĂŒndmus seotud selle toimumise ajaga ning simuleerimine jĂ€tkub sĂŒndmuste töötlemisega nende esinemise jĂ€rjekorras simuleerimise kĂ€igus. SĂŒndmused vĂ”ivad pĂ”hjustada tulevaste sĂŒndmuste planeerimist (nĂ€iteks taimer vĂ”ib end ĂŒmber planeerida, et lĂ”petada arvestamine jĂ€rgmises intervallis).
Alguses sĂŒndmused algatatakse tavaliselt objekti poolt, nĂ€iteks IPv6 plaanib teenuste kindlaksmÀÀramise vĂ”rgus, naabrite pĂ€ringud jne. Rakendus plaanib esimest paketi saatmise sĂŒndmust jne. Kui sĂŒndmus töödeldakse, vĂ”ib see genereerida null, ĂŒks vĂ”i mitu sĂŒndmust. Simuleerimise kĂ€igus juhtuvad sĂŒndmused, lĂ”petades lihtsalt vĂ”i tekitades uusi. Simulatsioon peatub automaatselt, kui sĂŒndmuste jĂ€rjekord on tĂŒhi vĂ”i kui tuvastatakse eriline sĂŒndmus Peata. SĂŒndmus Peata genereeritakse funktsiooniga Simulator::Stop (peata aeg).
On tĂŒĂŒpiline juhtum, kus Simulator::Stop on absoluutne vajadus simuleerimise peatamiseks: kui on enesetootvad sĂŒndmused. Enesetootvad (vĂ”i korduvad) sĂŒndmused on sĂŒndmused, mis alati ĂŒmber plaanitakse. SeetĂ”ttu hoiavad nad alati sĂŒndmuste jĂ€rjekorra mitte tĂŒhjana. Paljud protokollid ja moodulid sisaldavad korduvaid sĂŒndmusi, nĂ€iteks:
âą FlowMonitor â perioodiline kontroll kadunud pakettide suhtes;
âą RIPng â perioodiline teabetabeli vĂ€rskenduste saatmine;
âą jne.
Sellistel juhtudel Simulator::Stop on vajalik simuleerimise korrektseks peatamiseks. Lisaks, kui nsâ3 on emulatsioonireĆŸiimis, kasutatakse RealTimeSimulatori, et sĂŒnkroonida simuleerimise kella masina kellaga ja Simulator::Stop on vajalik protsessi peatamiseks.
Paljud Ă”pikute simuleerimisprogrammid ei kutsu Simulator::Stop selgelt, kuna need lĂ”petatakse automaatselt, kui jĂ€rjekorras olevad sĂŒndmused meeldivad. Kuid need programmid aktsepteerivad ka kutset Simulator::Stop. NĂ€iteks jĂ€rgnev tĂ€iendav kĂ€sk esimeses programmikoodis ajastab selge peatamise 11. sekundil:
+ Simulator::Stop (Seconds (11.0));
Simulator::Run ();
Simulator::Destroy ();
return 0;
}Ălaltoodud ei muuda tegelikult selle programmi kĂ€itumist, kuna see konkreetne simuleerimine lĂ”ppeb loomulikult 10 sekundi pĂ€rast. Kuid kui muudate peatamise aja ĂŒlaltoodud kĂ€sus 11 sekundilt 1 sekundile, mĂ€rkasite, et simuleerimine peatub enne, kui suvaline vĂ€ljund ekraanile jĂ”uab (kuna vĂ€ljund toimub umbes 2 sekundi jooksul simuleerimise ajast).
On oluline kutsuda Simulator::Stop enne Simulator::Run kutset; vastasel juhul ei pruugi Simulator::Run kunagi tagastada juhtimist pÔhiprogrammile peatamise tÀitmiseks!
4.2.9 Teie stsenaariumi koostamine
Oleme teie lihtsate skriptide loomise teinud triviaalseks. KĂ”ik, mis teil on vaja teha, on oma skript paigutada katalooge scratch, ja see kogutakse automaatselt, kui te kĂ€ivitate Waf. Proovime. Naaske ĂŒlemise taseme katalooge ja kopeerige examples/tutorial/first.cc kausta scratch
$ cd ../..
$ cp examples/tutorial/first.cc scratch/myfirst.ccNĂŒĂŒd koostage oma esimene nĂ€iteskript, kasutades waf:
$ ./wafTe peaksite nÀgema sÔnumeid, et teie esimene nÀide on edukalt loodud.
Waf: Siseneb kataloogisse `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
[614/708] cxx: scratch/myfirst.cc -> build/debug/scratch/myfirst_3.o
[706/708] cxx_link: build/debug/scratch/myfirst_3.o -> build/debug/scratch/myfirst
Waf: Lahkub kataloogist `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lĂ”petatud edukalt (2.357s)NĂŒĂŒd saate nĂ€idet kĂ€ivitada (pange tĂ€hele, et kui koostate oma programmi kataloogis scratch, peate seda ka kĂ€ivitama sealt) scratch):
$ ./waf --run scratch/myfirstTe peaksite nÀgema sarnast vÀljundit:
Waf: Siseneb kataloogisse `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Lahkub kataloogist `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' lÔpetatud edukalt (0.418s) Saadetud 1024 baiti aadressile 10.1.1.2
Saabunud 1024 baiti aadressilt 10.1.1.1
Saabunud 1024 baiti aadressilt 10.1.1.2Siit nĂ€ete, et kompileerimissĂŒsteem kontrollib, et fail on koostatud, ja seejĂ€rel kĂ€ivitab selle. Te nĂ€ete, et komponentide logis Echo kliendil on kirjas, et see saatis ĂŒhe 1024-baidise paketi Echo serverile 10.1.1.2. Te nĂ€ete ka komponentide logimist Echo serveris, mis ĂŒtleb, et see sai 10.1.1.1-elt 1024 baiti. Echo server saadab paketi tagasi ja nĂ€ete Echo kliendi logis, et see sai oma paketi serverilt tagasi.
4.3 ns-3 Allikasood
NĂŒĂŒd, kui olete kasutanud mĂ”ningaid ns-3 abivahendeid, vĂ”ite vaadata mĂ”ningaid allika koode, mis seda funktsionaalsust rakendavad. KĂ”ige vĂ€rskemat koodi saab vaadata meie veebiserveris jĂ€rgmisel lingil: . Seal nĂ€ete Mercuriali kokkuvĂ”tete lehte meie ns-3 arenduspuu jaoks. Lehe ĂŒlaosas nĂ€ete mitmeid linke,
summary | shortlog | changelog | graph | tags | filesJÀtkake ja valige link failidele. Nii nÀeb enamik meie hoidlatest vÀlja:
drwxr-xr-x [up]
drwxr-xr-x bindings python files
drwxr-xr-x doc files
drwxr-xr-x examples files
drwxr-xr-x ns3 files
drwxr-xr-x scratch files
drwxr-xr-x src files
drwxr-xr-x utils files
-rw-r--r-- 2009-07-01 12:47 +0200 560 .hgignore file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1886 .hgtags file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 1276 AUTHORS file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 30961 CHANGES.html file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 17987 LICENSE file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 3742 README file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 16171 RELEASE_NOTES file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 6 VERSION file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 88110 waf file | revisions | annotate
-rwxr-xr-x 2009-07-01 12:47 +0200 28 waf.bat file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 35395 wscript file | revisions | annotate
-rw-r--r-- 2009-07-01 12:47 +0200 7673 wutils.py file | revisions | annotateMeie skriptide nĂ€idised asuvad kataloogis examples. Kui klĂ”psate nĂ€idistel, nĂ€ete alamkaustade loendit. Ăks fail alamkaustas on tutorial â first.cc. Kui klĂ”psate first.cc , nĂ€ete koodi, mida olete just uurinud.
Allika kood asub peamiselt kataloogis srcSaate lĂ€htekoodi vaadata, klikkides kaustal vĂ”i klikkides kaustade paremal kĂŒljel olevatel faililinkidel. Kui klikkite kaustal src, nĂ€ete src alamkaustade loendit. Kui siis klikkite alamkaustal core, leiate failide loendi. Esimene fail, mille te nĂ€ete (selle juhendi kirjutamise hetkel) â abort.h. Kui klikkite lingil abort.h, suunatakse teid lĂ€htefailile, mis abort.h, sisaldab kasulikke makrosid skriptidest vĂ€ljumiseks, kui tuvastatakse ebanormaalsed tingimused. Selle peatĂŒki jooksul kasutatud abifailide lĂ€htekood asub kaustas src/Applications/helper. Ărge kartke kaustapuu kaevamisest, et mĂ”ista, kus mis on, ja tutvuda nsâ3 programmistiku stiiliga.
Allikas: habr.com
