آموزش شبیه ساز شبکه ns-3. فصل 3

آموزش شبیه ساز شبکه ns-3. فصل 3
فصل 1,2

3 شروع به کار
3.1. بررسی اجمالی
3.2 پیش نیازها
3.2.1 دانلود نسخه ns-3 به عنوان آرشیو منبع
3.3 دانلود ns-3 با استفاده از Git
3.3.1 بارگیری ns-3 با استفاده از Bake
3.4 مونتاژ ns-3
3.4.1 ساختمان با build.py
3.4.2 ساختمان با Bake
3.4.3 ساخت با Waf
3.5 تست ns-3
3.6 اجرای اسکریپت
3.6.1 آرگومان های خط فرمان
3.6.2 اشکال زدایی
3.6.3 دایرکتوری کاری

فصل 3

شروع شدن

هدف این فصل آماده کردن خواننده برای شروع با کامپیوتری است که ممکن است هرگز ns-3 را نصب نکرده باشد. این پلتفرم های پشتیبانی شده، پیش نیازها، نحوه به دست آوردن ns-3، نحوه ساخت ns-3، و نحوه آزمایش ساخت و اجرای برنامه های ساده را پوشش می دهد.

3.1. بررسی اجمالی

شبیه ساز ns-3 به عنوان سیستمی از کتابخانه های نرم افزاری مشترک ساخته شده است. در هنگام مونتاژ، کد برنامه های کاربر با این کتابخانه ها پیوند داده می شود. برای نوشتن برنامه های سفارشی از زبان های برنامه نویسی C++ یا Python استفاده می شود.

Ns-3 به عنوان کد منبع توزیع می شود، به این معنی که سیستم هدف باید دارای یک محیط توسعه نرم افزار باشد تا ابتدا کتابخانه ها را بسازد و سپس برنامه کاربر را بسازد. در اصل، ns-3 می تواند به عنوان کتابخانه های آماده برای یک سیستم خاص توزیع شود و در آینده ممکن است به این روش توزیع شود. اما امروزه بسیاری از کاربران در واقع کار خود را با ویرایش خود ns-3 انجام می دهند، بنابراین داشتن کد منبع برای ساخت کتابخانه ها مفید است. اگر کسی مایل است کار ایجاد کتابخانه ها و بسته های آماده برای سیستم عامل ها را به عهده بگیرد، لطفا با لیست پستی تماس بگیرید. توسعه دهندگان ns.

در ادامه، سه راه برای دانلود و ساخت ns-3 را بررسی خواهیم کرد. اولین مورد دانلود و ساخت نسخه رسمی از سایت اصلی است. دوم انتخاب و مونتاژ کپی نسخه های توسعه نصب پایه ns-3 است. سومین مورد استفاده از ابزارهای ساخت اضافی برای بارگذاری افزونه های بیشتر برای ns-3 است. از آنجایی که ابزارها کمی متفاوت هستند، هر کدام را مرور خواهیم کرد.

کاربران باتجربه لینوکس ممکن است تعجب کنند که چرا ns-3 مانند اکثر کتابخانه های دیگر که از یک مدیریت بسته استفاده می کنند به عنوان یک بسته ارائه نمی شود؟ اگرچه بسته‌های باینری برای توزیع‌های مختلف لینوکس (مثلاً دبیان) وجود دارد، اکثر کاربران در نهایت کتابخانه‌ها را ویرایش می‌کنند و مجبورند خودشان ns-3 را بازسازی کنند، بنابراین داشتن کد منبع در دسترس است. به همین دلیل، ما بر روی نصب از منبع تمرکز خواهیم کرد.

برای اکثر برنامه ها حقوق ns-3 ریشه نیازی نیست، توصیه می شود از یک حساب کاربری غیرمجاز استفاده کنید.

3.2 پیش نیازها

کل مجموعه کتابخانه های موجود ns-3 دارای تعدادی وابستگی به کتابخانه های شخص ثالث است، اما در بیشتر موارد ns-3 را می توان با پشتیبانی از چندین مؤلفه رایج (اغلب به صورت پیش فرض نصب شده) ساخته و استفاده کرد: یک کامپایلر ++C. پایتون، یک ویرایشگر کد منبع (به عنوان مثال، نیرو, ایمکس یا تحت الشعاع قرار دادن) و در صورت استفاده از مخازن توسعه، سیستم های کنترل نسخه Git. اکثر کاربرانی که برای اولین بار استفاده می کنند، در صورتی که پیکربندی آنها گزارش کند برخی از ویژگی های پیشرفته ns-3 از دست رفته است، نیازی به نگرانی نخواهند داشت، اما برای کسانی که خواهان نصب کامل هستند، این پروژه یک ویکی ارائه می دهد که شامل صفحاتی با نکات و ترفندهای مفید فراوان است. یکی از این صفحات، صفحه نصب است، با دستورالعمل‌های نصب برای سیستم‌های مختلف، که در آدرس زیر موجود است: https://www.nsnam.org/wiki/Installation.

بخش پیش نیازهای این ویکی توضیح می‌دهد که کدام بسته‌ها برای پشتیبانی از گزینه‌های رایج ns-3 مورد نیاز هستند و همچنین دستورات مورد استفاده برای نصب آن‌ها بر روی طعم‌های رایج لینوکس یا macOS را ارائه می‌دهد.

می توانید از این فرصت برای کاوش در صفحه ویکی ns-3 یا وب سایت اصلی استفاده کنید: https://www.nsnam.org، زیرا اطلاعات زیادی در آنجا وجود دارد. با شروع با آخرین نسخه ns-3 (ns-3.29)، ابزارهای زیر برای اجرای ns-3 مورد نیاز است:

بسته ابزار/نسخه

  • کامپایلر C++
    clang++ یا g++ (g++ نسخه 4.9 یا بالاتر)
  • پــایتــون
    نسخه python2 >= 2.7.10، یا python3 نسخه >=3.4
  • رفتن
    هر آخرین نسخه (برای دسترسی به ns-3 در GitLab.com)
  • قیر
    هر آخرین نسخه (برای باز کردن بسته بندی نسخه ns-3)
  • bunzip2
    هر آخرین نسخه (برای باز کردن نسخه ns-3)

برای بررسی نسخه پیش فرض پایتون، تایپ کنید python -V. برای بررسی نسخه g++، تایپ کنید g++ -v. اگر ابزاری گم شده یا خیلی قدیمی است، لطفاً به راهنمای نصب در صفحه ویکی ns-3 مراجعه کنید.

از این به بعد، فرض می کنیم که خواننده لینوکس، MacOS یا شبیه ساز لینوکس را اجرا می کند و حداقل ابزارهای بالا را دارد.

3.2.1 دانلود نسخه ns-3 به عنوان آرشیو منبع

این مسیر عمل برای کاربر جدیدی است که می‌خواهد آخرین نسخه‌های انتشار و بسته ns-3 را دانلود و آزمایش کند. نسخه‌های ns-3 به‌عنوان آرشیو منبع فشرده منتشر می‌شوند که گاهی اوقات نامیده می‌شوند تاربال. تاربال یک فرمت آرشیو نرم افزار ویژه است که در آن چندین فایل با هم ترکیب می شوند. آرشیو معمولاً فشرده است. فرآیند بوت ns-3 از طریق تاربال ساده است، فقط باید یک نسخه را انتخاب کنید، دانلود کنید و آن را باز کنید.

بیایید فرض کنیم که شما به عنوان یک کاربر می خواهید ns-3 را در یک فهرست محلی به نام بسازید فضای کاری. می‌توانید با وارد کردن موارد زیر در کنسول لینوکس (البته با جایگزینی شماره‌های نسخه مناسب) یک نسخه کارآمد از نسخه دریافت کنید.

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

به ابزار استفاده شده در بالا توجه کنید دستور wgetکه یک ابزار خط فرمان برای دانلود اشیا از اینترنت است. اگر آن را نصب نکرده اید، می توانید از مرورگر خود برای این کار استفاده کنید.

با دنبال کردن این مراحل شما را به دایرکتوری ns-allinone-3.29 می برد، در آنجا باید چندین فایل و دایرکتوری را مشاهده کنید.

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

اکنون آماده ساختن یک توزیع پایه ns-3 هستید و می توانید به بخش ساختن ns-3 بروید.

3.3 دانلود ns-3 با استفاده از Git

کد ns-3 در مخازن Git در GitLab.com در دسترس است https://gitlab.com/nsnam/. گروه nsnam مخازن مختلف مورد استفاده توسط یک پروژه منبع باز را گرد هم می آورد.

ساده ترین راه برای شروع استفاده از مخازن Git، فورک کردن یا شبیه سازی محیط است ns-3-allinone. این مجموعه ای از اسکریپت ها است که بارگذاری و مونتاژ پرکاربردترین زیرسیستم های ns-3 را مدیریت می کند. اگر در Git تازه کار هستید، ممکن است اصطلاحات "fork" و "clone" برای شما ناآشنا باشد. اگر چنین است، توصیه می کنیم به سادگی مخزن واقع در GitLab.com را شبیه سازی کنید (کپی خود را بسازید) به این صورت:

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

در این مرحله نمای دایرکتوری شما ns-3-allinone کمی متفاوت از دایرکتوری بایگانی انتشار که در بالا توضیح داده شد. باید چیزی شبیه این باشد:

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

لطفا توجه داشته باشید که یک اسکریپت وجود دارد download.py، که علاوه بر این ns-3 و کد منبع همراه آن را استخراج می کند. در اینجا شما یک انتخاب دارید: یا آخرین عکس فوری توسعه ns-3 را دانلود کنید:

$ python download.py

یا انتشار ns-3 را با استفاده از پرچم ترجیح دهید -n برای نشان دادن شماره انتشار:

$ python download.py -n ns-3.29

پس از این مرحله به دایرکتوری ns-3-allinone مخازن اضافی دانلود خواهند شد ns-3, پختن, pybindgen и نتانیم.

یادداشت
در ماشینی با Ubuntu16.04 تمیز، باید دستور را به این تغییر دهم: $ sudo python3 download.py -n ns-3.29 (از این پس یادداشت های مترجم).

3.3.1 بارگیری ns-3 با استفاده از Bake

دو روش بالا (بایگانی منبع یا مخزن ns-3-allinone از طریق Git) برای دریافت ساده ترین نصب ns-3 با افزونه های متعدد (pybindgen برای تولید پیوندهای پایتون و نتانیم برای انیمیشن شبکه). سومین مخزن ارائه شده به طور پیش فرض در ns-3-allinone نامیده می شود پختن.

پخت ابزاری برای ساخت هماهنگ نرم افزار از چندین مخزن است که برای پروژه ns-3 توسعه یافته است. پخت می توان برای به دست آوردن نسخه های توسعه ns-3، و همچنین برای دانلود و ساخت برنامه های افزودنی نسخه پایه توزیع ns-3، مانند محیط، استفاده کرد. اجرای مستقیم کد, CradleNetwork Simulation Cradle، توانایی ایجاد پیوندهای جدید پایتون و برنامه های مختلف ns-3.

یادداشت
CradleNetwork Simulation Cradle چارچوبی است که به شما امکان می دهد از پشته های شبکه TCP/IP واقعی در داخل یک شبیه ساز شبکه استفاده کنید.

اگر انتظار دارید نصب ns-3 شما دارای ویژگی های پیشرفته یا اضافی باشد، می توانید این مسیر نصب را دنبال کنید.

در آخرین نسخه های ns-3 پخت به رهاسازی تار اضافه شد. نسخه شامل یک فایل پیکربندی است که به شما امکان می دهد نسخه های فعلی نرم افزار را در زمان انتشار دانلود کنید. یعنی مثلا نسخه پخت، که با نسخه ns-3.29 توزیع شده است، می تواند برای بازیابی مؤلفه های آن نسخه ns-3 یا قبل از آن استفاده شود، اما نمی توان برای بازیابی مؤلفه های نسخه های بعدی (اگر فایل توضیحات بسته باشد) استفاده کرد. bakeconf.xml بروزرسانی نشده).

همچنین می توانید آخرین نسخه را دریافت کنید پختنبا وارد کردن دستور زیر در کنسول لینوکس خود (با فرض اینکه Git را نصب کرده اید):

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

هنگامی که دستور git را اجرا می کنید، باید چیزی شبیه به زیر مشاهده کنید:

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

پس از اتمام دستور کلون کردن شما باید دایرکتوری به نام داشته باشید پختن، که محتوای آن باید چیزی شبیه به این باشد:

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

توجه داشته باشید که چندین اسکریپت پایتون را بارگذاری کرده اید، یک ماژول پایتون به نام پختن و یک فایل پیکربندی XML. مرحله بعدی استفاده از این اسکریپت ها برای دانلود و ساخت توزیع ns-3 مورد نظرتان است. چندین هدف سفارشی سازی در دسترس است:

  1. ns-3.29: ماژول مربوط به انتشار. کامپوننت هایی شبیه به نسخه موجود در تربال را دانلود می کند.

  2. ns-3-dev: یک ماژول مشابه، اما با استفاده از کد از درخت توسعه.

  3. ns-allinone-3.29: ماژولی که شامل ویژگی های اضافی دیگری مانند مسیریابی کلیک و پایگاه شبیه سازی شبکه، Openflow برای ns-3 است.

  4. ns-3-allinone: مشابه نسخه انتشار ماژول آلینون، اما برای کد توسعه.

یادداشت
کلیک کنید - معماری نرم افزار ماژولار برای ایجاد روترها.

Openflow یک پروتکل برای مدیریت فرآیند پردازش داده های ارسال شده از طریق یک شبکه داده توسط روترها و سوئیچ ها، پیاده سازی فناوری شبکه تعریف شده توسط نرم افزار است.

عکس فوری توسعه (غیر انتشار) ns-3 را می توان در آدرس زیر یافت:https://gitlab.com/nsnam/ns-3-dev.git.

توسعه دهندگان سعی می کنند این مخازن را در یک نظم کاری ثابت نگه دارند، اما آنها در منطقه توسعه هستند و حاوی کدهای منتشر نشده هستند، بنابراین اگر قصد استفاده از ویژگی های جدید را ندارید، نسخه رسمی را انتخاب کنید.

می توانید آخرین نسخه کد را با مرور لیست مخازن یا با رفتن به صفحه وب ns-3 Releases پیدا کنید:https://www.nsnam.org/releases/ و روی لینک آخرین نسخه کلیک کنید. در این مثال با ns-3.29 ادامه می دهیم.

اکنون برای بدست آوردن کامپوننت های ns-3 که نیاز داریم، از ابزار استفاده می کنیم پخت. اجازه دهید چند کلمه مقدماتی در مورد کار بگوییم پخت.

Bake با بارگذاری منابع بسته در یک فهرست کار می کند منبع و نصب کتابخانه ها در دایرکتوری ساخت. پخت را می توان با ارجاع به باینری اجرا کرد، اما اگر می خواهید اجرا کنید پخت نه از دایرکتوری که در آن دانلود شده است، توصیه می شود مسیر را به آن اضافه کنید پختن به مسیر شما (متغیر محیط PATH)، به عنوان مثال به صورت زیر (مثالی برای پوسته bash لینوکس). به دایرکتوری "bake" بروید و سپس متغیرهای محیطی زیر را تنظیم کنید:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

این برنامه را قرار می دهد bake.py به مسیر پوسته می‌رود و به برنامه‌های دیگر اجازه می‌دهد تا فایل‌های اجرایی و کتابخانه‌های ایجاد شده را پیدا کنند پختن. در برخی موارد استفاده می شود پختن، تنظیمات PATH و PYTHONPATH که در بالا توضیح داده شد مورد نیاز نیست، اما ساخت کامل ns-3-allinone (با بسته های اضافی) معمولاً به آن نیاز دارد.

به پوشه کاری خود بروید و موارد زیر را در کنسول وارد کنید:

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

در ادامه خواهیم پرسید پخت بررسی کنید که آیا ابزار کافی برای بارگذاری اجزای مختلف داریم یا خیر. شماره گیری:

$ ./bake.py check

شما باید چیزی شبیه به زیر ببینید:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

به طور خاص، ابزارهای آپلود مانند Mercurial، CVS، Git و Bazaar در این مرحله ضروری هستند زیرا به ما امکان دریافت کد را می دهند. در این مرحله، ابزارهای از دست رفته را به روش معمول برای سیستم خود نصب کنید (اگر می دانید چگونه) یا برای کمک با مدیر سیستم خود تماس بگیرید.

سپس سعی کنید نرم افزار را دانلود کنید:

$ ./bake.py download

نتیجه باید چیزی شبیه به:

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

این بدان معنی است که سه منبع دانلود شده است. حالا به دایرکتوری منبع بروید و ls را تایپ کنید. باید ببینی:

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

اکنون شما آماده ساختن توزیع ns-3 هستید.

3.4 مونتاژ ns-3

همانند دانلود ns-3، راه های مختلفی برای ساختن ns-3 وجود دارد. اصلی‌ترین چیزی که می‌خواهیم بر آن تاکید کنیم این است که ns-3 با استفاده از یک ابزار ساخت به نام ساخته شده است وفدر زیر شرح داده شده است. اکثر کاربران با آن کار خواهند کرد وف، اما چند اسکریپت مفید برای کمک به شما برای شروع یا سازماندهی ساخت های پیچیده تر وجود دارد. پس لطفا قبل از خواندن در مورد وف، نگاهی به build.py و مونتاژ با پختن.

3.4.1 ساختمان با build.py

اخطار! این مرحله ساخت فقط از نسخه آرشیو منبع به دست آمده همانطور که در بالا توضیح داده شد در دسترس است. و از طریق git یا bake دانلود نمی شود.

هنگام کار با آرشیو انتشار تاربالبه ns-3-allinone یک اسکریپت مفید وجود دارد که می تواند مونتاژ اجزا را آسان تر کند. به آن build.py می گویند. این برنامه پروژه را به مفیدترین روش برای شما راه اندازی می کند. با این حال، توجه داشته باشید که راه اندازی پیشرفته تر و کار با ns-3 معمولاً شامل استفاده از سیستم ساخت خود ns-3، Waf است که در ادامه این آموزش معرفی خواهد شد.

اگر با استفاده از آن دانلود کردید تاربال، سپس در دایرکتوری شما ~/فضای کاری دایرکتوری با نامی شبیه به ns-allinone-3.29. زیر را وارد کنید:

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

وقتی تماس گرفته شود build.py ما از آرگومان های خط فرمان برای ساخت نمونه ها و تست های استفاده شده در این آموزش استفاده کردیم که به طور پیش فرض در ns-3 ساخته نشده اند. به طور پیش فرض، برنامه تمام ماژول های موجود را نیز می سازد. سپس در صورت تمایل می توانید ns-3 را بدون مثال و تست بسازید یا ماژول هایی را که برای کار شما نیازی ندارند حذف کنید.

شما پیام‌های خروجی کامپایلر زیادی را خواهید دید که توسط اسکریپت نمایش داده می‌شود که بخش‌های مختلفی را که بارگذاری کرده‌اید ایجاد می‌کند. ابتدا اسکریپت سعی می کند انیماتور را بسازد نتانیم، سپس مولد اتصال pybindgen و در نهایت ns-3. هنگامی که فرآیند کامل شد، باید موارد زیر را مشاهده کنید:

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

در سه خط آخر لیست پیامی در مورد ماژول هایی که ساخته نشده اند می بینیم:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

این به سادگی به این معنی است که برخی از ماژول‌های ns-3 که به کتابخانه‌های خارجی وابسته هستند ممکن است ساخته نشده باشند یا نیازی به ساختن آنها برای این پیکربندی نباشد. این بدان معنا نیست که شبیه ساز مونتاژ نشده است یا ماژول های مونتاژ شده به درستی کار نمی کنند.

3.4.2 ساختمان با Bake

اگر از bake بالا برای دریافت کد منبع از مخازن پروژه استفاده کرده اید، می توانید به استفاده از آن برای ساختن ns-3 ادامه دهید. شماره گیری:

$ ./bake.py build

و شما باید چیزی شبیه به:

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

اشاره: همچنین می‌توانید با فراخوانی «bake.py deploy» مراحل دانلود و ساخت را هم‌زمان انجام دهید.

مونتاژ همه اجزا ممکن است ناموفق باشد، اما در صورت عدم نیاز به قطعه، مونتاژ ادامه خواهد یافت. به عنوان مثال، یک مشکل قابل حمل اخیر این بود castxml می توان با ابزار مونتاژ کرد پختن نه در همه پلتفرم ها در این صورت پیامی مانند این ظاهر می شود:

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

اما castxml فقط در صورتی لازم است که بخواهید پیوندهای به روز شده پایتون ایجاد کنید. برای اکثر کاربران نیازی به این کار نیست (حداقل تا زمانی که ns-3 را تغییر دهند)، بنابراین می توان فعلاً چنین هشدارهایی را نادیده گرفت.

در صورت عدم موفقیت، دستور زیر به شما راهنمایی در مورد وابستگی های از دست رفته می دهد:

$ ./bake.py show

وابستگی‌های مختلف بسته‌هایی که می‌خواهید بسازید فهرست می‌شوند.

3.4.3 ساخت با Waf

تا این مرحله، برای شروع ساختن ns-3، از هر دو اسکریپت استفاده کردیم build.py، یا ابزار پختن. این ابزارها برای ساختن ns-3 و نگهداری کتابخانه ها مفید هستند. در واقع، برای ساخت، ابزار ساخت را اجرا می کنند وف از دایرکتوری ns-3. وف با کد منبع ns-3 نصب شده است. اکثر کاربران به سرعت به سمت استفاده مستقیم برای پیکربندی و مونتاژ ns-3 می روند وف. بنابراین، برای ادامه، لطفاً به دایرکتوری ns-3 که در ابتدا ایجاد کردید بروید.

این در حال حاضر به شدت مورد نیاز نیست، اما مفید خواهد بود که کمی به عقب برگردید و ببینید که چگونه می توان تغییراتی در پیکربندی پروژه ایجاد کرد. احتمالاً مفیدترین تغییر پیکربندی که می توانید انجام دهید ایجاد یک نسخه بهینه از کد است. به طور پیش فرض، شما پروژه خود را برای ساختن یک نسخه اشکال زدایی پیکربندی کرده اید. بیایید نگاهی به پروژه ای برای ایجاد یک ساخت بهینه بیندازیم. برای توضیح دادن به Waf که باید ساخت‌های بهینه‌سازی شده‌ای که شامل نمونه‌ها و تست‌ها هستند بسازد، باید دستورات زیر را اجرا کنید:

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

این راه اندازی خواهد شد وف خارج از فهرست محلی (برای راحتی شما). اولین دستور از ساخت قبلی پاک می شود، این معمولاً کاملاً ضروری نیست، اما تمرین خوبی است (همچنین به نمایه های ساخت در زیر مراجعه کنید). با این کار کتابخانه های ایجاد شده قبلی و فایل های شی واقع در دایرکتوری حذف می شود ساختن/. هنگامی که پروژه دوباره پیکربندی می شود و سیستم ساخت وابستگی های مختلف را بررسی می کند، باید خروجی مشابه زیر را مشاهده کنید:

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

لطفاً به بخش آخر لیست بالا توجه کنید. برخی از گزینه های ns-3 به طور پیش فرض فعال نیستند یا برای عملکرد صحیح به پشتیبانی سیستم نیاز دارند. به عنوان مثال، برای فعال کردن XmlTo، کتابخانه باید در سیستم وجود داشته باشد libxml-2.0. اگر این کتابخانه پیدا نشد و تابع ns-3 مربوطه فعال نبود، پیامی نمایش داده می شود. همچنین توجه داشته باشید که امکان استفاده از دستور وجود دارد کد: sudo برای تنظیم بیت suid "تنظیم شناسه گروه در زمان اجرا" برای برنامه های خاص. به طور پیش فرض فعال نیست و بنابراین این ویژگی به عنوان "فعال نشده" ظاهر می شود. در نهایت، برای دریافت لیستی از گزینه های فعال، استفاده کنید وف با پارامتر --check-config.

حالا بیایید به عقب برگردیم و به ساخت اشکال‌زدایی که شامل نمونه‌ها و تست‌ها است برگردیم.

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

اکنون سیستم ساخت راه‌اندازی شده است و می‌توانید نسخه‌های اشکال زدایی برنامه‌های ns-3 را با تایپ کردن ساده بسازید:

$ ./waf

ممکن است مراحل بالا شما را مجبور کرده باشد که بخشی از سیستم ns-3 را دو بار بسازید، اما اکنون می دانید که چگونه پیکربندی را تغییر دهید و کد بهینه سازی شده بسازید.

برای بررسی اینکه کدام نمایه برای یک پیکربندی پروژه مشخص فعال است، یک دستور وجود دارد:

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

سناریوی بالا build.py از استدلال ها نیز پشتیبانی می کند --enable-examples и --enable-tests، اما گزینه های دیگر وف به طور مستقیم پشتیبانی نمی کند. به عنوان مثال، این کار نخواهد کرد:

$ ./build.py --disable-python

واکنش به این صورت خواهد بود:

build.py: error: no such option: --disable-python

با این حال، عملگر ویژه - - می تواند برای ارسال پارامترهای اضافی از طریق استفاده شود وافبنابراین به جای دستور بالا دستور زیر کار خواهد کرد:

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

زیرا دستور اصلی را تولید می کند ./waf configure --disable-python. در اینجا چند نکته مقدماتی بیشتر در مورد وجود دارد وف.

رسیدگی به خطاهای ساخت

نسخه‌های ns-3 بر روی جدیدترین کامپایلرهای C++ موجود در زمان انتشار در توزیع‌های رایج لینوکس و MacOS آزمایش می‌شوند. با این حال، با گذشت زمان، توزیع‌های جدید با کامپایلرهای جدید منتشر می‌شوند و این کامپایلرهای جدیدتر تمایل بیشتری به هشدارها دارند. ns-3 بیلد خود را طوری پیکربندی می‌کند که همه هشدارها را به عنوان خطا در نظر بگیرد، بنابراین گاهی اوقات اگر نسخه قدیمی‌تری را روی سیستم جدیدتر اجرا می‌کنید، هشدار کامپایلر ممکن است ساخت را متوقف کند.

به عنوان مثال، قبلاً نسخه ns-3.28 برای فدورا 28 منتشر شده بود که شامل یک نسخه اصلی جدید بود. gcc (gcc-8). با ساختن نسخه ns-3.28 یا نسخه های قبلی تحت فدورا 28، با نصب Gtk2+، خطای زیر رخ می دهد:

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

در نسخه های شروع شده از ns-3.28.1، در وف گزینه ای برای حل این مشکلات موجود است. تنظیم پرچم "-Werror" را در g++ و clang++ غیرفعال می کند. این گزینه "--disable-error" است و باید در طول پیکربندی اعمال شود:

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

پیکربندی یا مونتاژ کنید

برخی دستورات وف فقط در مرحله پیکربندی معنا پیدا می کند و برخی فقط در مرحله ساخت معتبر هستند. به عنوان مثال، اگر می خواهید از ویژگی های شبیه سازی ns-3 استفاده کنید، می توانید تنظیمات بیت را فعال کنید جنوب استفاده كردن کد: sudo، همانطور که در بالا توضیح داده شد. این دستورات مرحله پیکربندی را لغو می‌کند و بنابراین می‌توانید پیکربندی را با استفاده از دستور زیر که شامل مثال‌ها و تست‌ها نیز می‌شود، تغییر دهید.

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

اگر این کار را انجام دهید وف راه اندازی خواهد شد کد: sudoبرای تغییر برنامه های ایجاد سوکت کد شبیه سازی برای اجرا با مجوز ریشهاست. به وف بسیاری از گزینه های دیگر برای مراحل پیکربندی و ساخت وجود دارد. برای بررسی گزینه های خود، وارد کنید:

$ ./waf --help

در بخش بعدی از چند گزینه مرتبط با تست استفاده خواهیم کرد.

پروفایل های مونتاژ

ما قبلاً دیده ایم که چگونه می توانید پیکربندی کنید وف برای مجامع اشکال زدایی کردن и بهینه:

$ ./waf --build-profile=debug

همچنین یک نمایه مونتاژ میانی وجود دارد، آزاد. گزینه -d مترادف است با --build-profile. نمایه ساخت، استفاده از سوئیچ‌های لاگ، ادعاها و بهینه‌سازی کامپایلر را کنترل می‌کند:

آموزش شبیه ساز شبکه ns-3. فصل 3

همانطور که می بینید، ورود به سیستم و ادعاها فقط در بیلدهای اشکال زدایی در دسترس هستند. روش توصیه شده این است که اسکریپت خود را در حالت اشکال زدایی توسعه دهید، سپس اجراهای مکرر (برای آمار یا تغییرات پارامتر) را در یک نمایه ساخت بهینه انجام دهید.

اگر کدی دارید که فقط باید در نمایه های ساخت خاصی اجرا شود، از ماکرو Code Wrapper استفاده کنید:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

پیش فرض ، وف آرتیفکت های ساخت را در فهرست ساخت قرار می دهد. با استفاده از این گزینه می توانید دایرکتوری خروجی متفاوتی را مشخص کنید - -out، برای مثال:

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

با ترکیب این با پروفایل های ساخت، می توانید به راحتی بین گزینه های مختلف کامپایل جابجا شوید:

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

که به شما امکان می دهد بدون نیاز به بازنویسی آخرین اسمبلی هر بار با چندین مجموعه کار کنید. وقتی به نمایه دیگری تغییر می‌کنید، وف فقط آن را کامپایل می کند، بدون اینکه همه چیز را دوباره کامپایل کند.

هنگامی که پروفایل های ساخت را به این روش تغییر می دهید، باید مراقب باشید که هر بار گزینه های پیکربندی یکسانی را ارائه دهید. تعریف چندین متغیر محیطی به شما کمک می کند تا از اشتباهات جلوگیری کنید:

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

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

کامپایلرها و پرچم ها

در مثال های بالا وف برای ساخت ns-3 از کامپایلر C++ از GCC استفاده می کند ( g ++). با این حال، می توانید موردی را که استفاده می کنید تغییر دهید وف کامپایلر C++ با تعریف متغیر محیطی CXX. به عنوان مثال، برای استفاده از کامپایلر C++ Clang، clang++،

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

به همین ترتیب می توانید پیکربندی کنید وف برای استفاده از کامپایل توزیع شده با استفاده از distcc:

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

اطلاعات بیشتر در مورد distcc و کامپایل توزیع شده را می توانید در صفحه پروژه در بخش Documentation پیدا کنید. برای افزودن پرچم های کامپایلر هنگام پیکربندی ns-3، از متغیر محیطی CXXFLAGS_EXTRA استفاده کنید.

نصب

وف می توان از آن برای نصب کتابخانه ها در مکان های مختلف سیستم استفاده کرد. به طور پیش فرض، کتابخانه های کامپایل شده و فایل های اجرایی در دایرکتوری قرار دارند ساختنو از آنجایی که Waf مکان این کتابخانه ها و فایل های اجرایی را می داند، نیازی به نصب کتابخانه ها در جای دیگری نیست.

اگر کاربران ترجیح می دهند خارج از دایرکتوری ساخت نصب کنند، می توانند دستور را اجرا کنند ./waf نصب کنید. پیشوند پیش فرض برای نصب است / usr / محلیپس ./waf نصب کنید برنامه ها را در آن نصب خواهد کرد / usr / local / bin، کتابخانه ها در / usr / local / lib و فایل های هدر در /usr/local/include. حقوق ابرکاربر معمولاً باید با یک پیشوند پیش فرض تنظیم شود، بنابراین یک دستور معمولی است sudo ./waf نصب کنید. پس از راه‌اندازی، Waf ابتدا استفاده از کتابخانه‌های مشترک در فهرست ساخت را انتخاب می‌کند، سپس به دنبال کتابخانه‌ها در مسیر کتابخانه‌های پیکربندی شده در محیط محلی می‌گردد. بنابراین هنگام نصب کتابخانه ها بر روی یک سیستم، بررسی اینکه آیا از کتابخانه های مناسب استفاده می شود، تمرین خوبی است. کاربران می توانند با عبور دادن گزینه در حین پیکربندی، نصب با پیشوند دیگری را انتخاب کنند --prefix، برای مثال:

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

اگر بعداً پس از ساخت، کاربر دستور نصب را وارد کند ./waf، از پیشوند استفاده خواهد شد /opt/local.

تیم ./waf clean در صورت استفاده از نصب، باید قبل از پیکربندی مجدد پروژه استفاده شود وف تحت یک پیشوند متفاوت

بنابراین، برای استفاده از ns-3 نیازی به تماس نیست ./waf install. اکثر کاربران به این دستور نیازی نخواهند داشت زیرا وف کتابخانه‌های فعلی را از دایرکتوری ساخت انتخاب می‌کند، اما برای برخی از کاربران اگر فعالیت‌هایشان شامل کار با برنامه‌های خارج از دایرکتوری ns-3 باشد، ممکن است این کار مفید باشد.

واف تک

در سطح بالای درخت منبع ns-3، تنها یک اسکریپت Waf وجود دارد. پس از شروع کار، زمان زیادی را در دایرکتوری سپری خواهید کرد scratch/ یا عمیق تر بهsrc/... و در عین حال باید اجرا شود وف. شما فقط می توانید به یاد بیاورید که کجا هستید و بدوید وف به شرح زیر است:

$ ../../../waf ...

اما این کار خسته کننده و مستعد خطا خواهد بود، بنابراین راه حل های بهتری وجود دارد. یکی از راه های رایج استفاده از ویرایشگر متنی مانند ایمکس یا نیرو، که در آن دو جلسه ترمینال باز می شود، یکی برای ساختن ns-3 و دومی برای ویرایش کد منبع استفاده می شود. اگر فقط دارید تاربال، سپس یک متغیر محیطی می تواند کمک کند:

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

$ cd scratch 
$ waff build

در فهرست ماژول ممکن است وسوسه انگیز باشد که یک اسکریپت waf بی اهمیت مانند اضافه کنید exec ../../waf. لطفا انجامش نده. این برای تازه کارها گیج کننده است و وقتی ضعیف انجام شود منجر به خطاهای ساختنی می شود که به سختی قابل تشخیص هستند. راه حل های نشان داده شده در بالا مسیری است که باید استفاده شود.

3.5 تست ns-3

با اجرای اسکریپت می توانید تست های واحد توزیع ns-3 را اجرا کنید ./test.py:

$ ./test.py

این تست ها به صورت موازی اجرا می شوند وف. در نهایت باید پیامی را مشاهده کنید که می گوید:

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

این یک پیام مهم برای شناسایی خرابی ها، خرابی ها یا خطاهای valgrind است که نشان دهنده مشکلات کد یا ناسازگاری بین ابزار و کد است.

همچنین خروجی نهایی را مشاهده خواهید کرد وف و یک تستر هر تست را اجرا می کند که چیزی شبیه به این خواهد بود:

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

این دستور معمولاً توسط کاربران اجرا می شود تا سریعاً تأیید کنند که توزیع ns-3 به درستی ساخته شده است. (توجه داشته باشید که ترتیب خطوط "PASS: ..." ممکن است متفاوت باشد، این طبیعی است. آنچه مهم است این است که خط خلاصه در انتهای گزارش نشان می دهد که تمام تست ها با موفقیت انجام شده است؛ هیچ تستی شکست خورده یا خراب نشده است.) و وفو test.py کار را در سراسر هسته های پردازنده موجود دستگاه موازی می کند.

3.6 اجرای اسکریپت

ما معمولا اسکریپت ها را تحت کنترل اجرا می کنیم وف. این به سیستم ساخت اجازه می دهد تا مطمئن شود که مسیرهای کتابخانه مشترک به درستی تنظیم شده اند و کتابخانه ها در زمان اجرا در دسترس هستند. برای اجرای برنامه، به سادگی استفاده کنید وف با پارامتر - -run. بیایید معادل ns-3 برنامه همه جا را اجرا کنیم سلام جهانبا تایپ موارد زیر:

$ ./waf --run hello-simulator

Waf ابتدا بررسی می کند که برنامه به درستی ساخته شده است و در صورت لزوم می سازد. سپس وف برنامه ای را اجرا می کند که خروجی زیر را تولید می کند.

Hello Simulator

تبریک می گویم! شما اکنون یک کاربر ns-3 هستید!

اگر نتایج را ندیدم باید چه کار کنم؟

اگر پیام ها را می بینید وفنشان می دهد که ساخت با موفقیت انجام شده است، اما شما خروجی را نمی بینید "سلام شبیه ساز"، پس این احتمال وجود دارد که در بخش [Build-with-Waf] حالت ساخت خود را به بهینه، اما بازگشت به حالت را از دست داد اشکال زدایی کردن. تمام خروجی های کنسول استفاده شده در این آموزش از یک جزء ویژه ns-3 استفاده می کند که لاگ را انجام می دهد و برای چاپ پیام های سفارشی روی کنسول استفاده می شود. خروجی این مؤلفه زمانی که کد بهینه سازی شده کامپایل می شود به طور خودکار غیرفعال می شود - بهینه شده است. اگر خروجی "Hello Simulator" را نمی بینید، موارد زیر را وارد کنید:

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

برای سفارشی کردن وف برای ساختن نسخه های اشکال زدایی برنامه های ns-3 که شامل نمونه ها و تست ها می شود. سپس باید نسخه اشکال زدایی فعلی کد را با تایپ مجدد بسازید

$ ./waf

حالا اگر برنامه را اجرا کنید سلام-شبیه ساز، باید نتیجه مورد انتظار را ببینید.

3.6.1 آرگومان های خط فرمان

برای ارسال آرگومان های خط فرمان به برنامه ns-3، از الگوی زیر استفاده کنید:

$ ./waf --run <ns3-program> --command-template="%s <args>"

جایگزین کردن به نام برنامه شما و به آرگومان ها. بحث و جدل - -command-template برای وف اساسا دستور العملی برای ساخت خط فرمان واقعی است وف برای اجرای برنامه استفاده می شود. Waf بررسی می‌کند که ساخت کامل است، مسیرهای کتابخانه مشترک را تنظیم می‌کند، سپس از الگوی خط فرمان ارائه شده استفاده می‌کند و نام برنامه را برای مکان‌نمای %s جایگزین می‌کند تا فایل اجرایی را فراخوانی کند. اگر این نحو را پیچیده می‌دانید، نسخه ساده‌تری وجود دارد که شامل برنامه ns-3 و آرگومان‌های آن است که در گیومه‌های تکی محصور شده‌اند:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

مثال مفید دیگر، اجرای مجموعه های آزمایشی به صورت انتخابی است. بیایید فرض کنیم یک مجموعه آزمایشی به نام mytest وجود دارد (در واقع وجود ندارد). در بالا از اسکریپت ./test.py برای اجرای تعدادی تست به صورت موازی استفاده کردیم که به طور مکرر برنامه تست را فراخوانی می کند. دونده آزمون. زنگ زدن دونده آزمون به طور مستقیم برای اجرای یک آزمایش:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

استدلال ها به برنامه منتقل می شود دونده آزمون. از آنجایی که mytest وجود ندارد، یک پیام خطا ایجاد می شود. برای چاپ گزینه های موجود تست runner، وارد کنید:

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

3.6.2 اشکال زدایی

برای اجرای برنامه های ns-3 تحت ابزاری دیگر، مانند دیباگر (به عنوان مثال، gdb) یا یک ابزار تست حافظه (به عنوان مثال، والگریند) از یک فرم مشابه استفاده کنید - -command-template = "…". به عنوان مثال، برای اجرا در دیباگر gdb برنامه hello-simulator ns-3 شما با آرگومان ها:

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

توجه داشته باشید که نام برنامه ns-3 همراه با آرگومان است - -run، و ابزار مدیریت (اینجا gdb) اولین نشانه در استدلال است - -command-template. گزینه - -args اطلاع می دهد gdbکه بقیه خط فرمان متعلق به برنامه "پایین" است. (برخی نسخه ها gdb گزینه را نمی فهمم - -args. در این حالت، آرگومان های برنامه را از آن حذف کنید - -command-template و از مجموعه دستورات استفاده کنید gdb قوس.) می‌توانیم این دستور و دستور قبلی را برای اجرای آزمایش در زیر اشکال‌زدا ترکیب کنیم:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 دایرکتوری کاری

Waf باید از محل خود در بالای درخت ns-3 پرتاب شود. این پوشه تبدیل به دایرکتوری کاری می شود که فایل های خروجی در آن نوشته می شوند. اما اگر بخواهید این فایل ها را خارج از درخت منبع ns-3 نگه دارید، چه؟ از استدلال استفاده کنید - -cwd:

$ ./waf --cwd=...

ممکن است دریافت فایل های خروجی در فهرست کاری خود راحت تر باشد. در این مورد، اقدامات غیر مستقیم زیر می تواند کمک کند:

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

این تزئین نسخه قبلی دستور، دایرکتوری فعلی را حفظ می کند، به دایرکتوری می رود وفو سپس دستور می دهد وف برای تغییر دایرکتوری کاری به دایرکتوری کاری فعلی که قبل از شروع برنامه ذخیره شده است. ما به تیم اشاره می کنیم - -cwd برای کامل بودن، اکثر کاربران به سادگی Waf را از دایرکتوری سطح بالا اجرا می کنند و فایل های خروجی را در آنجا تولید می کنند.

ادامه: فصل 4

منبع: www.habr.com

اضافه کردن نظر