Π£Ρ‡Π΅Π±Π½ΠΈΠΊ ΠΏΠΎ симулятору сСти ns-3. Π“Π»Π°Π²Π° 4

Π£Ρ‡Π΅Π±Π½ΠΈΠΊ ΠΏΠΎ симулятору сСти ns-3. Π“Π»Π°Π²Π° 4
Π³Π»Π°Π²Ρ‹ 1,2
Π³Π»Π°Π²Π° 3

4 ΠžΠ±Π·ΠΎΡ€ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ
4.1 ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ абстракции
4.1.1 Node (Π£Π·Π΅Π»)
4.1.2 Application (ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)
4.1.3 Channel (Канал)
4.1.4 Net Device (Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ устройство)
4.1.5 ВопологичСскиС ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ
4.2 ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ скрипт ns-3
4.2.1 Boilerplate ΠΊΠΎΠ΄
4.2.2 ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ
4.2.3 ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ ns3
4.2.4 Π–ΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
4.2.5 Главная функция
4.2.6 ИспользованиС топологичСских ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ²
4.2.7 ИспользованиС Application
4.2.8 Бимулятор
4.2.9 Π‘Π±ΠΎΡ€ΠΊΠ° вашСго сцСнария
4.3 ns-3 Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

Π“Π»Π°Π²Π° 4

ΠžΠ±Π·ΠΎΡ€ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ ns‑3 β€” это ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ нСсколько основных понятий ΠΈ абстракций Π² систСмС. МногоС ΠΈΠ· этого, для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Π½ΠΎ ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ врСмя для чтСния этого Ρ€Π°Π·Π΄Π΅Π»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Π½Π° ΠΏΡ€ΠΎΡ‡Π½ΠΎΠΉ основС.

4.1 ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ абстракции

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² сСти, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ns‑3.

4.1.1 Node (Π£Π·Π΅Π»)

На ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΆΠ°Ρ€Π³ΠΎΠ½Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ΅ устройство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ сСти, называСтся хостом ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ систСмой. По Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ ns‑3 β€” это симулятор сСти, Π° Π½Π΅ симулятор Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, ΠΌΡ‹ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ хост, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это тСсно связано с Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ΠΎΠΌ ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ. ВмСсто этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ симуляторами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π΅Ρ€Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΠΎ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΎΠ² β€” ΡƒΠ·Π΅Π» (node).

Π’ ns-3 базовая абстракция Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ устройства называСтся ΡƒΠ·Π»ΠΎΠΌ. Π­Ρ‚Π° абстракция прСдставлСна Π² C++ классом Node. Класс NodeNode (ΡƒΠ·Π΅Π») Π΄Π°Ρ‘Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для управлСния прСдставлСниями Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… устройств Π² симуляциях.

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Node ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π’Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ прилоТСния, стСки ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Π΅ ΠΊΠ°Ρ€Ρ‚Ρ‹ с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ Π±Π°Π·ΠΎΠ²ΡƒΡŽ модСль Π² ns-3.

4.1.2 Application (ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС дСлится Π½Π° Π΄Π²Π° ΡˆΠΈΡ€ΠΎΠΊΠΈΡ… класса. БистСмноС ПО ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Π΅ рСсурсы Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ†ΠΈΠΊΠ»Ρ‹ процСссора, диск, ΡΠ΅Ρ‚ΡŒ ΠΈ Ρ‚. Π΄. Π² соотвСтствии с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ модСлью. БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эти рСсурсы для выполнСния Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приносят Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ для достиТСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ запускаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ рСсурсы, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ систСмным ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ обСспСчСниСм.

Часто линия раздСлСния ΠΌΠ΅ΠΆΠ΄Ρƒ систСмным ΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ обСспСчСниСм проводится ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ уровня ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ происходит Π² Π»ΠΎΠ²ΡƒΡˆΠΊΠ°Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π’ ns‑3 Π½Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ соотвСтствСнно Π½Π΅Ρ‚ понятий ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ ΠΈΠ»ΠΈ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π£ нас, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΡ‚ΡŒ идСя прилоТСния. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π² Β«Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅Β» для выполнСния Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ прилоТСния Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…, прилоТСния ns‑3 Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΡƒΠ·Π»Π°Ρ… ns‑3 для управлСния симуляциями Π² симулированном ΠΌΠΈΡ€Π΅.

Π’ ns‑3 Π±Π°Π·ΠΎΠ²ΠΎΠΉ абстракциСй для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ для модСлирования, являСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚Π° абстракция прСдставлСна Π² C++ классом Application (ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅). Класс Application прСдоставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для управлСния Π² симуляциях прСдставлСниями нашСй вСрсии ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ уровня ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ΠžΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² оТидаСтся, Ρ‡Ρ‚ΠΎ для создания Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ класс Application Π² смыслС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π’ этом руководствС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ спСциализации класса Application, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ UdpEchoClientApplication ΠΈ UdpEchoServerApplication. Как ΠΈ слСдовало ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, эти прилоТСния ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚/сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ эхо‑симуляции сСтСвых ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

4.1.3 Channel (Канал)

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΊ сСти. Часто срСды, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ Π² этих сСтях, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ. Когда Π²Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ кабСль Ethernet ΠΊ Ρ€ΠΎΠ·Π΅Ρ‚ΠΊΠ΅ Π½Π° стСнС, Π²Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΊ ΠΊΠ°Π½Π°Π»Ρƒ связи Ethernet. Π’ смодСлированном ΠΌΠΈΡ€Π΅ ns‑3 ΡƒΠ·Π΅Π» ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌΡƒ ΠΊΠ°Π½Π°Π» связи. Π—Π΄Π΅ΡΡŒ основная абстракция ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ подсСти называСтся ΠΊΠ°Π½Π°Π»ΠΎΠΌ ΠΈ прСдставляСтся Π² C++ классом Channel (ΠΊΠ°Π½Π°Π»).

Класс ChannelChannel прСдоставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для управлСния взаимодСйствиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² подсСти ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π½ΠΈΠΌ ΡƒΠ·Π»ΠΎΠ². ΠšΠ°Π½Π°Π»Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ спСциализированы Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Π² смыслС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. БпСциализация ΠΊΠ°Π½Π°Π»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ простоС ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²ΠΎΠ΄. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ слоТныС Π²Π΅Ρ‰ΠΈ ΠΊΠ°ΠΊ большой Ethernet-ΠΊΠΎΠΌΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠ΅ пространство, ΠΏΠΎΠ»Π½ΠΎΠ΅ прСпятствий Π² случаС бСспроводных сСтСй.

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² этом руководствС спСциализированныС вСрсии ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ CsmaChannelCsmaChannel, PointToPointChannelPointToPointChannel ΠΈ WifiChannelWifiChannel. CsmaChannel, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ подсСти которая Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ срСду мноТСствСнного доступа с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ нСсущСй. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Ethernet-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

4.1.4 Net Device (Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ устройство)

РаньшС Π±Ρ‹Π»ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΊ сСти, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΡƒΠΏΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ сСтСвой кабСль ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ устройство, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ (Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ПК) ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½ΠΎΠΉ ΠΏΠ»Π°Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€. Если Π½Π° ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сСтСвыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡ… Π½Π°Π·Ρ‹Π²Π°Π»ΠΈ сСтСвыми интСрфСйсными ΠΏΠ»Π°Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ сСтСвыми ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ. БСгодня Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ сСтСвого интСрфСйса, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ видят ΠΈΡ… ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ устройства.

БСтСвая ΠΊΠ°Ρ€Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π΅Ρ‘ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π’ Unix (ΠΈΠ»ΠΈ Linux), Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½ΠΎΠ³ΠΎ оборудования классифицируСтся ΠΊΠ°ΠΊ device. Устройства ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² устройств (device drivers), Π° сСтСвыС устройства (NIC) ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с использованиСм Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² сСтСвых устройств (network device drivers) ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСтСвыС устройства (net devices). Π’ Unix ΠΈ Linux Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ сСтСвым устройствам ΠΏΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ, ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ eth0.

Π’ ns‑3 абстракция сСтСвого устройства ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Ρ‚Π°ΠΊ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅. ΠŸΡ€ΠΈ симуляции сСтСвоС устройство «установлСно» Π² ΡƒΠ·Π»Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π΅ΠΌΡƒ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΡƒΠ·Π»Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π»Ρ‹. Как ΠΈ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΡƒΠ·Π΅Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ нСскольким ΠΊΠ°Π½Π°Π»Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· нСсколько устройств NetDevices.

БСтСвая абстракция устройства прСдставлСна Π² C++ классом NetDevice. Класс NetDevice обСспСчиваСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ управлСния соСдинСниями с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Node ΠΈ Channel; ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ спСциализированы Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Π² смыслС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π’ этом руководствС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько спСциализированных вСрсий NetDevice ΠΏΠΎΠ΄ названиями CsmaNetDevice, PointToPointNetDevice ΠΈ WifiNetDevice. Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ сСтСвой Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ Ethernet ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅Ρ‚ΡŒΡŽ Ethernet, CsmaNetDevice ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с CsmaChannel, PointToPointNetDevice ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PointToPointChannel, Π° WifiNetDevice β€” ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с WifiChannel.

4.1.5 ВопологичСскиС ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ сСти Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ хост-ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ (ΠΈΠ»ΠΈ встроСнными) сСтСвыми ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ. Π’ ns‑3 ΠΌΡ‹ Π±Ρ‹ сказали, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡƒΠ·Π»Ρ‹ с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ NetDevices. Π’ большой ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ сСти Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ соСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ мноТСством ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Node, NetDevice ΠΈ Channel.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ NetDevices ΠΊ ΡƒΠ·Π»Π°ΠΌ, NetDevices ΠΊ ΠΊΠ°Π½Π°Π»Π°ΠΌ, Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ IP-адрСсов ΠΈ Ρ‚.Π΄. Π² ns‑3 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Ρ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, ΠΌΡ‹ прСдоставляСм Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… топологичСских ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ². НапримСр, для создания NetDevice Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ мноТСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ядра ns‑3, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ MAC-адрСс, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ это сСтСвоС устройство Π² Node, Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ стСк ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΡƒΠ·Π»Π°, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ NetDevice ΠΊ Channel. Π•Ρ‰Π΅ большС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ нСсколько устройств ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ сСти Π² ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ (Internetworks). ΠœΡ‹ прСдоставляСм Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ для вашСго удобства ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ эти многочислСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Π² использовании модСль.

4.2 ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ скрипт ns-3

Если Π²Ρ‹ установили систСму, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π²Ρ‹ΡˆΠ΅, Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π»ΠΈΠ· ns‑3 Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с ΠΈΠΌΠ΅Π½Π΅ΠΌ repos Π² вашСй домашнСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ release

Если Ρƒ вас Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹ ΠΏΡ€ΠΈ сборкС Ρ€Π΅Π»ΠΈΠ·Π½ΠΎΠΉ вСрсии ns‑3 Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ сборку Ρ‚Π°ΠΊ:
$ ./waf configure —build-profile=release —out=build/release,
$ ./waf build

Ρ‚Π°ΠΌ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ структуру Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠΎΡ…ΠΎΠΆΡƒΡŽ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ:

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

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ examples/tutorial. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ располоТСнный Ρ‚Π°ΠΌ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ first.cc. Π­Ρ‚ΠΎ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаст простоС соСдинСниС Ρ‚ΠΎΡ‡ΠΊΠ°-Ρ‚ΠΎΡ‡ΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΡƒΠ·Π»Π°ΠΌΠΈ ΠΈ пСрСдаст ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠ·Π»Π°ΠΌΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° этот скрипт построчно, для этого ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ first.cc Π² вашСм любимом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅.

4.2.1 Boilerplate ΠΊΠΎΠ΄
ΠŸΠ΅Ρ€Π²Π°Ρ строка Π² Ρ„Π°ΠΉΠ»Π΅ β€” это строка Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° emacs. Она Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ emacs ΠΎΠ± условностях форматирования (ΡΡ‚ΠΈΠ»ΡŒ кодирования), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² нашСм исходном ΠΊΠΎΠ΄Π΅.

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

Π­Ρ‚ΠΎ всСгда довольно спорный вопрос, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ внСсти ΡΡΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ сразу ΠΆΠ΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ с Π΄ΠΎΡ€ΠΎΠ³ΠΈ. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ns‑3, ΠΊΠ°ΠΊ ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², принял ΡΡ‚ΠΈΠ»ΡŒ кодирования, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ вСсь прСдоставлСнный ΠΊΠΎΠ΄. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ внСсти свой ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π²Π°ΠΌ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ придСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ стандарту кодирования ns‑3, ΠΊΠ°ΠΊ описано Π² Ρ„Π°ΠΉΠ»Π΅ doc/codingstd.txt ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° Π²Π΅Π±-страницС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: https://www.nsnam.org/develop/contributing-code/coding-style/.

ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π²Π°ΠΌ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ½ΡƒΡ‚ΡŒ ΠΊ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ Π²ΠΈΠ΄Ρƒ ΠΊΠΎΠ΄Π° ns‑3 ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ этот стандарт всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с нашим ΠΊΠΎΠ΄ΠΎΠΌ. Вся ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΡ€Ρ‹ согласились с этим послС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ворчания. Π‘Ρ‚Ρ€ΠΎΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌΠ° emacs, привСдСнная Π²Ρ‹ΡˆΠ΅, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ emacs.

Бимулятор ns‑3 лицСнзируСтся с использованиСм GNU General Public License. Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡŽΡ€ΠΈΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ GNU Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ дистрибутива ns‑3. Часто Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ± авторских ΠΏΡ€Π°Π²Π°Ρ… для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΡƒΡ‡Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ns‑3 Π²Ρ‹ΡˆΠ΅ тСкста GPL ΠΈ Π°Π²Ρ‚ΠΎΡ€Π°, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅.

/* 
* 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 ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

БобствСнно ΠΊΠΎΠ΄ начинаСтся с ряда ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (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"

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ нашим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ сцСнариСв высокого уровня ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с большим количСством Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² систСмС, ΠΌΡ‹ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΡ… Π² соотвСтствии с ΠΈΡ… использованиСм Π² большиС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. ΠœΡ‹ прСдоставляСм ΠΎΠ΄ΠΈΠ½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ рСкурсивно Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ всС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ список зависимостСй, ΠΌΡ‹ Π΄Π°Π΅ΠΌ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ² с большой ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ Π½Π΅ самый эффСктивный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π½ΠΎ ΠΎΠ½, бСзусловно, Π΄Π΅Π»Π°Π΅Ρ‚ написаниС сцСнариСв Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ns‑3 помСщаСтся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ns3 (поддирСктория сборки), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎ врСмя процСсса сборки ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ². Π€Π°ΠΉΠ» ns3/core-module.h соотвСтствуСт ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ns‑3, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ src/core Π² установлСнном Π²Π°ΠΌΠΈ Ρ€Π΅Π»ΠΈΠ·Π΅. Π’ листингС этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ большоС количСство Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Когда Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ сборку, Waf ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ общСдоступныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ns3 Π² ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ build/debug

Если Ρƒ вас Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹ ΠΏΡ€ΠΈ сборкС Ρ€Π΅Π»ΠΈΠ·Π½ΠΎΠΉ вСрсии ns‑3 Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ сборку Ρ‚Π°ΠΊ:
$ ./waf configure —build-profile=debug —out=build/debug
$ ./waf build
ΠΈΠ»ΠΈ
$ ./waf configure —build-profile=optimized —out=build/optimized
$ ./waf build

ΠΈΠ»ΠΈ build/optimized, Π² зависимости ΠΎΡ‚ вашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Waf Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» модуля для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ всСх общСдоступных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ΡƒΠΊΠΎΡΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слСдуСтС этому руководству, Π²Ρ‹ ΡƒΠΆΠ΅ сдСлали

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

Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… сборок, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ тСсты. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ сдСлали

$ ./waf

Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ посмотритС Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ../../build/debug/ns3, Ρ‚ΠΎ Ρ‚Π°ΠΌ, срСди ΠΏΡ€ΠΎΡ‡ΠΈΡ…, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° содСрТимоС этих Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя всС ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ модулями.

4.2.3 ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ ns3

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка Π² скриптС first.cc β€” это объявлСниС пространства ΠΈΠΌΠ΅Π½.

using namespace ns3;

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ns‑3 Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² пространствС ΠΈΠΌΠ΅Π½ C++, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ называСтся ns3. Π­Ρ‚ΠΎ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠ΅Ρ‚ всС ns‑3-связанныС объявлСния Π² области видимости Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ глобального пространства ΠΈΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ надССмся, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π² ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. ИспользованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° C++ Π²Π²ΠΎΠ΄ΠΈΡ‚ пространство ΠΈΠΌΠ΅Π½ ns‑3 Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ) Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Π»ΠΈΠ²Ρ‹ΠΉ способ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ послС этого объявлСния, Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ns3 :: scope ΠΏΠ΅Ρ€Π΅Π΄ всСм ΠΊΠΎΠ΄ΠΎΠΌ ns‑3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Если Π²Ρ‹ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с пространствами ΠΈΠΌΠ΅Π½, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ практичСски Π»ΡŽΠ±ΠΎΠΌΡƒ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΡƒ ΠΏΠΎ C++ ΠΈ сравнитС пространство ΠΈΠΌΠ΅Π½ ns3 с использованиСм пространства ΠΈΠΌΠ΅Π½ std ΠΈ объявлСния using namespace std; Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° cout ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

4.2.4 Π–ΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка скрипта такая,

NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ мСсто для обсуТдСния нашСй систСмы докумСнтирования Doxygen. Если Π²Ρ‹ посмотритС Π½Π° Π²Π΅Π±-сайт ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ns‑3, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ссылку «ДокумСнтация» (Documentation) Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ. Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ эту ссылку, Ρ‚ΠΎ ΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ΡΡŒ Π½Π° нашСй страницС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. БущСствуСт ссылка Π½Π° «ПослСдний Ρ€Π΅Π»ΠΈΠ·Β», которая ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ вас ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для послСднСй ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии ns‑3. Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ ссылку Β«API DocumentationΒ», Π²Ρ‹ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚Π΅ Π½Π° страницу Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ API ns‑3.

Π‘ Π»Π΅Π²ΠΎΠΉ стороны страницы Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ графичСскоС прСдставлСниС структуры Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Π₯ΠΎΡ€ΠΎΡˆΠ΅Π΅ мСсто для Π½Π°Ρ‡Π°Π»Π° β€” это Β«ΠΊΠ½ΠΈΠ³Π°Β» Modules ns‑3 Π² Π΄Π΅Ρ€Π΅Π²Π΅ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ ns‑3. Если Π²Ρ‹ раскроСтС Modules, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ список Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ns‑3. Как ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, концСпция модуля здСсь Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ связана с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π²Ρ‹ΡˆΠ΅. ΠŸΠΎΠ΄ΡΠΈΡΡ‚Π΅ΠΌΠ° Турналирования (вСдСния ΠΆΡƒΡ€Π½Π°Π»Π°, логирования) ns‑3 обсуТдаСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ИспользованиС модуля Турналирования, поэтому ΠΌΡ‹ вСрнСмся ΠΊ Π½Π΅ΠΉ ΠΏΠΎΠ·ΠΆΠ΅ Π² этом руководствС, Π½ΠΎ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ, посмотрСв Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Core, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Π² ΠΊΠ½ΠΈΠ³Ρƒ Debugging tools, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Ρ€Π°Π² страницу Logging. ΠšΠ»ΠΈΠΊΠ½ΠΈΡ‚Π΅ ΠΏΠΎ Logging.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Doxygen для модуля Logging. Π’ спискС макросов Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части страницы Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ запись для NS_LOG_COMPONENT_DEFINE. ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΏΠΎ ссылкС, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ посмотритС Β«ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС» модуля рСгистрации, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Ρ†Π΅Π»ΠΎΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠ· ΠΈΠ»ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Β«More…Β» ΠΏΠΎΠ΄ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠΎΠΉ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‰Π΅Π΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ происходит, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ ΠΈ посмотритС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ NS_LOG_COMPONENT_DEFINE. Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ здСсь, Π½ΠΎ подводя ΠΈΡ‚ΠΎΠ³, скаТу, Ρ‡Ρ‚ΠΎ эта строка ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ рСгистрации ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ FirstScriptExample, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ консоль рСгистрация сообщСний ΠΏΠΎ ссылкС Π½Π° имя.

4.2.5 Главная функция

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… строках скрипта Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅,

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

Π­Ρ‚ΠΎ просто объявлСниС основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (скрипта). Как ΠΈ Π² любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° C++, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π³Π»Π°Π²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½Π° выполняСтся ΠΏΠ΅Ρ€Π²ΠΎΠΉ. Π—Π΄Π΅ΡΡŒ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного. Π’Π°Ρˆ скрипт ns‑3 просто C++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка устанавливаСт Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π²Π½ΠΎΠ΅ 1 наносСкундС, Ρ‡Ρ‚ΠΎ являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

Time::SetResolution (Time::NS);

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ просто Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” это наимСньшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано (наимСньшая прСдставимая Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ двумя значСниями Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ эту Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, потрСбляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, поэтому, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ установлСно явно, ΠΌΡ‹ освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, прСдотвращая дальнСйшиС обновлСния. (Если Π²Ρ‹ Π½Π΅ установитС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ явно, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΉ наносСкундС, ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСна ΠΏΡ€ΠΈ Π½Π°Ρ‡Π°Π»Π΅ симуляции.)

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки сцСнария ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² вСдСния ΠΆΡƒΡ€Π½Π°Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ встроСны Π² прилоТСния EchoClient ΠΈ EchoServer:

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

Если Π²Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Logging, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ сущСствуСт нСсколько ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ подробности рСгистрации/Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅. Π­Ρ‚ΠΈ Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π° Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ INFO для эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ сСрвСров. На этом ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎ врСмя модСлирования Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ нСпосрСдствСнно ΠΊ Π΄Π΅Π»Ρƒ создания Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ запуска симуляции. ΠœΡ‹ задСйствуСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ топологичСских ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

4.2.6 ИспользованиС топологичСских ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ²

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π° Π² нашСм скриптС фактичСски создадут ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Node ns‑3, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ Π² симуляция.

NodeContainer nodes;
nodes.Create (2);

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°ΠΉΠ΄Π΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для класса NodeContainer. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса это Ρ‡Π΅Ρ€Π΅Π· Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Classes Π½Π° страницах Doxygen. Если Ρƒ вас ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Doxygen, просто ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚Π΅ Π²Π²Π΅Ρ€Ρ… Π΄ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части страницы ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Classes. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π²ΠΊΠ»Π°Π΄ΠΎΠΊ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… список классов. Под этой Π²ΠΊΠ»Π°Π΄ΠΊΠΎΠΉ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ список всСх классов ns‑3. ΠŸΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠ·, Π΄ΠΎ ns3 :: NodeContainer. Когда Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ класс, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для класса.

Как ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… абстракций являСтся ΡƒΠ·Π΅Π». Он прСдставляСт ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ собираСмся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ стСки ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ², прилоТСния ΠΈ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Π΅ ΠΊΠ°Ρ€Ρ‚Ρ‹. ВопологичСский ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ NodeContainer обСспСчиваСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ создания, управлСния ΠΈ доступа ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Node, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ создаСм для запуска симуляции. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ строка Π²Ρ‹ΡˆΠ΅ просто ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ NodeContainer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ nodes. Вторая строка Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Create для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° nodes ΠΈ просит ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° ΡƒΠ·Π»Π°. Как описано Π² Doxygen, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π² систСмС ns‑3 созданиС Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Node ΠΈ сохраняСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρƒ сСбя Π²Π½ΡƒΡ‚Ρ€ΠΈ.

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ Π² скриптС ΡƒΠ·Π»Ρ‹, ΠΏΠΎΠΊΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π² построСнии Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ являСтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π°ΡˆΠΈΡ… ΡƒΠ·Π»ΠΎΠ² ΠΊ сСти. Бамая простая Ρ„ΠΎΡ€ΠΌΠ° сСти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌ, β€” это двухточСчная связь ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΡƒΠ·Π»Π°ΠΌΠΈ. ΠœΡ‹ сСйчас создадим Ρ‚Π°ΠΊΠΎΠ΅ соСдинСниС.

PointToPointHelper

ΠœΡ‹ создаСм Π΄Π²ΡƒΡ…Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ΅ соСдинСниС, дСйствуя ΠΏΠΎ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΌΡƒ Π½Π°ΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ топологичСский Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для выполнСния Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ для соСдинСния. Напомним, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ наши ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ абстракции NetDevice ΠΈ Channel. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ эти Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΌ ΠΊΠ°Ρ€Ρ‚Π°ΠΌ ΠΈ сСтСвым кабСлям. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, эти Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ тСсно связаны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, ΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ±ΠΌΠ΅Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, устройства Ethernet ΠΏΠΎ бСспроводному ΠΊΠ°Π½Π°Π»Ρƒ. Наши топологичСскиС ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ этой тСсной связи ΠΈ поэтому Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π² этом сцСнарии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ PointToPointHelper для настройки ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ns‑3 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² PointToPointNetDevice ΠΈ PointToPointChannel. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ строки Π² сцСнарии:

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

ΠŸΠ΅Ρ€Π²Π°Ρ строка,

PointToPointHelper pointToPoint;

создаСт Π² стСкС экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° PointToPointHelper. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка,

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

Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ PointToPointHelper ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«5 ΠœΠ±ΠΈΡ‚/с» (ΠΏΡΡ‚ΡŒ ΠΌΠ΅Π³Π°Π±ΠΈΡ‚ Π² сСкунду) Π² качСствС Β«DataRateΒ».

Π‘ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, строка Β«DataRateΒ» соотвСтствуСт Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ PointToPointNetDevice. Если Π²Ρ‹ посмотритС Π½Π° Doxygen для класса ns3::PointToPointNetDevice ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ GetTypeId Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ список Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… для устройства. Π‘Ρ€Π΅Π΄ΠΈ Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Β«DataRateΒ». Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ns‑3 ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ списки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для простой настройки симуляции Π±Π΅Π· пСрСкомпиляции, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Подобно Β«DataRateΒ» Π² PointToPointNetDevice, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Β«DelayΒ», связанный с PointToPointChannel. Ѐинальная строка,

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

Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ PointToPointHelper ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«2 мс» (Π΄Π²Π΅ миллисСкунды) Π² качСствС значСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ распространСния ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ Ρ‚ΠΎΡ‡ΠΊΠ°-Ρ‚ΠΎΡ‡ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ впослСдствии создаСт.

NetDeviceContainer

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρƒ нас Π² сцСнарии Π΅ΡΡ‚ΡŒ NodeContainer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄Π²Π° ΡƒΠ·Π»Π°. Π£ нас Π΅ΡΡ‚ΡŒ PointToPointHelper, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² PointToPointNetDevices ΠΈ соСдинСния ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° PointToPointChannel. Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ использовали для создания ΡƒΠ·Π»ΠΎΠ² Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ NodeContainer, ΠΌΡ‹ попросим PointToPointHelper Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ для нас Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с созданиСм, настройкой ΠΈ установкой Π½Π°ΡˆΠΈΡ… устройств. Нам потрСбуСтся список всСх созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² NetDevice, поэтому ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ NetDeviceContainer для ΠΈΡ… хранСния Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ использовали NodeContainer для хранСния созданных Π½Π°ΠΌΠΈ ΡƒΠ·Π»ΠΎΠ². Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π°,

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

Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ настройку устройств ΠΈ ΠΊΠ°Π½Π°Π»Π°. ΠŸΠ΅Ρ€Π²Π°Ρ строка Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ устройства, упомянутый Π²Ρ‹ΡˆΠ΅, Π° вторая выполняСт ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠœΠ΅Ρ‚ΠΎΠ΄ Install ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° PointToPointHelper ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ NodeContainer ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π’Π½ΡƒΡ‚Ρ€ΠΈ NetDeviceContainer для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° находящСгося Π² NodeContainer создаСтся (для связи Ρ‚ΠΎΡ‡ΠΊΠ°-Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ Π΄Π²Π°) PointToPointNetDevice создаСтся ΠΈ сохраняСтся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ устройства. PointToPointChannel создаСтся, ΠΈ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π΄Π²Π° PointToPointNetDevices. ПослС создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ…Ρ€Π°Π½ΠΈΠ²ΡˆΠΈΠ΅ΡΡ Π² PointToPointHelper, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ….

ПослС выполнСния Π²Ρ‹Π·ΠΎΠ²Π° pointToPoint.Install (nodes) Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π° ΡƒΠ·Π»Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ с установлСнным сСтСвым устройством Β«Ρ‚ΠΎΡ‡ΠΊΠ°-Ρ‚ΠΎΡ‡ΠΊΠ°Β» ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ Β«Ρ‚ΠΎΡ‡ΠΊΠ°-Ρ‚ΠΎΡ‡ΠΊΠ°Β» ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Оба устройства Π±ΡƒΠ΄ΡƒΡ‚ настроСны Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΏΡΡ‚ΡŒ ΠΌΠ΅Π³Π°Π±ΠΈΡ‚ Π² сСкунду с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ Π² Π΄Π²Π΅ миллисСкунды.

InternetStackHelper

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас настроСны ΡƒΠ·Π»Ρ‹ ΠΈ устройства, Π½ΠΎ Π½Π° Π½Π°ΡˆΠΈΡ… ΡƒΠ·Π»Π°Ρ… Π½Π΅ установлСны стСки ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ². Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π° позаботятся ΠΎΠ± этом.

InternetStackHelper stack;
stack.Install (nodes);

InternetStackHelper β€” прСдставляСт собой топологичСский ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ для ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-стСков, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ PointToPointHelper для Π΄Π²ΡƒΡ…Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹Ρ… сСтСвыС устройств. ΠœΠ΅Ρ‚ΠΎΠ΄ Install ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ NodeContainer Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠ½ установит Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-стСк (TCP, UDP, IP ΠΈ Ρ‚. Π΄.) Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

Ipv4AddressHelper

Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΊ наши устройства ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с IP-адрСсами. ΠœΡ‹ прСдоставляСм топологичСского ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ° для управлСния распрСдСлСниСм IP-адрСсов. ЕдинствСнный Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ API β€” это установка Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ IP-адрСса ΠΈ маски сСти для использования ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ фактичСского распрСдСлСния адрСсов (это дСлаСтся Π½Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ°). Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π° Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ скрипта first.cc,

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

Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ адрСса ΠΈ говорят Π΅ΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ IP-адрСса ΠΈΠ· сСти 10.1.1.0, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для опрСдСлСния Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску 255.255.255.0. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ адрСса Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎ, поэтому ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ адрСс, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· этой Π±Π°Π·Ρ‹, Π±ΡƒΠ΄Π΅Ρ‚ 10.1.1.1, Π·Π°Ρ‚Π΅ΠΌ 10.1.1.2 ΠΈ Ρ‚.Π΄. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ систСма ns‑3 Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ всС Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ IP-адрСса ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли Π²Ρ‹ случайно создали ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован Π΄Π²Π°ΠΆΠ΄Ρ‹ (кстати, эту ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ).

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка ΠΊΠΎΠ΄Π°,

Ipv4InterfaceContainer interfaces = address.Assign (devices);

выполняСт фактичСскоС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ адрСса. Π’ ns‑3 ΠΌΡ‹ устанавливаСм связь ΠΌΠ΅ΠΆΠ΄Ρƒ IP-адрСсом ΠΈ устройством, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ipv4Interface. Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π½Π°ΠΌ ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ΅Π½ список сСтСвых устройств, созданных ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠΌ для дальнСйшСго использования, Π½Π°ΠΌ ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ΅Π½ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ipv4Interface. Ipv4InterfaceContainer прСдоставляСт эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

ΠœΡ‹ построили ΡΠ΅Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ°-Ρ‚ΠΎΡ‡ΠΊΠ°, с установлСнными стСками ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ IP-адрСсами. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ прилоТСния для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°.

4.2.7 ИспользованиС Application

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΈΠ· основных абстракций систСмы ns‑3 β€” это Application (ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅). Π’ этом сцСнарии ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Π²Π΅ спСциализации Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Application ns‑3 ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ UdpEchoServerApplication ΠΈ UdpEchoClientApplication. Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… случаях, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для настройки ΠΈ управлСния Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ UdpEchoServerHelper ΠΈ UdpEchoClientHelper ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Тизнь ΠΏΡ€ΠΎΡ‰Π΅.

UdpEchoServerHelper

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки ΠΊΠΎΠ΄Π° Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ скрипта first.cc, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для настройки прилоТСния UDP эхо сСрвСра Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡƒΠ·Π»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ создали Ρ€Π°Π½Π΅Π΅.

UdpEchoServerHelper echoServer (9);

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

ΠŸΠ΅Ρ€Π²Π°Ρ строка ΠΊΠΎΠ΄Π° Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ создаёт UdpEchoServerHelper. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, это Π½Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ само ΠΏΠΎ сСбС, это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ прилоТСния. Одно ΠΈΠ· Π½Π°ΡˆΠΈΡ… соглашСний β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² конструктор Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ°). Π’ этом случаС ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ, Ссли Π΅ΠΌΡƒ Π½Π΅ прСдоставлСн Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, этот Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ извСстСн ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ конструктору ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ° Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, просто выполняСт SetAttribute с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ПозТС, ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SetAttribute Π²Ρ‹ смоТСтС ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Β«ΠŸΠΎΡ€Ρ‚Β».

Подобно ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ UdpEchoServerHelper ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Install. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, фактичСски ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ создаСтся Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ эхо-сСрвСра ΠΈ привязываСтся ΠΊ ΡƒΠ·Π»Ρƒ. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Install ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ NodeContainter Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Install ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ.

НСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ C++, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π΅ здСсь, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° node.Get (1) (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΌΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠ·Π»Π° β€” Ptr ) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² конструкторС для Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° NodeContainer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ пСрСдаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Install. Если Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² C++ ΠΊΠΎΠ΄Π΅, ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΊΠ°ΠΊΠΎΠΉ сигнатурой компилируСтся ΠΈ выполняСтся, Ρ‚ΠΎ ΠΈΡ‰ΠΈΡ‚Π΅ срСди нСявных ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ echoServer.Install собираСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ UdpEchoServerApplication Π½Π° Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ Π² NodeContainer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для управлСния нашими ΡƒΠ·Π»Π°ΠΌΠΈ, ΡƒΠ·Π΅Π» с индСксом 1. ΠœΠ΅Ρ‚ΠΎΠ΄ Install Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° всС прилоТСния (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ΄Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ NodeContainer, содСрТащий ΠΎΠ΄ΠΈΠ½ ΡƒΠ·Π΅Π») созданный ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠΌ.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ трСбуСтся ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚ запуска Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Β«startΒ» ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ врСмя, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Β«stopΒ». ΠœΡ‹ прСдоставляСм ΠΎΠ±Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π­Ρ‚ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ApplicationContainer Start ΠΈ Stop. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° Time. Π’ этом случаС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠ²Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ C++, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π·ΡΡ‚ΡŒ C++ double 1.0 ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ns‑3 Time, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Seconds для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π² сСкунды. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° прСобразования ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈ C++ ΠΈΠΌΠ΅Π΅Ρ‚ свои собствСнныС ΠΏΡ€Π°Π²ΠΈΠ»Π°, поэтому Π²Ρ‹ Π½Π΅ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ. Π”Π²Π΅ строки,

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

ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ эхо-сСрвСра запустится (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ автоматичСски) Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½Ρƒ сСкунду послС Π½Π°Ρ‡Π°Π»Π° симуляции ΠΈ остановится (ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ) Ρ‡Π΅Ρ€Π΅Π· Π΄Π΅ΡΡΡ‚ΡŒ сСкунд симуляции. Π’ силу Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ объявили событиС модСлирования (событиС остановки прилоТСния), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π΄Π΅ΡΡΡ‚ΡŒ сСкунд, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ просимулировано Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ дСсяти сСкунд Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСти.

UdpEchoClientHelper

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ echo настраиваСтся способом, практичСски Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ сСрвСру. БущСствуСт Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ UdpEchoClientApplication, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ управляСт
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));;

Однако для эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя создания UdpEchoClientHelper. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ (Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ°) для установки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Β«RemoteAddressΒ» ΠΈ Β«RemotePortΒ» Π² соотвСтствии с нашим соглашСниСм, ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² конструктор ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ°.

Напомним, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ использовали Ipv4InterfaceContainer для отслСТивания IP-адрСсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ присвоили нашим устройствам. НулСвой интСрфСйс Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ интСрфСйсов Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ IP-адрСсу Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΡƒΠ·Π»ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ интСрфСйс Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ интСрфСйсов соотвСтствуСт IP-адрСсу ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΡƒΠ·Π»ΠΎΠ². Π˜Ρ‚Π°ΠΊ, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС ΠΊΠΎΠ΄Π° (свСрху) ΠΌΡ‹ создаСм ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ° ΠΈ сообщаСм Π΅ΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ адрСсом ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ IP-адрСс, Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΡƒΠ·Π»Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится сСрвСр. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π° дСвятый ΠΏΠΎΡ€Ρ‚.

Атрибут Β«MaxPacketsΒ» сообщаСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ максимальноС количСство ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎ врСмя модСлирования. Атрибут Β«IntervalΒ» сообщаСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ, ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Β«PacketSizeΒ» сообщаСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, насколько Π²Π΅Π»ΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ полСзная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π­Ρ‚ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ 1024-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚.

Как ΠΈ Π² случаС с эхо-сСрвСром, ΠΌΡ‹ устанавливаСм эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Start ΠΈ Stop, Π½ΠΎ здСсь ΠΌΡ‹ запускаСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‡Π΅Ρ€Π΅Π· сСкунду послС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ сСрвСра (Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π΅ сСкунды послС Π½Π°Ρ‡Π°Π»Π° симуляции).

4.2.8 Бимулятор

На этом этапС Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠΈΠΌΡƒΠ»ΡΡ†ΠΈΡŽ. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ глобальной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Simulator::Run.

Simulator::Run ();

Когда ΠΌΡ‹ Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹,

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

ΠΌΡ‹ фактичСски Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ события Π² симуляторС Π½Π° 1,0 сСкунды, 2,0 сСкунды ΠΈ Π΄Π²Π° события Π½Π° 10,0 сСкунды. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Simulator::Run, систСма Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ список Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… событий ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΡ…. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½ запустит событиС Ρ‡Π΅Ρ€Π΅Π· 1,0 сСкунды, Ρ‡Ρ‚ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ эхо-сСрвСра (это событиС ΠΌΠΎΠΆΠ΅Ρ‚, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… событий). Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ запустит событиС, Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π° t = 2,0 сСкунды, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ запустит ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, это событиС ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ событий. РСализация события запуска Π² эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ Π½Π°Ρ‡Π½Π΅Ρ‚ этап ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… модСлирования, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ² ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π° сСрвСр.

Акт ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π° сСрвСр Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π·Π° сцСной ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° эхо-сигналов Π² соотвСтствии с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ синхронизации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ установили Π² сцСнарии.

Π’ ΠΈΡ‚ΠΎΠ³Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ отправляСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚ (Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ MaxPackets Π±Ρ‹Π» установлСн Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ), Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° событий ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ этим СдинствСнным клиСнтским эхо-запросом закончится, ΠΈ симуляция ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΠΈΡΡ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ событиями Π±ΡƒΠ΄ΡƒΡ‚ события Stop для сСрвСра ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Когда эти события выполнятся, событий для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅ останСтся ΠΈ Simulator::Run Π²Π΅Ρ€Π½Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ.

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠ±Ρ€Π°Ρ‚ΡŒ Π·Π° собой. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° глобальной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Simulator::Destroy. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ² (ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня ns‑3), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² симуляторС Π±Ρ‹Π»ΠΈ вставлСны Ρ…ΡƒΠΊΠΈ для уничтоТСния всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ созданы. Π’Π°ΠΌ Π½Π΅ трСбуСтся ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ β€” всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Simulator::Destroy ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ. БистСма ns‑3 сдСлаСт эту Ρ‚Ρ€ΡƒΠ΄Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π·Π° вас. ΠžΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ строки нашСго ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ns‑3 скрипта, first.cc, Π΄Π΅Π»Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ это:

Simulator::Destroy ();
return 0;
}

Когда симулятор остановится?

ns‑3 β€” симулятор дискрСтных событий (DE). Π’ Ρ‚Π°ΠΊΠΎΠΌ симуляторС ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ событиС связано со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π΅Π³ΠΎ выполнСния, Π° симуляция продолТаСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ событий Π² порядкС ΠΈΡ… возникновСния ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ симуляции. Бобытия ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ планирования Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… событий (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСбя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ счСт Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅).

ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ события ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, IPv6 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСрвисов Π² сСти, запросы сосСдСй ΠΈ Ρ‚.Π΄. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ событиС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ Ρ‚.Π΄. Когда событиС обрабатываСтся, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ноль, ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько событий. По ΠΌΠ΅Ρ€Π΅ выполнСния симуляции, происходят события, просто Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡΡΡŒ ΠΈΠ»ΠΈ пороТдая Π½ΠΎΠ²Ρ‹Π΅. Бимуляция остановится автоматичСски, Ссли ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ событий окаТСтся пустой ΠΈΠ»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ событиС Stop. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ Stop гСнСрируСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Simulator::Stop (ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ врСмя).

БущСствуСт Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ случай, ΠΊΠΎΠ³Π΄Π° Simulator::Stop Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для остановки симуляции: ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ ΡΠ°ΠΌΠΎΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ события. Π‘Π°ΠΌΠΎΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ (ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ) события β€” это события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всСгда ΠΏΠ΅Ρ€Π΅ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Как слСдствиС, ΠΎΠ½ΠΈ всСгда ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ событий Π½Π΅ пустой. БущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, содСрТащих ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ события, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

β€’ FlowMonitor β€” пСриодичСская ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° потСрянныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹;

β€’ RIPng β€” пСриодичСская трансляция обновлСния Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ;

β€’ ΠΈ Ρ‚.Π΄.

Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Simulator::Stop Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ остановки симуляции. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° ns‑3 находится Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ эмуляции, RealtimeSimulator ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ часы симуляции с часами ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΈ Simulator::Stop Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для остановки процСсса.

МногиС ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ симуляции Π² ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ΅ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Simulator::Stop явно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ автоматичСски с исчСрпаниСм событий Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Однако эти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΡƒΡ‚ Π²Ρ‹Π·ΠΎΠ² Simulator::Stop. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ²Π½ΡƒΡŽ остановку Π½Π° 11 сСкундС:

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

Π’Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ фактичСски Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ заканчиваСтся Ρ‡Π΅Ρ€Π΅Π· 10 сСкунд. Но Ссли Π±Ρ‹ Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ врСмя остановки Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ с 11 сСкунд Π΄ΠΎ 1 сСкунды, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Π±Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ останавливаСтся Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ любой Π²Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π½Π° экран (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π²ΠΎΠ΄ происходит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· 2 сСкунды Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ симуляции).

Π’Π°ΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Simulator::Stop Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Simulator::Run; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Simulator::Run ΠΌΠΎΠΆΠ΅Ρ‚ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ для выполнСния остановки!

4.2.9 Π‘Π±ΠΎΡ€ΠΊΠ° вашСго сцСнария

ΠœΡ‹ сдСлали созданиС Π²Π°ΡˆΠΈΡ… простых скриптов Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ. ВсС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ваш скрипт Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ scratch, ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски собран, Ссли Π²Ρ‹ запуститС Waf. Π”Π°Π²Π°ΠΉ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ. Π’Π΅Ρ€Π½Π΅Ρ‚Π΅ΡΡŒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΠΈ скопируйтС examples/tutorial/first.cc Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ scratch

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ собСритС свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сцСнария, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ waf:

$ ./waf

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ сообщСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ваш ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±Ρ‹Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ создан.

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)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ собираСтС свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ scratch, Ρ‚ΠΎ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ· scratch):

$ ./waf --run scratch/myfirst

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

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

Π—Π΄Π΅ΡΡŒ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ систСма сборки провСряСт, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» Π±Ρ‹Π» собран, Π° Π·Π°Ρ‚Π΅ΠΌ запускаСт Π΅Π³ΠΎ. Π’Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ запись ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π° эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» ΠΎΠ΄ΠΈΠ½ 1024-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π° эхо-сСрвСр 10.1.1.2. Π’Ρ‹ Ρ‚ΠΎΠΆΠ΅ см. ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ вСдСния ΠΆΡƒΡ€Π½Π°Π»Π° Π½Π° эхо-сСрвСрС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 1024 Π±Π°ΠΉΡ‚Π° ΠΎΡ‚ 10.1.1.1. Π­Ρ…ΠΎ-сСрвСр ΠΌΠΎΠ»Ρ‡Π° повторяСт ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΈ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» свой ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ с сСрвСра.

4.3 ns-3 Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ использовали Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ² ns‑3, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ исходныС ΠΊΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π‘Π°ΠΌΡ‹ΠΉ свСТий ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° нашСм Π²Π΅Π±-сСрвСрС ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ссылкС: https://gitlab.com/nsnam/ns-3-dev.git. Π’Π°ΠΌ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠ²ΠΎΠ΄Π½ΡƒΡŽ страницу Mercurial для нашСго Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ns‑3. Π’ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части страницы Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ нСсколько ссылок,

summary | shortlog | changelog | graph | tags | files

Π˜Π΄ΠΈΡ‚Π΅ дальшС ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ссылку Π½Π° Ρ„Π°ΠΉΠ»Ρ‹. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π½Π°ΡˆΠΈΡ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π²:

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

Наши ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ сцСнариСв находятся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ examples. Если Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ список ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ. Один ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ tutorial β€” first.cc. Если Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ Π½Π° first.cc Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ находится Π² основном Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ src. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходный ΠΊΠΎΠ΄, Π½Π°ΠΆΠ°Π² Π½Π° имя Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈΠ»ΠΈ Π½Π°ΠΆΠ°Π² Π½Π° ссылку Ρ„Π°ΠΉΠ»Ρ‹ справа ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Если Π²Ρ‹ ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ Π½Π° дирСктория src, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ список ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ src. Если Π²Ρ‹ Π·Π°Ρ‚Π΅ΠΌ ΠΊΠ»ΠΈΠΊΠ½Π΅Ρ‚Π΅ ΠΏΠΎ ΠΏΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ core, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ список Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ (Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания этого руководства) β€” abort.h. Если Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ Π½Π° ссылку abort.h, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π° исходный Ρ„Π°ΠΉΠ» для abort.h, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ макросы для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· скриптов, Ссли ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π½Π΅Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ условия. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ использовали Π² этой Π³Π»Π°Π²Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ src/Applications/helper. НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ Ρ€Ρ‹Ρ‚ΡŒΡΡ Π² Π΄Π΅Ρ€Π΅Π²Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π³Π΄Π΅ ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² стилС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ns‑3.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com