OMNeT ++ ( C ++ में ऑब्जेक्टिव M ओड्यूलर N एस्टवर्क T) डिबेट इवेंट सिम्युलेटर एक मॉड्यूलर, कंपोनेंट-ओरिएंटेड C ++ लाइब्रेरी है और असतत-इवेंट मॉडलिंग के लिए फ्रेमवर्क, मुख्य रूप से नेटवर्क सिमुलेटर बनाने के लिए उपयोग किया जाता है। सीधे शब्दों में कहें, यह एक "असतत घटना सिम्युलेटर" है, जिसमें शामिल हैं: मॉडल बनाने के लिए एक आईडीई और स्वयं सिम्युलेटर (जीयूआई)।
INET फ्रेमवर्क OMNeT ++ के लिए नेटवर्क मॉडल का "पुस्तकालय" है ।
पूर्ण GIF (15.7 MiB)
पिछले भागों में ...
0. स्वचालित नेटवर्क टोपोलॉजी का पता लगाने और अप्रबंधित स्विच। मिशन असंभव? (+ क्लासिक हैब्राहाब यूजरसीएसएस )
इस भाग में:
- "अपना पहला" प्रोटोकॉल बनाएं (उदाहरण के लिए LLTR बेसिक का उपयोग करके);
- प्रोटोकॉल डिबगिंग (और इसके मॉडल बनाने) के लिए उपयुक्त शहर सिम्युलेटर चुनें;
- हम सिम्युलेटर और इसकी IDE (कॉन्फ़िगरेशन, संकलन, लिंकिंग, ट्यूनिंग, पैचिंग, पुराने दस्तावेज़ों की अनदेखी, और बड़ी संख्या में अन्य अंग्रेजी) के लिए पर्यावरण स्थापित करने की सूक्ष्मता सीखते हैं;
- हम
एक अपरिचित नेटवर्क सिम्युलेटर में अपने पहले प्रोटोकॉल का पहला मॉडल बनाते समय आपका सामना कर सकते हैं। - चलो सब साथ चलते हैं:
- खाली नेटवर्क के साथ पहली परियोजना के सफल (अंत में!) संकलन द्वारा लाई गई खुशी से;
- जब तक एक कामकाजी प्रोटोकॉल मॉडल के साथ प्रयोगों में पूरी तरह से डूब न जाए;
- ट्यूटोरियल , हर चीज को एक ट्यूटोरियल के रूप में वर्णित किया जाता है - हम गलतियों से सीखेंगे - हम उन्हें बनाएंगे, और हम उनके साथ (प्रकृति) समझदारी से / कुशलता से निपटने के लिए समझेंगे;
- रिपॉजिटरी (git)
), उन कमिट्स और टैग्स में, जिनके सभी स्टेप्स ( "Add ..." , "Fix ..." , "Fix ..." , "संशोधित ..." , "Correct ..." , ...) शुरू से अंत तक सेव रहते हैं।
नोट : "जाल-नेटवर्क" हब के पाठकों के लिए अतिरिक्त जानकारी ।
{छवियों की मात्रा: 2.2+ (2.1) MiB; पाठ: 484 KiB; इमोटिकॉन्स: 22 पीसी। }
नोट : [प्रयुक्त विभाजन संरचना के बारे में] ट्यूटोरियल की संरचना / कैसे-कैसे वर्गों आमतौर पर निर्देशिका में अनुभाग संरचना से अलग है: निर्देशिका में - अनुभाग संरचना आपको उन सूचनाओं तक पहुंचने की अनुमति देती है जिनकी आपको न्यूनतम संख्या में चरणों (संतुलित पेड़) में आवश्यकता होती है; ट्यूटोरियल में / कैसे - जहां अनुभाग दृढ़ता से तार्किक रूप से जुड़े हुए हैं, और एक अलग अनुभाग, वास्तव में, चरणों के अनुक्रम में एक कदम है, संरचना बुकमार्क (एंकर) का एक पदानुक्रम है, जो आपको याद दिलाने की अनुमति देता है (संदर्भ) ) पहले वर्णित टुकड़े के बारे में।
बंद - विषय: html5 <अनुभाग> टैग और हेडर टैग के बारे में <h #>
यह अच्छा है कि HTML5 में <section>
टैग दिखाई दिया, इसकी सहायता से अनुभाग के घोंसले के स्तर को सीधे सेट करना संभव हो गया ( <section>
के घोंसले के शिकार को एक दूसरे में जोड़कर)। पाठ संरचना अब टैग के नेस्टिंग (पदानुक्रम) में स्पष्ट रूप से परिलक्षित हो सकती है।
इसने हेडर टैग <h#>
भी प्रभावित किया अब अनुभागों का नेस्टिंग <section>
द्वारा निर्धारित किया जाता है, फिर <section>
के नाम को इंगित करने के लिए - यह केवल एक टैग <h1>
का उपयोग करने के लिए पर्याप्त था: " <section><h1> </h1> </section>
"।
मैं लंबे समय से इसका उपयोग कर रहा हूं ( <section>
की उपस्थिति के बाद से), लेकिन इस लेख को बनाते समय, मैंने <section>
का उपयोग करने का एक और फायदा देखा।
एक अच्छा अनुभाग शीर्षक को इसके सार को सटीक रूप से प्रतिबिंबित करना चाहिए, हालांकि, ऐसे समय होते हैं जब आपको अनुभाग के मध्य तक सार को रखने (खुलासा नहीं) करने की आवश्यकता होती है। यही है, इस तरह के एक खंड को पहले "नियमित" होना चाहिए, और बीच में एक "वाह / wtf - प्रभाव" बनाएं। तार्किक रूप से, यह सब एक खंड है, लेकिन यदि आप अनुभाग की शुरुआत में इसका नाम प्रकट करते हैं, तो नाम स्वयं एक बिगाड़ने वाला होगा । एक पुस्तक (जासूसी कहानी) की कल्पना करें, जिसके कवर पर "हत्यारा" के बारे में सभी जानकारी होगी।
यह वह जगह है जहां <section>
टैग "दृश्य पर जाता है"। यह आपको अपने अंदर कहीं भी अनुभाग का नाम निर्धारित करने की अनुमति देता है, अर्थात्। जरूरी नहीं कि शुरुआत में ही। उदाहरण: " <section> <h1> </h1> </section>
"। यह पता चला है कि हम एक साथ पाठ की तार्किक संरचना को बचा सकते हैं, और सही समय पर अनुभाग का नाम दिखा सकते हैं। आप पाठक के एक निश्चित बिंदु (HTML में <h1>
) तक पहुंचने के बाद, अनुभाग की उपाधि को नेत्रहीन रूप से इसकी शुरुआत में भी बना सकते हैं।
<section>
के अस्तित्व के केवल 9 वर्षों में, ब्राउज़र ने यह नहीं सीखा है कि पहुंच सुनिश्चित करने के लिए "HTML5 दस्तावेज़ रूपरेखा" को ठीक से कैसे बनाया जाए ।
आपने क्यों नहीं सीखा? एक जटिल संरचना वाले दस्तावेज़ में, यह निर्धारित करना मुश्किल है कि किस टैग (अनुभाग, लेख, ...) से शीर्षकों की संख्या (h1, h2, h3, ...) शुरू होनी चाहिए। अब कल्पना करें कि दस्तावेज़ को इस तरह से एक पृष्ठ पर रखा गया है (कई अतिरिक्त ब्लॉकों के साथ जो दस्तावेज़ से संबंधित नहीं हैं, लेकिन हेडर हैं), और हेडर्स के लिए हर जगह एच 1 का उपयोग किया जाता है। और अगर एक पृष्ठ पर एक दस्तावेज़ नहीं है, लेकिन कई हैं? हालांकि, नेत्रहीन सब कुछ अच्छा लगता है ( उदाहरण दस्तावेज़ )।
* - वास्तव में यह मुश्किल नहीं है, सब कुछ मानक में वर्णित है, लेकिन वास्तव में यह काम नहीं करता है (स्पष्टीकरण नीचे देखें)।
क्यों सब कुछ नेत्रहीन अच्छा लगता है? यहां, शैलियों के लिए धन्यवाद, अतिरिक्त जानकारी दिखाई दी - अनुभाग पदानुक्रम और हेडर स्तर (एच #) के बीच पत्राचार। तो हो सकता है कि "HTML5 डॉक्यूमेंट की रूपरेखा" बनाते समय आपको 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) की भी आवश्यकता है। शायद आप अपने आप को सिर्फ मार्कअप (एचटीएमएल) तक सीमित कर सकते हैं? इस प्रश्न के साथ, हम मानक में वर्णित "हेडिंग-स्तरीय रूपरेखा" निर्माण एल्गोरिदम की समस्या के करीब आ गए हैं। तो, समस्या स्वयं एल्गोरिथ्म में नहीं है, लेकिन इस तथ्य में कि केवल टैग का एक सीमित (निश्चित) सेट " सेक्शनिंग रूट " तत्व के रूप में कार्य कर सकता है। लेकिन लोगों को अक्सर "गैर-मानक इच्छाएं" होती हैं: "मैं अपने लेख सूची पृष्ठ पर लेख टैग को 'सेक्शनिंग रूट' तत्व होना चाहता हूं," और मैं चाहता हूं कि मनमाना खंड 'सेक्शनिंग रूट' तत्व बन जाए "। पहले, उनके लिए एक पृष्ठ पर कई h1 टैग का उपयोग करना पर्याप्त था (और उन्होंने किया)। तो यह सुनिश्चित कर सकते हैं कि कोई भी खंड (टैग: अनुभाग, लेख, ...) एक "सेक्शनिंग रूट" तत्व बन जाता है अगर इसमें शीर्षक h1 टैग का उपयोग करके सेट किया गया है? ..
# पहला कदम: "मॉडलिंग से पहले" / "बुद्धिशीलता"
यूएफओ ने उड़ान भरी और इस अंतर को यहां छोड़ दिया ? पिछले लेख से लीफलेट का उल्टा पक्ष ।
# प्रोटोकॉल विस्तार
शुरुआत में हम परिभाषित करते हैं कि हमें प्रोटोकॉल में क्या शामिल करना है। एलएलटीआर बेसिक के उदाहरण पर।
एलएलटीआर का आधार नेटवर्क स्कैनिंग के दौरान कई मेजबानों पर सांख्यिकी संग्रह की पुनरावृत्तियों है। LLTR (> 1) में कई पुनरावृत्तियां हैं, इसलिए प्रोटोकॉल में शामिल होने वाली पहली चीज प्रत्येक प्रवाह की शुरुआत और रोक को नियंत्रित कर रही है। यदि हम इस बात का ध्यान रखते हैं कि बहुत सारे होस्ट (> 1) हैं , तो नियंत्रण में सभी मेजबानों को एक निश्चित तरीके से सूचित करना होगा जिसमें पुनरावृत्ति का प्रारंभ समय और पुनरावृत्ति का अंत समय होगा। यही है, सभी मेजबानों को सिंक्रनाइज़ करें।
प्रत्येक पुनरावृत्ति का अपना यूनिकास्ट src होस्ट और यूनिकस्ट dst होस्ट है, इसलिए सक्षम करने के लिए अगली बात यह है कि प्रत्येक पुनरावृत्ति के लिए unicast src और dst असाइन करने का तरीका है। यही है, प्रत्येक पुनरावृत्ति में, मेजबान में से एक को एक यूनिकस्ट src होस्ट के रूप में खुद को "जागरूक" होना चाहिए, जिसका उद्देश्य यूनिकस्ट डीटीएस होस्ट को ट्रैफ़िक भेजना है।
और आखिरी वाला। सभी पुनरावृत्तियों के पूरा होने पर, सभी मेजबानों के सभी एकत्रित आंकड़ों को प्रसंस्करण के लिए एक मेजबान को भेजा जाना चाहिए। यह मेजबान एकत्रित आंकड़ों का विश्लेषण करेगा और नेटवर्क टोपोलॉजी का निर्माण करेगा।
इसके अलावा, इस चरण में, आप प्रोटोकॉल के कुछ कार्यान्वयन विवरणों (सीमाओं) के बारे में सोच सकते हैं। उदाहरण के लिए, हम चाहते हैं कि एलएलटीआर का उपयोग करने वाला एक प्रोग्राम रूट अधिकारों के बिना काम करने में सक्षम हो, और उपयोगकर्ता स्थान से (यानी सिस्टम में एक विशेष ड्राइवर स्थापित किए बिना), जिसका अर्थ है कि एलएलटीआर को काम करना चाहिए, उदाहरण के लिए, टीसीपी और यूडीपी पर।
बाकी सभी ने कार्यान्वयन किया, वे मॉडल बनाने की प्रक्रिया में खुद के लिए फैसला करेंगे। यही है, ज़ाहिर है, आप तुरंत सब कुछ के माध्यम से छोटी से छोटी विस्तार से सोच सकते हैं, लेकिन एक ही समय में "स्थानीय इष्टतम में फिसलने" और "बेहतर" कार्यान्वयन विकल्प को नोटिस नहीं करने का जोखिम है। यह अच्छा है जब कई मॉडल होंगे - यदि प्रत्येक कार्यान्वयन विकल्प के लिए एक मॉडल है, तो मॉडल को गठबंधन करना संभव होगा, और कदम से कदम एक बेहतर कार्यान्वयन के लिए आएगा। आनुवंशिक एल्गोरिथ्म याद रखना ; ;। उदाहरण के लिए, एक कार्यान्वयन / मॉडल में केंद्रीय प्रबंधन हो सकता है, दूसरे में - विकेंद्रीकृत, तीसरे में - पिछले दो विकल्पों में से सर्वश्रेष्ठ भागों का एक संयोजन।
# एक नेटवर्क सिम्युलेटर चुनना
अब एक नेटवर्क सिम्युलेटर पर निर्णय लेने का समय है जिसमें हम मॉडल बनाएंगे और प्रयोग स्थापित करेंगे।
मूल रूप से, एक नेटवर्क सिम्युलेटर से, हमें "हमारे" प्रोटोकॉल को लागू करने की क्षमता की आवश्यकता होती है। सभी सिमुलेटर इसे आसान नहीं बनाते हैं।
लेकिन "विश्व ब्रांडों" के वास्तविक नेटवर्क उपकरणों के ओएस एमुलेटर की उपस्थिति, इसके विपरीत, आवश्यक नहीं है। सबसे अधिक संभावना है, एमुलेटर कई सीमाएं बनाएंगे जो केवल प्रयोगों में हस्तक्षेप करेंगे।
सिम्युलेटर की पसंद के साथ, लेख का मूल्यांकन नेटवर्क सिमुलेशन उपकरण (कई मायनों में सिम्युलेटर के लिए मेरी आवश्यकताएं मेल खाती हैं) और OMNeT ++ जनरल 'नेटवर्क' सिमुलेशन ने मेरी मदद की।
# OMNeT ++ और INET स्थापित करें
डाउनलोड OMNeT ++ 5.0 ।
और चूंकि OMNeT ++ सिर्फ एक "असतत घटना सिम्युलेटर" है, इसलिए आपको नेटवर्क मॉडल (प्रोटोकॉल और डिवाइस) की लाइब्रेरी INET की भी आवश्यकता होगी। डाउनलोड करें INET 3.4.0 । वास्तव में, इसे आईडीई से इंस्टॉल किया जा सकता है , लेकिन मैं इसे मैन्युअल रूप से इंस्टॉल करने की सलाह देता हूं (बाद में यह स्पष्ट होगा कि क्यों)।
* निक्स और विंडोज पर इंस्टालेशन ज्यादा अलग नहीं है। मैं विंडोज के उदाहरण पर जारी रखूंगा।
OMNeT ++ को% ProgramData% (C: \ ProgramData \) में अनपैक करें, और INSTALL.txt (C: \ ProgramData \ omnetpp-5.0 \ INSTALL.txt) फ़ाइल खोलें। यह कहता है कि विस्तृत निर्देश "doc / InstallGuide.pdf" में हैं, यह आगे लिखा है कि यदि आप इसे नहीं पढ़ना चाहते हैं, तो बस करें:
$। setenv
$ ./configure
$ बना
लेकिन इसे करने के लिए जल्दी मत करो!
सबसे पहले, पहले कमांड पर ध्यान दें . setenv
” . setenv
। " "Omnetpp-5.0" निर्देशिका में "सेटेनव" फ़ाइल नहीं है (यह संस्करण 5.0b1 में था)। इसकी आवश्यकता नहीं है (विंडोज के लिए), इसलिए बस "mingwenv.bat" चलाएं (मैं आपको यह देखने के लिए सलाह देता हूं कि शुरू करने से पहले यह क्या करता है ... rm
से बचने के लिए )। अंत में, टर्मिनल टूट जाएगा (मिनिटेट)।
दूसरे, मैं आपको "config.user" फ़ाइल को सही करने के लिए सलाह देता हूं (यदि उल्लिखित पैरामीटर को फ़ाइल में टिप्पणी की गई है, तो आपको इसे अनसुना करने की आवश्यकता है):
- यदि आप क्लैंग (डिफ़ॉल्ट रूप से) का उपयोग करना चाहते हैं, तो छोड़ दें
PREFER_CLANG=yes
और कॉन्फ़िगर करें:- CFLAGS_RELEASE (संकलक विकल्प):
CFLAGS_RELEASE='-O2 -march=native -DNDEBUG=1'
- यदि आप Clang के स्थान पर GCC का उपयोग करना चाहते हैं (और आप संभवतः "कॉन्फ़िगर.in" फ़ाइल की पंक्ति 398 में जो लिखा है उसे देखने के बाद GCC का उपयोग करना चाहते हैं, तो इंस्टॉल करें
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
- 3D दृश्य बंद करें:
WITH_OSG=no
वह निश्चित रूप से सुंदर है , लेकिन हमें इसकी आवश्यकता नहीं होगी। - दुर्भाग्य से, समानांतर (सीपीयू के एक सेट पर) सिमुलेशन (with_PARSIM) निष्पादन को भी बंद कर दिया जाना चाहिए, लेकिन इसके बिना लिंकर विफल हो जाता है, इसलिए हम इसे चालू छोड़ देंगे:
WITH_PARSIM=yes
आपको इसे बंद क्यों करना चाहिए?
यदि इसका स्पष्ट रूप से उपयोग नहीं किया जाता है, तो इसकी आवश्यकता नहीं है (सिद्धांत में)। 16.1, 16.3, और 16.3.2 खंडों में अधिक विवरण "समानांतर अनुकार उदाहरण" में "doc / InstallGuide.pdf", या यहाँ ।
अब टर्मिनल (मिनिटेट) में आप कर सकते हैं:
./configure && make clean MODE=release make MODE=release –j17
नोट : " 17
" को सीपीयू + 1 कोर की संख्या या 1.5 × कोर द्वारा प्रतिस्थापित किया जाना चाहिए।
जिज्ञासु के लिए सावधानी (64 बिट का निर्माण)
"उपकरण / win32" निर्देशिका में MSYS2 है, इसके संकलक संकुल को अद्यतन किया जा सकता है:
और OMNeT ++ को 64bit के तहत बनाया जा सकता है।
लेकिन OMNeT ++ को केवल GCC के नए संस्करण के साथ संकलित नहीं किया जा सकता है (यह OMNeT ++ के पांचवें संस्करण के पहले बीटा के साथ मामला था - स्रोत कोड को संपादित किए बिना, यह आमतौर पर केवल GCC 4.x के साथ बनाया गया था)। और 64 बिट में परिवर्तन के लिए और भी अधिक प्रयास की आवश्यकता होगी। पहले आपको संकलन विकल्पों ( fPIC , आवश्यक नहीं? ) की समीक्षा करने की आवश्यकता है। फिर, यदि आप OMNeT ++ स्रोत कोड के माध्यम से स्क्रॉल करते हैं, तो आप देखेंगे कि टाइप लंबे समय अक्सर वहाँ int32_t, size_t और ptrdiff_t (साथ ही uintptr_t और intptr.t) के बजाय उपयोग किया जाता है। इससे क्या खतरा है? 64 बिट (LP64) असेंबली में * nix में, लंबा आकार 64 बिट होगा, और विंडोज (LLP64) में यह 32 बिट होगा ( डेटा मॉडल देखें)। हमें size_t और ptrdiff_t के साथ लंबे समय को बदलना होगा, लेकिन यहां आपको नुकसान मिलेगा। उदाहरण के लिए, आप "src / utils / opp_lcg32_seedtool.cc" को खोल सकते हैं और 231 - index
देख सकते हैं या आप 32bit (int32_t के साथ बदलें) को छोड़ सकते हैं, या 64 बिट बना सकते हैं और सभी बिटमास्क + विवरण + (संभवतः) थोड़ा तर्क बदल सकते हैं। इसलिए, लंबे चर के हिस्से को 32 बिट छोड़ना होगा, और दूसरा भाग 64 बिट होगा। सामान्य तौर पर, सही संचालन के लिए, आपको सभी बिंदुओं को करने की आवश्यकता है:
और एक ही चीज़ को OMNeT ++ के लिए कई पुस्तकालयों के साथ किया जाना चाहिए, उदाहरण के लिए, INET के साथ।
सामान्य तौर पर, मैं आपको 64 बिट OMNeT ++ असेंबली बनाने की कोशिश के खिलाफ चेतावनी देता हूं ।
* निक्स के तहत, मैं 32 बिट बिल्ड (कम से कम संस्करण 5.0 और उससे कम के साथ) का उपयोग करने की भी सलाह देता हूं।
शायद किसी दिन Andrey2008 OMNeT ++ और INET कोड की जांच करने का कार्य करेगा ... इस बीच, मैं ;। कोड में सभी " FIXME
" / " Fix
" को खोजने और देखने का सुझाव देता हूं।
PS का उल्लेख है कि OMNeT ++ कोड की जाँच एक स्थिर कोड एनालाइज़र द्वारा की गई थी , लेकिन "ChangeLog" INET 3.4.0 फ़ाइलों में आप कवरेज में स्कैन करने के बाद दोषों को ठीक करने के बारे में 70 उल्लेख पा सकते हैं।
OMNeT ++ एक आईडीई के रूप में ग्रहण का उपयोग करता है। सुविधा के लिए, आप IDE "% ProgramData% \ omnetpp-5.0 \ ide \ omnetpp.exe" पर एक शॉर्टकट बना सकते हैं, और इसे आसानी से सुलभ जगह पर रख सकते हैं। निर्देशिका "ide / jre /" में JRE v1.8.0_66-b18 शामिल है। यदि सिस्टम में संगत JRE / JDK पहले से इंस्टॉल है, तो ide / jre / निर्देशिका को सिस्टम JRE के स्थान पर एक प्रतीकात्मक लिंक के साथ बदलकर सुरक्षित रूप से हटाया जा सकता है।
पहली शुरुआत में, एक्लिप्स ने कार्यक्षेत्र को "नमूनों" निर्देशिका में रखने का सुझाव दिया है, हालांकि इसे "% प्रोग्रामडैट%" के बाहर आपके लिए सुविधाजनक किसी भी अन्य निर्देशिका में रखना बेहतर है। मुख्य बात यह है कि नई निर्देशिका के मार्ग में केवल लैटिन अक्षरों (+ वर्ण) का उपयोग किया जाता है, और कोई स्थान नहीं है।
वेलकम बंद करने के बाद, IDE INET स्थापित करने की पेशकश करेगा (जैसा कि ऊपर वर्णित है), और उदाहरणों को आयात करें - दोनों बिंदुओं को त्यागें।
ग्रहण सेटिंग्स, जेवीएम विकल्प, अतिरिक्त प्लगइन्स और थीम
जेवीएम विकल्प । फ़ाइल में "ide / omnetpp.ini" जोड़ें (कोई भी संपादक जो एलएफ लाइन फीड को समझता है संपादन के लिए उपयुक्त है; नोटपैड काम नहीं करेगा), अंतिम खाली लाइन को बचाते हुए:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:+TieredCompilation -XX:CompileThreshold=100
ग्रहण को चित्र के समान बनाने के लिए चित्र के अंदर देखें।
यह INET स्थापित करने का समय है। पहले से डाउनलोड किए गए संग्रह (inet-3.4.0-src.tgz) से "इनसेट" निर्देशिका को कार्यक्षेत्र में स्थानांतरित किया जाना चाहिए। इंस्टॉलेशन के चरण-दर-चरण विवरण के साथ निर्देशिका में एक "INSTALL" फ़ाइल है। आप इसका उपयोग कर सकते हैं (अनुभाग "यदि आप आईडीई का उपयोग कर रहे हैं"), लेकिन बस (बिल्ड) प्रोजेक्ट का निर्माण न करें!
आयात करें:
- ग्रहण में, खोलें: फ़ाइल> आयात करें।
- चयन करें: कार्यक्षेत्र के लिए सामान्य / मौजूदा परियोजनाएं।
- "रूट निर्देशिका" के रूप में कार्यक्षेत्र के स्थान का चयन करें।
- सुनिश्चित करें कि "कार्यक्षेत्र में प्रोजेक्ट्स की प्रतिलिपि बनाएँ" विकल्प बंद है।
- "समाप्त" बटन पर क्लिक करने के बाद, तब तक प्रतीक्षा करें जब तक कि परियोजना का अनुक्रमण पूरा नहीं हो जाता है (पूरा होने का%, नीचे देखें, स्थिति पट्टी में - " C / C ++ Indexer")।
प्रोजेक्ट सेट करें:
- A. LLTR के लिए अनावश्यक घटकों को अक्षम करें;
- बी जारी करने के लिए विधानसभा स्विच;
- C. OMNeT से छुटकारा पाएं ++ मेक बिल्डर ग्लिच (opp_makemake) - पहले, जब इसे चुना गया था, तो मेकफाइल को अक्सर पुनर्जीवित किया गया था, तब भी जब इसकी आवश्यकता नहीं थी;
- D. समानांतर संकलन सक्षम करें ;
- ई। अनुकूलन चालू करें;
- कई स्थानों पर, c ++ 11 के लिए सिंटैक्स हाइलाइटिंग पर एफ बारी;
- जी "
#include
" से संबंधित बग को ठीक करें (यह तब होता है जब आप "वर्तमान बिल्डर" को कई बार बदलते हैं; यह अन्य मामलों में हो सकता है)।
{A} सेट करने से पहले , आपको प्रोजेक्ट फ़ाइलों में से एक को ठीक करना होगा। "Inet / .oppfeatures" फ़ाइल में लाइन " inet.examples.visualization
" है, इसके बाद आपको एक खाली लाइन जोड़ने की आवश्यकता है जिसमें " inet.tutorials.visualization
" लिखना है, अधिमानतः बाईं ओर इंडेंट रखना (अन्य मापदंडों के समान " nedPackages
" फ़ाइल में) )। यदि ऐसा नहीं किया जाता है, तो कुछ भी बुरा नहीं होगा, बस "समस्याएं" (Alt + Shift + Q, X) में सेट करने के बाद हमेशा " inet.tutorials.visualization
" के साथ जुड़ी त्रुटियां inet.tutorials.visualization
। आप पहले {A} कर सकते हैं, और त्रुटियों को देख सकते हैं, और फिर "inet / .oppfeatures" फ़ाइल को ठीक कर सकते हैं - उसी समय, ग्रहण सेटिंग्स में अखंडता के उल्लंघन के बारे में चेतावनी देगा और उन्हें ठीक करने की पेशकश करेगा (हम इस पर सहमत हैं)।
आइए शुरू करते हैं ( "प्रोजेक्ट एक्सप्लोरर" पैनल > "inet" प्रोजेक्ट> संदर्भ मेनू> गुण ):
- OMNeT ++ अनुभाग > परियोजना सुविधाएँ सदस्यता
- {A} को छोड़कर सब कुछ हटा दें:
- टीसीपी आम
- टीसीपी (INET)
- IPv4 प्रोटोकॉल
- यूडीपी प्रोटोकॉल
- ईथरनेट
- "लागू करें" बटन।
- अनुभाग "C / C ++ बिल्ड":
- "कॉन्फ़िगरेशन प्रबंधित करें ..." बटन > "जीसीसी-रिलीज़" {बी} सक्रिय करें;
- कॉन्फ़िगरेशन का चयन करें "जीसीसी-रिलीज [सक्रिय]" {बी} ।
- सदस्यता "उपकरण श्रृंखला संपादक":
- जैसा कि "वर्तमान बिल्डर" दोनों कॉन्फ़िगरेशन के लिए "GNU मेक बिल्डर" चुनें: "जीसीसी-डिबग" और "जीसीसी-रिलीज़" {सी} , ध्यान दें : यदि आप भविष्य में "वर्तमान बिल्डर" बदलते हैं, तो आपको सब कुछ फिर से कॉन्फ़िगर करना होगा!
- "लागू करें" बटन।
- "व्यवहार" टैब ("C / C ++ बिल्ड" अनुभाग के मूल पर लौटें):
- सेट "समानांतर नौकरियों का उपयोग करें" N (या तो N, CPU कोर + 1 या 1.5 × कोर की संख्या है) - यह सभी CPU कोर को {D} संकलन करने के लिए उपयोग करने की अनुमति देगा ("gcc-debug" और "Gcc- के लिए कॉन्फ़िगर करें ) रिलीज ”)।
- सेटिंग्स टैब बनाएँ:
- "डिफ़ॉल्ट बिल्ड कमांड का उपयोग करें" को अक्षम करें;
- लाइन "बिल्ड कमांड" को "
make MODE=release CONFIGNAME=${ConfigName} -j17
" के साथ बदलें (पंक्ति में " 17
" को बदलें (चयनित N के साथ, यानी चयनित N के साथ) {E} , आप ऐसा ही कर सकते हैं "gcc-debug" कॉन्फ़िगरेशन के लिए, लाइन में " MODE=debug
" के साथ " MODE=release
" की जगह, उसके बाद "gcc-release [सक्रिय]" पर वापस स्विच करना न भूलें।
- "लागू करें" बटन।
- अनुभाग "C / C ++ सामान्य":
- सदस्यता "पथ और प्रतीक":
- टैब "शामिल":
- बटन जोड़ें: चयनित "सभी कॉन्फ़िगरेशन में जोड़ें" और "सभी भाषाओं में जोड़ें" {G} - प्रारंभ में "
../src
" के साथ निर्देशिका जोड़ें " ../src
" भाषा में "GNU C ++ " है, लेकिन एक अनिश्चित क्षण में। , यह सूची से हटाया जा सकता है; - "लागू करें" बटन, और जांचें कि "
../src
" सभी भाषाओं और कॉन्फ़िगरेशन में दिखाई दिया।
- प्रतीक टैब:
- बटन जोड़ें: "
201103L
" और "सभी विन्यासों में जोड़ें" और "सभी भाषाओं में जोड़ें" - " F F " मूल्य के साथ प्रतीक " __cplusplus
" जोड़ें - और अधिक ; - "लागू करें" बटन, और जांचें कि "जीसीसी-डिबग" कॉन्फ़िगरेशन में, "
__cplusplus
" का मूल्य " 201103L
" है।
- स्रोत स्थान टैब:
- जांचें कि सूची में एक आइटम है और यह "
/inet/src
" {G} को इंगित करता है, अगर कुछ और है (उदाहरण के लिए, बस " /inet
"), तो जो है उसे हटा दें और जोड़ें ("फ़ोल्डर जोड़ें" ... ")" /inet/src
"। फिर "लागू करें" बटन, और {A} पर वापस जाएं, क्योंकि हटाने के दौरान सभी फ़िल्टर हटा दिए गए थे। वैसे, " /inet
" वास्तव में छोड़ा जा सकता है - इसके साथ भी सब कुछ ठीक चल रहा है, लेकिन इसे मूल " /inet/src
" तक सीमित करना बेहतर है।
- सदस्यता "प्रीप्रोसेसर में पथ, मार्कोस आदि शामिल करें" > "प्रदाता" टैब:
- "सीडीटी जीसीसी बिल्ड-इन कंपाइलर सेटिंग्स" चुनें:
- "भाषा सेटिंग प्रदाता विकल्प" समूह में, "कार्यक्षेत्र सेटिंग" लिंक पर क्लिक करें:
- "डिस्कवरी" टैब: फिर से "सीडीटी जीसीसी बिल्ड-इन कंपाइलर सेटिंग्स" चुनें, और "कंपाइलर स्पेक्स प्राप्त करने के लिए कमांड" में "
${FLAGS}
" से पहले " -std=c++11
" जोड़ें, यह ` ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}"
'के लिए कुछ दिखना चाहिए। ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}"
` {F} , अधिक विवरण यहाँ और यहाँ ; - बटन "लागू करें", "ठीक है" (विंडो बंद करें)।
- “CDT प्रबंधित बिल्ड सिस्टम प्रविष्टियाँ” के ऊपर “CDT GCC बिल्ड-इन कंपाइलर सेटिंग्स” को स्थानांतरित करें (दोनों कॉन्फ़िगरेशन के लिए: “gcc-release” और “gcc-debug”) {F} , अधिक विवरण - इसके बाद हम वर्णों को फिर से परिभाषित करने की क्षमता खो देंगे “CDT "CDT प्रबंधित बिल्ड सिस्टम प्रविष्टियाँ" ( "C / C ++ सामान्य"> "पथ और प्रतीक"> "प्रतीक") के माध्यम से GCC बिल्ड-इन कंपाइलर सेटिंग्स ", आप केवल" 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. (‑: “ ”)

. . – . – .