Handbuch für den ns-3 Netzwerk-Simulator. Kapitel 3

Handbuch für den ns-3 Netzwerk-Simulator. Kapitel 3
Kapitel 1,2

3 Erste Schritte
3.1 Überblick
3.2 Voraussetzungen
3.2.1 Download der ns-3 Version als Quellarchiv
3.3 Download von ns-3 über Git
3.3.1 Herunterladen von ns-3 mit Bake
3.4 Kompilierung von ns-3
3.4.1 Kompilierung mit build.py
3.4.2 Kompilierung mit Bake
3.4.3 Kompilierung mit Waf
3.5 Testen von ns-3
3.6 Ausführen eines Skripts
3.6.1 Befehlszeilenargumente
3.6.2 Debugging
3.6.3 Arbeitsverzeichnis

Kapitel 3

Erste Schritte

In diesem Kapitel wird der Leser auf die Arbeit vorbereitet, beginnend mit einem Computer, auf dem ns-3 möglicherweise noch nie installiert wurde. Es werden unterstützte Plattformen, Voraussetzungen, Methoden zur Beschaffung von ns-3, Kompilierungsweisen von ns-3 und Möglichkeiten zur Überprüfung Ihrer Kompilierung sowie zum Ausführen einfacher Programme behandelt.

3.1 Überblick

Der ns-3-Simulator ist als System von zusammenarbeitenden Softwarebibliotheken aufgebaut. Bei der Kompilierung wird der Code der Benutzerprogramme mit diesen Bibliotheken verknüpft. Für die Erstellung von Benutzerprogrammen werden die Programmiersprachen C++ oder Python verwendet.

Ns‑3 wird als Quellcode verteilt, was bedeutet, dass das Zielsystem eine Entwicklungsumgebung benötigt, um zuerst die Bibliotheken zu kompilieren und dann das benutzerdefinierte Programm zu erstellen. Grundsätzlich kann ns‑3 auch als vorgefertigte Bibliotheken für spezifische Systeme bereitgestellt werden, und in Zukunft könnten sie auf diese Weise angeboten werden. Derzeit führen jedoch viele Benutzer ihre Arbeit durch das Bearbeiten von ns‑3 selbst aus, weshalb es hilfreich ist, den Quellcode für die Kompilierung der Bibliotheken zur Verfügung zu haben. Wenn jemand bereit wäre, die Aufgabe zu übernehmen, vorgefertigte Bibliotheken und Pakete für Betriebssysteme zu erstellen, wenden Sie sich bitte an die Mailingliste. ns-developers.

Im Folgenden betrachten wir drei Methoden zum Herunterladen und Erstellen von ns-3. Die erste besteht darin, die offizielle Version von der Hauptwebsite herunterzuladen und zu bauen. Die zweite ist die Auswahl und der Aufbau von Entwicklerversionen der Basisinstallation von ns-3. Die dritte Möglichkeit ist die Verwendung zusätzlicher Bauwerkzeuge, um mehr Erweiterungen für ns-3 herunterzuladen. Wir werden jeden dieser Ansätze durchgehen, da sich die Werkzeuge etwas unterscheiden.

Erfahrene Linux-Nutzer könnten sich fragen, warum ns-3 nicht wie die meisten anderen Bibliotheken in Form eines Pakets angeboten wird, das über einen Paketmanager installiert werden kann. Obwohl es Binärpakete für verschiedene Linux-Distributionen (z. B. Debian) gibt, bearbeiten die meisten Nutzer letztendlich die Bibliotheken und müssen ns-3 selbst neu kompilieren, weshalb die Verfügbarkeit des Quellcodes praktisch ist. Aus diesem Grund werden wir uns auf die Installation aus dem Quellcode konzentrieren.

Für die meisten Anwendungen von ns-3 sind keine root Rechte erforderlich, es wird empfohlen, ein nicht privilegiertes Benutzerkonto zu verwenden.

3.2 Voraussetzungen

Das gesamte Set der verfügbaren ns-3 Bibliotheken hat eine Reihe von Abhängigkeiten zu externen Bibliotheken, aber größtenteils kann ns-3 mit Unterstützung für mehrere gängige (häufig standardmäßig installierte) Komponenten kompiliert und verwendet werden: C++ Compiler, Python, Quelltext-Editor (z. B. vim, emacs oder Eclipse) und, falls Entwicklung-Repositories verwendet werden, Versionskontrollsysteme wie Git. Die meisten Anfänger müssen sich keine Gedanken machen, wenn ihre Konfiguration einige fehlende zusätzliche ns-3 Funktionen meldet, aber für diejenigen, die eine vollständige Installation wünschen, bietet das Projekt ein Wiki, das Seiten mit vielen nützlichen Tipps und Hinweisen enthält. Eine solcher Seite ist die Seite „Installation“ mit Installationsanleitungen für verschiedene Systeme, die unter folgender Adresse verfügbar sind: https://www.nsnam.org/wiki/Installation.

Der Abschnitt „Voraussetzungen“ dieser Wiki-Seite erklärt, welche Pakete erforderlich sind, um die allgemeinen ns-3 Optionen zu unterstützen, und stellt die Befehle zur Installation in gängigen Linux- oder macOS-Versionen bereit.

Sie haben die Möglichkeit, die Wiki-Seite von ns‑3 oder die Haupt-Website zu besuchen, https://www.nsnam.org, da dort viele Informationen zu finden sind. Ab der letzten Version von ns‑3 (ns‑3.29) sind die folgenden Werkzeuge erforderlich, um ns‑3 zu starten:

Werkzeug Paket/Version

  • C++ Compiler
    clang++ oder g++ (g++ Version 4.9 oder höher)
  • Python
    Python2 Version >= 2.7.10 oder Python3 Version >= 3.4
  • Git
    jede aktuelle Version (zum Zugriff auf ns‑3 auf GitLab.com)
  • ,
    jede aktuelle Version (zum Entpacken der ns‑3 Version)
  • bunzip2
    jede aktuelle Version (zum Entpacken der ns‑3 Version)

Um die standardmäßig installierte Python-Version zu überprüfen, geben Sie ein: python -V. Um die Version von g++ zu überprüfen, geben Sie ein: g++ -v. Wenn einige Werkzeuge fehlen oder zu alt sind, konsultieren Sie bitte die Installationsanleitung auf der Wiki-Seite von ns‑3.

Ab diesem Punkt gehen wir davon aus, dass der Leser unter Linux, MacOS oder einem Linux-Emulator arbeitet und mindestens die oben genannten Werkzeuge hat.

3.2.1 Download der ns-3 Version als Quellarchiv

Das ist der Ablauf für neue Benutzer, die die neuesten Release- und Paketversionen von ns‑3 herunterladen und ausprobieren möchten. Die Releases von ns‑3 werden in Form von komprimierten Quellarchiven veröffentlicht, die manchmal als tarball. tarball — ist ein spezielles Format für ein Software-Archiv, in dem mehrere Dateien zusammengefasst sind. Das Archiv ist normalerweise komprimiert. Der Download von ns‑3 erfolgt über tarball einfach, Sie müssen nur die Version auswählen, herunterladen und entpacken.

Angenommen, Sie möchten als Benutzer ns‑3 in einem lokalen Verzeichnis mit dem Namen workspace. Sie können eine Arbeitskopie der Version erhalten, indem Sie in der Linux-Konsole Folgendes eingeben (ersetzen Sie natürlich die entsprechenden Versionsnummern)

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

Beachten Sie das oben verwendete Dienstprogramm tar, das ein Kommandozeilenwerkzeug zum Herunterladen von Objekten aus dem Internet ist. Wenn Sie es nicht installiert haben, können Sie dafür einen Browser verwenden.

Wenn Sie diesen Schritten folgen, gelangen Sie in das Verzeichnis ns-allinone-3.29, dort sollten Sie mehrere Dateien und Verzeichnisse sehen

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

Jetzt sind Sie bereit, die Basisausgabe von ns‑3 zu kompilieren und können zum Abschnitt über die Kompilierung von ns‑3 gehen.

3.3 Download von ns-3 über Git

Der Code von ns‑3 ist in Git-Repositories auf GitLab.com verfügbar unter https://gitlab.com/nsnam/. Die Gruppe nsnam vereint verschiedene Repositories, die von dem Open-Source-Projekt verwendet werden.

Der einfachste Weg, mit Git-Repositories zu beginnen, besteht darin, ein Fork zu erstellen oder das Repository zu klonen. ns‑3-allinone. Dies ist eine Sammlung von Skripten, die den Download und die Erstellung der am häufigsten verwendeten ns‑3-Subsysteme verwalten. Wenn Sie neu bei Git sind, sind Ihnen die Begriffe "Fork" und "Klonen" möglicherweise unbekannt; in diesem Fall empfehlen wir Ihnen, einfach das Repository, das sich auf GitLab.com befindet, zu klonen (eine eigene Kopie zu erstellen) wie folgt:

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

Zu diesem Zeitpunkt sieht Ihr Verzeichnis ns‑3-allinone ein wenig anders aus als das oben beschriebene Release-Archiv. Es sollte ungefähr so aussehen:

$ ls
build.py constants.py download.py README util.py

Beachten Sie das Vorhandensein des Skripts download.py, das zusätzlich ns‑3 und den zugehörigen Quellcode extrahiert. Hier haben Sie die Wahl: entweder den aktuellsten Entwicklungs-Snapshot von ns‑3 herunterzuladen:

$ python download.py

oder den ns‑3 Release bevorzugen, indem Sie die Flagge -n verwenden, um die Release-Nummer anzugeben:

$ python download.py -n ns-3.29

Nach diesem Schritt sollte sich im Verzeichnis ns‑3-allinone zusätzliche Repositories werden geladen ns‑3, bake, pybindgen und netanim.

Hinweis
Auf einer Maschine mit reinem Ubuntu 16.04 musste ich den Befehl wie folgt ändern: $ sudo python3 download.py -n ns-3.29 (Anmerkungen des Übersetzers folgen hier und darüber hinaus).

3.3.1 Herunterladen von ns-3 mit Bake

Die beiden oben genannten Methoden (Quellarchiv oder Repository ns‑3-allinone über Git) sind nützlich, um die einfachste Installation von ns‑3 mit mehreren Add-ons zu erhalten (pybindgen zur Generierung von Python-Bindungen und netanim zur Netzwerkanimation). Das dritte Repository, das standardmäßig in ns‑3-allinone bereitgestellt wird, heißt bake.

Bake — ein Werkzeug zum koordinierten Bauen von Software aus mehreren Repositories, entwickelt für das ns‑3-Projekt. Bake kann verwendet werden, um Entwicklungsversionen von ns‑3 zu erhalten sowie um Erweiterungen der Basisversion des ns‑3-Distros herunterzuladen und zu erstellen, wie die Umgebung Direct Code Execution, CradleNetwork Simulation Cradle, die Möglichkeit, neue Python-Bindungen zu erstellen, und verschiedene 'Anwendungen' von ns‑3.

Hinweis
CradleNetwork Simulation Cradle ist ein Framework, das es ermöglicht, innerhalb eines Netzwerk-Simulators reale Netzwerk-Stacks TCP/IP zu verwenden.

Wenn Sie annehmen, dass Ihre ns-3-Installation erweiterte oder zusätzliche Funktionen benötigt, können Sie diesen Installationsweg folgen.

In den neuesten Versionen von ns-3 Bake wurde in die Tar-Distribution aufgenommen. Das Release enthält eine Konfigurationsdatei, die es ermöglicht, die zum Zeitpunkt der Erstellung des Releases aktuellen Softwareversionen herunterzuladen. Das heißt, zum Beispiel die Version Bake, die mit dem ns-3.29-Release ausgeliefert wird, kann verwendet werden, um Komponenten für dieses ns-3-Release oder frühere zu erhalten, kann jedoch nicht verwendet werden, um Komponenten für spätere Releases zu extrahieren (es sei denn, die Paketbeschreibungsdatei bakeconf.xml wurde aktualisiert).

Sie können auch die neueste Version erhalten bake, indem Sie den folgenden Befehl in Ihre Linux-Konsole eingeben (vorausgesetzt, Sie haben Git installiert):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

Beim Ausführen des Git-Befehls sollten Sie etwas Ähnliches wie Folgendes sehen:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Nach Abschluss des Befehls clone Sie sollten ein Verzeichnis mit dem Namen bakeerstellen, dessen Inhalt ungefähr so aussehen sollte:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Bitte beachten Sie, dass Sie mehrere Python-Skripte, das Python-Modul mit dem Namen bake und die XML-Konfigurationsdatei hochgeladen haben. Der nächste Schritt besteht darin, diese Skripte zu verwenden, um die ns‑3-Distribution Ihrer Wahl herunterzuladen und zu erstellen. Es stehen mehrere Konfigurationsziele zur Verfügung:

  1. ns‑3.29: ein Modul, das mit dem Release übereinstimmt; es wird Komponenten ähnlich dem Release im Tarball herunterladen;

  2. ns‑3-dev: ein ähnliches Modul, aber mit Code aus dem Entwicklungstableau;

  3. ns-allinone-3.29: ein Modul, das andere zusätzliche Funktionen umfasst, wie z.B. Click-Routing und Network Simulation Cradle, Openflow für ns-3.

  4. ns‑3-allinone: ähnlich wie die Release-Version des Moduls allinone, jedoch für den Entwicklungsstand.

Hinweis
Click ist eine modulare Softwarearchitektur zur Erstellung von Routern.

Openflow ist ein Protokoll zur Verwaltung des Datenverarbeitungsprozesses, der über Netzwerke zwischen Routern und Switches übertragen wird, und implementiert die Technologie des softwarekonfigurierbaren Netzwerks.

Der aktuelle Entwicklungssnapshot (nicht veröffentlicht) von ns‑3 ist verfügbar unter:https://gitlab.com/nsnam/ns-3-dev.git.

Die Entwickler bemühen sich, diese Repositories in einem konsistenten Arbeitszustand zu halten, jedoch befinden sie sich im Entwicklungsbereich und enthalten nicht freigegebenen Code. Wenn Sie also keine neuen Funktionen nutzen möchten, wählen Sie bitte die offizielle Version.

Sie können die neueste Version des Codes finden, indem Sie die Liste der Repositories durchsuchen oder die Webseite „ns‑3 Releases“ aufrufen:https://www.nsnam.org/releases/ und auf den Link zur neuesten Version klicken. In diesem Beispiel fahren wir mit ns‑3.29 fort.

Um die benötigten Komponenten von ns‑3 zu erhalten, verwenden wir das Tool Bake. Lassen Sie uns ein paar grundlegende Worte zur Funktionsweise sagen. Bake.

Bake funktioniert, indem es die Quellcodes der Pakete in das Verzeichnis source lädt und die Bibliotheken in das Build-Verzeichnis installiert. Bake Man kann es ausführen, indem man auf die Binärdatei verweist, aber wenn Sie es nicht aus dem Verzeichnis starten möchten, in das es heruntergeladen wurde, ist es ratsam, den Pfad zu Bake zu Ihrer PATH-Umgebungsvariable hinzuzufügen, zum Beispiel wie folgt (Beispiel für die Linux-Bash-Shell). Wechseln Sie in das Verzeichnis „bake“ und setzen Sie dann die folgenden Umgebungsvariablen: bake $ export BAKE_HOME=`pwd` $ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin $ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Das platziert das Programm

bake.py bake.py in der Shell-Umgebung und ermöglicht es anderen Programmen, die von Ihnen erstellten ausführbaren Dateien und Bibliotheken zu finden bake. In einigen Anwendungsfällen bake, wie oben beschrieben, ist die Einrichtung von PATH und PYTHONPATH nicht erforderlich, jedoch in der Regel notwendig für eine vollständige Installation von ns‑3-allinone (mit zusätzlichen Paketen).

Gehen Sie in das Arbeitsverzeichnis und geben Sie in die Konsole Folgendes ein:

$ ./bake.py configure -e ns-3.29

Danach werden wir Sie bitten, Bake zu überprüfen, ob wir über die erforderlichen Werkzeuge zum Herunterladen verschiedener Komponenten verfügen. Geben Sie ein:

$ ./bake.py check

Sie sollten etwas Ähnliches sehen:

> Python - OK 
> GNU C++ Compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar-Werkzeug - OK 
> Unzip-Werkzeug - OK 
> Make - OK 
> cMake - OK 
> Patch-Werkzeug - OK 
> Suchpfad für Werkzeuge: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Insbesondere sind Werkzeuge wie Mercurial, CVS, Git und Bazaar in diesem Schritt entscheidend, da sie es uns ermöglichen, den Code zu erhalten. Installieren Sie zu diesem Zeitpunkt die fehlenden Werkzeuge auf die für Ihr System übliche Weise (wenn Sie können) oder wenden Sie sich an Ihren Systemadministrator um Hilfe.

Versuchen Sie anschließend, die Software herunterzuladen:

$ ./bake.py download

Das Ergebnis sollte etwa so aussehen:

>> Suche nach Systemabhängigkeit setuptools - OK 
>> Suche nach Systemabhängigkeit libgoocanvas2 - OK 
>> Suche nach Systemabhängigkeit gi-cairo - OK 
>> Suche nach Systemabhängigkeit pygobject - OK 
>> Suche nach Systemabhängigkeit pygraphviz - OK 
>> Suche nach Systemabhängigkeit python-dev - OK 
>> Suche nach Systemabhängigkeit qt - OK 
>> Suche nach Systemabhängigkeit g++ - OK 
>> Herunterladen von pybindgen-0.19.0.post4+ng823d8b2 (Zielverzeichnis: pybindgen) - OK 
>> Herunterladen von netanim-3.108 - OK 
>> Herunterladen von ns-3.29 - OK

Dies bedeutet, dass drei Quellcodes heruntergeladen wurden. Wechseln Sie nun in das Verzeichnis source und geben Sie ls ein; Sie sollten Folgendes sehen:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Jetzt sind Sie bereit, das ns-3-Paket zu bauen.

3.4 Kompilierung von ns-3

Wie beim Herunterladen von ns-3 gibt es mehrere Möglichkeiten, ns-3 zu erstellen. Wichtig ist, dass ns-3 mit einem Build-Tool erstellt wird, das WAF, wie unten beschrieben. Die meisten Nutzer werden mit WAFarbeiten, aber es gibt auch einige benutzerfreundliche Skripte, die Ihnen beim Einstieg helfen oder komplexere Builds organisieren können. Lesen Sie daher bitte bevor Sie sich mit WAF, werfen Sie einen Blick auf build.py und dem Bauen mit bake.

3.4.1 Kompilierung mit build.py

Achtung! Dieser Schritt zum Bauen ist nur aus dem oben beschriebenen Quellarchiv verfügbar und nicht aus einem über git oder bake heruntergeladenen.

Beim Arbeiten mit dem Release-Archiv tarball, in ns-3-allinone Es gibt ein praktisches Skript, das die Zusammenstellung von Komponenten erleichtern kann. Es heißt build.py. Dieses Programm wird das Projekt für Sie auf die nützlichste Weise konfigurieren. Beachten Sie jedoch, dass komplexere Einstellungen und die Arbeit mit ns-3 normalerweise die Verwendung des eigenen Build-Systems von ns-3, Waf, beinhalten, das später in diesem Handbuch vorgestellt wird.

Wenn Sie den Download mit tarball, sollte in Ihrem Verzeichnis ~/workspace ein Verzeichnis mit einem Namen wie ns-allinone-3.29entstehen. Geben Sie Folgendes ein:

$ ./build.py --enable-examples --enable-tests

Beim Aufruf build.py Wir haben die Befehlszeilenargumente verwendet, um die in diesem Handbuch verwendeten Beispiele und Tests zu kompilieren, die standardmäßig in ns-3 nicht gebaut werden. Standardmäßig baut das Programm auch alle verfügbaren Module. Später können Sie ns-3 ohne Beispiele und Tests oder bestimmte Module, die Sie nicht benötigen, kompilieren.

Sie werden viele Ausgaben des Compilers sehen, die vom Skript beim Kompilieren der verschiedenen Teile, die Sie heruntergeladen haben, angezeigt werden. Zunächst wird das Skript versuchen, den Animator netanim, dann den Bindungsgenerator pybindgen Und schließlich ns‑3. Am Ende des Prozesses sollten Sie Folgendes sehen:

Waf: Verlasse Verzeichnis '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' wurde erfolgreich abgeschlossen (6m25.032s) 

Gebäude Module:
antenne                aodv                     Anwendungen
brücke                 gebäude                 konfigurationsspeicher
kern                   csma                     csma-layout
dsdv                   dsr                      energie 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobilität               mpi
netanim (kein Python)    netzwerk                  nix-vector-routing 
olsr                   punkt-zu-punkt           punkt-zu-punkt-layout 
verbreitung            sixlowpan                spektrum 
statistiken            tap-bridge               test (kein Python) 
topologie-lesen        verkehrssteuerung       uan 
virtuelles-netzwerkgerät visueller               wellen 
wifi                   wimax 

Nicht gebaute Module (siehe ns-3-Tutorial zur Erklärung):
brite                  klicken                    openflow 
Verlasse Verzeichnis ./ns-3.29

In den letzten drei Zeilen der Ausgabe sehen wir eine Nachricht über die Module, die nicht gebaut wurden:

Nicht gebaute Module (siehe ns-3-Tutorial zur Erklärung):
brite                     klicken

Das bedeutet einfach, dass einige ns‑3-Module, die von externen Bibliotheken abhängen, möglicherweise nicht gebaut wurden oder dass ihre Erstellung für diese Konfiguration nicht erforderlich ist. Das bedeutet nicht, dass der Simulator nicht erfolgreich erstellt wurde oder dass die gebauten Module nicht richtig funktionieren werden.

3.4.2 Kompilierung mit Bake

Wenn Sie zuvor Bake verwendet haben, um den Quellcode aus den Projekt-Repositorys zu erhalten, können Sie es auch für den Bau von ns-3 verwenden. Geben Sie ein:

$ ./bake.py build

und Sie sollten etwas sehen wie:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

Hinweis: Sie können auch beide Schritte, das Herunterladen und Bauen, sofort durchführen, indem Sie "bake.py deploy" aufrufen.

Beim Bau aller Komponenten kann es zu Fehlern kommen, aber der Bau wird fortgesetzt, wenn die betroffene Komponente nicht zwingend erforderlich ist. Ein Beispiel für ein kürzlich aufgetretenes Portierungsproblem ist, dass castxml von einem Werkzeug bake nicht auf allen Plattformen gebaut werden kann. In diesem Fall erscheint eine Nachricht wie:

>> Building castxml - Problem 
> Problem: Optionale Abhängigkeit, Modul "castxml" fehlgeschlagen
Dies kann die Funktionalität des endgültigen Builds einschränken.
Jedoch wird Bake fortfahren, da "castxml" keine essentielle Abhängigkeit ist.
Für mehr Informationen rufen Sie Bake mit -v oder -vvv für den vollen Detailmodus auf.

Allerdings castxml ist nur erforderlich, wenn Sie aktualisierte Python-Bindungen erstellen möchten. Für die meisten Benutzer ist dies nicht notwendig (zumindest, bis sie Änderungen an ns-3 vornehmen), sodass solche Warnungen derzeit sicher ignoriert werden können.

Falls ein Fehler auftritt, gibt Ihnen der folgende Befehl Hinweise zu fehlenden Abhängigkeiten:

$ ./bake.py show

Es werden verschiedene Paketabhängigkeiten aufgelistet, die Sie zu erstellen versuchen.

3.4.3 Kompilierung mit Waf

Bis zu diesem Punkt haben wir entweder das Skript build.pyoder das Tool bakeverwendet. Diese Tools helfen beim Erstellen von ns-3 und unterstützen die Bibliotheken. Tatsächlich starten sie den Build-Tool WAF aus dem ns-3 Verzeichnis. WAF wird zusammen mit dem Quellcode von ns-3 installiert. Die meisten Benutzer springen schnell zu einer direkten Verwendung von WAF. Um fortzufahren, bitte wechseln Sie in das ursprüngliche ns-3 Verzeichnis, das Sie erstellt haben.

Aktuell ist dies nicht zwingend erforderlich, doch es wäre hilfreich, einen kleinen Schritt zurückzutreten und zu betrachten, wie Änderungen an der Projektkonfiguration vorgenommen werden. Eine der sinnvollsten Änderungen, die Sie vornehmen können, besteht darin, eine optimierte Version des Codes zu erstellen. Standardmäßig haben Sie Ihr Projekt so konfiguriert, dass es eine Debug-Version erstellt. Lassen Sie uns das Projekt für den Bau einer optimierten Version betrachten. Um Waf zu erklären, dass es optimierte Builds inklusive Beispielen und Tests erstellen soll, müssen Sie die folgenden Befehle ausführen:

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

Dies wird WAF außerhalb des lokalen Verzeichnisses (zu Ihrem Komfort) ausgeführt. Der erste Befehl bereinigt die vorherige Build-Version; dies ist normalerweise nicht unbedingt erforderlich, jedoch eine gute Praxis (siehe auch die Build-Profile weiter unten); er entfernt zuvor erstellte Bibliotheken und Objektdateien im Verzeichnis build/. Wenn das Projekt neu konfiguriert ist und das Build-System die verschiedenen Abhängigkeiten überprüft, sollten Sie eine Ausgabe sehen, die ähnlich wie folgt aussieht:

Setze oberes Verzeichnis auf : /home/ns3user/workspace/bake/source/ns-3-dev
Setze Ausgabeverzeichnis auf : /home/ns3user/workspace/bake/source/ns-3-dev/build
Überprüfe 'gcc' (C-Compiler) : /usr/bin/gcc
Überprüfe die Version von cc : 7.3.0
Überprüfe 'g++' (C++-Compiler) : /usr/bin/g++
Überprüfe Unterstützung für den Kompilierungsflag -march=native : ok
Überprüfe Unterstützung für den Kompilierungsflag -Wl,--soname=foo : ok
Überprüfe Unterstützung für den Kompilierungsflag -std=c++11 : ok
Überprüfe Boost-Header : Header nicht gefunden, bitte '--boost-includes' Argument angeben (siehe Hilfe)
Überprüfe Boost-Header : Header nicht gefunden, bitte '--boost-includes' Argument angeben (siehe Hilfe)
Überprüfe Programm 'python' : /usr/bin/python
Überprüfe Python-Version >= 2.3 : 2.7.15 python-config : /usr/bin/python-config
Frage python-config nach pyembed '--cflags --libs --ldflags' Flags : ja
Teste pyembed-Konfiguration : ja
Frage python-config nach pyext '--cflags --libs --ldflags' Flags : ja
Teste pyext-Konfiguration : ja

Überprüfe Unterstützung für den Kompilierungsflag -fvisibility=hidden : ok
Überprüfe Unterstützung für den Kompilierungsflag -Wno-array-bounds : ok
Überprüfe pybindgen-Standort : ../pybindgen, !(geschätzt)
Überprüfe Python-Modul 'pybindgen' : 0.19.0, !post4+g823d8b2
Überprüfe pybindgen-Version : 0.19.0, !post4+g823d8b2
Überprüfe Code-Snippet : ja
Überprüfe Äquivalenz der Typen uint64_t und unsigned long : nein
Überprüfe Code-Snippet : nein
Überprüfe Äquivalenz der Typen uint64_t und unsigned long long : ja
Überprüfe die apidefs für Python-Bindings : gcc-LP64
Überprüfe interne GCC cxxabi : abgeschlossen
Überprüfe Python-Modul 'pygccxml' : nicht gefunden
Überprüfe Standort von click : nicht gefunden
Überprüfe Programm 'pkg-config' : /usr/bin/pkg-config
Überprüfe 'gtk+-3.0' : nicht gefunden
Überprüfe 'libxml-2.0' : ja
Überprüfe uint128_t : nicht gefunden
Überprüfe __uint128_t : ja
Überprüfe Hochpräzisionsimplementierung : 128-Bit-Ganzzahl, !(standardmäßig)
Überprüfe Header stdint.h : ja
Überprüfe Header inttypes.h : ja
Überprüfe Header sys/inttypes.h : nicht gefunden
Überprüfe Header sys/types.h : ja
Überprüfe Header sys/stat.h : ja
Überprüfe Header dirent.h : ja
Überprüfe Header stdlib.h : ja
Überprüfe Header signal.h : ja
Überprüfe Header pthread.h : ja
Überprüfe Header stdint.h : ja
Überprüfe Header inttypes.h : ja
Überprüfe Header sys/inttypes.h : nicht gefunden
Überprüfe Bibliothek rt : ja
Überprüfe Header sys/ioctl.h : ja
Überprüfe Header net/if.h : ja
Überprüfe Header net/ethernet.h : ja
Überprüfe Header linux/if_tun.h : ja
Überprüfe Header netpacket/packet.h : ja
Überprüfe NSC-Standort : nicht gefunden
Überprüfe 'sqlite3' : nicht gefunden
Überprüfe Header linux/if_tun.h : ja
Überprüfe Python-Modul 'gi' : 3.26.1
Überprüfe Python-Modul 'gi.repository.GObject' : ok
Überprüfe Python-Modul 'cairo' : ok
Überprüfe Python-Modul 'pygraphviz' : 1.4rc1
Überprüfe Python-Modul 'gi.repository.Gtk' : ok
Überprüfe Python-Modul 'gi.repository.Gdk' : ok
Überprüfe Python-Modul 'gi.repository.Pango' : ok
Überprüfe Python-Modul 'gi.repository.GooCanvas' : ok
Überprüfe Programm 'sudo' : /usr/bin/sudo
Überprüfe Programm 'valgrind' : nicht gefunden
Überprüfe 'gsl' : nicht gefunden python-config : nicht gefunden
Überprüfe Unterstützung für den Kompilierungsflag -fstrict-aliasing : ok
Überprüfe Unterstützung für den Kompilierungsflag -fstrict-aliasing : ok
Überprüfe Unterstützung für den Kompilierungsflag -Wstrict-aliasing : ok
Überprüfe Unterstützung für den Kompilierungsflag -Wstrict-aliasing : ok
Überprüfe Programm 'doxygen' : /usr/bin/doxygen
---- Zusammenfassung der optionalen ns-3 Funktionen:
Build-Profil : optimiert
Build-Verzeichnis :
BRITE-Integration : nicht aktiviert (BRITE nicht aktiviert (siehe Option --with-brite))
DES-Metrik-Ereignissammlung : nicht aktiviert (standardmäßig deaktiviert)
Emulation FdNetDevice : aktiviert
Beispiele : aktiviert
Dateideskriptor NetDevice : aktiviert
GNU Scientific Library (GSL) : nicht aktiviert (GSL nicht gefunden)
Gcrypt-Bibliothek : nicht aktiviert
(libgcrypt nicht gefunden: du kannst libgcrypt-config verwenden, um ihren Standort zu finden.) GtkConfigStore : nicht aktiviert (Bibliothek 'gtk+-3.0 >= 3.0' nicht gefunden)
MPI-Unterstützung : nicht aktiviert (Option --enable-mpi nicht ausgewählt)
ns-3 Click-Integration : nicht aktiviert (nsclick nicht aktiviert (siehe Option --with-nsclick))
ns-3 OpenFlow-Integration : nicht aktiviert (Erforderliche Boost-Bibliotheken nicht gefunden)
Network Simulation Cradle : nicht aktiviert (NSC nicht gefunden (siehe Option --with-nsc))
PlanetLab FdNetDevice : nicht aktiviert (PlanetLab-Betriebssystem nicht erkannt (siehe Option --force-planetlab)) PyViz-Visualizer : aktiviert
Python API Scanning Support : nicht aktiviert (Fehlendes 'pygccxml' Python-Modul)
Python-Bindungen : aktiviert
Echtzeit-Simulator : aktiviert
SQlite-Statistiken-Ausgabe : nicht aktiviert (Bibliothek 'sqlite3' nicht gefunden)
Tap Bridge : aktiviert
Tap FdNetDevice : aktiviert
Tests : aktiviert
Threading-Primitiven : aktiviert
Verwende sudo für setze suid-Bit : nicht aktiviert (Option --enable-sudo nicht ausgewählt)
XmlIo : aktiviert
'configure' erfolgreich abgeschlossen (6.387s)

Beachten Sie den letzten Teil der obigen Auflistung. Einige ns-3 Optionen sind standardmäßig nicht aktiviert oder benötigen Systemunterstützung für eine korrekte Funktionsweise. Zum Beispiel muss die Bibliothek libxml-2.0vorhanden sein, um XmlTo zu aktivieren. Sollte diese Bibliothek nicht gefunden werden und die entsprechende ns-3 Funktion nicht aktiviert sein, wird eine Fehlermeldung angezeigt. Beachten Sie außerdem, dass Sie den Befehl sudo verwenden können, um das SUID-Bit „Set User ID upon Execution“ für bestimmte Programme zu setzen. Diese Funktion ist standardmäßig nicht aktiviert und wird daher als „nicht aktiviert“ angezeigt. Schließlich verwenden Sie WAF mit dem Parameter --check-config.

um eine Liste der aktivierten Optionen zu erhalten. Jetzt kehren wir zurück zur Debug-Build, die Beispiele und Tests enthält.

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

Das Build-System ist jetzt konfiguriert, und Sie können die Debug-Versionen der ns-3 Programme einfach erstellen, indem Sie eingeben:

$ ./waf

Obwohl die oben beschriebenen Schritte dazu geführt haben, dass Sie einen Teil des ns-3-Systems zweimal aufgebaut haben, wissen Sie jetzt, wie Sie die Konfiguration ändern und optimierten Code erstellen können.

Um zu überprüfen, welches Profil für die gegebene Projektkonfiguration aktiv ist, gibt es den Befehl:

$ ./waf --check-profile 
Waf: Betrete Verzeichnis `/path/to/ns-3-allinone/ns-3.29/build' 
Build-Profil: debug

Das oben betrachtete Szenario build.py unterstützt auch die Argumente --enable-examples und --enable-tests, aber andere Optionen WAF unterstützt es nicht direkt. Zum Beispiel wird folgendes nicht funktionieren:

$ ./build.py --disable-python

die Reaktion wird sein:

build.py: Fehler: keine solche Option: --disable-python

Dennoch kann der spezielle Operator -- verwendet werden, um zusätzliche Parameter über wafzu übergeben, daher wird der folgende Befehl anstelle des oben genannten funktionieren:

$ ./build.py -- --disable-python

da er den Hauptbefehl generiert ./waf configure --disable-python. Hier sind einige weitere einführende Tipps zu WAF.

Fehlerbehandlung beim Build

Die ns‑3 Releases wurden mit den neuesten verfügbaren C++ Compilern zum Zeitpunkt der Veröffentlichung auf gängigen Linux- und MacOS-Distributionen getestet. Mit der Zeit werden jedoch neue Distributionen mit neuen Compilern veröffentlicht, die in der Regel strenger bei Warnungen sind. ns‑3 konfiguriert sein Build so, dass alle Warnungen als Fehler behandelt werden, sodass manchmal, wenn Sie eine ältere Version auf einem neueren System verwenden, eine Compilerwarnung den Build stoppen kann.

So gab es beispielsweise zuvor das Release ns‑3.28 für Fedora 28, das eine neue Hauptversion enthielt, gcc (gcc-8). Beim Build des Releases ns‑3.28 oder älter für Fedora 28, mit installiertem Gtk2+, kann folgender Fehler auftreten:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

In den Releases, beginnend mit ns‑3.28.1, WAF ist eine Option verfügbar, um diese Probleme zu lösen. Sie deaktiviert das Setzen des „-Werror“ Flags in g++ und clang++. Diese Option „—disable-werror“ sollte während der Konfiguration angewendet werden:

$ ./waf configure --disable-werror --enable-examples --enable-tests

Konfigurieren oder Bauen

Einige Befehle WAF sind nur in der Konfigurationsphase sinnvoll, während andere nur in der Build-Phase funktionieren. Wenn Sie beispielsweise die Emulationsfunktionen von ns-3 verwenden möchten, können Sie die Bitinstallation aktivieren. suid unter Verwendung von sudo, wie oben beschrieben. Dies wird die Kommandos der Konfigurationsphase zurücksetzen, sodass Sie die Konfiguration mit dem folgenden Befehl ändern können, der auch Beispiele und Tests einschließt.

$ ./waf configure --enable-sudo --enable-examples --enable-tests

Wenn Sie dies tun, WAF startet sudo, um die Socket-Erstellungsprogramme des Emulationscodes mit Rechten auszuführen. rootIn WAF Es stehen viele weitere Optionen für die Konfigurations- und Build-Phasen zur Verfügung. Um die Optionen zu erkunden, geben Sie ein:

$ ./waf --help

Im nächsten Abschnitt werden wir einige testbezogene Optionen verwenden.

Build-Profile

Wir haben bereits gesehen, wie man WAF für Builds debug und optimiert:

$ ./waf --build-profile=debug

Es gibt auch ein Zwischen-Build-Profil, release. Die Option -d ist ein Synonym für --build-profile. Das Build-Profil verwaltet die Verwendung von Logging, Assertions und Compiler-Optimierungsschlüsseln:

Handbuch für den ns-3 Netzwerk-Simulator. Kapitel 3

Wie Sie sehen können, sind Protokollierung und Anweisungen nur in Debug-Builds verfügbar. Es wird empfohlen, Ihr Skript im Debug-Modus zu entwickeln und dann Wiederholungen (für Statistiken oder um Parameter zu ändern) im optimierten Build-Profil auszuführen.

Wenn Sie Code haben, der nur in bestimmten Build-Profilen ausgeführt werden soll, verwenden Sie das Makro Code Wrapper Macro:

NS_BUILD_DEBUG (std::cout << "Teil einer Ausgabeleiste..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Fertig: " << timer << std::endl;)

Standardmäßig WAF platziert die Build-Artefakte im Build-Verzeichnis. Sie können ein anderes Ausgabeverzeichnis mit der Option angeben - -out, zum Beispiel:

$ ./waf configure --out=my-build-dir

Indem Sie dies mit den Build-Profilen kombinieren, können Sie einfach zwischen verschiedenen Kompilierungsoptionen wechseln:

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

Was Ihnen ermöglicht, mit mehreren Builds zu arbeiten, ohne jedes Mal den letzten Build neu zu schreiben. Wenn Sie zu einem anderen Profil wechseln, WAF wird nur dieses kompiliert, ohne dass eine vollständige Neukompilierung aller erforderlich ist.

Wenn Sie die Build-Profile auf diese Weise wechseln, sollten Sie darauf achten, bei jeder Änderung die gleichen Konfigurationsparameter anzugeben. Das Festlegen mehrerer Umgebungsvariablen kann Ihnen helfen, Fehler zu vermeiden.

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

Compiler und Flags

In den obigen Beispielen WAF verwendet ns-3 den C++ Compiler aus GCC ( g++). Es ist jedoch möglich, den verwendeten WAF C++ Compiler zu ändern, indem die Umgebungsvariable CXX festgelegt wird. Zum Beispiel, um den C++ Compiler Clang zu verwenden, clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

Ähnlich können Sie WAF die Verwendung von verteilter Kompilierung mit distcc:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

Weitere Informationen zu distcc und verteilter Kompilierung finden Sie auf der Projektseite unter dem Abschnitt „Dokumentation“. Um beim Konfigurieren von ns-3 Compiler-Flags hinzuzufügen, verwenden Sie die Umgebungsvariable CXXFLAGS_EXTRA.

Installation von

WAF kann verwendet werden, um Bibliotheken an verschiedenen Orten im System zu installieren. Standardmäßig befinden sich die erstellten Bibliotheken und ausführbaren Dateien im Verzeichnis build, und da Waf den Speicherort dieser Bibliotheken und ausführbaren Dateien kennt, ist es nicht erforderlich, Bibliotheken irgendwo anders zu installieren.

Wenn Benutzer eine Installation außerhalb des Build-Verzeichnisses bevorzugen, können sie den Befehl ausführen ./waf install. Standardmäßig ist das Präfix für die Installation /usr/local, daher ./waf install werden Programme in /usr/local/bin, Bibliotheken in /usr/local/lib und Header-Dateien in /usr/local/includeinstalliert. Superuser-Rechte sind in der Regel erforderlich, um mit dem Standardpräfix zu installieren, daher wird der typische Befehl sein sudo ./waf install. Beim Ausführen wird Waf zunächst bevorzugen, die gemeinsamen Bibliotheken im Build-Verzeichnis zu verwenden, und dann nach Bibliotheken im Pfad zu suchen, der in der lokalen Umgebung konfiguriert ist. Daher ist es bei der Systeminstallation von Bibliotheken eine gute Praxis zu überprüfen, ob die richtigen Bibliotheken verwendet werden. Benutzer können die Installation mit einem anderen Präfix wählen, indem sie während der Konfiguration die Option --prefix, zum Beispiel:

./waf configure --prefix=/opt/local

Wenn der Benutzer nach der Erstellung später den Installationsbefehl eingibt ./waf, wird das Präfix verwendet /opt/local.

Der Befehl ./waf clean sollte vor einer Neuausrichtung des Projekts verwendet werden, wenn für die Installation ein WAF anderes Präfix verwendet wird.

Somit ist es nicht notwendig, ns‑3 manuell aufzurufen ./waf install. Die meisten Benutzer werden diesen Befehl nicht benötigen, da WAF die aktuellen Bibliotheken aus dem Build-Verzeichnis übernommen werden, aber einige Benutzer finden es nützlich, wenn ihre Arbeit Programme außerhalb des ns‑3-Verzeichnisses umfasst.

Waf ist einheitlich

Auf der obersten Ebene des ns‑3-Quellbaums gibt es nur ein Waf-Skript. Wenn Sie beginnen, werden Sie viel Zeit im Verzeichnis scratch/ oder tiefer, insrc/... verbringen und dabei die Notwendigkeit haben, WAFauszuführen. Sie können sich einfach merken, wo Sie sind, und es folgendermaßen ausführen: WAF $ ../..../waf ...

aber das wird mühsam und fehleranfällig sein, daher gibt es bessere Lösungen. Eine gängige Methode ist die Verwendung eines Texteditors, wie

aber das wird mühsam und fehleranfällig sein, deshalb gibt es bessere Lösungen. Eine übliche Vorgehensweise ist die Verwendung eines Texteditors, wie emacs oder vim, in dem zwei Terminalsitzungen geöffnet werden, eine für den Bau von ns-3 und die andere zum Bearbeiten des Quellcodes. Wenn Sie nur haben tarball, könnte die Umgebungsvariable helfen:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $*; } 

$ cd scratch 
$ waff build

Es kann verlockend sein, ein triviales Waf-Skript im Modulverzeichnis als Vorlage hinzuzufügen exec ../../waf. Bitte tun Sie dies nicht. Das verwirrt Anfänger und kann bei unsachgemäßer Ausführung zu schwer erkennbaren Baufehlern führen. Die oben gezeigten Lösungen sind die beste Vorgehensweise.

3.5 Testen von ns-3

Sie können die Modultests der ns-3-Verteilung ausführen, indem Sie das Skript ./test.py:

$ ./test.py

Diese Tests werden parallel zu WAFausgeführt. Am Ende sollten Sie eine Nachricht sehen, die besagt, dass

92 von 92 Tests bestanden (92 bestanden, 0 fehlgeschlagen, 0 abgestürzt, 0 Valgrind-Fehler)

Diese wichtige Meldung zeigt Fehler, Abstürze oder Valgrind-Fehler an und deutet auf Probleme im Code oder Inkompatibilitäten zwischen den Werkzeugen und dem Code hin.

Sie werden auch die Endausgabe von WAF und dem Tester sehen, der jeden Test ausführt, die etwa so aussehen wird:

Waf: Verzeichnis betreten `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Verzeichnis verlassen `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' erfolgreich abgeschlossen (1.799s) 

Erstellte Module:
aodv           Anwendungen         Bridge
click          Konfigurationsspeicher  Kern
csma           csma-layout         dsdv
emu            Energie              Flow-Monitor
Internet       lte                 Mesh
Mobilität      mpi                 netanim
Netzwerk       nix-Vektor-Routing   ns3tcp
ns3wifi        olsr                OpenFlow
Punkt-zu-Punkt Punkt-zu-Punkt-Layout Propagation
Spektrum       Statistiken         tap-bridge
template       Test                Tools
topologie-lesen  uan                virtuelles-Netzwerk-Gerät
Visualizer     wifi                wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite Histogramm 

...

PASS: TestSuite Objekt
PASS: TestSuite Zufallszahlengeneratoren
92 von 92 Tests bestanden (92 bestanden, 0 fehlgeschlagen, 0 abgestürzt, 0 Valgrind-Fehler)

Dieser Befehl wird normalerweise von Benutzern ausgeführt, um schnell die Richtigkeit des ns-3-Distribution Builds zu überprüfen. (Bitte beachten Sie, dass die Reihenfolge der Zeilen "PASS: ..." variieren kann, was normal ist. Wichtig ist, dass in der Schlussszene des Berichts alle Prüfungen bestanden wurden; kein Test ist fehlgeschlagen oder abgestürzt.) WAF, und test.py werden die Arbeiten auf die verfügbaren CPU-Kerne der Maschine verteilt.

3.6 Ausführen eines Skripts

Normalerweise führen wir Skripte unter Kontrolle aus WAFDies ermöglicht dem Build-System, sicherzustellen, dass die Pfade zur gemeinsamen Bibliothek korrekt festgelegt sind und die Bibliotheken zur Laufzeit verfügbar sind. Um das Programm auszuführen, verwenden Sie einfach WAF mit dem Parameter - run. Lassen Sie uns das ns‑3-Äquivalent des allgegenwärtigen Programms hello worldausführen, indem wir Folgendes eingeben:

$ ./waf --run hello-simulator

Waf prüft zunächst, ob das Programm korrekt kompiliert wurde, und führt bei Bedarf die Kompilierung durch. Dann WAF führt es das Programm aus, das die folgende Ausgabe erzeugt.

Hello Simulator

Herzlichen Glückwunsch! Sie sind jetzt ein ns‑3-Nutzer!

Was soll ich tun, wenn ich kein Ergebnis sehe?

Wenn Sie Meldungen sehen WAF, die darauf hinweisen, dass der Build erfolgreich abgeschlossen wurde, aber keine Ausgabe von „Hello Simulator“sehen, besteht die Wahrscheinlichkeit, dass Sie im Abschnitt [Build mit Waf] Ihren Build-Modus auf optimiertumgeschaltet haben, aber das Zurückwechseln in den Modus nicht durchgeführt haben. debug. Die gesamte Konsolenausgabe, die in diesem Handbuch verwendet wird, nutzt eine spezielle Komponente von ns-3, die die Protokollierung übernimmt und zum Drucken von Benutzermeldungen in die Konsole dient. Die Ausgabe dieser Komponente ist bei der Kompilierung von optimiertem Code automatisch deaktiviert — sie ist „optimiert“. Wenn Sie die Ausgabe „Hello Simulator“ nicht sehen, geben Sie Folgendes ein:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

um WAF Debug-Versionen der ns-3-Programme zu erstellen, die Beispiele und Tests enthalten. Danach müssen Sie die aktuelle Debug-Version des Codes neu kompilieren, indem Sie

$ ./waf

Jetzt, wenn Sie das Programm hello-simulator, ausführen, sollten Sie das erwartete Ergebnis sehen.

3.6.1 Befehlszeilenargumente

Um Argumente für die Befehlszeile an das ns-3-Programm zu übergeben, verwenden Sie folgende Vorlage:

$ ./waf --run  --command-template="%s "

Ersetzen Sie durch den Namen Ihres Programms und durch die Argumente. Das Argument - -command-template für WAF ist im Wesentlichen ein Rezept zum Erstellen der tatsächlichen Befehlszeile. WAF wird verwendet, um das Programm auszuführen. Waf überprüft, ob der Build abgeschlossen ist, legt die Pfade zur gemeinsamen Bibliothek fest und ruft dann die ausführbare Datei auf, indem es das bereitgestellte Befehlszeilenmuster verwendet und den Programmnamen anstelle des Platzhalters %s einsetzt. Wenn dieser Syntax für Sie kompliziert erscheint, gibt es eine einfachere Möglichkeit, die die ns‑3-Programm und seine Argumente in einfache Anführungszeichen einschließt:

$ ./waf --run ' --arg1=value1 --arg2=value2 ...'

Ein weiteres, besonders nützliches Beispiel ist das selektive Ausführen von Testsuiten. Angenommen, es gibt eine Testsuite (suite) namens mytest (die tatsächlich nicht existiert). Zuvor haben wir das Skript ./test.py verwendet, um eine Reihe von Tests parallel auszuführen, das die Testprogramm häufig aufruft test-runner. Der direkte Aufruf, um einen einzelnen Test auszuführen: test-runner $ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Die Argumente werden an das Programm übergeben

. Da mytest nicht existiert, wird eine Fehlermeldung generiert. Um die verfügbaren Parameter von test-runner anzuzeigen, geben Sie ein: test-runner$ ./waf --run test-runner --command-template="%s --help"

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Debugging

Um ns‑3-Programme mit einem anderen Dienstprogramm, wie einem Debugger (zum Beispiel, gdb) oder einem Speicherprüfungstool (wie, valgrind), verwenden Sie eine ähnliche Form - -command-template = "…". Zum Beispiel, um Ihr ns‑3-Programm hello-simulator im Debugger zu starten mit den Argumenten: gdb $ ./waf --run=hello-simulator --command-template="gdb %s --args "

Bitte beachten Sie, dass der Name des ns‑3-Programms mit einem Argument

, und das Kontrollwerkzeug (hier - run) das erste Token im Argument ist gdb- -args - -command-template. Die Option , wobei der Rest der Kommandozeile für das "untergeordnete" Programm gehört. (Einige Versionen berichtet gdbverstehen die Option nicht. gdb In diesem Fall entfernen Sie die Programmargumente aus , wobei der Rest der Kommandozeile für das "untergeordnete" Programm gehört. (Einige Versionenund verwenden Sie die Befehlssammlung - -command-template args gdb .) Wir können dieses Rezept mit dem vorherigen kombinieren, um den Test im Debugger zu starten:$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

Waf sollte aus seiner Position im oberen Verzeichnisbaum von ns‑3 gestartet werden. Dieser Ordner wird das Arbeitsverzeichnis, in dem die Ausgabedateien geschrieben werden. Aber was ist, wenn Sie diese Dateien außerhalb des ns‑3-Quellbaums speichern möchten? Verwenden Sie das Argument

3.6.3 Arbeitsverzeichnis

- -cwd $ ./waf --cwd=...:

$ ./waf --cwd=...

Es könnte für Sie bequemer sein, die Ausgabedateien in Ihrem Arbeitsverzeichnis zu erhalten. In diesem Fall könnte Ihnen eine solche indirekte Aktion helfen:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

Diese Dekoration der vorherigen Version des Befehls speichert das aktuelle Arbeitsverzeichnis, wechselt in das Verzeichnis WAF, und weist dann an WAF um das Arbeitsverzeichnis zurück in das vor dem Start des Programms gespeicherte aktuelle Arbeitsverzeichnis zu ändern. Wir erwähnen den Befehl $ ./waf --cwd=... vollständigkeitshalber, da die meisten Benutzer Waf einfach aus dem Hauptverzeichnis starten und dort die Ausgabedateien generieren.

Fortsetzung: Kapitel 4

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster