OMNeT ++ (الهدف النشط للعلامات التجارية المعتمد في C ++ ) محاكي الأحداث المنفصلة عبارة عن مكتبة وإطار عمل C ++ معياري موجه للمكونات لنمذجة الأحداث المنفصلة ، تُستخدم في المقام الأول لإنشاء محاكيات الشبكة . ببساطة ، هذا هو "محاكاة حدث منفصل" ، بما في ذلك: IDE لإنشاء النماذج ، والمحاكي نفسه (GUI).
إن INET Framework عبارة عن "مكتبة" لنماذج الشبكات لـ OMNeT ++ .
ملف GIF كامل (15.7 ميجابايت)
في الأجزاء السابقة ...
0. الكشف التلقائي عن مخطط الشبكة والتبديل غير المُدار. مهمة مستحيلة؟ (+ برنامج Habrahabr UserCSS الكلاسيكي )
في هذا الجزء:
- إنشاء بروتوكول "الأول" (باستخدام LLTR Basic كمثال) ؛
- اختيار محاكي المدينة المناسب لتصحيح البروتوكول (وإنشاء نموذجه) ؛
- نتعلم التفاصيل الدقيقة لإعداد البيئة للمحاكي و IDE الخاص به (التكوين والتجميع والربط والضبط والتصحيح وتجاهل الوثائق القديمة ؛ والإنجليزية الأخرى بأعداد كبيرة) ؛
- سنواجه كل ما يمكن أن تواجهه عند إنشاء نموذجك الأول من بروتوكولك الأول في محاكي شبكة غير مألوف ؛
- دعنا نذهب معا على طول الطريق:
- من السعادة التي حققها التجميع الناجح (أخيرًا!) للمشروع الأول بشبكة فارغة ،
- حتى الانغماس التام في التجارب مع نموذج بروتوكول فعال ؛
- برنامج تعليمي ، كل شيء يوصف بأنه برنامج تعليمي - سنتعلم من الأخطاء - سنرتكبها ، وسوف نفهمها (الطبيعة) من أجل التعامل معها بأناقة / كفاءة ؛
- مستودع (بوابة
) ، في عمليات التنفيذ والعلامات التي يتم حفظ جميع الخطوات منها ( "إضافة ..." ، "إصلاح ..." ، "إصلاح ..." ، "تعديل ..." ، "تصحيح ..." ، ...) من البداية إلى النهاية.
ملاحظة : معلومات إضافية لقراء محور "الشبكة المتداخلة".
{حجم الصور: 2.2+ (2.1) MiB ؛ النص: 484 كيلوبايت ؛ الرموز: 22 قطعة. }}
ملاحظة : [حول هيكل القسم المستخدم] عادة ما يختلف هيكل الأقسام التعليمية / كيفية التنفيذ عن هيكل القسم في الدليل: في الدليل - تسمح لك بنية القسم بالوصول إلى المعلومات التي تحتاجها في الحد الأدنى من الخطوات (شجرة متوازنة) ؛ في البرنامج التعليمي / كيفية - حيث ، حيث ترتبط الأقسام بشكل قوي منطقياً ، وقسم منفصل ، في الواقع ، هو أحد الخطوات في تسلسل الخطوات ، الهيكل هو التسلسل الهرمي للإشارات المرجعية (نقاط الارتساء) ، والذي يسمح لك بالتذكير (راجع ) حول الجزء الموصوف سابقًا.
خارج الموضوع: حول علامة html5 <section> وعلامات الرأس <h #>
من الجيد أن تظهر علامة <section>
في HTML5 ، بمساعدتها أصبح من الممكن تعيين مستوى تداخل القسم مباشرة (من خلال معالجة تداخل علامات <section>
في بعضها البعض). يمكن الآن أن تنعكس بنية النص بشكل صريح في تداخل (التسلسل الهرمي) للعلامات.
وقد أثر ذلك أيضًا في علامات الرأس <h#>
، مثل الآن يتم تحديد تداخل الأقسام من خلال تداخل علامة <section>
، ثم للإشارة إلى اسم القسم - كان يكفي استخدام علامة واحدة فقط <h1>
في النموذج: " <section><h1> </h1> </section>
".
لقد استخدمت هذا لفترة طويلة (منذ ظهور <section>
) ، ولكن عند إنشاء هذه المقالة ، رأيت ميزة أخرى لاستخدام <section>
.
يجب أن يعكس عنوان القسم الجيد جوهره بدقة ، ومع ذلك ، هناك أوقات تحتاج فيها إلى الحفاظ على (عدم الكشف) عن الجوهر حتى منتصف القسم. أي أن مثل هذا القسم يجب أن يصبح "روتينيًا" أولاً ، وفي الوسط يخلق "تأثير رائع / wtf -". منطقياً ، هذا كل شيء - قسم واحد ، ولكن إذا كشفت عن اسمه في بداية القسم ، فسيكون الاسم نفسه مفسدًا . تخيل كتابًا (قصة بوليسية) ، على غلافه كل المعلومات حول "القاتل".
هذا هو المكان الذي تنتقل فيه علامة <section>
إلى "المشهد". يسمح لك بتحديد اسم القسم في أي مكان داخل نفسك ، أي ليس بالضرورة في البداية. مثال: " <section> <h1> </h1> </section>
". اتضح أنه يمكننا حفظ البنية المنطقية للنص في نفس الوقت ، وإظهار اسم القسم في الوقت المناسب. يمكنك أيضًا جعل عنوان القسم يظهر بشكل مرئي في بدايته ، بعد أن يصل القارئ إلى نقطة معينة (علامة <h1>
في html).
خلال ما يزيد قليلاً عن 9 سنوات من وجود <section>
، لم تتعلم المتصفحات كيفية إنشاء "مخطط مستند HTML5" بشكل صحيح لضمان إمكانية الوصول .
لماذا لم تتعلم؟ في مستند بهيكل معقد ، من الصعب * تحديد أي علامة (قسم ، مقالة ، ...) يجب أن يبدأ ترقيم العناوين (h1 ، h2 ، h3 ، ...). تخيل الآن أنه تم وضع المستند نفسه على صفحة مثل هذه (مع العديد من الكتل الإضافية التي لا تتعلق بالمستند نفسه ، ولكن تحتوي على رؤوس) ، ويتم استخدام h1 في كل مكان للرؤوس. وإذا كان على صفحة واحدة لا وثيقة واحدة ، ولكن عدة؟ ومع ذلك ، يبدو كل شيء بصريًا جيدًا ( مثال المستند ).
* - في الواقع ليس الأمر صعبًا ، كل شيء موصوف في المعيار ، ولكنه في الواقع لا يعمل (الشرح انظر أدناه).
لماذا يبدو كل شيء جيدًا بصريًا؟ هنا ، وبفضل الأنماط ، ظهرت معلومات إضافية - المراسلات بين التسلسل الهرمي للقسم ومستويات العنوان (h #). لذا ربما عند إنشاء "مخطط مستند HTML5" ، يجب استخدام المعلومات من CSS؟ للقيام بذلك ، تحتاج إلى إضافة خاصية إضافية إلى عنصر CSS لعنصر العنوان الذي يشير إلى مستواه ، على سبيل المثال:
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; }
أو خيار أكثر صرامة - يُسمح برأس واحد فقط في قسم واحد. في هذه الحالة ، يتم تعيين مستوى الرأس بواسطة القسم نفسه:
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; }
، ولا يهم أي علامة رأس سيتم استخدامها في النهاية: h1 أو h5.
ومع ذلك ، إذا كان إنشاء مخطط تفصيلي على مستوى العنوان سابقًا ، كان يكفي أن يكون لديك فقط ترميز (HTML) ، والآن نحتاج أيضًا إلى أنماط (CSS). ربما يمكنك أن تقصر نفسك على الترميز فقط (HTML)؟ مع هذا السؤال ، اقتربنا من مشكلة خوارزمية البناء "مخطط مستوى العنوان" الموضحة في المعيار. لذا ، فإن المشكلة ليست في الخوارزمية نفسها ، ولكن في حقيقة أن مجموعة محدودة (ثابتة) من العلامات يمكن أن تعمل كعنصر " جذر التقسيم ". ولكن غالبًا ما يكون لدى الأشخاص "رغبات غير قياسية": "أريد أن تكون علامة المقالة عنصر" قسم التقسيم "في صفحة قائمة المقالات الخاصة بي ،" وأريد أن يصبح القسم التعسفي عنصر "قسم التقسيم". في السابق ، كان يكفيهم استخدام العديد من علامات h1 في صفحة واحدة (وقد فعلوا ذلك). لذا تأكد من أن أي قسم (العلامات: القسم ، المقالة ، ...) يصبح عنصر "جذر التقسيم" إذا تم تعيين العنوان فيه باستخدام علامة h1؟ ..
# الخطوات الأولى: "قبل النمذجة" / "العصف الذهني"
طارت الأجسام الغريبة وتركت هذه الفجوة هنا ؟ الجزء الخلفي من النشرة من المقالة السابقة .
# تفاصيل البروتوكول
في البداية نحدد ما نحتاج إلى تضمينه في البروتوكول. على سبيل المثال LLTR Basic.
أساس LLTR هو تكرارات جمع الإحصائيات على مضيفين متعددين أثناء فحص الشبكة. هناك العديد من التكرارات في LLTR (> 1) ، لذا فإن أول شيء يتم تضمينه في البروتوكول هو التحكم في بدء وإيقاف كل تكرار. إذا أخذنا في الاعتبار أن هناك الكثير من المضيفين (> 1) ، فسيكون عنصر التحكم هو إعلام جميع المضيفين بطريقة معينة بوقت بدء التكرار ووقت انتهاء التكرار. أي مزامنة جميع المضيفين.
تحتوي كل عملية تكرار على مضيف أحادي الإرسال الخاص بها ومضيف التوقيت الأحادي الإرسال ، لذا فإن الشيء التالي الذي يجب تشغيله هو كيفية تعيين أحادي الإرسال src و dst لكل تكرار. أي أنه في كل تكرار ، يجب أن يكون أحد المضيفين "على دراية" بنفسه كمضيف أحادي الإرسال ، والغرض منه إرسال حركة المرور إلى مضيف البث الأحادي.
والأخير. عند الانتهاء من جميع التكرارات ، يجب إرسال جميع الإحصائيات المجمعة من جميع المضيفين إلى مضيف واحد للمعالجة. سيقوم هذا المضيف بتحليل الإحصائيات التي تم جمعها وبناء طوبولوجيا الشبكة.
أيضًا ، في هذه الخطوة ، قد تفكر في بعض تفاصيل التنفيذ (القيود) للبروتوكول. على سبيل المثال ، نريد أن يكون برنامج يستخدم LLTR قادرًا على العمل بدون حقوق الجذر ، ومن مساحة المستخدم (أي بدون تثبيت برنامج تشغيل خاص في النظام) ، مما يعني أن LLTR يجب أن يعمل ، على سبيل المثال ، عبر TCP و UDP.
قام أي شخص آخر بالتنفيذ ، وسوف يقرروا بأنفسهم في عملية إنشاء النموذج. هذا ، بالطبع ، يمكنك التفكير على الفور في كل شيء حتى أدق التفاصيل ، ولكن في الوقت نفسه هناك خطر "الانزلاق إلى المثلى المحلي" وعدم ملاحظة خيار تنفيذ "أفضل". من الجيد أن يكون هناك العديد من النماذج - إذا كان هناك نموذج لكل خيار تنفيذ ، فسيكون من الممكن الجمع بين النماذج والتقدم خطوة بخطوة نحو تنفيذ أفضل. تذكر الخوارزمية الجينية ;). على سبيل المثال ، في تنفيذ / نموذج واحد قد تكون هناك إدارة مركزية ، في أخرى - لامركزية ، في الثالث - مزيج من أفضل الأجزاء من الخيارين السابقين.
# اختيار محاكي للشبكة
الآن حان الوقت لاتخاذ قرار بشأن محاكي الشبكة الذي سنقوم فيه بإنشاء نماذج وإعداد تجارب.
في الأساس ، من محاكي الشبكة ، نحتاج إلى القدرة على تنفيذ بروتوكول "لدينا". ليس كل المحاكيات تجعل الأمر سهلاً.
لكن وجود محاكي أنظمة تشغيل لمعدات الشبكة الحقيقية لـ "العلامات التجارية العالمية" ، على العكس من ذلك ، ليس ضروريًا. على الأرجح ، ستنشئ المحاكيات العديد من القيود التي لن تتداخل إلا مع التجارب.
مع اختيار المحاكي ، ساعدني المقال تقييم أدوات محاكاة الشبكة (تزامنت متطلباتي للمحاكي في كثير من النواحي) ومحاكاة OMNeT ++ العامة `` للشبكة '' .
# تثبيت OMNeT ++ و INET
تنزيل OMNeT ++ 5.0 .
وبما أن OMNeT ++ ليست سوى "محاكي حدث منفصل" ، فستحتاج أيضًا إلى INET ، وهي مكتبة من نماذج الشبكات (البروتوكولات والأجهزة). تنزيل INET 3.4.0 . في الواقع ، يمكن تثبيته من IDE ، ولكن أوصي بتثبيته يدويًا (في وقت لاحق سيكون من الواضح لماذا).
لا يختلف التثبيت على * nix و Windows كثيرًا. سأستمر في مثال Windows.
قم بفك حزم OMNeT ++ في٪ ProgramData٪ (C: \ ProgramData \) ، وافتح الملف INSTALL.txt (C: \ ProgramData \ omnetpp-5.0 \ INSTALL.txt). تقول أن التعليمات التفصيلية موجودة في "doc / InstallGuide.pdf" ، كما أنه مكتوب أيضًا أنه إذا كنت لا تريد قراءتها ، فما عليك سوى القيام بما يلي:
$. سيتينف
$ ./configure
جعل $
ولكن لا تتسرع في القيام بذلك!
أولاً ، انتبه إلى الأمر الأول " . setenv
. setenv
. " لا يوجد ملف " setenv
" في دليل "omnetpp-5.0" (كان في الإصدار 5.0b1). ليست هناك حاجة (لنظام التشغيل Windows) ، لذا فقط قم بتشغيل "mingwenv.bat" (أنصحك بمعرفة ما يفعله قبل البدء ... لتجنب rm
). في النهاية ، سوف تنقطع المحطة (mintty).
ثانيًا ، أنصحك بتصحيح ملف "config.user" قليلاً (إذا تم التعليق على المعلمة المذكورة في الملف ، فأنت بحاجة إلى إلغاء تعليقها):
- إذا كنت تريد استخدام Clang (افتراضيًا) ، فاخرج
PREFER_CLANG=yes
وتكوين:- CFLAGS_RELEASE (خيارات المترجم):
CFLAGS_RELEASE='-O2 -march=native -DNDEBUG=1'
- إذا كنت تريد استخدام GCC بدلاً من Clang (وعلى الأرجح تريد استخدام GCC بعد رؤية ما هو مكتوب في السطر 398 من ملف "config.in") ، فقم بتثبيت
PREFER_CLANG=no
وتكوين:- CFLAGS_RELEASE (خيارات المترجم). يمكن اختيار أو
CFLAGS_RELEASE='-O2 -mfpmath=sse,387 -ffast-math -fpredictive-commoning -ftree-vectorize -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
أو
CFLAGS_RELEASE='-O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
أو
CFLAGS_RELEASE='-O2 -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
(تقع بترتيب تنازلي لحدوث الخلل). - من الجدير أيضًا إضافة CXXFLAGS كـ '
-std=c++11
' + CFLAGS_RELEASE. على سبيل المثال:
CXXFLAGS='-std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
- JAVA_CFLAGS (فقط تعليق):
JAVA_CFLAGS=-fno-strict-aliasing
PREFER_QTENV=yes
- إيقاف تشغيل التمثيل البصري ثلاثي الأبعاد:
WITH_OSG=no
إنها بالتأكيد جميلة ، لكننا لن نحتاجها. - لسوء الحظ ، يجب أيضًا إيقاف تنفيذ محاكاة (WITH_PARSIM) بالتوازي (على مجموعة من وحدات المعالجة المركزية) ، ولكن بدون فشل الرابط ، سنتركها قيد التشغيل:
WITH_PARSIM=yes
لماذا يجب إيقاف تشغيله؟
إذا لم يتم استخدامه بشكل صريح ، فلا حاجة إليه (نظريًا). مزيد من التفاصيل في الأقسام 16.1 و 16.3 و 16.3.2 "مثال المحاكاة المتوازية" في "doc / InstallGuide.pdf" أو هنا .
الآن في المحطة (mintty) يمكنك القيام بما يلي:
./configure && make clean MODE=release make MODE=release –j17
ملحوظة : يجب استبدال " 17
" بعدد نواة CPU + 1 أو 1.5 × نوى.
تحذير للفضول (بناء 64 بت)
يحتوي دليل "أدوات / win32" على MSYS2 ، يمكن تحديث حزم المترجم الخاصة به:
ويمكن بناء OMNeT ++ تحت 64 بت .
ولكن قد لا يتم تجميع OMNeT ++ ببساطة مع إصدار أحدث من GCC (كان هذا هو الحال مع الإصدار التجريبي الأول من الإصدار الخامس من OMNeT ++ - بدون تحرير التعليمات البرمجية المصدر ، فإنه عادةً ما يتم بناؤه فقط مع GCC 4.x). وسيتطلب الانتقال إلى 64 بت مزيدًا من الجهد. تحتاج أولاً إلى مراجعة خيارات التجميع ( fPIC ، وليس هناك حاجة؟ ). بعد ذلك ، إذا قمت بالتمرير عبر شفرة مصدر OMNeT ++ ، فسترى أن النوع الطويل يُستخدم غالبًا هناك بدلاً من int32_t و size_t و ptrdiff_t (بالإضافة إلى uintptr_t و intptr_t) . ماذا يهدد هذا؟ في * nix في تجميع 64 بت (LP64) ، سيكون الحجم الطويل 64 بت ، وفي Windows (LLP64) سيكون 32 بت (انظر نماذج البيانات ). سيتعين علينا استبدالها بحجم size_t و ptrdiff_t طويلاً ، ولكن هنا ستجد المزالق. على سبيل المثال ، يمكنك فتح "src / utils / opp_lcg32_seedtool.cc" وإلقاء نظرة على السطر 231 - index
أو يمكنك ترك 32 بت (استبدال بـ int32_t) ، أو إنشاء 64 بت وتعديل كل bitmasks + الأوصاف + (ربما) القليل من المنطق. لذلك ، يجب ترك جزء من المتغيرات الطويلة 32 بت ، والجزء الآخر سيكون 64 بت. بشكل عام ، للتشغيل الصحيح ، تحتاج إلى القيام بجميع النقاط من:
ونفس الشيء يجب القيام به مع العديد من المكتبات لـ OMNeT ++ ، على سبيل المثال ، مع INET.
بشكل عام ، أحذرك من محاولة بناء تجميع OMNeT ++ 64 بت.
تحت * nix ، أوصي أيضًا باستخدام بنية 32 بت (على الأقل مع الإصدار 5.0 وأقل).
ربما في يوم من الأيام سوف يتعهد Andrey2008 بالتحقق من كود OMNeT ++ و INET ... في هذه الأثناء ، أقترح فقط العثور على جميع " FIXME
" / " Fix
" Fix
في الرمز ;..
يذكر PS أن كود OMNeT ++ تم فحصه بواسطة محلل رمز ثابت مفقود ، ولكن في ملفات "ChangeLog" INET 3.4.0 يمكنك العثور على 70 إشارة حول إصلاح العيوب بعد المسح في Coverity.
يستخدم OMNeT ++ Eclipse كـ IDE. من أجل الراحة ، يمكنك إنشاء اختصار على IDE "٪ ProgramData٪ \ omnetpp-5.0 \ ide \ omnetpp.exe" ، ووضعه في مكان يسهل الوصول إليه. يحتوي الدليل "ide / jre /" على JRE v1.8.0_66-b18. إذا كان JRE / JDK متوافقًا مثبتًا بالفعل في النظام ، فيمكن حذف الدليل ide / jre / بأمان عن طريق استبداله برابط رمزي إلى موقع JRE للنظام.
في البداية ، يقترح Eclipse وضع مساحة العمل في دليل "العينات" ، ولكن من الأفضل وضعها في أي دليل آخر مناسب لك خارج "٪ ProgramData٪". الشيء الرئيسي هو أنه يتم استخدام الأحرف اللاتينية فقط (+ الأحرف) في المسار إلى الدليل الجديد ، ولا توجد مسافات.
بعد إغلاق الترحيب ، سيعرض IDE تثبيت INET (كما هو موضح أعلاه) ، واستيراد الأمثلة - تجاهل كلتا النقطتين.
إعدادات الكسوف ، خيارات JVM ، الإضافات والموضوعات الإضافية
خيارات JVM . أضف "ide / omnetpp.ini" إلى الملف (أي محرر يفهم تغذية سطر LF مناسب للتحرير ؛ لن تعمل المفكرة) ، مع حفظ السطر الفارغ الأخير:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:+TieredCompilation -XX:CompileThreshold=100
لجعل الكسوف مثل الذي في الصورة ، انظر داخل الصورة.
حان الوقت لتثبيت INET. يجب نقل دليل "inet" من الأرشيف الذي تم تنزيله مسبقًا (inet-3.4.0-src.tgz) إلى مساحة العمل. يوجد ملف "INSTALL" في الدليل مع وصف خطوة بخطوة للتثبيت. يمكنك استخدامه (القسم "إذا كنت تستخدم IDE") ، ولكن لا تقم ببناء مشروع (Build)!
استيراد INET:
- في Eclipse ، افتح: ملف> استيراد.
- حدد: مشروعات عامة / موجودة في مساحة العمل.
- بصفتك "الدليل الجذر" ، حدد موقع مساحة العمل.
- تأكد من إيقاف تشغيل خيار "نسخ المشاريع في مساحة العمل".
- بعد النقر على زر "إنهاء" ، انتظر حتى تكتمل فهرسة المشروع (٪ من الاكتمال ، انظر أدناه ، في شريط الحالة - "مفهرس C / C ++ ").
انشاء المشروع:
- A. تعطيل المكونات غير الضرورية لـ LLTR ؛
- B. تبديل التجمع لتحرير ؛
- تخلص من خلل OMNeT ++ Make Builder (opp_makemake) - في وقت سابق ، عندما تم تحديده ، غالبًا ما تم تجديد ملف Makefile ، حتى عندما لم يكن مطلوبًا ؛
- د- تمكين التجميع الموازي ؛
- E. تشغيل التحسينات ؛
- F. تشغيل تمييز بناء الجملة لـ c ++ 11 في عدة أماكن ؛
- G. أصلح الخطأ المتعلق بـ "
#include
" (يحدث إذا قمت بتغيير "المنشئ الحالي" عدة مرات ؛ ويمكن أن يحدث في حالات أخرى).
قبل إعداد {A} ، تحتاج إلى إصلاح أحد ملفات المشروع. في ملف "inet / .oppfeatures" يوجد سطر " inet.examples.visualization
" تحتاج إلى إضافة سطر فارغ بعده لكتابة " inet.tutorials.visualization
" ، ويفضل إبقاء المسافة البادئة على اليسار (عن طريق القياس مع المعلمات الأخرى " nedPackages
" في الملف ) إذا لم يتم ذلك ، فلن يحدث أي شيء سيئ ، بعد الإعداد مباشرةً في "المشاكل" (Alt + Shift + Q ، X) ستكون هناك دائمًا أخطاء مرتبطة بـ " inet.tutorials.visualization
". يمكنك أولاً إنشاء {A} ، وإلقاء نظرة على الأخطاء ، ثم إصلاح ملف "inet / .oppfeatures" - وفي الوقت نفسه ، سيحذر Eclipse من انتهاك النزاهة في الإعدادات ويعرض إصلاحها (نحن نوافق على ذلك).
فلنبدأ (لوحة "Project Explorer"> مشروع "inet"> قائمة السياق> الخصائص ):
- قسم OMNeT ++> القسم الفرعي لميزات المشروع
- {A} إزالة كل شيء باستثناء:
- مشترك TCP
- TCP (INET)
- بروتوكول IPv4
- بروتوكول UDP
- إيثرنت
- زر "تطبيق".
- قسم "بناء C / C ++":
- زر "إدارة التهيئة ..."> تنشيط "إصدار دول مجلس التعاون الخليجي" {B} ؛
- حدد التكوين "gcc-release [نشط]" {B} .
- القسم الفرعي "محرر سلسلة الأدوات":
- بصفتك "الباني الحالي" حدد "GNU Make Builder" لكلا التكوينين: "gcc-debug" و "gcc-release" {C} ، لاحظ : إذا قمت بتغيير "الباني الحالي" في المستقبل ، فسيتعين عليك إعادة تكوين كل شيء!
- زر "تطبيق".
- علامة التبويب "السلوك" (العودة إلى جذر قسم "بناء C / C ++"):
- اضبط "استخدام الوظائف الموازية" على N (إما أن N هو عدد نوى وحدة المعالجة المركزية + 1 أو 1.5 × نوى) - سيسمح هذا باستخدام جميع نوى وحدة المعالجة المركزية للترجمة {D} (تكوين لـ "gcc-debug" و "gcc- الإفراج ").
- علامة تبويب إعدادات الإنشاء:
- تعطيل "استخدام أمر البناء الافتراضي" ؛
make MODE=release CONFIGNAME=${ConfigName} -j17
السطر "Build command" بـ " make MODE=release CONFIGNAME=${ConfigName} -j17
" ( make MODE=release CONFIGNAME=${ConfigName} -j17
" 17
" بالقيمة السابقة في السطر ، أي بـ N المحدد) {E} ، يمكنك أن تفعل نفس الشيء لتهيئة "gcc-debug" ، مع استبدال " MODE=release
" بـ " MODE=debug
" في السطر ، بعد ذلك لا تنسى العودة إلى "gcc-release [Active]".
- زر "تطبيق".
- قسم "C / C ++ عام":
- القسم الفرعي "المسارات والرموز":
- علامة التبويب "تتضمن":
- زر الإضافة: أضف الدليل "
../src
" مع تحديد "إضافة إلى جميع التكوينات" و "إضافة إلى جميع اللغات" {G} - مبدئيًا " ../src
" باللغة "GNU C ++ " ، ولكن في لحظة غير مؤكدة ، يمكن حذفه من القائمة ؛ - الزر "تطبيق" ، وتحقق من
../src
" ../src
" بكل اللغات والتكوينات.
- علامة تبويب الرموز:
- زر الإضافة: أضف الرمز "
__cplusplus
" بقيمة " 201103L
" و "إضافة إلى جميع التكوينات" المحددة و "إضافة إلى جميع اللغات" - {F} أخرى ؛ - الزر "تطبيق" ، وتحقق من أن "
__cplusplus
" في تكوين "gcc-debug" له القيمة " 201103L
".
- علامة تبويب موقع المصدر:
- تحقق من وجود عنصر واحد في القائمة ويشير إلى "
/inet/src
" {G} ، إذا كان هناك شيء آخر (على سبيل المثال ، فقط " /inet
") ، فاحذف ما هو وأضف ("Add Folder" ... ")" /inet/src
". ثم زر "تطبيق" ، والعودة إلى {A} ، لأن تم حذف جميع الفلاتر أثناء الحذف. بالمناسبة ، يمكن ترك " /inet
" في الواقع - كل شيء يسير على ما يرام أيضًا ، ولكن من الأفضل تضييقه إلى " /inet/src
" الأصلي.
- القسم الفرعي "المعالج المسبق يشمل المسارات وماركوس وما إلى ذلك" > علامة التبويب "الموفرون":
- حدد "إعدادات مترجم CDT GCC البناء":
- في مجموعة "خيارات موفر إعدادات اللغة" ، انقر فوق الرابط "إعدادات مساحة العمل":
- علامة التبويب "Discovery": حدد "CDT GCC Build-in Compiler Settings" مرة أخرى ، وأضف "
-std=c++11
" قبل " ${FLAGS}
" في "Command للحصول على مواصفات المحول البرمجي" ، يجب أن تبدو مثل " ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}"
" {F} ، مزيد من التفاصيل هنا وهنا ؛ - زر "تطبيق" ، "موافق" (أغلق النافذة).
- نقل "إعدادات مترجم البناء CDT GCC" فوق "إدخالات نظام البناء المُدار CDT" (لكلا التكوينين: "gcc-release" و "gcc-debug") {F} ، مزيد من التفاصيل - بعد ذلك سوف نفقد القدرة على إعادة تعريف الأحرف "CDT إعدادات مترجم البناء في دول مجلس التعاون الخليجي "من خلال" إدخالات نظام البناء المُدار بواسطة CDT "( " C / C ++ عام "> " المسارات والرموز "> " الرموز ") ، يمكنك تجاوزه فقط عن طريق إضافة قيم إلى" إدخالات إعدادات مستخدم 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} . سأشرح. , 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. (‑: “ ”)

. . – . – .