ns-3 sare-simulatzailearen tutoriala. 4. kapitulua

ns-3 sare-simulatzailearen tutoriala. 4. kapitulua
1,2. kapitulua
3. kapitulua

4 Kontzeptuaren ikuspegi orokorra
4.1 Funtsezko abstrakzioak
4.1.1 Nodoa
4.1.2 Aplikazioa
4.1.3 Kanala
4.1.4 Gailu garbia
4.1.5 Laguntzaile topologikoak
4.2 Lehen ns-3 gidoia
4.2.1 Boilerplate kodea
4.2.2 Pluginak
4.2.3 ns3 izen-espazioa
4.2.4 Erregistratzea
4.2.5 Funtzio nagusia
4.2.6 Topologia laguntzaileak erabiltzea
4.2.7 Aplikazioa erabiltzea
4.2.8 Simulagailua
4.2.9 Zure gidoia eraikitzea
4.3 ns-3 Iturburu kodea

4 kapitulua

Kontzeptuaren ikuspegi orokorra

ns-3 kodea ikasten edo idazten hasi aurretik egin behar dugun lehenengo gauza sistemaren oinarrizko kontzeptu eta abstrakzio batzuk azaltzea da. Horietako asko begi-bistakoa irudituko zaie batzuentzat, baina atal hau irakurtzeko denbora hartzea gomendatzen dugu oinarri sendo batekin hasten zarela ziurtatzeko.

4.1 Funtsezko abstrakzioak

Atal honetan, sarean erabili ohi diren baina ns-3-n esanahi zehatza duten zenbait termino aztertuko ditugu.

4.1.1 Nodoa

Interneteko hizkeran, sare batera konektatzen den ordenagailu gailu bati ostalari edo, batzuetan, amaierako sistema deitzen zaio. ns-3 sare-simulatzailea denez eta ez Interneteko simulagailua, nahita ez dugu host terminoa erabiltzen, hau Internetekin eta bere protokoloekin oso lotuta baitago. Horren ordez, termino orokorrago bat erabiltzen dugu, beste simulagailu batzuek ere erabiltzen dutena, grafoen teorian jatorria duena: nodo (Nodo).

ns-3-n, gailu informatiko baten azpian dagoen abstrakzioari nodo deitzen zaio. Abstrakzio hau C++-n Node klaseak adierazten du. Klasea NodeNode (nodoak) gailu informatikoen irudikapenak simulazioetan manipulatzeko metodoak eskaintzen ditu.

Ulertu behar duzu Nodoa funtzionaltasuna gehitzen diozun ordenagailu bat bezala. Besteak beste, aplikazioak, protokolo-pilak eta txartel periferikoak ordenagailuari lan erabilgarria egiteko aukera ematen dioten kontrolatzaileekin gehituko dituzu. Oinarrizko eredu bera erabiltzen dugu ns-3-n.

4.1.2 Aplikazioa

Orokorrean, informatika-softwarea bi klase handitan banatzen da. Sistemaren softwareak hainbat baliabide informatiko antolatzen ditu, hala nola memoria, prozesadorearen zikloak, diskoa, sarea, etab. konputazio-eredu batzuen arabera. Sistemaren softwareak normalean ez ditu baliabide hauek erabiltzen erabiltzaileari zuzenean mesede egiten dioten zereginak egiteko. Erabiltzaile batek normalean aplikazio bat exekutatzen du helburu zehatz bat lortzeko, sistemaren softwareak kontrolatutako baliabideak lortu eta erabiltzen dituena.

Askotan sistema eta aplikazio softwarearen arteko bereizketa-lerroa sistema eragilearen tranpetan gertatzen diren pribilegio-mailako aldaketetan marrazten da. ns-3-k ez du sistema eragilearen benetako kontzepturik eta, beraz, ez du pribilegio-mailen edo sistema-deien kontzepturik. Hala ere, badugu aplikazio bat egiteko ideia bat. "Mundu errealeko" software-aplikazioetan ordenagailuetan exekutatzen dira zereginak egiteko, ns-3 aplikazioak ns-3 nodoetan exekutatzen dira simulatutako munduan simulazioak kontrolatzeko.

ns-3-n, modelatzeko jardueraren bat sortzen duen erabiltzailearen programa baten oinarrizko abstrakzioa aplikazio bat da. Abstrakzio hau C++-n Aplikazio klaseak adierazten du. Aplikazio klaseak simulazioetan gure erabiltzaile-mailako aplikazioen ikuspegiak manipulatzeko metodoak eskaintzen ditu. Garatzaileek Aplikazio klasea objektuetara zuzendutako programazio zentzuan espezializatzea espero da, aplikazio berriak sortzeko. Tutorial honetan, deitutako Aplikazio klaseko espezializazioak erabiliko ditugu UdpEchoClientApplication ΠΈ UdpEchoServerApplication. Espero zenezakeen bezala, aplikazio hauek sare-paketeak sortzeko eta oihartzuna emateko erabiltzen diren bezero/zerbitzari aplikazio multzo bat osatzen dute.

4.1.3 Kanala

Mundu errealean, ordenagailu bat sare batera konekta dezakezu. Sarritan sare horietan datuak transmititzen diren euskarriei kanal deitzen zaie. Ethernet kable bat hormako entxufe batera konektatzen duzunean, zure ordenagailua Ethernet esteka batera konektatzen ari zara. Simulatutako ns-3 munduan, nodo bat komunikazio kanala adierazten duen objektu bati konektatzen da. Hemen, komunikazio azpisarearen oinarrizko abstrakzioari kanal deitzen zaio eta C++-n Channel klaseak adierazten du.

Class ChannelChannel Azpisareko objektuen elkarrekintza kudeatzeko eta haiekin nodoak konektatzeko metodoak eskaintzen ditu. Kanalak garatzaileek objektuetara bideratutako programazio zentzuan ere espezializatu ditzakete. Kanalen espezializazioak hari bat bezain sinplea den zerbait modelatu dezake. Kanal dedikatu batek gauza konplexuak ere modelatu ditzake Ethernet switch handi bat edo oztopoz betetako hiru dimentsioko espazio bat, hari gabeko sareen kasuan.

Kanalaren bertsio espezializatuak erabiliko ditugu izeneko tutorial honetan CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel ΠΈ WifiChannelWifiChannel. CsmaChannel, adibidez, eramailearen zentzuan sarbide anitzeko komunikazio-ingurune bat ezartzen duen komunikazio-azpisare baten bertsioa modelatzen du. Horrek Ethernet antzeko funtzionaltasuna ematen digu.

4.1.4 Gailu garbia

Garai batean ordenagailu bat sare batera konektatu nahi bazenuen, sareko kable zehatz bat eta ordenagailuan instalatu behar zen txartel periferiko bat (PC terminologian) izeneko hardware gailu bat erosi behar zen. Txartel periferiko batek sareko funtzio batzuk ezartzen bazituen, sareko interfaze-txartelak edo sare-txartelak deitzen ziren. Gaur egun, ordenagailu gehienek sareko interfazearen hardware integratua dute eta erabiltzaileek ez dituzte gailu bereizi gisa ikusten.

Sare-txartel batek ez du funtzionatuko bere hardwarea kontrolatzen duen software-kontrolatzailerik gabe. Unix-en (edo Linuxen), ekipo periferiko bat gailu gisa sailkatzen da. Gailuak gailu kontrolatzaileen bidez kudeatzen dira, eta sareko gailuak (NICs) sareko gailu kontrolatzaileen bidez kudeatzen dira (sareko gailuen kontrolatzaileak) eta sareko gailu deitzen zaie kolektiboki (sareko gailuak). Unix eta Linux-en, sareko gailuei erreferentzia egiten diezu, esaterako, izenekin eth0.

ns-3-n, sareko gailuen abstrakzioak software kontrolatzailea eta modelatzen ari den hardwarea estaltzen ditu. Simulazioan, sareko gailu bat nodo batean "instalatzen" da, kanalen bidez beste nodo batzuekin komunikatzeko. Benetako ordenagailu bat bezala, nodo bat hainbat kanaletara konekta daiteke hainbat gailuren bidez NetDevices.

Gailu baten sarearen abstrakzioa C++-n adierazten du klaseak NetDevice. Klasea NetDevice Node eta Channel objektuetarako konexioak kudeatzeko metodoak eskaintzen ditu; eta garatzaileek objektuetara zuzendutako programazioaren zentzuan espezializatu daitezke. Tutorial honetan NetDevice izeneko hainbat bertsio espezializatu erabiliko ditugu CsmaNetDevice, PointToPointNetDevice ΠΈ WifiNetDevice. Ethernet sare egokitzaile bat sare batekin lan egiteko diseinatuta dagoen bezala Ethernet, CsmaNetDevice lan egiteko diseinatuta CsmaChannel, PointToPointNetDevice lan egiteko diseinatuta PointToPointChannelEta WifiNetDevice - Lan egiteko diseinatuta WifiChannel.

4.1.5 Laguntzaile topologikoak

Benetako sare batean, sare-txartelak gehituta (edo barneratuta) dituzten ostalari ordenagailuak aurkituko dituzu. ns-3n esango genuke NetDevices erantsita dituzten nodoak ikusiko dituzula. Sare simulatu handi batean, objektu askoren arteko konexioak antolatu beharko dituzu Nodoa, NetDevice ΠΈ Channel.

NetDevices nodoetara, NetDevices kanaletara konektatu zenetik, IP helbideak esleitu eta abar. ns-3n ohiko zeregina da, hau ahalik eta errazena egiteko topologia laguntzaileak deiturikoak eskaintzen ditugu. Adibidez, NetDevice bat sortzeko, ns-3 kernel-eragiketa asko egin behar dituzu, MAC helbide bat gehitu, sare-gailua Node-n instalatu, nodoaren protokolo-pila konfiguratu eta, ondoren, NetDevice kanalera konektatu. Are gehiago lan egin beharko da hainbat gailu puntu anitzeko esteketara konektatzeko eta gero sare indibidualak Internetworks sare batera konektatzeko. Eragiketa asko horiek erabilerraza den eredu batean konbinatzen dituzten topologia laguntzaile-objektuak eskaintzen ditugu zure erosotasunerako.

4.2 Lehen ns-3 gidoia

Goian iradokitako moduan instalatu baduzu sistema, ns-3 bertsioa zure etxeko direktorioko repos izeneko direktorio batean izango duzu. Joan direktoriora askatu

Ez baduzu horrelako direktoriorik, esan nahi du ez duzula irteerako direktorioa zehaztu ns-3 bertsioa eraikitzerakoan, honela eraiki:
$ ./waf konfiguratu β€”build-profile=oharra β€”out=eraiki/askatu,
$ ./waf eraikitzea

han direktorio-egitura bat ikusi beharko zenuke ondorengoaren antzekoa:

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.pyc

Joan direktoriora adibideak/tutoriala. Bertan dagoen fitxategi bat ikusi beharko zenuke izeneko lehenengo.cc. Bi nodoen artean puntuz puntuko konexio sinple bat sortuko duen script-a da eta nodoen artean pakete bat transmitituko du. Ikus dezagun lerroz lerro script hau; horretarako, ireki first.cc zure gogoko editorean.

4.2.1 Boilerplate kodea
Fitxategiko lehen lerroa editore moduko lerroa da emacs. Gure iturburu-kodean erabiltzen ditugun formatu-konbentzioak (kode-estiloa) kontatzen dizkio emacs-i.

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */

Hau beti da nahiko gai polemikoa, beraz, errekorra zuzen jarri behar dugu berehala kentzeko. ns-3 proiektuak, proiektu handi gehienek bezala, kodetze-estilo bat hartu du, ekarpenak egiten dituen kode guztiak bete behar dituena. Zure kodea proiektuari lagundu nahi badiozu, azkenean ns-3 kodeketa estandarrarekin bat etorri beharko duzu, fitxategian azaltzen den moduan. doc/codingstd.txt edo proiektuaren web orrian agertzen da: https://www.nsnam.org/develop/contributing-code/coding-style/.

Gomendatzen dugu ns-3 kodearen itxurara ohitzea eta estandar hau aplikatzea gure kodearekin lan egiten duzun bakoitzean. Garapen talde osoak eta laguntzaileek hau adostu zuten marmar batzuen ostean. Goiko emacs moduaren lerroak erraz formateatzea errazten du emacs editorea erabiltzen ari bazara.

ns-3 simulagailua erabiltzeko lizentzia du GNU General Public License. Ns-3 banaketa-fitxategi bakoitzean GNU legezko goiburu egokia ikusiko duzu. Sarritan, ns-3 proiektuan parte hartzen duten erakundeetako baten copyright-oharra ikusiko duzu GPL testuaren eta egilearen gainean, behean agertzen dena.

/* 
* 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 Pluginak

Kodea bera barne-adierazpen sorta batekin hasten da (besteak beste,).

#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"

Gure goi-mailako scripting-eko erabiltzaileei sisteman dagoen goiburuko fitxategi kopuru handiari aurre egiten laguntzeko, haien erabileraren arabera taldekatzen ditugu modulu handietan. Modulu jakin batean erabilitako goiburuko fitxategi guztiak modu errekurtsiboan kargatuko dituen goiburuko fitxategi bakarra eskaintzen dugu. Behar duzun goiburua zehatz-mehatz bilatu beharrean eta menpekotasun-zerrenda zuzena lortu beharrean, fitxategi-multzo bat deskargatzeko aukera ematen dizugu xehetasun handiz. Ez da ikuspegi eraginkorrena, baina, zalantzarik gabe, asko errazten du gidoiak idaztea.

ns-3 barne fitxategietako bakoitza izena duen direktorio batean kokatzen da Ns3 (eraiki azpidirektorioa) fitxategi-izenen gatazkak saihesteko eraikitze-prozesuan. Fitxategia ns3/core-module.h ns-3 moduluari dagokio, direktorioan aurkituko duzuna src/core instalatu duzun bertsioan. Direktorio honen zerrendan goiburuko fitxategi ugari aurkituko dituzu. Muntaia egiten duzunean, Waf goiburuko fitxategi publikoak ns3 direktorioan jartzen ditu azpidirektorio batean eraiki/araztea

Ez baduzu horrelako direktoriorik, esan nahi du ez duzula irteerako direktorioa zehaztu ns-3 bertsioa eraikitzerakoan, honela eraiki:
$ ./waf konfiguratu --build-profile=araztea --out=eraiki/araztea
$ ./waf eraikitzea
edo
$ ./waf configure --build-profile=optimizatu --out=eraiki/optimizatu
$ ./waf eraikitzea

edo eraiki/optimizatu, zure konfigurazioaren arabera. Waf ere automatikoki sortuko du moduluaren barne fitxategi bat goiburuko fitxategi publiko guztiak kargatzeko. Jakina, gida hau erlijioz jarraitzen ari zarenez, dagoeneko egin duzu

$ ./waf -d debug --enable-examples --enable-tests configure

proiektua konfiguratzeko adibideak eta probak barne hartzen dituzten arazketa-eraikuntzak exekutatzeko. Zuk ere egin zenuen

$ ./waf

proiektua muntatzeko. Beraz, orain direktorioa begiratu duzunean ../../build/debug/ns3, orduan bertan aurkituko dituzu, besteak beste, goian agertzen diren lau moduluen goiburuko fitxategiak. Fitxategi horien edukia begiratu eta dagozkien moduluek erabiltzen dituzten fitxategi publiko guztiak biltzen dituztela aurki dezakezu.

4.2.3 ns3 izen-espazioa

Hurrengo lerroa gidoian lehenengo.cc izen-espazioen adierazpena da.

using namespace ns3;

ns-3 proiektua ns3 izeneko C++ izen-espazio batean inplementatzen da. Honek ns-3-rekin lotutako deklarazio guztiak izen-espazio globaletik kanpoko esparru batean biltzen ditu, eta horrek beste kode batzuekin integratzen lagunduko duela espero dugu. C++ operadorea erabiliz ns-3 izen-espazioa uneko eskualde deklaratiboan (globalean) sartzen da. Hau deklarazio honen ondoren ez duzula ns3::scope baimen-operadorerik idatzi beharko zure ns-3 kode guztiaren aurretik esateko modu dotorea da hura erabiltzeko. Izen-espazioak ezagutzen ez badituzu, ikusi ia edozein C++ testu-liburutara eta konparatu ns3 izen-espazioa std izen-espazioa eta adierazpena erabiliz. using namespace std; irteerako operadorearekin lan egiteko adibideetan cΓ΄ut eta errekak.

4.2.4 Erregistratzea

Gidoiaren hurrengo lerroa hau da:

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

Adierazpen hau gure dokumentazio sistema eztabaidatzeko leku eroso gisa erabiliko dugu Doxygen. ns-3 proiektuaren webgunera begiratzen baduzu, Dokumentazio esteka bat aurkituko duzu nabigazio-barran. Esteka honetan klik egiten baduzu, gure dokumentazio orrira eramango zara. "Azken bertsioa" esteka bat dago, ns-3-ren azken bertsio egonkorraren dokumentaziora eramango zaituena. "API Dokumentazioa" esteka hautatzen baduzu, ns-3 APIaren dokumentazio orrira eramango zaitu.

Orriaren ezkerraldean dokumentazioaren egituraren irudikapen grafikoa aurkituko duzu. Hasteko leku ona ns-3 nabigazio-zuhaitzeko Moduluak ns-3 "liburua" da. Agertzen baduzu Moduluak, ns-3 moduluen dokumentazioaren zerrenda ikusiko duzu. Goian aipatu bezala, hemen modulu kontzeptua goiko moduluan sartutako fitxategiekin zuzenean lotuta dago. ns-3 erregistro-azpisistema atalean eztabaidatzen da Erregistro modulua erabiliz, beraz, geroago itzuliko gara tutorial honetan, baina goiko adierazpenari buruz ikas dezakezu moduluari begiratuta Coreeta gero liburua irekitzen Arazketa tresnaketa gero orria hautatuz Logging. Egin klik Logging.

Orain dokumentazioa berrikusi beharko zenuke Doxygen modulurako Logging. Orriaren goialdean dagoen makroen zerrendan, NS_LOG_COMPONENT_DEFINE sarrera bat ikusiko duzu. Estekan klik egin aurretik, ziurtatu erregistratzeko moduluaren "Deskribapen Xehatua" begiratu duzula orokorrean nola funtzionatzen duen ulertzeko. Horretarako, behera korritu edo grafikoaren azpian "Gehiago..." hautatu dezakezu.

Gertatzen ari denaren ideia orokor bat duzunean, jarraitu eta begiratu NS_LOG_COMPONENT_DEFINE zehatzaren dokumentazioa. Ez dut hemen dokumentazioa bikoiztuko, baina laburbilduz, lerro honek erregistro-osagai bat deklaratzen du. FirstScriptExample, izen bati erreferentzia eginez mezuen kontsolaren erregistroa gaitzeko edo desgaitzeko aukera ematen duena.

4.2.5 Funtzio nagusia

Gidoiaren hurrengo lerroetan ikusiko duzu,

int 
main (int argc, char *argv[])
{ 

Hau zure programaren (script) funtzio nagusiaren adierazpena besterik ez da. C++ edozein programarekin bezala, funtzio nagusi bat definitu behar duzu, hau lehenik exekutatzen da. Hemen ez dago ezer berezirik. Zure ns-3 script C++ programa bat besterik ez da. Hurrengo lerroak denboraren bereizmena 1 nanosegundoan ezartzen du, hau da, lehenetsia:

Time::SetResolution (Time::NS);

Denbora-bereizmena edo, besterik gabe, bereizmena, erabil daitekeen denbora-baliorik txikiena da (bi denboraren artean irudika daitekeen diferentziarik txikiena). Bereizmena behin zehatz-mehatz alda dezakezu. Malgutasun hori ematen duen mekanismoak memoria kontsumitzen du, beraz, ebazpena esplizituki ezarrita, memoria askatzen dugu, eguneratze gehiago saihestuz. (Ebazpena esplizituki ezartzen ez baduzu, nanosegundo bateko lehenetsia izango da eta memoria askatuko da simulazioa hasten denean.)

Hurrengo bi script-lerroak aplikazioetan integratuta dauden bi erregistro-osagai gaitzeko erabiltzen dira EchoClient ΠΈ EchoServer:

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

Logging osagaiaren dokumentazioa irakurtzen baduzu, ikusiko duzu osagai bakoitzean gaitu ditzakezun erregistro/granularitate maila batzuk daudela. Bi kode lerro hauek INFO mailan arazketa-erregistratzea ahalbidetzen dute echo bezero eta zerbitzarientzat. Maila honetan, aplikazioak mezuak inprimatuko ditu simulazioan paketeak bidali eta jasotzen dituen heinean.

Orain topologia sortzea eta simulazioa exekutatzeko negozioari ekingo diogu. Topologia laguntzaile-objektuak erabiltzen ditugu lan hau ahalik eta errazen egiteko.

4.2.6 Topologia laguntzaileak erabiltzea

Gure gidoiaren hurrengo bi kode-lerroek simulazioan ordenagailuak irudikatuko dituzten Node ns-3 objektuak sortuko dituzte.

NodeContainer nodes;
nodes.Create (2);

Jarraitu aurretik, aurki dezagun klaseko dokumentazioa NodeContainer. Klase jakin bateko dokumentaziora iristeko beste modu bat fitxaren bidez da Eskolak orrialdeetan Doxygen. Dagoeneko Doxygen irekita baduzu, joan orriaren goialdera eta hautatu Klaseak fitxa. Fitxa multzo berri bat ikusi beharko zenuke, eta horietako bat klaseen zerrenda da. Fitxa honen azpian ns-3 klase guztien zerrenda ikusiko duzu. Joan behera ns3::NodeContainer. Klase bat aurkitzen duzunean, hautatu klasearen dokumentaziora joateko.

Gogoratzen dugunez, gure abstrakzio gakoetako bat nodoa da. Protokolo-pilak, aplikazioak eta txartel periferikoak bezalako gauzak gehituko dizkiogun ordenagailua adierazten du. Topologiako laguntzailea NodeContainer edozein objektu sortzeko, kudeatzeko eta sartzeko modu erosoa eskaintzen du Nodoa, simulazioa exekutatzeko sortzen duguna. Goiko lehen lerroak besterik gabe adierazten du NodeContainer, nodoak deitzen ditugunak. Bigarren lerroak Sortu metodoa deitzen du nodoen objektuan eta edukiontziari bi nodo sortzeko eskatzen dio. atalean azaltzen den bezala Doxygen, edukiontziak ns-3 sistemari bi objektu sortzeko eskatzen dio Nodoa eta objektu horien erakusleak barnean gordetzen ditu.

Script-ean sortutako nodoek ez dute ezer egiten oraindik. Topologia eraikitzeko hurrengo urratsa gure nodoak sarera konektatzea da. Onartzen dugun sare formarik errazena bi nodoen arteko puntuz puntuko konexioa da. Orain halako konexio bat sortuko dugu.

PointToPointHelper

Puntutik puntuko konexio bat sortzen dugu eredu ezagun bat erabiliz, topologia laguntzaile objektu bat erabiliz konexiorako behar den behe-mailako lana egiteko. Gogoratu gure bi abstrakzio gakoak NetDevice ΠΈ Channel. Mundu errealean, termino hauek txartel periferikoei eta sareko kableei dagozkie gutxi gorabehera. Normalean, bi gauza hauek elkarren artean estu lotuta daude, eta inork ezin du partekatzeaz fidatu, adibidez, gailuak. Ethernet haririk gabeko kanal baten bidez. Gure topologia laguntzaileek harreman estu hau jarraitzen dute eta, beraz, objektu bakarra erabiliko duzu eszenatoki honetan PointToPointHelper ns-3 objektuak konfiguratzeko eta konektatzeko PointToPointNetDevice ΠΈ PointToPointChannel. Gidoiaren hurrengo hiru lerroak:

PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); 
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

Lehen lerroa,

PointToPointHelper pointToPoint;

pilako objektu baten instantzia bat sortzen du PointToPointHelper. Goi-mailako ikuspuntutik hurrengo lerroa,

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

esaten dio objektuari PointToPointHelper erabili "5 Mbit/s" balioa (bost megabit segundoko) gisa "Datu-tasa'.

Ikuspegi zehatzago batetik, "DataRate" katea atributu deitzen diogun horri dagokio PointToPointNetDevice. Begiratuz gero Doxygen klaserako ns3::PointToPointNetDevice eta metodoaren dokumentazioan GetTypeId gailurako definitutako atributuen zerrenda aurkituko duzu. Horien artean atributua izango da "Datu-tasa" Erabiltzaileak ikus daitezkeen ns-3 objektu gehienek atributu-zerrenda antzekoak dituzte. Mekanismo hau birkonpilatu gabe simulazioa erraz konfiguratzeko erabiltzen dugu, hurrengo atalean ikusiko duzuen bezala.

Antzekoak "Datu-tasa" PointToPointNetDevice-n, PointToPointChannel-ekin lotutako "Atzerapena" atributua aurkituko duzu. Azken lerroa

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

He mintzo PointToPointHelper erabili "2 ms" balioa (bi milisegundo) ondoren sortzen duen puntuz puntuko loturaren hedapen-atzerapenaren balio gisa.

NetDeviceContainer

Momentuz gidoian daukagu NodeContainer, bi nodo dituena. Daukagu PointToPointHelper, objektuak sortzeko prestatuta dagoena PointToPointNetDevices eta konektatzea PointToPointChannel objektu bat erabiliz. NodeContainer topologia laguntzailea objektua nodoak sortzeko erabili genuen bezala, galdetuko dugu PointToPointHelper gure gailuen sorrera, konfigurazio eta instalazioarekin lotutako lanak egin dizkigute. Sortutako objektu guztien zerrenda behar dugu NetDevice, beraz, erabiltzen dugu NetDeviceContainer guk erabili genuen moduan gordetzeko NodeContainer sortu ditugun nodoak gordetzeko. Hurrengo bi kode lerroak,

NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);

gailuaren eta kanalaren konfigurazio osoa. Lehen lerroak goian aipatutako gailuaren edukiontzia deklaratzen du, eta bigarrenak lan nagusia egiten du. Metodoa Instalatu objektua PointToPointHelper onartzen NodeContainer parametro gisa. Barruan NetDeviceContainer kokatutako nodo bakoitzeko NodeContainer sortzen da (puntutik puntuko komunikaziorako bi izan behar dira zehazki) PointToPointNetDevice gailuaren edukiontzian sortu eta gordetzen da. PointToPointChannel sortzen da eta bi erantsi zaizkio PointToPointNetDevices. Objektuak sortu ondoren, bertan gordetzen diren atributuak PointToPointHelper, sortutako objektuetan dagozkien atributuak hasieratzeko erabiltzen dira.

Dei bat egin ondoren pointToPoint.Install (nodoak) bi nodo izango ditugu, bakoitza puntuz puntu sareko gailu bat instalatuta eta haien artean puntuz puntuko lotura batekin. Bi gailuak datuak segundoko bost megabit-eko abiaduran transmititzeko konfiguratuko dira bi milisegundoko transmisio-atzerapenarekin kanalean zehar.

InternetStackHelper

Orain nodoak eta gailuak konfiguratuta ditugu, baina gure nodoek ez dute protokolo pilarik instalatuta. Hurrengo bi kode lerroak arduratuko dira horretaz.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper - Interneteko pilen topologia-laguntzailea da, PointToPointHelper-en antzeko sareko gailuetarako. Metodoa Instalatu NodeContainer hartzen du parametro gisa. Exekutatuta, Interneteko pila (TCP, UDP, IP, etab.) edukiontzi-nodo bakoitzean instalatuko du.

IPv4AddressHelper

Ondoren, gure gailuak IP helbideekin lotu behar ditugu. IP helbidearen esleipena kudeatzeko topologia-laguntzaile bat eskaintzen dugu. Erabiltzaileak ikusgai dagoen API bakarra oinarrizko IP helbidea eta sare-maskara ezartzea da benetako helbidearen banaketa egiterakoan erabiltzeko (laguntzailearen barruan maila baxuago batean egiten da). Hurrengo bi kode lerroak gure adibideko scriptean lehenengo.cc,

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");

deklaratu helbide laguntzailearen objektua eta esan 10.1.1.0 sareko IP helbideak esleitzen hasi beharko lukeela, zehazteko 255.255.255.0 bitmaskara erabiliz. Lehenespenez, esleitutako helbideak batean hasiko dira eta monotonikoki handitzen joango dira, beraz, oinarri honetatik esleitutako lehen helbidea 10.1.1.1 izango da, gero 10.1.1.2, etab. Egia esan, maila baxuan, ns-3 sistemak esleitutako IP helbide guztiak gogoratzen ditu eta errore larri bat sortzen du ustekabean helbide bera bi aldiz sortzen den egoera bat sortzen baduzu (bide batez, errore hau zaila da arazketa).

Hurrengo kode lerroa,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

benetako helbidearen esleipena egiten du. ns-3-n IP helbide baten eta objektua erabiliz gailu baten arteko konexioa ezartzen dugu IPv4 Interfazea. Batzuetan laguntzaileak sorturiko sareko gailuen zerrenda behar dugun bezala, beste batzuetan objektuen zerrenda bat behar dugu. IPv4 Interfazea. IPv4InterfaceContainer funtzionalitate hori eskaintzen du.

Puntutik puntuko sarea eraiki genuen, pilak instalatuta eta IP helbideak esleituta. Orain nodo bakoitzean aplikazioak behar ditugu trafikoa sortzeko.

4.2.7 Aplikazioa erabiltzea

ns-3 sistemaren beste abstrakzio nagusietako bat da Aplikazio (aplikazio). Eszenatoki honetan oinarrizko klaseko bi espezializazio erabiltzen ari gara Aplikazio ns-3 izenekoa UdpEchoServerApplication ΠΈ UdpEchoClientApplication. Aurreko kasuetan bezala, oinarrizko objektuak konfiguratzeko eta kudeatzeko objektu laguntzaileak erabiltzen ditugu. Hemen erabiltzen dugu UdpEchoServerHelper ΠΈ UdpEchoClientHelper objektuak gure bizitza errazteko.

UdpEchoServerHelper

Gure first.cc adibideko script-eko kode-lerro hauek UDP oihartzun zerbitzariaren aplikazio bat konfiguratzeko erabiltzen dira lehenago sortu ditugun nodoetako batean.

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

Goiko zatiko lehen kode-lerroa sortzen da UdpEchoServerHelper. Ohi bezala, hau ez da aplikazio bat bera, benetako aplikazioak sortzen laguntzen digun objektu bat da. Gure konbentzioetako bat objektu laguntzailearen eraikitzaileari beharrezko atributuak pasatzea da. Kasu honetan, laguntzaileak ezin du ezer baliagarririk egin zerbitzariak paketeak entzungo dituen ataka-zenbakia ematen ez badio, zenbaki hori bezeroak ere ezagutu behar du. Kasu honetan, ataka-zenbakia eraikitzaile laguntzaileari pasatzen diogu. Eraikitzaileak, berriz, besterik gabe egiten du EzarriAtributua pasatako balioarekin. Geroago, nahi izanez gero, SetAttribute erabil dezakezu Portuaren atributuari beste balio bat ezartzeko.

Beste hainbat objektu laguntzaile bezala, objektua UdpEchoServerHelper metodo bat dauka Instalatu. Metodo hau eraginkortasunez exekutatzeak oinarrizko oihartzun zerbitzariaren aplikazio bat sortzen du eta ostalariarekin lotzen du. Interesgarria da metodoa Instalatu onartzen NodeContainer parametro gisa besteak bezala Instalatu ikusi ditugun metodoak.

Hemen lan egiten duen C++ bihurketa inplizituak metodoaren emaitza hartzen du nodoa.Lortu(1) (erakusle adimendun bat nodo objektura itzultzen duena - Ptr ) eta objektu anonimorako eraikitzailean erabiltzen du NodeContainergero metodora pasatzen dena Instalatu. Ezin baduzu C++ kodean zehaztu zein metodo sinadura konpilatu eta exekutatu den, begiratu bihurketa inplizituen artean.

Orain hori ikusten dugu echoServer.Instalatu aplikazioa instalatzear UdpEchoServerApplication urtean aurkitu NodeContainergure nodoak kudeatzeko erabiltzen duguna, 1. indizea duen nodoa. Metodoa Instalatu Erakusleak dituen edukiontzi bat itzuliko du aplikazio guztietarako (kasu honetan bat, anonimo bat pasatu dugulako NodeContainer, nodo bat duena) laguntzaileak sortua.

Aplikazioek trafikoa sortzen noiz hasiko den zehaztu behar dute "hasi" eta baliteke gelditzeko ordua ere zehaztu behar izatea "gelditu". Bi aukerak eskaintzen ditugu. Denbora hauek metodoak erabiliz ezartzen dira ApplicationContainer start ΠΈ Gelditu. Metodo hauek motako parametroak onartzen dituzte Ordua. Kasu honetan C++ bihurketen sekuentzia esplizitua erabiltzen dugu C++ hartzeko bikoiztu 1.0 eta bihurtu segundotan bihurtzeko Seconds objektua erabiltzen duen tns-3 Time objektu bat. Gogoratu bihurketa-arauak ereduaren egileak kontrola ditzakeela eta C++-k bere arau propioak dituela, beraz, ezin dituzula beti kontatu parametroak espero zenuen moduan bihurtzen ari direla. Bi lerro

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));

simulazioa hasi eta segundo batean oihartzun zerbitzariaren aplikazioa abiaraziko da (automatikoki piztuko da) eta simulazioaren hamar segundoren buruan geldituko da (desaktibatu). Hamar segundotan exekutatuko den simulazio-gertaera (aplikazioa gelditzeko gertaera) deklaratu genuenez, gutxienez hamar segundoko sarearen funtzionamendua simulatuko da.

UdpEchoClientHelper

Bezeroaren aplikazioa galdu zerbitzariaren ia antzeko moduan konfiguratuta. Oinarrizko objektu bat dago UdpEchoClientApplication, kontrolatuta dagoena
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));;

Hala ere, echo bezeroarentzat bost atributu ezberdin ezarri behar ditugu. Lehenengo bi atributuak sortzean ezartzen dira UdpEchoClientHelper. Atributuak ezartzeko erabiltzen diren (laguntzailearen barruan) parametroak pasatzen ditugu "Urrutiko helbidea" ΠΈ "Urruneko Portua" eraikitzaile laguntzaileari beharrezko parametroak pasatzeko gure akordioaren arabera.

Gogora dezagun erabili genuela IPv4InterfaceContainer gure gailuei esleitu dizkiegun IP helbideak jarraitzeko. Interfazeen edukiontziko interfaze nulua nodoen edukiontziko nodo nuluaren IP helbideari dagokio. Interfazeen edukiontziko lehen interfazea nodoen edukiontziko lehen nodoaren IP helbideari dagokio. Beraz, kodearen lehen lerroan (goian), laguntzaile bat sortzen dugu eta bezeroaren urruneko helbidea zerbitzaria dagoen ostalariari esleitutako IP helbidea izango dela esaten diogu. Gainera, paketeak bederatzi portura bidaltzeko antolatu behar dugula esaten dugu.

"MaxPackets" atributuak simulazioan zehar bidal ditzakegun gehienezko pakete-kopurua esaten dio bezeroari. "Tartea" atributuak paketeen artean zenbat denbora itxaron behar duen esaten dio bezeroari, eta "PacketSize" atributuak paketearen karga zenbaterainokoa izan behar duen esaten dio bezeroari. Atributu-konbinazio honekin bezeroari 1024 byteko pakete bakarra bidaltzeko esaten diogu.

Echo zerbitzariarekin bezala, echo bezeroaren atributuak ezartzen ditugu start ΠΈ Gelditu, baina hemen zerbitzaria piztu eta segundo batera hasten dugu bezeroa (simulazioa hasi eta bi segundora).

4.2.8 Simulagailua

Une honetan simulazioa exekutatu behar dugu. Hau funtzio globala erabiliz egiten da Simulatzailea::Exekutatu.

Simulator::Run ();

Metodoei lehenago deitzen diegunean,

serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
... 
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));

simulagailuan 1,0 segundotan, 2,0 segundotan eta bi ekitaldi 10,0 segundotan programatu ditugu. Deialdiaren ostean Simulatzailea::Exekutatu, sistema programatutako gertaeren zerrenda ikusten eta exekutatzen hasiko da. Lehenik eta behin, gertaera bat piztuko du 1,0 segundo igaro ondoren, eta horrek oihartzunaren zerbitzariaren aplikazioa abiaraziko du (gertaera honek beste hainbat gertaera programa ditzake). Ondoren, t=2,0 segundotan programatutako gertaera bat piztuko du eta horrek echo bezeroaren aplikazioa abiaraziko du. Berriz ere, gertaera honek beste hainbat ekitaldi antolatu ditu. Echo bezeroaren hasierako gertaeraren inplementazioak simulazioaren datu-transferentzia-fasea hasiko du zerbitzariari pakete bat bidaliz.

Pakete bat zerbitzarira bidaltzeak gertakari kate bat abiaraziko du, agertoki atzean automatikoki programatuko dena eta scriptean ezarri ditugun denbora-parametroen arabera oihartzun-pakete bat bidaltzeko mekanika ezarriko duena.

Ondorioz, pakete bakarra bidaltzen ari garenez (gogoratu, atributua MaxPackets bat ezarri zen), bezeroaren ping bakarrak abiarazitako gertaeren katea amaituko da eta simulazioa egonean moduan sartuko da. Hori gertatzen denean, programatutako gainerako ekitaldiak ekitaldiak izango dira Gelditu zerbitzariarentzat eta bezeroarentzat. Gertaera hauek gauzatzen direnean, ez da gertaerarik geratuko prozesatzeko eta Simulatzailea::Exekutatu kontrola itzuliko du. Simulazioa osatu da.

Zure burua garbitzea besterik ez da geratzen. Hau funtzio globalari deituz egiten da Simulatzailea::Suntsitu. Funtzio laguntzaileak (edo maila baxuko ns-3 kodea) deitu zirelako, sortu ziren objektu guztiak suntsitzeko kakoak txertatzen ziren simulagailuan antolatuta. Ez zenuen objektu hauetako bat zuk zeuk jarraitu beharrik; egin behar zenuen bakarra deitzea zen Simulatzailea::Suntsitu eta atera. ns-3 sistemak lan gogor hau egingo dizu. Gure lehen ns-3 scriptaren gainerako lerroek, first.cc, hori egiten dute:

Simulator::Destroy ();
return 0;
}

Noiz geldituko da simulagailua?

ns-3 gertaera diskretuen (DE) simulagailu bat da. Horrelako simulagailu batean, gertaera bakoitza bere exekuzio-denborarekin lotzen da, eta simulazioak aurrera egiten duen heinean gertaerak prozesatzen jarraitzen du. Gertaetek etorkizuneko gertaerak programatzea eragin dezakete (adibidez, tenporizadore batek bere burua programatu dezake hurrengo tartean zenbatzen amaitzeko).

Hasierako gertaerak normalean entitateak abiarazten ditu, adibidez IPv6-k sareko zerbitzuak, auzokideen eskaerak, etab. Aplikazioak paketeak bidaltzeko lehen ekitaldia programatzen du, eta abar. Gertaera bat prozesatzen denean, gertaera zero, bat edo gehiago sor ditzake. Simulazioak aurrera egin ahala, gertaerak gertatzen dira, amaitu edo berriak sortuz. Simulazioa automatikoki geldituko da gertaera-ilara hutsik badago edo gertaera berezi bat hautematen bada Gelditu. Gertaera Gelditu funtzioak sortutakoa Simulatzailea::Gelditu (gelditu denbora).

Badago kasu tipiko bat non Simulator::Stop guztiz beharrezkoa den simulazioa geldiarazteko: gertakari autosostengarriak daudenean. Ekitaldi autonomoak (edo errepikatuak) beti birprogramatzen diren ekitaldiak dira. Ondorioz, ekitaldi-ilara hutsik mantentzen dute beti. Gertaera errepikakorrak dituzten protokolo eta modulu asko daude, adibidez:

β€’ FlowMonitor - galdutako paketeen aldizkako egiaztapena;

β€’ RIPng – bideratze-taularen eguneraketen aldizkako igorpena;

β€’ etab.

Horrelakoetan Simulatzailea::Gelditu beharrezkoa da simulazioa behar bezala gelditzeko. Gainera, ns-3 emulazio moduan dagoenean, RealtimeSimulator erabiltzen da simulazio-erlojua makinaren erlojuarekin sinkronizatzeko, eta Simulatzailea::Gelditu prozesua geldiarazteko beharrezkoa.

Testu liburuko simulazio-programa askok ez dute deitzen Simulatzailea::Gelditu esplizituki, automatikoki amaitzen baitira ilaran dauden gertaerak agortzen direnean. Hala ere, programa hauek Simulator::Stop deia ere onartuko dute. Adibidez, lehenengo programaren adibideko adierazpen gehigarri honek geldialdi esplizitua programatuko luke 11 segundotan:

+ Simulator::Stop (Seconds (11.0));
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

Aurrekoak ez du programa honen portaera aldatuko, simulazio jakin hau 10 segundoren buruan amaitzen baita. Baina goiko adierazpenean gelditzeko denbora 11 segundotik segundora aldatuko bazenu, simulazioa edozein irteera pantailara iritsi baino lehen gelditzen dela nabarituko zenuke (irteera simulazio-denbora 1 segundo inguru igaro ondoren gertatzen baita).

Garrantzitsua da Simulator::Stop deitzea Simulator::Run deitu baino lehen; bestela, Simulator::Run-ek baliteke inoiz ez itzultzea programa nagusiari kontrola geldialdia exekutatzeko!

4.2.9 Zure gidoia eraikitzea

Zure script sinpleak sortzea hutsala egin dugu. Egin behar duzun guztia zure script-a scratch direktorioan jartzea da eta automatikoki eraikiko da exekutatzen baduzu Waf. Saia gaitezen. Itzuli goi mailako direktoriora eta kopiatu adibideak/tutoriala/lehen.cc katalogora urratu

$ cd ../.. 
$ cp examples/tutorial/first.cc scratch/myfirst.cc

Orain eraiki ezazu zure lehen lagin-scripta erabiliz waf:

$ ./waf

Zure lehen adibidea behar bezala sortu dela adierazten duten mezuak ikusi beharko zenuke.

Waf: Entering directory `/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: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (2.357s)

Orain adibidea exekutatu dezakezu (kontuan izan zure programa scratch direktorioan eraikitzen baduzu, orduan exekutatu behar duzula urratu):

$ ./waf --run scratch/myfirst

Irteera antzekoa ikusi beharko zenuke:

Waf: Entering directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/home/craigdo/repos/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (0.418s) Sent 1024 bytes to 10.1.1.2
Received 1024 bytes from 10.1.1.1
Received 1024 bytes from 10.1.1.2

Hemen ikus dezakezu eraikitze-sistemak fitxategia eraiki dela egiaztatzen duela eta gero exekutatzen duela. Ikusten duzu echo bezeroaren osagaien sarrerak 1024 byte-ko pakete bakarra bidali duela adierazten duela echo zerbitzariari 10.1.1.2. Zuk ere ikusten duzu erregistroaren osagaia oihartzun zerbitzarian 1024-tik 10.1.1.1 byte jaso zituela esateko. Echo zerbitzariak paketea isilik erreproduzitzen du eta echo bezeroaren erregistroan ikus dezakezu zerbitzaritik itzuli zuela paketea.

4.3 ns-3 Iturburu kodea

Orain ns-3 laguntzaile batzuk erabili dituzunean, funtzionalitate hau inplementatzen duten iturburu-kode batzuei begiratu diezaiekezu. Azken kodea gure web zerbitzarian ikus daiteke esteka honetan: https://gitlab.com/nsnam/ns-3-dev.git. Bertan gure ns-3 garapen zuhaitzaren Mercurial laburpen orria ikusiko duzu. Orriaren goialdean hainbat esteka ikusiko dituzu,

summary | shortlog | changelog | graph | tags | files

Aurrera eta hautatu fitxategien esteka. Hauxe izango da gure biltegi gehienen maila gorena:

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 | annotate

Gure adibideko scriptak direktorioa daude adibide. Adibideetan klik egiten baduzu azpidirektorioen zerrenda ikusiko duzu. Azpidirektorioko fitxategietako bat tutoretza - lehen.cc. Sakatzen baduzu lehenengo.cc ikasi berri duzun kodea ikusiko duzu.

Iturburu-kodea nagusiki direktorioan dago src. Iturburu-kodea ikus dezakezu direktorioaren izenaren gainean klik eginez edo direktorioaren izenaren eskuinean dagoen fitxategien estekan klik eginez. Src direktorioan klik egiten baduzu, src azpidirektorioen zerrenda jasoko duzu. Ondoren oinarrizko azpidirektorioan klik egiten baduzu, fitxategien zerrenda aurkituko duzu. Ikusiko duzun lehenengo fitxategia (gida hau idazteko momentuan) da abortatu.h. Estekan klik egiten baduzu abortatu.h, iturburu fitxategira bidaliko zaituzte abortatu.h, baldintza anormalak hautematen badira scriptetatik irteteko makro erabilgarriak dituena. Kapitulu honetan erabili ditugun laguntzaileen iturburu kodea direktorioa aurki daiteke src/Aplikazioak/laguntzailea. Anima zaitez direktorioen zuhaitzean arakatu zer dagoen jakiteko eta ns-3 programen estiloa ulertzeko.

Iturria: www.habr.com

Gehitu iruzkin berria