OMNeT ++ (Objective M odular N estwork T estbed di C ++ ) Discrete Event Simulator adalah pustaka C ++ modular dan berorientasi komponen dan kerangka kerja untuk pemodelan acara diskrit , terutama digunakan untuk membuat simulator jaringan . Sederhananya, ini adalah "simulator kejadian diskrit", termasuk: IDE untuk membuat model, dan simulator itu sendiri (GUI).
Kerangka INET adalah "perpustakaan" model jaringan untuk OMNeT ++ .
GIF Penuh (15,7 MiB)
Di bagian sebelumnya ...
0. Deteksi topologi jaringan otomatis dan sakelar yang tidak dikelola. Misi Tidak Mungkin? (+ userCSS Habrahabr klasik )
Di bagian ini:
- buat protokol "Anda pertama" (menggunakan LLTR Basic sebagai contoh);
- pilih simulator kota yang sesuai untuk men-debug protokol (dan membuat modelnya);
- kita mempelajari seluk-beluk pengaturan lingkungan untuk simulator dan IDE-nya (konfigurasi, kompilasi, menghubungkan, menyetel, menambal, mengabaikan dokumentasi yang ketinggalan zaman; dan bahasa Inggris lainnya dalam jumlah besar);
- kami akan menemukan segala yang dapat Anda temui saat membuat model pertama dari protokol pertama Anda dalam simulator jaringan yang tidak dikenal;
- mari kita pergi bersama-sama:
- dari kebahagiaan yang dibawa oleh kompilasi yang sukses (akhirnya!) dari proyek pertama dengan jaringan kosong,
- sampai benar-benar tenggelam dalam eksperimen dengan model protokol yang berfungsi;
- tutorial , semuanya digambarkan sebagai tutorial - kita akan belajar dari kesalahan - kita akan membuatnya, dan kita akan memahaminya (alam) untuk secara elegan / efisien mengatasinya;
- repositori (git
), dalam komit dan tag yang semua langkahnya ( "Tambah ..." , "Perbaiki ..." , "Perbaiki ..." , "Ubah ..." , "Benar ..." , ...) disimpan, dari awal hingga akhir.
Catatan : informasi tambahan untuk pembaca hub "Mesh-network".
{volume gambar: 2.2+ (2.1) MiB; Teks: 484 KiB; Emoticon: 22 buah. }
Catatan : [tentang struktur partisi yang digunakan] struktur bagian tutorial / bagaimana - ke biasanya berbeda dari struktur bagian dalam direktori: dalam direktori, struktur bagian memungkinkan Anda untuk mencapai informasi yang Anda butuhkan dalam jumlah minimum langkah (pohon seimbang); dalam tutorial / bagaimana - ke, di mana bagian-bagian sangat terhubung secara logis, dan bagian terpisah, pada kenyataannya, adalah salah satu langkah dalam urutan langkah-langkah, struktur adalah hierarki bookmark (jangkar), yang memungkinkan Anda untuk mengingatkan (merujuk ) tentang fragmen yang dijelaskan sebelumnya.
di luar topik: tentang tag html5 <section> dan tag header <h #>
Sangat bagus bahwa tag <section>
muncul di HTML5, dengan bantuannya menjadi mungkin untuk secara langsung mengatur level nesting pada bagian (dengan memanipulasi nesting dari tag <section>
menjadi satu sama lain). Struktur teks sekarang dapat secara eksplisit tercermin dalam nesting (hierarki) tag.
Ini juga memengaruhi tag header <h#>
, seperti Karena nesting bagian ditentukan oleh nesting <section>
, maka untuk menunjukkan nama bagian, itu cukup menggunakan hanya satu <h1>
dalam bentuk: “ <section><h1> </h1> </section>
".
Saya telah menggunakan ini sejak lama (sejak kemunculan <section>
), tetapi ketika membuat artikel ini, saya melihat keuntungan lain menggunakan <section>
.
Judul bagian yang baik harus secara akurat mencerminkan esensinya, namun ada kalanya Anda perlu menyimpan (tidak mengungkapkan) esensi sampai bagian tengah bagian itu. Artinya, bagian seperti itu pertama-tama harus menjadi "rutin", dan di tengah menciptakan "wow / wtf - efek". Secara logis, ini semua - satu bagian, tetapi jika Anda mengungkapkan namanya di bagian paling awal, maka nama itu sendiri akan menjadi spoiler . Bayangkan sebuah buku (cerita detektif), di sampulnya semua informasi tentang "pembunuh".
Di sinilah tag <section>
“pergi ke tempat kejadian”. Ini memungkinkan Anda untuk menentukan nama bagian di mana saja di dalam diri Anda, yaitu tidak harus di awal. Contoh: " <section> <h1> </h1> </section>
". Ternyata kita dapat secara bersamaan menyimpan struktur logis teks, dan menunjukkan nama bagian pada waktu yang tepat. Anda bahkan dapat membuat judul bagian muncul secara visual di awal, setelah pembaca mencapai titik tertentu ( <h1>
dalam html).
Hanya dalam lebih dari 9 tahun keberadaan <section>
, browser belum belajar bagaimana cara membangun "garis besar dokumen HTML5" untuk memastikan aksesibilitas .
Kenapa kamu tidak belajar? Dalam dokumen dengan struktur yang kompleks, sulit * untuk menentukan dari tag mana (bagian, artikel, ...) penomoran judul (h1, h2, h3, ...) harus dimulai. Sekarang bayangkan bahwa dokumen itu sendiri ditempatkan pada halaman seperti ini (dengan banyak blok tambahan yang tidak terkait dengan dokumen itu sendiri, tetapi memiliki header), dan h1 digunakan di mana-mana untuk header. Dan jika pada satu halaman bukan satu dokumen, tetapi beberapa? Namun, secara visual semuanya terlihat baik ( contoh dokumen ).
* - sebenarnya tidak sulit, semuanya dijelaskan dalam standar , tetapi pada kenyataannya itu tidak berhasil (penjelasan lihat di bawah).
Mengapa semuanya terlihat baik secara visual? Di sini, berkat gaya , informasi tambahan muncul - korespondensi antara hierarki bagian dan tingkat header (h #). Jadi mungkin ketika membangun "garis besar dokumen HTML5" Anda harus menggunakan informasi dari CSS? Untuk melakukan ini, Anda perlu menambahkan properti tambahan ke elemen CSS untuk elemen judul yang menunjukkan levelnya, misalnya:
body>section>h2 { heading-level: 1; font-size: 1.8em; } body>section>section>h2 { heading-level: 2; font-size: 1.4em; } body>section>section>section>h2 { heading-level: 3; font-size: 1.17em; } body>section>section>section>section>h2 { heading-level: 4; font-size: 1em; } body>section>section>section>section>section>h2 { heading-level: 5; font-size: 0.83em; }
Atau opsi yang lebih ketat - hanya satu tajuk yang diperbolehkan dalam satu bagian. Dalam hal ini, level tajuk diatur oleh bagian itu sendiri:
body>section { heading-level: 1; } body>section>section { heading-level: 2; } body>section>section>section { heading-level: 3; } body>section>section>section>section { heading-level: 4; } body>section>section>section>section>section { heading-level: 5; }
, dan tidak masalah tag tajuk mana yang akan digunakan pada akhirnya: h1 atau h5.
Namun, jika sebelumnya membuat " heading-level outline " itu sudah cukup dengan hanya markup (HTML), sekarang kita juga perlu style (CSS). Mungkin Anda bisa membatasi diri hanya dengan markup (HTML)? Dengan pertanyaan ini, kami telah mendekati masalah algoritma konstruksi "heading-level outline" yang dijelaskan dalam standar. Jadi, masalahnya bukan pada algoritme itu sendiri, tetapi pada kenyataan bahwa hanya set tag yang terbatas (yang diperbaiki) yang dapat bertindak sebagai elemen “ root pembelahan ”. Tetapi orang sering memiliki "keinginan non-standar": "Saya ingin tag artikel menjadi elemen 'sectioning root'" pada halaman daftar artikel saya, "dan saya ingin bagian arbitrer menjadi elemen 'sectioning root'". Sebelumnya, itu cukup bagi mereka untuk menggunakan beberapa tag h1 pada satu halaman (dan mereka melakukannya). Jadi dapat memastikan bahwa bagian mana saja (tag: bagian, artikel, ...) menjadi elemen "sectioning root" jika judul di dalamnya diatur menggunakan tag h1? ..
# Langkah pertama: "sebelum pemodelan" / "brainstorming"
UFO terbang dan meninggalkan celah ini di sini ? Sisi terbalik selebaran dari artikel sebelumnya .
# Detail protokol
Pada awalnya kita mendefinisikan apa yang perlu kita sertakan dalam protokol. Pada contoh LLTR Basic.
Dasar dari LLTR adalah iterasi koleksi statistik pada banyak host selama pemindaian jaringan. Ada banyak iterasi di LLTR (> 1) , jadi hal pertama yang dimasukkan dalam protokol adalah mengontrol awal dan berhenti dari setiap iterasi. Jika kita memperhitungkan bahwa ada banyak host (> 1) , maka kontrol akan terdiri dalam menginformasikan semua host dengan cara tertentu waktu mulai iterasi dan waktu akhir iterasi. Yaitu, sinkronkan semua host.
Setiap iterasi memiliki host src unicast dan host unicast dst masing-masing, sehingga hal berikutnya yang memungkinkan adalah cara untuk menetapkan sic dan dst unicast untuk setiap iterasi. Artinya, dalam setiap iterasi, salah satu host harus “menyadari” dirinya sebagai host sic unicast, yang tujuannya adalah untuk mengirim lalu lintas ke host unicast dst.
Dan yang terakhir. Setelah menyelesaikan semua iterasi, semua statistik yang dikumpulkan dari semua host harus dikirim ke satu host untuk diproses. Tuan rumah ini akan menganalisis statistik yang dikumpulkan dan membangun topologi jaringan.
Juga, pada langkah ini, Anda mungkin berpikir tentang beberapa detail implementasi (batasan) dari protokol. Sebagai contoh, kami ingin sebuah program menggunakan LLTR untuk dapat bekerja tanpa hak root, dan dari ruang pengguna (mis. Tanpa menginstal driver khusus dalam sistem), yang berarti bahwa LLTR harus bekerja, misalnya, melalui TCP dan UDP.
Semua orang melakukan implementasi, mereka akan memutuskan sendiri dalam proses pembuatan model. Tentu saja, Anda dapat segera memikirkan semuanya dengan detail terkecil, tetapi pada saat yang sama ada risiko "tergelincir ke dalam optimal lokal" dan tidak memperhatikan opsi implementasi yang "lebih baik". Ada baiknya ketika akan ada beberapa model - jika ada model untuk setiap opsi implementasi, maka akan mungkin untuk menggabungkan model, dan langkah demi langkah mencapai implementasi yang lebih baik. Mengingat algoritma genetika ;). Sebagai contoh, dalam satu implementasi / model mungkin ada manajemen terpusat, yang lain - desentralisasi, di ketiga - kombinasi bagian terbaik dari dua opsi sebelumnya.
# Memilih simulator jaringan
Sekarang saatnya memutuskan simulator jaringan tempat kami akan membuat model dan mengatur eksperimen.
Pada dasarnya, dari simulator jaringan, kita perlu kemampuan untuk mengimplementasikan protokol "kami". Tidak semua simulator membuatnya mudah.
Tetapi kehadiran emulator OS dari peralatan jaringan nyata dari "merek dunia", sebaliknya, tidak perlu. Kemungkinan besar, emulator akan membuat banyak batasan yang hanya akan mengganggu percobaan.
Dengan pilihan simulator, artikel Mengevaluasi Alat Simulasi Jaringan (persyaratan saya untuk simulator dalam banyak hal bertepatan) dan OMNeT ++ Simulasi 'Jaringan' Umum membantu saya.
# Instal OMNeT ++ dan INET
Unduh OMNeT ++ 5.0 .
Dan karena OMNeT ++ hanyalah "simulator kejadian diskrit", Anda juga akan memerlukan INET , perpustakaan model jaringan (protokol dan perangkat). Unduh INET 3.4.0 . Bahkan, itu bisa diinstal dari IDE , tapi saya sarankan menginstalnya secara manual (nanti akan jelas kenapa).
Instalasi pada * nix dan Windows tidak jauh berbeda. Saya akan melanjutkan pada contoh Windows.
Buka paket OMNeT ++ dalam% ProgramData% (C: \ ProgramData \), dan buka file INSTALL.txt (C: \ ProgramData \ omnetpp-5.0 \ INSTALL.txt). Dikatakan bahwa petunjuk terperinci ada di "doc / InstallGuide.pdf", ada tertulis lebih lanjut bahwa jika Anda tidak ingin membacanya, maka cukup lakukan:
$. setenv
$ ./configure
$ buat
Tapi jangan buru-buru melakukannya!
Pertama, perhatikan perintah pertama . setenv
” . setenv
. " Tidak ada file " setenv
" di direktori "omnetpp-5.0" (itu dalam versi 5.0b1). Tidak diperlukan (untuk Windows), jadi jalankan saja "mingwenv.bat" (Saya menyarankan Anda untuk melihat apa yang dilakukannya sebelum memulai ... untuk menghindari rm
). Pada akhirnya, terminal akan putus (mintty).
Kedua, saya menyarankan Anda untuk memperbaiki sedikit file “configure.user” (jika parameter yang disebutkan dikomentari dalam file, maka Anda harus menghapus komentarnya):
- Jika Anda ingin menggunakan Dentang (secara default), lalu pergi
PREFER_CLANG=yes
dan konfigurasikan:- CFLAGS_RELEASE (opsi kompiler):
CFLAGS_RELEASE='-O2 -march=native -DNDEBUG=1'
- Jika Anda ingin menggunakan GCC alih-alih Dentang (dan Anda kemungkinan besar ingin menggunakan GCC setelah melihat apa yang tertulis pada baris 398 dari file “configure.in”), maka instal
PREFER_CLANG=no
dan konfigurasikan:- CFLAGS_RELEASE (opsi kompiler). Dapat memilih atau
CFLAGS_RELEASE='-O2 -mfpmath=sse,387 -ffast-math -fpredictive-commoning -ftree-vectorize -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
atau
CFLAGS_RELEASE='-O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
atau
CFLAGS_RELEASE='-O2 -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
(terletak dalam urutan terjadinya gangguan). - Layak juga menambahkan CXXFLAGS sebagai '
-std=c++11
' + CFLAGS_RELEASE. Sebagai contoh:
CXXFLAGS='-std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
- JAVA_CFLAGS (hanya tanda komentar):
JAVA_CFLAGS=-fno-strict-aliasing
PREFER_QTENV=yes
- Matikan visualisasi 3D:
WITH_OSG=no
Dia memang cantik , tetapi kita tidak akan membutuhkannya. - Sayangnya, eksekusi paralel (pada set CPU) (WITH_PARSIM) eksekusi juga harus dimatikan, tetapi tanpa itu linker gagal, jadi kami akan membiarkannya dihidupkan:
WITH_PARSIM=yes
Mengapa Anda harus mematikannya?
Jika tidak digunakan secara eksplisit, maka itu tidak diperlukan (dalam teori). Lebih detail di bagian 16.1, 16.3, dan 16.3.2 “Contoh Simulasi Paralel” di “doc / InstallGuide.pdf”, atau di sini .
Sekarang di terminal (mintty) Anda dapat melakukan:
./configure && make clean MODE=release make MODE=release –j17
Catatan : " 17
" harus diganti dengan jumlah CPU + 1 core, atau 1,5 × core.
Perhatian untuk yang penasaran (build 64bit)
Direktori "tools / win32" berisi MSYS2, paket kompilernya dapat diperbarui:
Dan OMNeT ++ dapat dibangun di bawah 64bit .
Tetapi OMNeT ++ mungkin tidak dapat dikompilasi dengan versi GCC yang lebih baru (ini adalah kasus dengan beta pertama dari versi kelima OMNeT ++ - tanpa mengedit kode sumber, biasanya dibuat hanya dengan GCC 4.x). Dan transisi ke 64bit akan membutuhkan lebih banyak usaha. Pertama, Anda perlu meninjau opsi kompilasi ( fPIC , tidak diperlukan? ). Kemudian, jika Anda menggulir kode sumber OMNeT ++ , Anda akan melihat bahwa tipe long sering digunakan di sana daripada int32_t, size_t dan ptrdiff_t (serta uintptr_t dan intptr_t) . Apa yang mengancam ini? Dalam * nix dalam rakitan 64bit (LP64), ukuran panjang akan 64bit, dan pada Windows (LLP64) akan menjadi 32bit (lihat model data ). Kita harus mengganti panjang dengan size_t dan ptrdiff_t, tetapi di sini Anda akan menemukan perangkap. Misalnya, Anda dapat membuka "src / utils / opp_lcg32_seedtool.cc" dan lihat baris 231 - index
atau Anda dapat meninggalkan 32bit (ganti dengan int32_t), atau buat 64bit dan ubah semua bitmasks + description + ((mungkin) sedikit logika). Oleh karena itu, bagian dari variabel lama harus dibiarkan 32bit, dan bagian lainnya akan 64bit. Secara umum, untuk operasi yang benar, Anda perlu melakukan semua poin dari:
Dan hal yang sama perlu dilakukan dengan banyak pustaka untuk OMNeT ++ , misalnya, dengan INET.
Secara umum, saya memperingatkan Anda agar tidak mencoba membangun perakitan OMNeT ++ 64bit.
Di bawah * nix, saya juga merekomendasikan menggunakan build 32bit (setidaknya dengan versi 5.0 dan kurang).
Mungkin suatu hari Andrey2008 akan melakukan pengecekan OMNeT ++ dan kode INET ... Sementara itu, saya sarankan hanya mencari dan melihat semua " FIXME
" / " Fix
" dalam kode ;).
PS menyebutkan bahwa kode OMNeT ++ diperiksa oleh penganalisa kode statis tidak ada, tetapi dalam file "ChangeLog" INET 3.4.0 Anda dapat menemukan 70 menyebutkan tentang memperbaiki cacat setelah pemindaian di Coverity.
OMNeT ++ menggunakan Eclipse sebagai IDE. Untuk kenyamanan, Anda dapat membuat pintasan pada IDE “% ProgramData% \ omnetpp-5.0 \ ide \ omnetpp.exe", dan letakkan di tempat yang mudah diakses. Direktori "ide / jre /" berisi JRE v1.8.0_66-b18. Jika JRE / JDK yang kompatibel sudah diinstal dalam sistem, maka direktori ide / jre / dapat dihapus dengan aman dengan menggantinya dengan tautan simbolis ke lokasi sistem JRE.
Pada awal pertama, Eclipse menyarankan menempatkan ruang kerja di direktori "samples", namun lebih baik untuk menempatkannya di direktori lain yang nyaman bagi Anda di luar "% ProgramData%". Hal utama adalah bahwa hanya huruf Latin (+ karakter) yang digunakan di jalur ke direktori baru, dan tidak ada spasi.
Setelah menutup Welcome, IDE akan menawarkan untuk menginstal INET (seperti dijelaskan di atas), dan mengimpor contoh - buang kedua poin.
Pengaturan gerhana, opsi JVM, plugin dan tema tambahan
Opsi JVM . Tambahkan "ide / omnetpp.ini" ke file (editor apa pun yang memahami umpan garis LF cocok untuk diedit; notepad tidak akan berfungsi), menyimpan baris kosong terakhir:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:+TieredCompilation -XX:CompileThreshold=100
Untuk membuat Eclipse seperti yang ada di gambar, lihat ke dalam gambar.
Inilah saatnya untuk menginstal INET. Direktori "inet" dari arsip yang diunduh sebelumnya (inet-3.4.0-src.tgz) harus ditransfer ke ruang kerja. Ada file "INSTALL" di direktori dengan deskripsi langkah-demi-langkah instalasi. Anda dapat menggunakannya (bagian "Jika Anda menggunakan IDE"), tetapi jangan membangun proyek (Bangun)!
INET impor:
- Di Eclipse, buka: File> Impor.
- Pilih: Umum / Proyek yang Ada ke Ruang Kerja.
- Sebagai "direktori root" pilih lokasi ruang kerja.
- Pastikan opsi "Salin proyek ke ruang kerja" tidak aktif.
- Setelah mengklik tombol "Selesai", tunggu sampai pengindeksan proyek selesai (% selesai, lihat di bawah, di bilah status - " C / C ++ Pengindeks").
Siapkan proyek:
- A. nonaktifkan komponen yang tidak perlu untuk LLTR;
- B. mengalihkan perakitan untuk melepaskan;
- C. singkirkan OMNeT ++ Make Builder glitches (opp_makemake) - sebelumnya, ketika dipilih, Makefile sering dibuat ulang, bahkan ketika itu tidak diperlukan;
- D. memungkinkan kompilasi paralel ;
- E. nyalakan optimisasi;
- F. aktifkan penyorotan sintaks untuk c ++ 11 , di beberapa tempat;
- G. perbaiki bug yang terkait dengan "
#include
" (itu terjadi jika Anda mengubah "Builder saat ini" beberapa kali; itu bisa terjadi dalam kasus lain).
Sebelum mengatur {A}, Anda harus memperbaiki salah satu file proyek. Dalam file "inet / .oppfeatures" terdapat baris " inet.examples.visualization
" Anda perlu menambahkan baris kosong setelahnya untuk menulis " inet.tutorials.visualization
", lebih disukai menjaga indentasi di sebelah kiri (dengan analogi dengan parameter lain " nedPackages
" dalam file ) Jika ini tidak dilakukan, maka tidak ada hal buruk yang akan terjadi, tepat setelah pengaturan di "Masalah" (Alt + Shift + Q, X) akan selalu ada kesalahan yang terkait dengan " inet.tutorials.visualization
". Pertama-tama Anda dapat membuat {A} , dan melihat kesalahan, dan kemudian memperbaiki file "inet / .oppfeatures" - pada saat yang sama, Eclipse akan memperingatkan tentang pelanggaran integritas dalam pengaturan dan menawarkan untuk memperbaikinya (kami setuju untuk ini).
Mari kita mulai (panel "Project Explorer"> proyek "inet"> menu konteks> Properti ):
- OMNeT ++ Bagian > Subbagian Fitur Fitur Proyek
- {A} hapus semuanya kecuali:
- TCP Common
- TCP (INET)
- Protokol IPv4
- Protokol UDP
- Ethernet
- Tombol "Terapkan".
- Bagian “C / C ++ Build”:
- Tombol "Kelola Konfigurasi ..."> aktifkan "gcc-release" {B} aktif;
- pilih konfigurasi "gcc-release [Active]" {B} .
- Subbagian “Editor Rantai Alat”:
- sebagai "Pembuat saat ini" pilih "GNU Make Builder" untuk kedua konfigurasi: "gcc-debug" dan "gcc-release" {C} , perhatikan : jika Anda mengubah "Pembuat saat ini" di masa mendatang, Anda harus mengkonfigurasi ulang semuanya!
- Tombol "Terapkan".
- Tab "Perilaku" (kembali ke akar bagian "C / C ++ Build"):
- atur "Use parallel jobs" ke N (N adalah jumlah core CPU +1 , atau 1,5 × core) - ini akan memungkinkan semua core CPU digunakan untuk mengkompilasi {D} (konfigurasikan untuk "gcc-debug" dan "gcc- lepaskan ”).
- Bangun Pengaturan Tab:
- nonaktifkan “Use default build command”;
- ganti baris "Bangun perintah" dengan "
make MODE=release CONFIGNAME=${ConfigName} -j17
" (ganti " 17
" dengan nilai sebelumnya di baris, yaitu dengan N yang dipilih) {E} , Anda dapat melakukan hal yang sama untuk konfigurasi "gcc-debug", ganti " MODE=release
" dengan " MODE=debug
" di baris, setelah itu jangan lupa untuk kembali ke "gcc-release [Active]".
- Tombol "Terapkan".
- Bagian "C / C ++ Umum":
- Subbagian “Jalur dan Simbol”:
- Tab "Termasuk":
- Tambahkan tombol: tambahkan direktori "
../src
" dengan "Tambahkan ke semua konfigurasi" dan "Tambahkan ke semua bahasa" yang dipilih {G} - awalnya " ../src
" dalam bahasa "GNU C ++ ", tetapi pada saat yang tidak pasti , itu dapat dihapus dari daftar; - Tombol "Terapkan", dan periksa bahwa "
../src
" muncul dalam semua bahasa dan konfigurasi.
- Simbol Tab:
- Tombol Tambahkan: tambahkan simbol "
__cplusplus
" dengan nilai " 201103L
" dan "Tambahkan ke semua konfigurasi" dan "Tambahkan ke semua bahasa" yang dipilih - {F} lebih banyak ; - Tombol "Terapkan", dan periksa bahwa dalam konfigurasi "debug gcc", "
__cplusplus
" memiliki nilai " 201103L
".
- Tab Lokasi Sumber:
- Periksa apakah ada satu item dalam daftar dan menunjuk ke "
/inet/src
" {G} , jika ada sesuatu yang lain (misalnya, hanya " /inet
"), lalu hapus apa yang ada dan tambahkan ("Tambah Folder ... ")" /inet/src
". Kemudian tombol "Terapkan", dan kembali ke {A} , karena semua filter dihapus selama penghapusan. Ngomong-ngomong, " /inet
" sebenarnya bisa dibiarkan - semuanya baik-baik saja dengan itu, tetapi lebih baik mempersempitnya ke " /inet/src
" yang asli.
- Subbagian “Pra-Prosesor Termasuk Jalur, Marcos dll.” > Tab "Penyedia":
- Pilih “Pengaturan Kompilator bawaan CDT GCC”:
- Di grup "Opsi Penyedia Pengaturan Bahasa", klik tautan "Pengaturan Ruang Kerja":
- "Discovery" tab: lagi pilih "CDT GCC Build-in Compiler Settings", dan tambahkan "
-std=c++11
" sebelum " ${FLAGS}
" di "Command untuk mendapatkan spesifikasi kompiler", seharusnya terlihat seperti ` ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}"
` {F} , detail lebih lanjut di sini dan di sini ; - tombol "Terapkan", "Oke" (tutup jendela).
- pindahkan "CDT GCC Build-in Compiler Settings" di atas "Entri Sistem Build CDT Managed" (untuk kedua konfigurasi: "gcc-release" dan "gcc-debug") {F} , lebih jelasnya - setelah itu kita akan kehilangan kemampuan untuk mendefinisikan kembali karakter "CDT Pengaturan Kompilator Bangun GCC ”melalui“ Entri Sistem Bangun yang Dikelola oleh CDT ”( “ C / C ++ Umum ”> “ Jalur dan Simbol ”> “ Simbol ”), Anda hanya dapat menimpanya dengan menambahkan nilai ke“ Entri Pengaturan Pengguna CDT ” “Entries” (: , .. “CDT Managed Build System Entries” “
__cplusplus
”; , “ __cplusplus
__cplusplus
” “CDT Managed Build System Entries”, , ); - “Apply”, , “Entries” “GNU C++ ” “CDT GCC Build-in Compiler Settings” ( [ ] “Show build-in values” ) “
__cplusplus=201103L
” ( ).
- “Indexer”:
- “Build configuration for indexer” “gcc-release” {B} ;
- “Apply”.
{E} . Saya akan jelaskan. , Eclipse , “configure.user” OMNeT++ (./configure). Eclipse g++ make. , , , . , “Build command” {E} “ --just-print
” “ --trace
”, , ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C), ‑ “ g++ -c -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1 …
”. , .
( “Project Explorer” > “inet” > > Properties ):
- “/++ Build”:
- “Build Variables” (, “gcc-release [ Active ]”):
- “Add…”, “
CFLAGS
”, “String”, “ -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe
”; - “Add…”, “
CXXFLAGS
”, “String”, “ -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe
”; - “Apply”.
- “Environment”:
- “Add…”, “
CFLAGS
”, “ ${CFLAGS}
”; - “Add…”, “
CXXFLAGS
”, “ ${CXXFLAGS}
”; - “Apply”.
, , g++ , “ --just-print
” “ --trace
”, Process Explorer . Process Explorer , “ -march=native
” “cc1plus.exe”.
, , INET! , “gcc-release” {B} , “ --just-print
” “ --trace
” {E} , . ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C).
, Eclipse, “.cproject” “.settings” {BG} , : “.oppfeatures”, “.oppfeaturestate”, “.nedexclusions” – {A} .
, , .
Note : , – “doc” OMNeT++ INET. Simulation Manual User Guide, Stack Overflow ( stackoverflow.com, ). , , , , “” .
Note : , OMNeT++ INET, , INET GitHub. 3.4.0 ( , INET ).
INET, , . , ?
INET “Project Explorer”, “inet/src/inet/applications”, “ udpapp ” (UDP Application). UDP broadcast . , , , , “ UDPEchoApp ”. “UDPBasicApp”, “Basic”. “.cc”, “.h” “.ned” . , “.ned” , ( “parameters:
” ) .
. , ( inet/examples ) INET. , “broadcast” ( inet/examples/inet/broadcast )! “.cc”, “.h” “.ned”, “.ini” “.xml” . , :
, (“broadcast”) , .. . , , .
Note : Simulation Manual . , , ( RAM) . JS ‑ bookmark let . , Simulation Manual, ( ), ( target
Simulation Manual). Bookmarklet . , , Simulation Manual , bookmarklet .
bookmarklet , ?
bookmarklet . . 5- . bookmarklet , .
⇒ bookmarklet – ; bookmarklet , ( 5- ) – .
“LLTR”, “src” “simulations”, “gcc-release” (File → New → OMNeT++ Project…):
“inet”, . , “gcc-debug” (.. “LLTR”), “inet”. : {A,B,G} “Project References”, “inet”.
, Wizard, , “package.ned” : “src”, “simulations”. – “ package lltr;
” “ package lltr.simulations;
” . .
INET, “inet/src” – “LLTR/src”, “inet/examples” – “LLTR/simulations”. “LLTR/simulations” “.ned” c Network , “LLTR/src” – ().
– INET , INET, , INET. , – INET.
, “.ned” “LLTR/src” ( “inet/src”), “ package lltr.simulations;
” “LLTR/simulations”. “package.ned” “LLTR/src” “LLTR/simulations”.
LLTR. “LLTR/simulations/omnetpp.ini”, ( Run > Run As > 1 OMNeT++ Simulation):
Eclipse “simulations” . , : “LLTR/src/LLTR.exe” . , “LLTR.exe” , ( Project → Build Project), ( ).
“No network specified in the configuration.”, , “ network = lltr. Network
” “ [General]
” “omnetpp .ini ”, “ network Network {}
” “package .ned ”. ( “.ned” ), ( “.ini” ) ( Network – ) .
( Run > Run As > 1 OMNeT++ Simulation), () Network .
Note : ( Run > Run As > 1 OMNeT++ Simulation), ( Run > 1 simulations): , .. , , Eclipse .
Note : ( – a1_v0.1.0 (“a” – article) “ git checkout -b ‹my_branch› tags/a1_v0.1.0
”) 
, :
- tutorial git;
- tutorial – ;
- () , (article) – ( : “article_#”), / ;
- , “” tutorial.
Note : “article_#” , , , ( ), /.
“ ”? , GitHub , :
, , “ git checkout -b ‹ my_branch › tags/‹tag_name›
”.
, .. ? Pull Request, >:-), , , , ):
, , Pull Request .
Note : , : , ( “ ” () , ). “ -u ” , . , “a1_v0.1. 0 ”, “a1_v0.2. 0 ”, … – “a1_v0.1. 1 ”, “a1_v0.2. 1 ”, … , : “a1_v0.1. 2 ”, “a1_v0.2. 2 ”, …
Note : tutorial , “”, git
, git tag.
Note : git diff , , ( , / ) ( AST ), Java .
# (Link Layer Topology Reveal)
# −1:
“package.ned” ( “Design” ), :
, broadcast :
- – StandardHost;
- – EtherSwitch.
“” ( ) Eth100M (: 100 Mbps; : 10 ). , 10 , , ? ( )
( “Source” ), (git tag a1_v0.2.0)
. :
package ‹<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:packages"> </a>›;
Warning : <a>...</a>
– “” . , , , ( <strong>...</strong>
, <em>...</em>
).
“ ” (Gates) :
- Gates , , gate “
‹ ›.‹gate›[‹›]
”, – “ ‹ ›.‹gate› ++
”. - (: “
… <--> { delay = 100ms; } <--> …
”), / , ( broadcast : “ … <--> C <--> …
”), (: “ … <--> FastEthernet {per = 1e-6;} <--> …
”), … - Gates ( :
output
/ input
; : -->
/ <--
), ( : inout
; : <-->
). , , “ $i
” “ $o
” .
Warning : 1 ⁄ 3 20 ( 504 “Gateway Time-out”). 1 ⁄ 3 . ( ):
<a href="#set">: “<code>set: p=1.87548</code>”</a> .
:
<a href="#set"><code>: “set: p=1.87548</code>”</a> .
, 3‑ . :
, <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:inout-gates"> “<strong><code>$i</code></strong>” “<strong><code>$o</code></strong>”</a>.
, . , , GitHub Pages:

Note : target
Simulation Manual – bookmarklet ', . « →» , .
Note : , CSS JS – , 3 , GitHub Pages 2‑ ( HTML, , , , ‑). 3‑ – .
# / To be continued…
- 2.
- 3. OMNeT++
- 4.
- 5. OMNeT++ 2
- 6.
- 7. (‑: “ ”)

. . – . – .