এটি হল ns-3-ম্যানুয়াল কমান্ড যা আমাদের একাধিক বিনামূল্যের অনলাইন ওয়ার্কস্টেশন যেমন উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটর ব্যবহার করে OnWorks ফ্রি হোস্টিং প্রদানকারীতে চালানো যেতে পারে।
কার্যক্রম:
NAME এর
ns-3-ম্যানুয়াল - ns-3 ম্যানুয়াল
এই ns-3 ম্যানুয়াল. ns-3 প্রকল্পের প্রাথমিক ডকুমেন্টেশন পাঁচটিতে পাওয়া যায়
ফর্ম:
· ns-3 অক্সিজেন: সিমুলেটরের পাবলিক API-এর ডকুমেন্টেশন
· টিউটোরিয়াল, ম্যানুয়াল (এই নথি), এবং মডেল লাইব্রেরি জন্য সর্বশেষ মুক্তি এবং
উন্নয়ন বৃক্ষ
· ns-3 উইকি
সুচিপত্র
সংগঠন
এই অধ্যায় সামগ্রিক বর্ণনা ns-3 সফ্টওয়্যার সংস্থা এবং সংশ্লিষ্ট
এই ম্যানুয়ালটির সংগঠন।
ns-3 একটি বিচ্ছিন্ন-ইভেন্ট নেটওয়ার্ক সিমুলেটর যাতে সিমুলেশন কোর এবং মডেল থাকে
C++ এ প্রয়োগ করা হয়েছে। ns-3 একটি লাইব্রেরি হিসাবে নির্মিত যা স্ট্যাটিক বা গতিশীল হতে পারে
একটি C++ প্রধান প্রোগ্রামের সাথে সংযুক্ত যা সিমুলেশন টপোলজি সংজ্ঞায়িত করে এবং শুরু করে
সিমুলেটর ns-3 এছাড়াও পাইথনে এর প্রায় সমস্ত API রপ্তানি করে, যা পাইথন প্রোগ্রামগুলিকে অনুমতি দেয়
অনেকটা একইভাবে একটি "ns3" মডিউল আমদানি করুন ns-3 লাইব্রেরি এক্সিকিউটেবল দ্বারা লিঙ্ক করা হয়
C++ এ।
[ছবি] সফ্টওয়্যার সংস্থা ns-3.UNINDENT
এর উত্স কোড ns-3 বেশিরভাগ ক্ষেত্রে সংগঠিত হয় src ডিরেক্টরি এবং বর্ণনা করা যেতে পারে
মধ্যে চিত্র দ্বারা সফটওয়্যার সংগঠন of ns-3. আমরা নিচ থেকে আমাদের মত কাজ করব
আপ সাধারণভাবে, মডিউলগুলির শুধুমাত্র চিত্রের নীচের মডিউলগুলির উপর নির্ভরশীলতা রয়েছে৷
আমরা প্রথমে সিমুলেটরের মূল বর্ণনা করি; সব জুড়ে সাধারণ যে উপাদান
প্রোটোকল, হার্ডওয়্যার এবং পরিবেশগত মডেল। সিমুলেশন কোর বাস্তবায়িত হয়
src/core. প্যাকেটগুলি হল একটি নেটওয়ার্ক সিমুলেটরে মৌলিক বস্তু এবং এতে প্রয়োগ করা হয়
src/নেটওয়ার্ক. এই দুটি সিমুলেশন মডিউল নিজেদের দ্বারা একটি গঠিত উদ্দেশ্যে করা হয়
জেনেরিক সিমুলেশন কোর যা বিভিন্ন ধরণের নেটওয়ার্ক দ্বারা ব্যবহার করা যেতে পারে, শুধু নয়
ইন্টারনেট ভিত্তিক নেটওয়ার্ক। এর উপরের মডিউলগুলি ns-3 নির্দিষ্ট নেটওয়ার্ক থেকে স্বাধীন
এবং ডিভাইস মডেল, যা এই ম্যানুয়ালটির পরবর্তী অংশগুলিতে কভার করা হয়েছে।
উপরে ছাড়াও ns-3 কোর, আমরা প্রবর্তন করি, এর প্রাথমিক অংশেও
ম্যানুয়াল, অন্য দুটি মডিউল যা মূল C++-ভিত্তিক API-এর পরিপূরক। ns-3 প্রোগ্রাম হতে পারে
সমস্ত API সরাসরি অ্যাক্সেস করতে পারে বা একটি তথাকথিত ব্যবহার করতে পারে সাহায্যকারী এপিআই যে সরবরাহ করে
নিম্ন-স্তরের API কলগুলির সুবিধাজনক মোড়ক বা এনক্যাপসুলেশন। ব্যাপারটা হচ্ছে ns-3 প্রোগ্রাম
দুটি API-তে লেখা যেতে পারে (বা এর সংমিশ্রণ) একটি মৌলিক দিক
সিমুলেটর পাইথন কীভাবে সমর্থিত হয় তাও আমরা বর্ণনা করি ns-3 নির্দিষ্ট দিকে যাওয়ার আগে
নেটওয়ার্ক সিমুলেশনের সাথে প্রাসঙ্গিকতার মডেল।
ম্যানুয়ালটির বাকি অংশটি মডেলের নথিভুক্তকরণ এবং সমর্থন করার উপর দৃষ্টি নিবদ্ধ করে
ক্ষমতা পরবর্তী অংশ দুটি মৌলিক বস্তুর উপর ফোকাস করে ns-3: দ্য নোড এবং
নেটডিভাইস. নেটওয়ার্ক ইমুলেশন ব্যবহার সমর্থন করার জন্য দুটি বিশেষ NetDevice প্রকার ডিজাইন করা হয়েছে
ক্ষেত্রে, এবং অনুকরণ পরবর্তী বর্ণনা করা হয়েছে। নিম্নলিখিত অধ্যায় উৎসর্গ করা হয়
ইন্টারনেট-সম্পর্কিত মডেল, ইন্টারনেট অ্যাপ্লিকেশন দ্বারা ব্যবহৃত সকেট API সহ। দ্য
পরবর্তী অধ্যায় অ্যাপ্লিকেশন কভার করে, এবং নিম্নলিখিত অধ্যায় অতিরিক্ত সমর্থন বর্ণনা করে
সিমুলেশনের জন্য, যেমন অ্যানিমেটর এবং পরিসংখ্যান।
প্রকল্পের পরীক্ষা এবং বৈধতা নিবেদিত একটি পৃথক ম্যানুয়াল বজায় রাখে ns-3 কোড
(দেখুন ns-3 পরীক্ষামূলক এবং ভ্যালিডেশন ম্যানুয়াল).
এলোমেলো ভেরিয়েবল
ns-3 একটি অন্তর্নির্মিত সিউডো-র্যান্ডম নম্বর জেনারেটর (PRNG) রয়েছে। জন্য এটি গুরুত্বপূর্ণ
কার্যকারিতা, কনফিগারেশন এবং ব্যবহার বোঝার জন্য সিমুলেটরের গুরুতর ব্যবহারকারীরা
এই PRNG এর, এবং এটি তার গবেষণা ব্যবহারের জন্য যথেষ্ট কিনা তা সিদ্ধান্ত নিতে।
দ্রুত সংক্ষিপ্ত বিবরণ
ns-3 র্যান্ডম সংখ্যা দৃষ্টান্তের মাধ্যমে প্রদান করা হয় ns3::RandomVariable Stream.
· গতানুগতিক, ns-3 সিমুলেশন একটি নির্দিষ্ট বীজ ব্যবহার; কোন এলোমেলোতা আছে যদি
সিমুলেশন, প্রোগ্রামের প্রতিটি রান একই ফলাফল দেবে যদি না বীজ এবং/অথবা
রান নম্বর পরিবর্তন করা হয়।
· ভিতরে ns-3.3 এবং আগে, ns-3 সিমুলেশন ডিফল্টরূপে একটি এলোমেলো বীজ ব্যবহার করে; এই একটি চিহ্ন
থেকে শুরু করে নীতিতে পরিবর্তন ns-3.4.
· ভিতরে ns-3.14 এবং আগে, ns-3 সিমুলেশনে একটি ভিন্ন র্যাপার ক্লাস ব্যবহৃত হয় যাকে বলা হয়
ns3::RandomVariable। হিসাবে ns-3.15, এই ক্লাস দ্বারা প্রতিস্থাপিত হয়েছে
ns3::RandomVariable Stream; অন্তর্নিহিত ছদ্ম-র্যান্ডম নম্বর জেনারেটর নেই
পরিবর্তন করেছেন।
· একাধিক সিমুলেশন রান জুড়ে এলোমেলোতা পেতে, আপনাকে অবশ্যই বীজ সেট করতে হবে
ভিন্নভাবে বা রান নম্বর ভিন্নভাবে সেট করুন। একটি বীজ সেট করতে, কল করুন
ns3::RngSeedManager::SetSeed() প্রোগ্রামের শুরুতে; সঙ্গে একটি রান নম্বর সেট করতে
একই বীজ, কল ns3::RngSeedManager::SetRun() প্রোগ্রামের শুরুতে; দেখা
তৈরি করা হচ্ছে এলোমেলো ভেরিয়েবল.
· প্রতিটি RandomVariable Stream ব্যবহৃত হয় ns-3 একটি ভার্চুয়াল র্যান্ডম নম্বর জেনারেটর যুক্ত আছে
এর সাথে; সমস্ত র্যান্ডম ভেরিয়েবলের ব্যবহারের উপর ভিত্তি করে একটি নির্দিষ্ট বা এলোমেলো বীজ ব্যবহার করে
গ্লোবাল বীজ (আগের বুলেট);
· যদি আপনি একই দৃশ্যের একাধিক রান সম্পাদন করতে চান, ভিন্ন র্যান্ডম সহ
সংখ্যা, কীভাবে স্বাধীন প্রতিলিপিগুলি সম্পাদন করতে হয় সে সম্পর্কে অনুগ্রহ করে বিভাগটি পড়তে ভুলবেন না:
তৈরি করা হচ্ছে এলোমেলো ভেরিয়েবল.
এর জন্য র্যান্ডম নম্বর সুবিধা সম্পর্কে আরও ব্যাখ্যার জন্য আরও পড়ুন ns-3.
পটভূমি
সিমুলেশন অনেক র্যান্ডম সংখ্যা ব্যবহার করে; এক গবেষণায় দেখা গেছে যে বেশিরভাগ নেটওয়ার্ক সিমুলেশন
এলোমেলো সংখ্যা তৈরিতে CPU-এর 50% পর্যন্ত ব্যয় করুন। সিমুলেশন ব্যবহারকারী হতে হবে
(ছদ্ম) র্যান্ডম সংখ্যার গুণমান এবং এর মধ্যে স্বাধীনতার সাথে সংশ্লিষ্ট
এলোমেলো সংখ্যার বিভিন্ন প্রবাহ।
ব্যবহারকারীদের কয়েকটি সমস্যা নিয়ে উদ্বিগ্ন হতে হবে, যেমন:
· এলোমেলো সংখ্যা জেনারেটরের বীজ এবং একটি সিমুলেশন ফলাফল কিনা
নির্ধারক বা না,
· কিভাবে এলোমেলো সংখ্যার বিভিন্ন স্ট্রীম অর্জন করতে হয় যা একটি থেকে স্বাধীন
আরেকটি, এবং
স্ট্রীম সাইকেল হতে কতক্ষণ লাগে
আমরা এখানে কয়েকটি পদ প্রবর্তন করব: একটি RNG (ছদ্ম) এলোমেলো একটি দীর্ঘ ক্রম প্রদান করে
সংখ্যা এই ক্রমটির দৈর্ঘ্যকে বলা হয় চক্র লম্বা or কাল, এরপর কি
RNG নিজেই পুনরাবৃত্তি হবে. এই ক্রমটি বিভক্ত করা যেতে পারে স্ট্রিম. একটি
একটি আরএনজির স্ট্রিম হল আরএনজি সিকোয়েন্সের একটি সংলগ্ন উপসেট বা ব্লক। উদাহরণস্বরূপ, যদি
RNG সময়কাল N এর দৈর্ঘ্য, এবং এই RNG থেকে দুটি স্ট্রীম প্রদান করা হয়, তারপর প্রথমটি
স্ট্রিম প্রথম N/2 মান ব্যবহার করতে পারে এবং দ্বিতীয় স্ট্রিম দ্বিতীয় N/2 তৈরি করতে পারে
মান এখানে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল যে দুটি ধারা অসংলগ্ন। একইভাবে,
প্রতিটি স্ট্রীম অসংলগ্ন একটি সংখ্যায় বিভক্ত করা যেতে পারে সাবস্ট্রিম. দ্য
অন্তর্নিহিত RNG আশা করি খুব দীর্ঘ সংখ্যার একটি ছদ্ম-এলোমেলো ক্রম তৈরি করে
চক্রের দৈর্ঘ্য, এবং এটিকে স্ট্রীম এবং সাবস্ট্রিমে একটি দক্ষ পদ্ধতিতে পার্টিশন করে।
ns-3 একই অন্তর্নিহিত র্যান্ডম নম্বর জেনারেটর ব্যবহার করে ns-2: MRG32k3a
Pierre L'Ecuyer থেকে জেনারেটর। একটি বিস্তারিত বিবরণ পাওয়া যাবে
http://www.iro.umontreal.ca/~lecuyer/myftp/papers/streams00.pdf. MRG32k3a জেনারেটর
1.8x10^{19} এলোমেলো সংখ্যার স্বাধীন স্ট্রীম প্রদান করে, যার প্রতিটিতে রয়েছে
2.3x10^{15} সাবস্ট্রিম। প্রতিটি সাবস্ট্রিমের একটি পিরিয়ড থাকে (অর্থাত, এলোমেলো সংখ্যার সংখ্যা
ওভারল্যাপের আগে) 7.6x10^{22}। পুরো জেনারেটরের সময়কাল হল 3.1x10^{57}।
শ্রেণী ns3::RandomVariable Stream এই অন্তর্নিহিত র্যান্ডম সংখ্যার সর্বজনীন ইন্টারফেস
জেনারেটর যখন ব্যবহারকারীরা নতুন র্যান্ডম ভেরিয়েবল তৈরি করে (যেমন ns3::UniformRandomVariable,
ns3::ExponentialRandomVariable, ইত্যাদি), তারা একটি বস্তু তৈরি করে যা একটি ব্যবহার করে
র্যান্ডম সংখ্যা জেনারেটরের স্বতন্ত্র, স্বাধীন স্ট্রীম। অতএব, প্রতিটি বস্তুর
আদর্শ ns3::RandomVariable Stream ধারণাগতভাবে এর নিজস্ব "ভার্চুয়াল" RNG আছে। উপরন্তু,
প্রতি ns3::RandomVariable Stream অঙ্কিত সাবস্ট্রিমগুলির একটি সেট ব্যবহার করার জন্য কনফিগার করা যেতে পারে
মূল স্রোত থেকে।
একটি বিকল্প বাস্তবায়ন হবে প্রতিটি RandomVariable এর নিজস্ব থাকতে দেওয়া
(ভিন্নভাবে বীজযুক্ত) RNG. যাইহোক, আমরা দৃঢ়ভাবে গ্যারান্টি দিতে পারি না যে ভিন্ন
এই ধরনের ক্ষেত্রে ক্রমগুলি সম্পর্কহীন হবে; তাই, আমরা একটি একক RNG ব্যবহার করতে পছন্দ করি এবং
এটি থেকে স্রোত এবং উপধারা।
তৈরি করা হচ্ছে এলোমেলো ভেরিয়েবল
ns-3 বেস ক্লাস থেকে র্যান্ডম পরিবর্তনশীল বস্তুর একটি সংখ্যা সমর্থন করে
এলোমেলো ভেরিয়েবল স্ট্রিম. এই বস্তু থেকে উদ্ভূত ns3::অবজেক্ট এবং স্মার্ট দ্বারা পরিচালিত হয়
পয়েন্টার
এই বস্তুগুলি তৈরি করার সঠিক উপায় হল টেমপ্লেটেড ব্যবহার করা CreateObject<> পদ্ধতি,
যেমন:
Ptr x = CreateObject ();
তারপর আপনি অবজেক্টে পদ্ধতিগুলি কল করে মানগুলি অ্যাক্সেস করতে পারেন যেমন:
myRandomNo = x->GetInteger ();
আপনি যদি পরিবর্তে এই মত কিছু করার চেষ্টা করেন:
myRandomNo = UniformRandomVariable().GetInteger();
আপনার প্রোগ্রামটি একটি বিভাজন ত্রুটির সম্মুখীন হবে, কারণ বাস্তবায়ন নির্ভর করে
কিছু বৈশিষ্ট্য নির্মাণ যে ঘটে শুধুমাত্র যখন অবজেক্ট তৈরি করুন বলা হয়.
এই অধ্যায়ের বাকি বেশিরভাগই এখন স্ট্রীমের বৈশিষ্ট্য নিয়ে আলোচনা করে
এই ধরনের বস্তু থেকে উত্পন্ন ছদ্ম-এলোমেলো সংখ্যা, এবং এই ধরনের বীজ কিভাবে নিয়ন্ত্রণ করা যায়
অবজেক্ট।
seeding এবং স্বাধীন প্রতিলিপি
ns-3 সিমুলেশনগুলি নির্ধারক বা এলোমেলো ফলাফল তৈরি করতে কনফিগার করা যেতে পারে। যদি
ns-3 সিমুলেশন একই রান নম্বর সহ একটি নির্দিষ্ট, নির্ধারক বীজ ব্যবহার করার জন্য কনফিগার করা হয়েছে,
এটি প্রতিবার চালানোর সময় একই আউটপুট দেওয়া উচিত।
গতানুগতিক, ns-3 সিমুলেশন একটি নির্দিষ্ট বীজ এবং রান সংখ্যা ব্যবহার করে। এই মান সংরক্ষণ করা হয়
দুই ns3::গ্লোবাল ভ্যালু উদাহরণ: g_rngSeed এবং g_rngRun.
একটি সাধারণ ব্যবহারের ক্ষেত্রে স্বাধীন বিচারের ক্রম হিসাবে একটি সিমুলেশন চালানো হয়, যাতে
প্রচুর পরিমাণে স্বাধীন রানের পরিসংখ্যান গণনা করুন। ব্যবহারকারী হয় পরিবর্তন করতে পারেন
বৈশ্বিক বীজ এবং সিমুলেশন পুনরায় চালান, বা RNG এর সাবস্ট্রিম অবস্থা অগ্রসর করতে পারেন, যা
রান সংখ্যা বৃদ্ধি হিসাবে উল্লেখ করা হয়.
একটি শ্রেণী ns3::RngSeedManager সিডিং এবং রান নম্বর নিয়ন্ত্রণ করতে একটি API প্রদান করে
আচরণ এই সিডিং এবং সাবস্ট্রিম স্টেট সেটিং কোন র্যান্ডম আগে কল করা আবশ্যক
ভেরিয়েবল তৈরি করা হয়; যেমন:
RngSeedManager::SetSeed (3); // ডিফল্ট থেকে বীজ 1 থেকে 3 পরিবর্তন করে
RngSeedManager::SetRun (7); // ডিফল্ট থেকে 1 থেকে 7 পর্যন্ত রান নম্বর পরিবর্তন করে
// এখন, এলোমেলো ভেরিয়েবল তৈরি করুন
Ptr x = CreateObject ();
Ptr y = CreateObject ();
...
কোনটি ভাল, একটি নতুন বীজ সেট করা বা সাবস্ট্রিম স্টেটকে অগ্রসর করা? এমন কিছু নেই
গ্যারান্টি যে দুটি এলোমেলো বীজ দ্বারা উত্পাদিত স্ট্রিম ওভারল্যাপ হবে না। একমাত্র উপায়
গ্যারান্টি যে দুটি স্ট্রীম ওভারল্যাপ হয় না তা হল দ্বারা প্রদত্ত সাবস্ট্রিম ক্ষমতা ব্যবহার করা
RNG বাস্তবায়ন। অতএব, ব্যবহার দ্য সাবস্ট্রিম সামর্থ্য থেকে উৎপাদন করা বহু
স্বাধীন রান of দ্য একই সিমুলেশন। অন্য কথায়, আরও পরিসংখ্যানগতভাবে কঠোর
একাধিক স্বাধীন প্রতিলিপি কনফিগার করার উপায় হল একটি নির্দিষ্ট বীজ ব্যবহার করা এবং অগ্রসর হওয়া
রান নম্বর। এই বাস্তবায়ন সর্বাধিক 2.3x10^{15} স্বাধীন করার অনুমতি দেয়
সাবস্ট্রিম ব্যবহার করে প্রতিলিপি।
ব্যবহারের স্বাচ্ছন্দ্যের জন্য, বীজ নিয়ন্ত্রণ করা এবং এর মধ্যে থেকে সংখ্যা চালানোর প্রয়োজন নেই
কার্যক্রম; ব্যবহারকারী সেট করতে পারেন NS_GLOBAL_VALUE পরিবেশ পরিবর্তনশীল নিম্নরূপ:
$ NS_GLOBAL_VALUE="RngRun=3" ./waf --run প্রোগ্রাম-নাম
এটি নিয়ন্ত্রণ করার আরেকটি উপায় হল একটি কমান্ড-লাইন আর্গুমেন্ট পাস করা; যেহেতু এই একটি ns-3
GlobalValue উদাহরণে, এটি সমতুল্যভাবে করা হয় যেমন নিম্নরূপ:
$ ./waf --command-template="%s --RngRun=3" --রান প্রোগ্রাম-নাম
অথবা, আপনি যদি সরাসরি waf এর বাইরে প্রোগ্রাম চালাচ্ছেন:
$ ./build/optimized/scratch/program-name --RngRun=3
উপরের কমান্ড-লাইন ভেরিয়েন্টগুলি একটি শেল থেকে প্রচুর বিভিন্ন রান চালানো সহজ করে তোলে
স্ক্রিপ্ট শুধুমাত্র একটি ভিন্ন RngRun সূচক পাস করে।
শ্রেণী এলোমেলো ভেরিয়েবল স্ট্রিম
সমস্ত র্যান্ডম ভেরিয়েবল ক্লাস থেকে প্রাপ্ত করা উচিত দৈব চলক. এই বেস ক্লাস একটি প্রদান করে
র্যান্ডম নম্বর জেনারেটরের আচরণ বিশ্বব্যাপী কনফিগার করার জন্য কয়েকটি পদ্ধতি। প্রাপ্ত
ক্লাস নির্দিষ্ট ডিস্ট্রিবিউশন থেকে এলোমেলো বৈচিত্র আঁকার জন্য API প্রদান করে
সমর্থিত।
সিমুলেশনে তৈরি প্রতিটি র্যান্ডমভেরিয়েবল স্ট্রিমকে একটি জেনারেটর দেওয়া হয় যা একটি নতুন
অন্তর্নিহিত PRNG থেকে RNGস্ট্রিম। এই পদ্ধতিতে ব্যবহৃত, L'Ecuyer বাস্তবায়ন
সর্বাধিক 1.8x10^19 র্যান্ডম ভেরিয়েবলের জন্য অনুমতি দেয়। একটি একক প্রতিটি র্যান্ডম পরিবর্তনশীল
প্রতিলিপি ওভারল্যাপ করার আগে 7.6x10^22 পর্যন্ত র্যান্ডম সংখ্যা তৈরি করতে পারে।
ভিত্তি শ্রেণী প্রকাশ্য এপিআই
নীচে ক্লাসের কয়েকটি পাবলিক পদ্ধতি উদ্ধৃত করা হয়েছে এলোমেলো ভেরিয়েবল স্ট্রিম যে অ্যাক্সেস
সাবস্ট্রিমের পরবর্তী মান।
/ **
* \brief অন্তর্নিহিত বন্টন থেকে একটি এলোমেলো দ্বিগুণ প্রদান করে
* \return একটি ফ্লোটিং পয়েন্ট এলোমেলো মান
*/
ডবল GetValue (অকার্যকর) const;
/ **
* \brief অন্তর্নিহিত বন্টন থেকে একটি এলোমেলো পূর্ণসংখ্যা প্রদান করে
* \::GetValue() এর পূর্ণসংখ্যা কাস্ট ফেরত দিন
*/
uint32_t GetInteger (অকার্যকর) const;
আমরা ইতিমধ্যে উপরে বপন কনফিগারেশন বর্ণনা করেছি। বিভিন্ন র্যান্ডম ভেরিয়েবল
সাবক্লাসে অতিরিক্ত API থাকতে পারে।
প্রকারভেদ of এলোমেলো ভেরিয়েবল
নিম্নলিখিত ধরনের র্যান্ডম ভেরিয়েবল প্রদান করা হয়, এবং নথিভুক্ত করা হয় ns-3
ডক্সিজেন নাকি পড়ে src/core/model/random-variable-stream.h. ব্যবহারকারীরাও তৈরি করতে পারেন
ক্লাস থেকে প্রাপ্ত করে তাদের নিজস্ব কাস্টম র্যান্ডম ভেরিয়েবল এলোমেলো ভেরিয়েবল স্ট্রিম.
· ক্লাস UniformRandomVariable
· ক্লাস ConstantRandomVariable
· ক্লাস অনুক্রমিক র্যান্ডম ভেরিয়েবল
· ক্লাস সূচকীয় র্যান্ডম ভেরিয়েবল
· ক্লাস ParetoRandomVariable
· ক্লাস WeibullRandomVariable
· ক্লাস সাধারণ র্যান্ডম ভেরিয়েবল
· ক্লাস LogNormalRandomVariable
· ক্লাস GammaRandomVariable
· ক্লাস ErlangRandomVariable
· ক্লাস ত্রিভুজাকার র্যান্ডম ভেরিয়েবল
· ক্লাস ZipfRandomVariable
· ক্লাস ZetaRandomVariable
· ক্লাস DeterministicRandomVariable
· ক্লাস অভিজ্ঞতামূলক র্যান্ডম ভেরিয়েবল
শব্দার্থবিদ্যা of এলোমেলো ভেরিয়েবল স্ট্রিম বস্তু
RandomVariableStream অবজেক্ট থেকে প্রাপ্ত ns3::অবজেক্ট এবং স্মার্ট পয়েন্টার দ্বারা পরিচালিত হয়।
RandomVariableStream দৃষ্টান্ত এছাড়াও ব্যবহার করা যেতে পারে ns-3 গুণাবলী, যার মানে যে
এর মাধ্যমে তাদের জন্য মান নির্ধারণ করা যেতে পারে ns-3 বৈশিষ্ট্য সিস্টেম। একটি উদাহরণ আছে
WifiNetDevice-এর জন্য প্রচার মডেল:
টাইপআইডি
এলোমেলো প্রচার বিলম্ব মডেল::GetTypeId (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::RandomPropagationDelayModel")
.SetParent ()
.AddConstructor ()
.AddAttribute ("ভেরিয়েবল",
"র্যান্ডম ভেরিয়েবল যা এলোমেলো বিলম্ব (গুলি) তৈরি করে।",
StringValue ("ns3::UniformRandomVariable"),
MakePointerAccessor (&RandomPropagationDelayModel::m_variable),
MakePointerChecker ())
;
রিটার্ন tid;
}
এখানে ns-3 ব্যবহারকারী এই বিলম্ব মডেলের জন্য ডিফল্ট র্যান্ডম ভেরিয়েবল পরিবর্তন করতে পারে (যা
0 থেকে 1 পর্যন্ত একটি UniformRandomVariable) অ্যাট্রিবিউট সিস্টেমের মাধ্যমে।
ব্যবহার অন্যান্য পিআরএনজি
বর্তমানে একটি ভিন্ন অন্তর্নিহিত র্যান্ডম সংখ্যা প্রতিস্থাপনের জন্য কোন সমর্থন নেই
জেনারেটর (যেমন, GNU সায়েন্টিফিক লাইব্রেরি বা Akaroa প্যাকেজ)। প্যাচ স্বাগত জানাই.
বিন্যাস দ্য প্রবাহ সংখ্যা
অন্তর্নিহিত MRG32k3a জেনারেটর 2^64 স্বাধীন স্ট্রিম প্রদান করে। ns-3 এ, এগুলো
নতুন RandomVariableStream দৃষ্টান্ত হিসাবে প্রথম স্ট্রীম থেকে শুরু করে ক্রমানুসারে বরাদ্দ করা হয়েছে
GetValue() এ তাদের প্রথম কল করুন।
কিভাবে এই RandomVariableStream অবজেক্টগুলি অন্তর্নিহিত স্ট্রীমগুলিতে বরাদ্দ করা হয় তার ফলস্বরূপ,
অ্যাসাইনমেন্টটি সিমুলেশন কনফিগারেশনের ঝামেলার জন্য সংবেদনশীল। দ্য
ফলাফল হল যে যদি সিমুলেশন কনফিগারেশনের কোন দিক পরিবর্তন করা হয়, ম্যাপিং
র্যান্ডম ভ্যারিয়েবল থেকে স্ট্রীম পরিবর্তন হতে পারে (বা নাও হতে পারে)।
একটি কংক্রিট উদাহরণ হিসাবে, একজন ব্যবহারকারী রাউটিং প্রোটোকলগুলির মধ্যে একটি তুলনামূলক অধ্যয়ন চালাতে পারে
একটি রাউটিং প্রোটোকল অন্যটির জন্য পরিবর্তন করার কাজটি লক্ষ্য করবে যে
অন্তর্নিহিত গতিশীলতার প্যাটার্নও পরিবর্তিত হয়েছে।
ns-3.15 দিয়ে শুরু করে, ব্যবহারকারীদের অনুমতি দেওয়ার জন্য ব্যবহারকারীদের কিছু নিয়ন্ত্রণ প্রদান করা হয়েছে
ঐচ্ছিকভাবে নির্বাচিত RandomVariableStream অবজেক্টের অ্যাসাইনমেন্ট অন্তর্নিহিতে ঠিক করুন
প্রবাহ এই হল প্রবাহ বৈশিষ্ট্য, বেস ক্লাস RandomVariableStream এর অংশ।
আগে থেকে স্ট্রিমগুলির বিদ্যমান ক্রমকে বিভাজন করে:
<---------------------------------------------------------------- -------------------------------------->
স্ট্রীম 0 স্ট্রীম (2^64 - 1)
দুটি সমান আকারের সেটে:
<---------------------------------------------------------------- -------------------------------------->
^ ^^ ^
| || |
স্ট্রীম 0 স্ট্রীম (2^63 - 1) স্ট্রীম 2^63 স্ট্রীম (2^64 - 1)
<- স্বয়ংক্রিয়ভাবে বরাদ্দ -----------><- ব্যবহারকারী দ্বারা নির্ধারিত ----------------->
প্রথম 2^63 স্ট্রীমগুলি স্বয়ংক্রিয়ভাবে বরাদ্দ করা অব্যাহত থাকে, যেখানে শেষ 2^63টি হয়৷
2^63-1 পর্যন্ত শূন্য দিয়ে শুরু হওয়া প্রদত্ত স্ট্রিম সূচক।
একটি নির্দিষ্ট স্ট্রিম নম্বরে স্ট্রীমগুলির নিয়োগ ঐচ্ছিক; এর উদাহরণ
RandomVariableStream যেগুলির জন্য স্ট্রীম মান বরাদ্দ নেই সেগুলি পরেরটি বরাদ্দ করা হবে৷
স্বয়ংক্রিয় প্রবাহের পুল থেকে একটি।
একটি নির্দিষ্ট অন্তর্নিহিত স্ট্রীমে একটি RandomVariableStream ঠিক করতে, এটি নির্ধারণ করুন প্রবাহ
একটি অ নেতিবাচক পূর্ণসংখ্যার বৈশিষ্ট্য (-1 এর ডিফল্ট মান মানে একটি মান হবে
স্বয়ংক্রিয়ভাবে বরাদ্দ)।
প্রকাশক তোমার ফলাফল
আপনি যখন সিমুলেশন ফলাফল প্রকাশ করেন, তখন কনফিগারেশন তথ্যের একটি মূল অংশ যা আপনি
আপনি কিভাবে এলোমেলো নম্বর জেনারেটর ব্যবহার করেছেন তা সর্বদা বলা উচিত।
আপনি কোন বীজ ব্যবহার করেছেন,
ডিফল্ট না হলে আপনি কোন RNG ব্যবহার করেছেন,
কিভাবে স্বাধীন রান সঞ্চালিত হয়েছে,
· বড় সিমুলেশনের জন্য, আপনি কীভাবে পরীক্ষা করেছেন যে আপনি সাইকেল চালাননি।
এটি যথেষ্ট তথ্য অন্তর্ভুক্ত করার জন্য ফলাফল প্রকাশের গবেষকের দায়িত্ব
অন্যদের তার ফলাফল পুনরুত্পাদন করার অনুমতি দিন। এটা গবেষকেরও দায়িত্ব
নিজেকে বোঝান যে ব্যবহৃত এলোমেলো সংখ্যাগুলি পরিসংখ্যানগতভাবে বৈধ ছিল, এবং উল্লেখ করার জন্য
কাগজ কেন এই ধরনের আস্থা অনুমান করা হয়.
সারাংশ
একটি সিমুলেশন তৈরি করার সময় আপনার কী করা উচিত তা পর্যালোচনা করা যাক।
· আপনি একটি স্থির বীজ বা এলোমেলো বীজ নিয়ে দৌড়াচ্ছেন কিনা তা নির্ধারণ করুন; একটি নির্দিষ্ট বীজ হয়
ডিফল্ট,
· প্রযোজ্য হলে আপনি কীভাবে স্বাধীন প্রতিলিপিগুলি পরিচালনা করবেন তা নির্ধারণ করুন,
নিজেকে বোঝান যে আপনি চক্রের দৈর্ঘ্যের চেয়ে বেশি এলোমেলো মান আঁকছেন না, যদি
আপনি একটি খুব দীর্ঘ সিমুলেশন চালাচ্ছেন, এবং
· আপনি যখন প্রকাশ করেন, তখন আপনার র্যান্ডম ব্যবহার নথিভুক্ত করার বিষয়ে উপরের নির্দেশিকা অনুসরণ করুন
নম্বর জেনারেটর।
কাটা কার্যাবলী
ns-3 সাধারণ উদ্দেশ্য হ্যাশ ফাংশন একটি জেনেরিক ইন্টারফেস প্রদান করে. সহজে
ব্যবহার, হ্যাশ ফাংশন একটি ডেটা বাফার বা স্ট্রিং এর 32-বিট বা 64-বিট হ্যাশ ফেরত দেয়।
ডিফল্ট অন্তর্নিহিত হ্যাশ ফাংশন হয় murmur3, বেছে নেওয়া হয়েছে কারণ এটির হ্যাশ ফাংশন ভালো
বৈশিষ্ট্য এবং একটি 64-বিট সংস্করণ অফার করে। পূজনীয় FNV1a হ্যাশও পাওয়া যায়।
বিকল্প হ্যাশ যোগ করার (বা রান টাইমে প্রদান) করার জন্য একটি সোজা-আগামী প্রক্রিয়া আছে
ফাংশন বাস্তবায়ন।
মৌলিক ব্যবহার
একটি ডেটা বাফার বা স্ট্রিংয়ের হ্যাশ মান পাওয়ার সহজ উপায় হল:
# "ns3/hash.h" অন্তর্ভুক্ত করুন
নামস্থান ns3 ব্যবহার করে;
char * বাফার = ...
size_t বাফার_size = ...
uint32_t buffer_hash = Hash32 ( বাফার, বাফার_সাইজ);
std::স্ট্রিং s;
uint32_t string_hash = Hash32(s);
64-বিট হ্যাশ মানের জন্য সমতুল্য ফাংশন সংজ্ঞায়িত করা হয়।
ক্রমবর্ধমান হ্যাশ
কিছু পরিস্থিতিতে একাধিক বাফারের হ্যাশ গণনা করা দরকারী, যেন তাদের ছিল
একসাথে যোগদান করা হয়েছে। (উদাহরণস্বরূপ, আপনি একটি প্যাকেট স্ট্রিমের হ্যাশ চাইতে পারেন, কিন্তু না
সমস্ত প্যাকেটের সম্মিলিত বিষয়বস্তুর সাথে একটি একক বাফার একত্রিত করতে চাই।)
এটি প্রথম উদাহরণের মতো প্রায় সোজা-সামনের:
# "ns3/hash.h" অন্তর্ভুক্ত করুন
নামস্থান ns3 ব্যবহার করে;
char * বাফার;
সাইজ_টি বাফার_সাইজ;
হাশর হাশার; // ডিফল্ট হ্যাশ ফাংশন ব্যবহার করুন
জন্য ( )
{
বাফার = get_next_buffer ();
হ্যাশার (বাফার, বাফার_সাইজ);
}
uint32_t combined_hash = hasher.GetHash32 ();
গতানুগতিক হাশার ক্রমবর্ধমান হ্যাশিং সক্ষম করতে অভ্যন্তরীণ অবস্থা সংরক্ষণ করে। যদি তুমি চাও
পুনঃব্যবহার a হাশার বস্তু (উদাহরণস্বরূপ কারণ এটি একটি নন-ডিফল্ট হ্যাশের সাথে কনফিগার করা হয়েছে
ফাংশন), কিন্তু পূর্বে গণনা করা হ্যাশে যোগ করতে চান না, আপনাকে করতে হবে পরিষ্কার()
প্রথম:
hasher.clear ().GetHash32 (বাফার, বাফার_সাইজ);
এটি বাফার হ্যাশ করার আগে অভ্যন্তরীণ অবস্থা পুনরায় চালু করে।
ব্যবহার an বিকল্প কাটা ক্রিয়া
ডিফল্ট হ্যাশ ফাংশন হয় murmur3. FNV1a এছাড়াও পাওয়া যায় হ্যাশ নির্দিষ্ট করতে
স্পষ্টভাবে ফাংশন, এই কন্ট্রাক্টর ব্যবহার করুন:
হ্যাশার হ্যাশার = হাশার ( তৈরি করুন ());
যোগ করার পদ্ধতি নতুন কাটা ক্রিয়া বাস্তবায়নের
হ্যাশ ফাংশন যোগ করতে foo বিন্যাস, অনুসরণ করা হ্যাশ- murmur3.h/.cc প্যাটার্ন:
একটি ক্লাস ঘোষণা তৈরি করুন (.h) এবং সংজ্ঞা (.cc) থেকে উত্তরাধিকারসূত্রে পাওয়া
হ্যাশ::বাস্তবায়ন.
· অন্তর্ভুক্ত করা মধ্যে ঘোষণা হ্যাশ (বিন্দু যেখানে হ্যাশ- murmur3.h অন্তর্ভুক্ত করা হয়.
· আপনার নিজের কোডে, তাৎক্ষণিক a হাশার কনস্ট্রাক্টরের মাধ্যমে অবজেক্ট হাশার
(Ptr ())
যদি আপনার হ্যাশ ফাংশন একটি একক ফাংশন হয়, যেমন হ্যাশফ, আপনি এমনকি একটি তৈরি করতে হবে না
হ্যাশ ইমপ্লিমেন্টেশন থেকে প্রাপ্ত নতুন ক্লাস:
হাশর হাশর=
হ্যাশার ( তৈরি করুন (&হাশফ));
এই কম্পাইল করার জন্য, আপনার হ্যাশফ ফাংশন পয়েন্টার স্বাক্ষরগুলির একটির সাথে মেলাতে হবে:
typedef uint32_t (*Hash32Function_ptr) (const char *, const size_t);
typedef uint64_t (*Hash64Function_ptr) (const char *, const size_t);
সোর্স উন্নত কাটা কার্যাবলী
অন্যান্য হ্যাশ ফাংশন বাস্তবায়নের উত্সগুলির মধ্যে রয়েছে:
· পিটার কানকোস্কি: http://www.strchr.com
· আরাশ পার্টো: http://www.partow.net/programming/hashfunctions/index.html
· SMHasher: http://code.google.com/p/smhasher/
· সানমায়েস: http://www.sanmayce.com/Fastest_Hash/index.html
ঘটনাবলী এবং সিমুলেটর
ns-3 একটি বিচ্ছিন্ন-ইভেন্ট নেটওয়ার্ক সিমুলেটর। ধারণাগতভাবে, সিমুলেটর একটি ট্র্যাক রাখে
একটি নির্দিষ্ট সিমুলেশন সময়ে চালানোর জন্য নির্ধারিত ইভেন্টের সংখ্যা। এর কাজ
সিমুলেটর হল ইভেন্টগুলিকে ক্রমানুসারে কার্যকর করা। এর সমাপ্তি একবার
একটি ঘটনা ঘটে, সিমুলেটরটি পরবর্তী ইভেন্টে চলে যাবে (অথবা যদি না থাকে তাহলে প্রস্থান করবে
ইভেন্ট সারিতে আরও ইভেন্ট)। যদি, উদাহরণস্বরূপ, সিমুলেশন সময়ের জন্য নির্ধারিত একটি ইভেন্ট
"100 সেকেন্ড" কার্যকর করা হয়, এবং পরবর্তী ইভেন্ট "200 সেকেন্ড" পর্যন্ত নির্ধারিত হয় না,
সিমুলেটর অবিলম্বে 100 সেকেন্ড থেকে 200 সেকেন্ডে (সিমুলেশন সময়ের) লাফিয়ে যাবে
পরবর্তী ঘটনা চালান। এটি "বিচ্ছিন্ন-ইভেন্ট" সিমুলেটর দ্বারা বোঝানো হয়েছে।
এই সব ঘটতে, সিমুলেটর কিছু জিনিস প্রয়োজন:
1. একটি সিমুলেটর অবজেক্ট যা একটি ইভেন্ট সারি অ্যাক্সেস করতে পারে যেখানে ইভেন্টগুলি সংরক্ষণ করা হয় এবং এটি করতে পারে
ঘটনা সঞ্চালন পরিচালনা
2. সারি থেকে ইভেন্টগুলি সন্নিবেশ করা এবং অপসারণের জন্য দায়ী একটি সময়সূচী৷
3. সিমুলেশন সময় প্রতিনিধিত্ব করার একটি উপায়
4. ঘটনা নিজেদের
ম্যানুয়ালটির এই অধ্যায়টি এই মৌলিক বস্তুগুলিকে বর্ণনা করে (সিমুলেটর, সময়সূচী,
সময়, ঘটনা) এবং কিভাবে তারা ব্যবহার করা হয়।
ঘটনা
থেকে be সম্পন্ন
সিমুলেটর
ইভেন্ট শিডিউলিং সুবিধাগুলি অ্যাক্সেস করার জন্য সিমুলেটর ক্লাস হল পাবলিক এন্ট্রি পয়েন্ট। একদা
ইভেন্টের একটি দম্পতি সিমুলেশন শুরু করার জন্য নির্ধারিত করা হয়েছে, ব্যবহারকারী শুরু করতে পারেন
সিমুলেটর প্রধান লুপে প্রবেশ করে সেগুলি চালান (কল সিমুলেটর::চালান) একবার মূল লুপ
চলতে শুরু করে, এটি ক্রমানুসারে পুরানো থেকে ক্রমানুসারে সমস্ত নির্ধারিত ইভেন্ট চালাবে
ইভেন্টের সারিতে আর কোনো ইভেন্ট বাকি না থাকা পর্যন্ত বা
সিমুলেটর::স্টপ বলা হয়েছে।
সিমুলেটর প্রধান লুপ দ্বারা সঞ্চালনের জন্য ইভেন্টগুলি নির্ধারণ করতে, সিমুলেটর ক্লাস প্রদান করে
সিমুলেটর::শিডিউল* ফাংশন পরিবার।
1. বিভিন্ন স্বাক্ষর সহ ইভেন্ট হ্যান্ডলারদের হ্যান্ডলিং
এই ফাংশনগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করার জন্য C++ টেমপ্লেট হিসাবে ঘোষণা এবং প্রয়োগ করা হয়
বন্যতে ব্যবহৃত C++ ইভেন্ট হ্যান্ডলার স্বাক্ষরের বিস্তৃত বৈচিত্র্য। উদাহরণস্বরূপ, একটি সময়সূচী করতে
ভবিষ্যতে 10 সেকেন্ড চালানোর জন্য ইভেন্ট, এবং একটি C++ পদ্ধতি বা ফাংশন চালু করুন
নির্দিষ্ট আর্গুমেন্ট, আপনি এটি লিখতে পারেন:
অকার্যকর হ্যান্ডলার (int arg0, int arg1)
{
std::cout << "হ্যান্ডলারকে আর্গুমেন্ট দিয়ে ডাকা হয় arg0=" << arg0 << " এবং
arg1=" << arg1 << std::endl;
}
সিমুলেটর::শিডিউল(সেকেন্ড(10), &হ্যান্ডলার, 10, 5);
যা আউটপুট করবে:
হ্যান্ডলার আর্গুমেন্ট arg0=10 এবং arg1=5 সহ কল করা হয়
অবশ্যই, এই C++ টেমপ্লেটগুলি C++ এ স্বচ্ছ সদস্য পদ্ধতিগুলিও পরিচালনা করতে পারে
বস্তু:
থেকে be সম্পন্ন: সদস্য পদ্ধতি উদাহরণ
নোট:
· ns-3 তফসিল পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে ফাংশন এবং পদ্ধতিগুলিকে চিনতে পারে শুধুমাত্র যদি তারা
5 টিরও কম আর্গুমেন্ট নিন। আপনার যদি আরও যুক্তি সমর্থন করার জন্য তাদের প্রয়োজন হয়, অনুগ্রহ করে, একটি ফাইল করুন
বাগ রিপোর্ট
· 'সম্পূর্ণ-বাউন্ড ফাংশনস' শব্দটির সাথে পরিচিত পাঠকরা চিনতে পারবে
সিমুলেটর:: এই ধরনের বস্তুগুলি স্বয়ংক্রিয়ভাবে তৈরি করার উপায় হিসাবে সময়সূচী পদ্ধতি।
2. সাধারণ শিডিউলিং অপারেশন
বেশিরভাগ ইভেন্টের সময়সূচী করা সত্যিই সহজ করার জন্য সিমুলেটর API ডিজাইন করা হয়েছিল। এটা
এটি করার জন্য তিনটি রূপ প্রদান করে (সর্বাধিক ব্যবহৃত থেকে সর্বনিম্ন ব্যবহৃত থেকে অর্ডার করা):
· সময়সূচী পদ্ধতি যা আপনাকে প্রদান করে ভবিষ্যতে একটি ইভেন্টের সময় নির্ধারণ করতে দেয়
বর্তমান সিমুলেশন সময় এবং টার্গেট ইভেন্টের মেয়াদ শেষ হওয়ার তারিখের মধ্যে বিলম্ব।
· ScheduleNow পদ্ধতি যা আপনাকে বর্তমান সিমুলেশনের জন্য একটি ইভেন্ট নির্ধারণ করতে দেয়
সময়: তারা _after_ বর্তমান ইভেন্টটি কার্যকর করা শেষ হবে কিন্তু _for_the
পরবর্তী ইভেন্টের জন্য সিমুলেশন সময় পরিবর্তন করা হয়।
· ScheduleDestroy পদ্ধতি যা আপনাকে সিমুলেটরের শাটডাউন প্রক্রিয়ার সাথে যুক্ত করতে দেয়
সিমুলেশন রিসোর্স ক্লিনআপ করতে: ব্যবহারকারী কল করলে প্রতিটি 'ডিস্ট্রয়' ইভেন্ট চালানো হয়
সিমুলেটর::নষ্ট পদ্ধতি।
3. সিমুলেশন প্রসঙ্গ বজায় রাখা
ইভেন্টের সময়সূচী করার জন্য দুটি মৌলিক উপায় আছে, সঙ্গে এবং ছাড়া প্রসঙ্গ। এই কি
এর অর্থ কি?
সিমুলেটর::শিডিউল (সময় ধারণ ও সময়, MEM mem_ptr, OBJ obj);
বনাম
সিমুলেটর::ScheduleWithContext (uint32_t প্রসঙ্গ, সময় কনস্ট & সময়, MEM mem_ptr, OBJ obj);
পাঠক যারা একটি নন-তুচ্ছ সিমুলেশন মডেল তৈরি বা ব্যবহার করার জন্য সময় এবং শ্রম বিনিয়োগ করেন
সহজ এবং জটিল সিমুলেশন ডিবাগ করতে ns-3 লগিং ফ্রেমওয়ার্কের মান জানতে পারবে
একইভাবে এই লগিং ফ্রেমওয়ার্ক দ্বারা উপলব্ধ করা হয় যে গুরুত্বপূর্ণ বৈশিষ্ট্য এক
'বর্তমানে' চলমান ইভেন্টের সাথে যুক্ত নেটওয়ার্ক নোড আইডির স্বয়ংক্রিয় প্রদর্শন।
বর্তমানে কার্যকরী নেটওয়ার্ক নোডের নোড আইডি আসলে সিমুলেটর দ্বারা ট্র্যাক করা হয়
ক্লাস এটি Simulator::GetContext পদ্ধতির মাধ্যমে অ্যাক্সেস করা যেতে পারে যা রিটার্ন করে
'প্রসঙ্গ' (একটি 32-বিট পূর্ণসংখ্যা) যুক্ত এবং বর্তমানে-নির্বাহী ইভেন্টে সংরক্ষিত। ভিতরে
কিছু বিরল ক্ষেত্রে, যখন একটি ইভেন্ট একটি নির্দিষ্ট নেটওয়ার্ক নোডের সাথে যুক্ত হয় না, এটি
'প্রসঙ্গ' 0xffffffff এ সেট করা হয়েছে।
প্রতিটি ইভেন্টের সাথে একটি প্রসঙ্গ সংযুক্ত করতে, সময়সূচী, এবং ScheduleNow পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে
নির্ধারিত ইভেন্টের প্রেক্ষাপট হিসাবে বর্তমানে-নির্বাহী ইভেন্টের প্রসঙ্গ পুনরায় ব্যবহার করুন
পরে মৃত্যুদন্ড কার্যকর করার জন্য।
কিছু ক্ষেত্রে, সবচেয়ে উল্লেখযোগ্যভাবে যখন একটি নোড থেকে প্যাকেটের সংক্রমণ অনুকরণ করা হয়
আরেকটি, এই আচরণটি অবাঞ্ছিত কারণ অভ্যর্থনা অনুষ্ঠানের প্রত্যাশিত প্রেক্ষাপট
রিসিভিং নোডের যে, সেন্ডিং নোড নয়। এই সমস্যা এড়াতে, সিমুলেটর
ক্লাস একটি নির্দিষ্ট সময়সূচী পদ্ধতি প্রদান করে: ScheduleWithContext যা একজনকে প্রদান করতে দেয়
স্পষ্টভাবে রিসিভ ইভেন্টের সাথে যুক্ত রিসিভিং নোডের নোড আইডি।
XXX: কোড উদাহরণ
কিছু খুব বিরল ক্ষেত্রে, বিকাশকারীদের প্রসঙ্গটি কীভাবে পরিবর্তন করা বা বোঝার প্রয়োজন হতে পারে
প্রথম ইভেন্টের (নোড আইডি) তার সংশ্লিষ্ট নোডের সাথে সেট করা হয়। এই সম্পন্ন হয়
NodeList ক্লাস দ্বারা: যখনই একটি নতুন নোড তৈরি করা হয়, NodeList ক্লাস ব্যবহার করে
ScheduleWithContext এই নোডের জন্য একটি 'সূচনা' ইভেন্ট নির্ধারণ করতে। ইভেন্ট 'সূচনা করুন'
এইভাবে নোড আইডির সাথে সেট করা একটি প্রসঙ্গ সহ কার্যকর করে এবং এর সাধারণ বৈচিত্র্য ব্যবহার করতে পারে
সময়সূচী পদ্ধতি। এটি নোড::ইনিশিয়ালাইজ পদ্ধতিকে আহ্বান করে যা 'ইনিশিয়ালাইজ' প্রচার করে
নোডের সাথে যুক্ত প্রতিটি বস্তুর জন্য DoInitialize পদ্ধতিতে কল করে ইভেন্ট। দ্য
DoInitialize পদ্ধতিটি এই অবজেক্টগুলির মধ্যে কিছুতে ওভাররাইড করা হয়েছে (সবচেয়ে উল্লেখযোগ্যভাবে অ্যাপ্লিকেশনে
বেস ক্লাস) কিছু ইভেন্টের সময়সূচী করবে (সবচেয়ে উল্লেখযোগ্যভাবে Application::StartApplication) যা
ট্রাফিক জেনারেশন ইভেন্টের সময়সূচী করবে যা পালা করে সময়সূচী করবে
নেটওয়ার্ক-স্তরের ঘটনা।
নোট:
· ব্যবহারকারীদের কল করে বস্তু জুড়ে DoInitialize পদ্ধতিগুলি প্রচার করতে সতর্কতা অবলম্বন করতে হবে
তাদের সদস্য বস্তুগুলিতে স্পষ্টভাবে শুরু করুন
· প্রতিটি ScheduleWithContext পদ্ধতির সাথে যুক্ত প্রসঙ্গ আইডি এর বাইরেও অন্যান্য ব্যবহার রয়েছে
লগিং: এটি সমান্তরাল সিমুলেশন সঞ্চালনের জন্য ns-3 এর একটি পরীক্ষামূলক শাখা দ্বারা ব্যবহৃত হয়
মাল্টিকোর সিস্টেম মাল্টিথ্রেডিং ব্যবহার করে।
সিমুলেটর::* ফাংশনগুলি প্রসঙ্গটি কী তা জানে না: তারা কেবল এটি নিশ্চিত করে
আপনি ScheduleWithContext এর সাথে যে প্রসঙ্গ উল্লেখ করেন তা প্রাসঙ্গিক হলে উপলব্ধ
ইভেন্ট ::GetContext দিয়ে সঞ্চালিত হয়।
প্রসঙ্গ মান ব্যাখ্যা করার জন্য এটি সিমুলেটর::* এর উপরে প্রয়োগ করা মডেলগুলির উপর নির্ভর করে।
ns-3-এ, নেটওয়ার্ক মডেলগুলি প্রসঙ্গটিকে নোডের নোড আইডি হিসাবে ব্যাখ্যা করে যা
একটি ইভেন্ট তৈরি করেছে। এই কারণেই ScheduleWithContext-এ কল করা গুরুত্বপূর্ণ
ns3::চ্যানেল সাবক্লাস কারণ আমরা নোড i থেকে নোড j পর্যন্ত একটি ইভেন্ট তৈরি করছি এবং আমরা
নিশ্চিত করতে চাই যে ইভেন্টটি যা নোড j এ চলবে তার সঠিক প্রসঙ্গ আছে।
সময়
থেকে be সম্পন্ন
নির্ধারণকারী
থেকে be সম্পন্ন
কলব্যাকস
কিছু নতুন ব্যবহারকারী ns-3 ব্যবহৃত একটি ব্যাপকভাবে ব্যবহৃত প্রোগ্রামিং বাগধারার সাথে অপরিচিত
কোড জুড়ে: the ns-3 কলব্যাক. এই অধ্যায় কিছু অনুপ্রেরণা প্রদান করে
কলব্যাক, এটি কীভাবে ব্যবহার করবেন তার নির্দেশিকা এবং এর বাস্তবায়নের বিশদ বিবরণ।
কলব্যাকস প্রেরণা
বিবেচনা করুন যে আপনার দুটি সিমুলেশন মডেল A এবং B আছে এবং আপনি সেগুলি পাস করতে চান৷
সিমুলেশনের সময় তাদের মধ্যে তথ্য। একটি উপায় যে আপনি করতে পারেন যে আপনি
A এবং B একে অপরের সম্পর্কে স্পষ্টভাবে জ্ঞানী করে তুলতে পারে, যাতে তারা আহ্বান করতে পারে
একে অপরের উপর পদ্ধতি:
শ্রেণীকক্ষে {
প্রকাশ্য:
void ReceiveInput ( // পরামিতি);
...
}
(অন্য উত্স ফাইলে :)
ক্লাস B {
প্রকাশ্য:
void DoSomething (অকার্যকর);
...
ব্যক্তিগত:
A* a_instance; // একটি এ নির্দেশক
}
অকার্যকর
B::Do Something()
{
// একটি_উদাহরণ বলুন যে কিছু ঘটেছে
a_instance->রিসিভইনপুট (// প্যারামিটার);
...
}
এটি অবশ্যই কাজ করে, তবে এর ত্রুটি রয়েছে যে এটি A এবং B এর উপর নির্ভরতা প্রবর্তন করে
কম্পাইলের সময় অন্য সম্পর্কে জানতে (এটি স্বাধীন থাকা কঠিন করে তোলে
সিমুলেটরে সংকলন ইউনিট) এবং সাধারণীকরণ করা হয় না; যদি পরবর্তী ব্যবহারের দৃশ্যে,
B-কে সম্পূর্ণ ভিন্ন C বস্তুর সাথে কথা বলতে হবে, B-এর সোর্স কোড হতে হবে
একটি যোগ করার জন্য পরিবর্তিত হয়েছে c_instance এবং তাই ঘোষণা সহজেই বোঝা যায় যে এটি একটি নৃশংস শক্তি
যোগাযোগের প্রক্রিয়া যা মডেলগুলিতে প্রোগ্রামিং ক্রাফ্ট হতে পারে।
এটি বলার অপেক্ষা রাখে না যে বস্তুগুলি একে অপরের সম্পর্কে জানা উচিত নয় যদি একটি শক্ত থাকে
তাদের মধ্যে নির্ভরতা, কিন্তু যে প্রায়ই মডেল আরো নমনীয় করা যেতে পারে যদি তার
কম্পাইল সময়ে মিথস্ক্রিয়া কম সীমাবদ্ধ।
এটি নেটওয়ার্ক সিমুলেশন গবেষণার জন্য একটি বিমূর্ত সমস্যা নয়, বরং এটি একটি হয়েছে
পূর্ববর্তী সিমুলেটরগুলির সমস্যার উত্স, যখন গবেষকরা প্রসারিত বা পরিবর্তন করতে চান
বিভিন্ন জিনিস করার সিস্টেম (যেমন তারা গবেষণা করতে উপযুক্ত)। বিবেচনা করুন, উদাহরণস্বরূপ,
একজন ব্যবহারকারী যিনি TCP এবং IP এর মধ্যে একটি IPsec নিরাপত্তা প্রোটোকল সাবলেয়ার যোগ করতে চান:
------------ -----------
| TCP | | TCP |
------------ -----------
| হয়ে যায় -> |
----------- -----------
| আইপি | | IPsec |
----------- -----------
|
-----------
| আইপি |
-----------
যদি সিমুলেটর অনুমান করে থাকে এবং কোডে হার্ড কোড করে থাকে, তাহলে সেই আইপি সবসময় কথা বলে
উপরের একটি ট্রান্সপোর্ট প্রোটোকলের জন্য, ব্যবহারকারীকে সিস্টেমটি হ্যাক করতে বাধ্য করা হতে পারে
কাঙ্ক্ষিত আন্তঃসংযোগ। এটি স্পষ্টতই জেনেরিক ডিজাইন করার জন্য একটি সর্বোত্তম উপায় নয়
সিমুলেটর
কলব্যাকস পটভূমি
লক্ষ্য করুন:
প্রোগ্রামিং কলব্যাকের সাথে পরিচিত পাঠকরা এই টিউটোরিয়াল বিভাগটি এড়িয়ে যেতে পারেন।
মৌলিক প্রক্রিয়া যা একজনকে উপরের সমস্যাটির সমাধান করতে দেয় তা হল a হিসাবে পরিচিত কলব্যাক.
চূড়ান্ত লক্ষ্য হল কোডের একটি অংশকে একটি ফাংশন কল করার অনুমতি দেওয়া (বা C++ এ পদ্ধতি)
কোনো নির্দিষ্ট আন্তঃমডিউল নির্ভরতা ছাড়াই।
শেষ পর্যন্ত এর মানে হল আপনার একধরনের পরোক্ষ প্রয়োজন -- আপনি ঠিকানার সাথে আচরণ করেন
একটি পরিবর্তনশীল হিসাবে ফাংশন বলা হয়. এই ভেরিয়েবলটিকে পয়েন্টার-টু-ফাংশন ভেরিয়েবল বলা হয়।
ফাংশন এবং পয়েন্টার-টু-ফাংশন পয়েন্টারের মধ্যে সম্পর্ক সত্যিই আলাদা নয়
যে অবজেক্ট এবং পয়েন্টার-টু-অবজেক্ট।
সি-তে একটি পয়েন্টার-টু-ফাংশনের ক্যানোনিকাল উদাহরণ হল একটি
পয়েন্টার-টু-ফাংশন-রিটার্নিং-ইনটিজার (PFI)। একটি PFI এক int পরামিতি গ্রহণের জন্য, এই
যেমন ঘোষণা করা যেতে পারে:
int (*pfi)(int arg) = 0;
আপনি এই থেকে পেতে একটি পরিবর্তনশীল নাম সহজভাবে পিএফআই যেটি মান 0 এ আরম্ভ করা হয়।
আপনি যদি কিছু অর্থপূর্ণ এই পয়েন্টার আরম্ভ করতে চান, আপনি একটি থাকতে হবে
একটি মিলিত স্বাক্ষর সহ ফাংশন। এক্ষেত্রে:
int MyFunction (int arg) {}
আপনার যদি এই লক্ষ্য থাকে, আপনি আপনার ফাংশনের দিকে নির্দেশ করতে ভেরিয়েবলটি শুরু করতে পারেন যেমন:
pfi = MyFunction;
তারপর আপনি কলের আরও পরামর্শমূলক ফর্ম ব্যবহার করে পরোক্ষভাবে MyFunction কল করতে পারেন:
int ফলাফল = (*pfi) (1234);
এটি ইঙ্গিতপূর্ণ কারণ দেখে মনে হচ্ছে আপনি ফাংশন পয়েন্টারটিকে ডিরেফার করছেন
আপনি যে কোনো পয়েন্টার dereference চাই. সাধারণত, তবে, লোকেরা এর সুবিধা নেয়
সত্য যে কম্পাইলার জানে কি ঘটছে এবং শুধু একটি ছোট ফর্ম ব্যবহার করবে:
int ফলাফল = pfi (1234);
লক্ষ্য করুন যে ফাংশন পয়েন্টার মান শব্দার্থবিদ্যা মেনে চলে, তাই আপনি এটিকে যেকোনো মত পাস করতে পারেন
অন্যান্য মান। সাধারণত, আপনি যখন একটি অ্যাসিঙ্ক্রোনাস ইন্টারফেস ব্যবহার করেন তখন আপনি কিছু সত্তা পাস করবেন
এই মত একটি ফাংশন যা একটি কর্ম সঞ্চালন করবে এবং কল পিছনে তোমাকে জানাতে
সম্পন্ন এটি পরোক্ষ অনুসরণ করে এবং প্রদত্ত ফাংশন সম্পাদন করে ফিরে কল করে।
C++ এ আপনার কাছে বস্তুর অতিরিক্ত জটিলতা রয়েছে। উপরের PFI এর সাথে সাদৃশ্য মানে আপনি
পয়েন্টারের পরিবর্তে একটি int (PMI) ফেরত একটি সদস্য ফাংশন একটি পয়েন্টার আছে
ফাংশন একটি int (PFI) প্রদান করে।
পরোক্ষ প্রদানকারী ভেরিয়েবলের ঘোষণা শুধুমাত্র সামান্য ভিন্ন দেখায়:
int (MyClass::*pmi) (int arg) = 0;
এই নামে একটি পরিবর্তনশীল ঘোষণা পিএমআই ঠিক যেমন পূর্ববর্তী উদাহরণ একটি ভেরিয়েবল নামে ঘোষণা করেছে
পিএফআই. যেহেতু উইল একটি নির্দিষ্ট ক্লাসের একটি উদাহরণের একটি পদ্ধতিকে কল করতে হবে, একজন অবশ্যই
একটি ক্লাসে সেই পদ্ধতিটি ঘোষণা করুন:
ক্লাস মাইক্লাস {
প্রকাশ্য:
int MyMethod (int arg);
};
এই বর্গ ঘোষণার প্রেক্ষিতে, কেউ তখন এই ভেরিয়েবলটিকে এভাবে আরম্ভ করবে:
pmi = &MyClass::MyMethod;
এটি ভেরিয়েবলে পদ্ধতি বাস্তবায়নকারী কোডের ঠিকানা বরাদ্দ করে, সম্পূর্ণ করে
পরোক্ষ একটি পদ্ধতি কল করার জন্য, কোড প্রয়োজন a এই নির্দেশক এই ঘুরে,
মানে উল্লেখ করার জন্য MyClass এর একটি বস্তু থাকতে হবে। এর একটি সরল উদাহরণ ঠিক
একটি পদ্ধতিকে পরোক্ষভাবে কল করা (ভার্চুয়াল ফাংশন মনে করুন):
int (MyClass::*pmi) (int arg) = 0; // একটি PMI ঘোষণা করুন
pmi = &MyClass::MyMethod; // বাস্তবায়ন কোডে পয়েন্ট করুন
মাইক্লাস মাইক্লাস; // ক্লাসের একটি উদাহরণ প্রয়োজন
(myClass.*pmi) (1234); // একটি বস্তু ptr সঙ্গে পদ্ধতি কল
ঠিক যেমন C উদাহরণে, আপনি এটিকে অন্য মডিউলে একটি অ্যাসিঙ্ক্রোনাস কলে ব্যবহার করতে পারেন
যা করবে কল পিছনে একটি পদ্ধতি এবং একটি অবজেক্ট পয়েন্টার ব্যবহার করে। সহজবোধ্য এক্সটেনশন
কেউ বিবেচনা করতে পারে অবজেক্ট এবং PMI ভেরিয়েবলে একটি পয়েন্টার পাস করা। মডিউল
শুধু করবে:
(*objectPtr.*pmi) (1234);
পছন্দসই বস্তুতে কলব্যাক চালানোর জন্য।
এই সময়ে কেউ প্রশ্ন করতে পারে, কি দ্য বিন্দু? নামক মডিউল বুঝতে হবে
সঠিকভাবে কলব্যাক করার জন্য কলিং অবজেক্টের কংক্রিট প্রকার। কেন না
শুধু এটি গ্রহণ করুন, সঠিকভাবে টাইপ করা অবজেক্ট পয়েন্টার পাস করুন এবং করুন বস্তু->পদ্ধতি(1234) in
কলব্যাকের পরিবর্তে কোড? এই অবিকল উপরে বর্ণিত সমস্যা. কি
প্রয়োজন হল কলিং ফাংশনটিকে কলিং ক্লাস থেকে সম্পূর্ণরূপে ডিকপল করার একটি উপায়। এই
চাহিদার বিকাশের দিকে পরিচালিত করে ফাংশন.
একটি ফাংশন হল 1960 এর দশকে আবিষ্কৃত কিছুর বৃদ্ধি যাকে বন্ধ বলা হয়। এটা
মূলত শুধুমাত্র একটি প্যাকেজড-আপ ফাংশন কল, সম্ভবত কিছু রাজ্যের সাথে।
একটি ফাংশনের দুটি অংশ থাকে, একটি নির্দিষ্ট অংশ এবং একটি জেনেরিক অংশ, উত্তরাধিকারের মাধ্যমে সম্পর্কিত।
কলিং কোড (যে কোডটি কলব্যাক চালায়) একটি জেনেরিক ওভারলোড কার্যকর করবে
অপারেটর () একটি জেনেরিক ফাংশন কলব্যাক কল করতে কারণ. নামক কোড (
যে কোডটি ফেরত ডাকতে চায়) এর একটি বিশেষ বাস্তবায়ন প্রদান করতে হবে
দ্য অপারেটর () যে ক্লাস-নির্দিষ্ট কাজ সম্পাদন করে যা ঘনিষ্ঠ-সংযোজন ঘটায়
উপরে সমস্যা।
নির্দিষ্ট ফাংশন এবং এর ওভারলোড সহ অপারেটর () তৈরি, তারপর কোড বলা হয়
মডিউলে বিশেষ কোড দেয় যা কলব্যাক (কলিং) চালাবে
কোড)।
কলিং কোডটি প্যারামিটার হিসাবে একটি জেনেরিক ফাংশন নেবে, তাই একটি অন্তর্নিহিত কাস্ট করা হয়
নির্দিষ্ট ফাংশনকে জেনেরিক ফাংশনে রূপান্তর করতে ফাংশন কলে। এর মানে
যে কলিং মডিউলটিকে শুধুমাত্র জেনেরিক ফাংশন টাইপ বুঝতে হবে। এটা decoupled হয়
সম্পূর্ণভাবে কলিং কোড থেকে।
একটি নির্দিষ্ট ফাংশন তৈরি করতে যে তথ্য প্রয়োজন তা হল অবজেক্ট পয়েন্টার এবং
পয়েন্টার থেকে পদ্ধতি ঠিকানা।
যা ঘটতে হবে তার সারমর্ম হল যে সিস্টেমটি এর একটি জেনেরিক অংশ ঘোষণা করে
ফাংশন:
টেমপ্লেট
ক্লাস ফাংশন
{
প্রকাশ্য:
ভার্চুয়াল int operator() (T arg) = 0;
};
কলার ফাংশনের একটি নির্দিষ্ট অংশকে সংজ্ঞায়িত করে যা বাস্তবে বাস্তবায়নের জন্য সেখানে রয়েছে
নির্দিষ্ট অপারেটর() পদ্ধতি:
টেমপ্লেট
ক্লাস স্পেসিফিক ফাংশন: পাবলিক ফাংশন
{
প্রকাশ্য:
SpecificFunctor(T*p, int (T::*_pmi)(ARG arg))
{
m_p = p;
m_pmi = _pmi;
}
ভার্চুয়াল int অপারেটর() (ARG arg)
{
(*m_p.*m_pmi)(arg);
}
ব্যক্তিগত:
int (T::*m_pmi)(ARG arg);
T* m_p;
};
এখানে ব্যবহারের একটি উদাহরণ:
ক্লাস এ
{
প্রকাশ্য:
A (int a0): a (a0) {}
int হ্যালো (int b0)
{
std::cout << "এ থেকে হ্যালো, a = " << a << " b0 = " << b0 << std::endl;
}
int a;
};
প্রধান প্রধান ()
{
A a(২০১১);
নির্দিষ্ট ফাংশন sf(&a, &A::হ্যালো);
sf(২০১১);
}
লক্ষ্য করুন:
আগের কোডটি আসল ns-3 কোড নয়। এটি সরল উদাহরণ কোড শুধুমাত্র ব্যবহৃত
জড়িত ধারণাগুলিকে চিত্রিত করুন এবং আপনাকে সিস্টেমটি আরও বুঝতে সাহায্য করতে। করো না
ns-3 গাছের যে কোন জায়গায় এই কোডটি খুঁজে পাওয়ার আশা করুন।
লক্ষ্য করুন যে উপরের ক্লাসে দুটি ভেরিয়েবল সংজ্ঞায়িত করা হয়েছে। m_p ভেরিয়েবল হল
অবজেক্ট পয়েন্টার এবং m_pmi হল ভেরিয়েবল যাতে ফাংশনের ঠিকানা থাকে
এক্সিকিউট.
লক্ষ্য করুন যে কখন অপারেটর() বলা হয়, এটি ঘুরে প্রদত্ত পদ্ধতিকে কল করে
C++ PMI সিনট্যাক্স ব্যবহার করে অবজেক্ট পয়েন্টার।
এটি ব্যবহার করার জন্য, কেউ তখন কিছু মডেল কোড ঘোষণা করতে পারে যা একটি জেনেরিক ফাংশনকে নেয়
পরামিতি:
void LibraryFunction (Functor functor);
যে কোডটি মডেলের সাথে কথা বলবে তা একটি নির্দিষ্ট ফাংশন তৈরি করবে এবং এটি পাস করবে
লাইব্রেরি ফাংশন:
মাইক্লাস মাইক্লাস;
নির্দিষ্ট ফাংশন functor (&myclass, MyClass::MyMethod);
কখন লাইব্রেরি ফাংশন সম্পন্ন হয়, এটি ব্যবহার করে কলব্যাক নির্বাহ করে অপারেটর() জেনেরিক উপর
ফাংশন এটি পাস করা হয়েছিল, এবং এই বিশেষ ক্ষেত্রে, পূর্ণসংখ্যা যুক্তি প্রদান করে:
অকার্যকর
লাইব্রেরি ফাংশন (ফাংশন ফাংশন)
{
// লাইব্রেরি ফাংশন চালান
ফাংশন(২০১১);
}
লক্ষ্য করুন লাইব্রেরি ফাংশন ক্লায়েন্টের নির্দিষ্ট ধরনের থেকে সম্পূর্ণরূপে ডিকপল করা হয়।
সংযোগটি Functor polymorphism এর মাধ্যমে তৈরি করা হয়।
কলব্যাক এপিআই ns-3 ফাংশন মেকানিজম ব্যবহার করে অবজেক্ট-ওরিয়েন্টেড কলব্যাক প্রয়োগ করে।
এই কলব্যাক API, C++ টেমপ্লেটের উপর ভিত্তি করে, টাইপ-নিরাপদ; অর্থাৎ, এটি স্ট্যাটিক সঞ্চালন করে
কলার এবং কলেদের মধ্যে সঠিক স্বাক্ষর সামঞ্জস্যতা প্রয়োগ করতে চেক টাইপ করুন। এটা
তাই প্রথাগত ফাংশন পয়েন্টার ব্যবহার করার জন্য আরো টাইপ-নিরাপদ, কিন্তু সিনট্যাক্স হতে পারে
প্রথম দিকে তাকান এই বিভাগটি আপনাকে কলব্যাক সিস্টেমের মাধ্যমে নিয়ে যাওয়ার জন্য ডিজাইন করা হয়েছে
যাতে আপনি এটি ব্যবহার করতে আরামদায়ক হতে পারেন ns-3.
ব্যবহার দ্য কলব্যাক এপিআই
কলব্যাক API মোটামুটি নূন্যতম, শুধুমাত্র দুটি পরিষেবা প্রদান করে:
1. কলব্যাক টাইপ ডিক্লেয়ারেশন: প্রদত্ত স্বাক্ষর সহ কলব্যাকের প্রকার ঘোষণা করার একটি উপায়,
এবং,
2. কলব্যাক ইনস্ট্যান্টেশন: একটি টেমপ্লেট-জেনারেটেড ফরওয়ার্ডিং কলব্যাক ইনস্ট্যান্টিয়েট করার একটি উপায়
যা অন্য C++ ক্লাস মেম্বার মেথড বা C++ ফাংশনে যেকোনো কল ফরওয়ার্ড করতে পারে।
এটি একটি উদাহরণের উপর ভিত্তি করে হাঁটার মাধ্যমে সর্বোত্তমভাবে পর্যবেক্ষণ করা হয় samples/main-callback.cc.
ব্যবহার দ্য কলব্যাক এপিআই সঙ্গে স্থির ক্রিয়াকলাপ
একটি ফাংশন বিবেচনা করুন:
স্ট্যাটিক ডবল
CbOne (ডবল এ, ডবল বি)
{
std::cout << "cbOne a=" << a << ", b=" << b << std::endl;
ফেরত a;
}
এছাড়াও নিম্নলিখিত প্রধান প্রোগ্রাম স্নিপেট বিবেচনা করুন:
int প্রধান (int argc, char *argv[])
{
// রিটার্ন টাইপ: ডবল
// প্রথম arg টাইপ: ডবল
// দ্বিতীয় আর্গ টাইপ: ডবল
কলব্যাক এক;
}
এটি একটি সি-স্টাইল কলব্যাকের একটি উদাহরণ -- যেটিতে একটি অন্তর্ভুক্ত নেই বা প্রয়োজন নেই৷ এই
নির্দেশক ফাংশন টেমপ্লেট কলব্যাক মূলত পরিবর্তনশীল ঘোষণা
পয়েন্টার-টু-ফাংশন ধারণকারী। উপরের উদাহরণে, আমরা স্পষ্টভাবে একটি পয়েন্টার দেখিয়েছি
একটি ফাংশনে যা একটি পূর্ণসংখ্যা প্রদান করে এবং একটি প্যারামিটার হিসাবে একটি একক পূর্ণসংখ্যা নেয়, The
কলব্যাক টেমপ্লেট ফাংশন এর একটি জেনেরিক সংস্করণ -- এটি টাইপ ঘোষণা করতে ব্যবহৃত হয়
একটি কলব্যাক এর
লক্ষ্য করুন:
C++ টেমপ্লেটের সাথে অপরিচিত পাঠকরা পরামর্শ করতে পারেন
http://www.cplusplus.com/doc/tutorial/templates/.
সার্জারির কলব্যাক টেমপ্লেটের জন্য একটি বাধ্যতামূলক আর্গুমেন্ট প্রয়োজন (ফাংশনের রিটার্ন প্রকার
এই কলব্যাকে বরাদ্দ করা হবে) এবং পাঁচটি পর্যন্ত ঐচ্ছিক আর্গুমেন্ট, যা প্রতিটি নির্দিষ্ট করে
আর্গুমেন্টের ধরন (যদি আপনার নির্দিষ্ট কলব্যাক ফাংশনে পাঁচটির বেশি আর্গুমেন্ট থাকে,
তারপর কলব্যাক বাস্তবায়ন প্রসারিত করে এটি পরিচালনা করা যেতে পারে)।
সুতরাং উপরের উদাহরণে, আমাদের কাছে "এক" নামে একটি ঘোষিত কলব্যাক রয়েছে যা অবশেষে হবে
একটি ফাংশন পয়েন্টার ধরে রাখুন। এটি যে ফাংশনটি ধরে রাখবে তার স্বাক্ষর অবশ্যই ফেরত দিতে হবে
ডবল এবং অবশ্যই দুটি ডবল আর্গুমেন্ট সমর্থন করে। যদি কেউ একটি ফাংশন পাস করার চেষ্টা করে যার
স্বাক্ষর ঘোষিত কলব্যাকের সাথে মেলে না, একটি সংকলন ত্রুটি ঘটবে। এছাড়াও, যদি
কেউ একটি কলব্যাক একটি বেমানান একটি বরাদ্দ করার চেষ্টা করে, সংকলন সফল হবে কিন্তু একটি
রান-টাইম NS_FATAL_ERROR উত্থাপিত হবে। নমুনা প্রোগ্রাম
src/core/examples/main-callback.cc এর শেষে এই ত্রুটির উভয় ক্ষেত্রেই প্রদর্শন করে
দ্য প্রধান () প্রোগ্রাম.
এখন, আমাদের এই কলব্যাক ইন্সট্যান্স এবং প্রকৃত টার্গেট ফাংশনকে একসাথে বাঁধতে হবে
(CbOne)। উপরে লক্ষ্য করুন যে CbOne-এ কলব্যাকের মতো একই ধরনের ফাংশন স্বাক্ষরের ধরন রয়েছে--
এটা গুরুত্বপূর্ণ. আমরা এই কলব্যাকে সঠিকভাবে টাইপ করা ফাংশনটি পাস করতে পারি।
আসুন এটি আরও ঘনিষ্ঠভাবে দেখুন:
স্ট্যাটিক ডাবল CbOne (ডাবল a, ডাবল b) {}
^ ^ ^
| | |
| | |
কলব্যাক এক;
আপনি শুধুমাত্র একটি ফাংশন একটি কলব্যাক আবদ্ধ করতে পারেন যদি তাদের মিলিত স্বাক্ষর থাকে। প্রথম
টেমপ্লেট আর্গুমেন্ট হল রিটার্ন টাইপ, এবং অতিরিক্ত টেমপ্লেট আর্গুমেন্ট হল প্রকার
ফাংশন স্বাক্ষর এর আর্গুমেন্ট.
এখন, আসুন আমাদের কলব্যাক "এক" ফাংশনের সাথে আবদ্ধ করি যা এর স্বাক্ষরের সাথে মেলে:
// কলব্যাক উদাহরণ তৈরি করুন যা cbOne ফাংশনের দিকে নির্দেশ করে
one = MakeCallback (&CbOne);
এই কল কলব্যাক করুন মূলত, বিশেষায়িত ফাংশনগুলির মধ্যে একটি তৈরি করা
উপরোল্লিখিত. ভেরিয়েবল ব্যবহার করে ঘোষিত কলব্যাক টেমপ্লেট ফাংশন যাচ্ছে
জেনেরিক ফাংশনের অংশ বাজানো হবে। নিয়োগ এক = কলব্যাক করুন (&CbOne) is
কাস্ট যা কলির পরিচিত বিশেষ ফাংশনকে জেনেরিক ফাংশনে রূপান্তর করে
কলার পরিচিত।
তারপরে, পরবর্তীতে প্রোগ্রামে, যদি কলব্যাকের প্রয়োজন হয়, এটি নিম্নরূপ ব্যবহার করা যেতে পারে:
NS_ASSERT (!one.IsNull ());
// কলব্যাক উদাহরণের মাধ্যমে cbOne ফাংশন আহ্বান করুন
ডবল retOne;
retOne = one (10.0, 20.0);
জন্য চেক IsNull() নিশ্চিত করে যে কলব্যাকটি শূন্য নয় -- একটি ফাংশন আছে
এই কলব্যাকের পিছনে কল করতে। তারপর, এক() জেনেরিক চালায় অপারেটর() যা সত্যিই
একটি নির্দিষ্ট বাস্তবায়ন সঙ্গে ওভারলোড অপারেটর() এবং যদি একই ফলাফল প্রদান করে
CbOne() সরাসরি ডাকা হয়েছিল।
ব্যবহার দ্য কলব্যাক এপিআই সঙ্গে সদস্য ক্রিয়াকলাপ
সাধারণত, আপনি স্ট্যাটিক ফাংশন কল করবেন না বরং এর পরিবর্তে পাবলিক মেম্বার ফাংশন
একটি বস্তু এই ক্ষেত্রে, MakeCallback ফাংশনে একটি অতিরিক্ত আর্গুমেন্ট প্রয়োজন, to
সিস্টেমকে বলুন কোন বস্তুতে ফাংশনটি চালু করা উচিত। এই উদাহরণ বিবেচনা করুন,
এছাড়াও main-callback.cc থেকে:
ক্লাস MyCb {
প্রকাশ্য:
int CbTwo (ডাবল a) {
std::cout << " invoke cbTwo a=" << a << std::endl;
রিটার্ন -5;
}
};
int প্রধান ()
{
...
// রিটার্ন টাইপ: int
// প্রথম arg টাইপ: ডবল
কলব্যাক দুই
মাইসিবি সিবি;
// কলব্যাক উদাহরণ তৈরি করুন যা MyCb::cbTwo-তে নির্দেশ করে
দুই = MakeCallback (&MyCb::CbTwo, &cb);
...
}
এখানে, আমরা একটি অতিরিক্ত অবজেক্ট পয়েন্টার পাস করি মেককলব্যাক<> ফাংশন থেকে প্রত্যাহার
যে উপরে পটভূমি বিভাগ অপারেটর() সদস্য সিনট্যাক্স পয়েন্টার ব্যবহার করবে যখন এটি
একটি বস্তুর উপর চালানো:
ভার্চুয়াল int অপারেটর() (ARG arg)
{
(*m_p.*m_pmi)(arg);
}
এবং তাই আমাদের দুটি ভেরিয়েবল প্রদান করতে হবে (m_p এবং m_pmi) যখন আমরা নির্দিষ্ট করেছি
ফাংশন লাইন:
দুই = MakeCallback (&MyCb::CbTwo, &cb);
অবিকল যে করে। এই ক্ষেত্রে, যখন দুই () আহ্বান করা হয়:
int ফলাফল = দুই (1.0);
একটি কল tothe ফলাফল হবে CbTwo সদস্য ফাংশন (পদ্ধতি) দ্বারা নির্দেশিত বস্তুর উপর
&cb.
ভবন খালি কলব্যাকস
কলব্যাক শূন্য হতে পারে; তাই তাদের ব্যবহার করার আগে চেক করা বুদ্ধিমানের কাজ হতে পারে।
একটি নাল কলব্যাকের জন্য একটি বিশেষ গঠন রয়েছে, যা কেবল পাস করার চেয়ে ভাল
একটি যুক্তি হিসাবে "0"; এটা MakeNullCallback<> নির্মাণ:
দুই = MakeNullCallback ();
NS_ASSERT (two.IsNull ());
একটি নাল কলব্যাক আহ্বান করা ঠিক একটি নাল ফাংশন পয়েন্টার আহ্বান করার মতো: এটি ক্র্যাশ হবে
রানটাইম
আবদ্ধ কলব্যাকস
ফাংশন ধারণার একটি খুব দরকারী এক্সটেনশন হল একটি আবদ্ধ কলব্যাক। আগে এটা
উল্লেখ করা হয়েছিল যে বন্ধগুলি মূলত ফাংশন কলগুলি পরে প্যাকেজ করা হয়েছিল৷
মৃত্যুদন্ড লক্ষ্য করুন যে উপরের সমস্ত কলব্যাকের বিবরণে, কোন উপায় নেই
পরবর্তীতে ব্যবহারের জন্য যেকোনো পরামিতি প্যাকেজ করুন -- যখন কলব্যাক মাধ্যমে বলা হয় অপারেটর().
সমস্ত পরামিতি কলিং ফাংশন দ্বারা সরবরাহ করা হয়।
ক্লায়েন্ট ফাংশন (যেটি কলব্যাক প্রদান করে) অনুমতি দিতে চাইলে কি হবে
কিছু পরামিতি প্রদান? আলেকজান্দ্রেস্কু ক্লায়েন্টকে অনুমতি দেওয়ার প্রক্রিয়াকে কল করে
পরামিতিগুলির একটি নির্দিষ্ট করুন "আবদ্ধ". এর পরামিতিগুলির মধ্যে একটি অপারেটর() হয়েছে
ক্লায়েন্ট দ্বারা আবদ্ধ (নির্দিষ্ট)।
আমাদের কিছু pcap ট্রেসিং কোড এর একটি চমৎকার উদাহরণ প্রদান করে। একটি ফাংশন আছে যে
যখনই একটি প্যাকেট পাওয়া যায় তখনই কল করা দরকার। এই ফাংশন একটি বস্তু কল যে
আসলে pcap ফাইল ফরম্যাটে ডিস্কে প্যাকেট লেখে। এর মধ্যে একজনের স্বাক্ষর
ফাংশন হবে:
স্ট্যাটিক অকার্যকর ডিফল্টসিঙ্ক (Ptr ফাইল, Ptr পি);
স্ট্যাটিক কীওয়ার্ডের অর্থ হল এটি একটি স্ট্যাটিক ফাংশন যার কোনো প্রয়োজন নেই এই নির্দেশক, তাই
এটি সি-স্টাইল কলব্যাক ব্যবহার করা হবে। আমরা চাই না যে কলিং কোড সম্পর্কে জানতে হবে
প্যাকেট ছাড়া অন্য কিছু। কলিং কোডে আমরা যা চাই তা হল এমন একটি কল যা দেখতে:
m_promiscSnifferTrace (m_currentPkt);
আমরা কি করতে চাই বাঁধাই করা দ্য Ptr ফাইল নির্দিষ্ট কলব্যাকে
যখন এটি তৈরি করা হয় তখন বাস্তবায়নের ব্যবস্থা করে অপারেটর() কলব্যাক থেকে
বিনামূল্যে যে পরামিতি প্রদান করুন.
আমরা সরবরাহ মেকবাউন্ড কলব্যাক যে উদ্দেশ্যে টেমপ্লেট ফাংশন. এটা একই লাগে
হিসাবে পরামিতি কলব্যাক করুন টেমপ্লেট ফাংশন কিন্তু পরামিতি হতে লাগে
আবদ্ধ. উপরের উদাহরণের ক্ষেত্রে:
MakeBoundCallback (&DefaultSink, file);
একটি নির্দিষ্ট কলব্যাক বাস্তবায়ন তৈরি করবে যা অতিরিক্ত বাউন্ডে যোগ করতে জানে
যুক্তি. ধারণাগতভাবে, এটি উপরে বর্ণিত নির্দিষ্ট ফাংশনকে এক বা একাধিক দিয়ে প্রসারিত করে
আবদ্ধ যুক্তি:
টেমপ্লেট
ক্লাস স্পেসিফিক ফাংশন: পাবলিক ফাংশন
{
প্রকাশ্য:
SpecificFunctor(T*p, int (T::*_pmi)(ARG arg), BOUND_ARG boundArg)
{
m_p = p;
m_pmi = pmi;
m_boundArg = boundArg;
}
ভার্চুয়াল int অপারেটর() (ARG arg)
{
(*m_p.*m_pmi)(m_boundArg, arg);
}
ব্যক্তিগত:
void (T::*m_pmi)(ARG arg);
T* m_p;
BOUND_ARG m_boundArg;
};
আপনি দেখতে পাচ্ছেন যে যখন নির্দিষ্ট ফাংশন তৈরি করা হয়, তখন আবদ্ধ আর্গুমেন্টটি সংরক্ষিত হয়
ফাংশন / কলব্যাক বস্তু নিজেই। যখন অপারেটর() একক সঙ্গে আহ্বান করা হয়
পরামিতি, যেমন:
m_promiscSnifferTrace (m_currentPkt);
বাস্তবায়ন অপারেটর() প্রকৃত ফাংশন কলে আবদ্ধ পরামিতি যোগ করে:
(*m_p.*m_pmi)(m_boundArg, arg);
পাশাপাশি দুই বা তিনটি আর্গুমেন্ট আবদ্ধ করা সম্ভব। আমরা সঙ্গে একটি ফাংশন আছে বলুন
স্বাক্ষর:
স্ট্যাটিক শূন্য NotifyEvent (Ptr a, Ptr b, MyEventType e);
একজন আবদ্ধ কলব্যাক বাইন্ডিং প্রথম দুটি আর্গুমেন্ট তৈরি করতে পারে যেমন:
MakeBoundCallback (&NotifyEvent, a1, b1);
অভিমানী a1 এবং b1 টাইপের বস্তু A এবং B যথাক্রমে একইভাবে তিনজনের জন্য
আর্গুমেন্টগুলি একজনের স্বাক্ষরের সাথে কাজ করবে:
স্ট্যাটিক শূন্য NotifyEvent (Ptr a, Ptr b, MyEventType e);
এর সাথে সম্পন্ন তিনটি আর্গুমেন্ট বাঁধাই:
MakeBoundCallback (&NotifyEvent, a1, b1, c1);
আবার অনুমান a1, b1 এবং c1 টাইপের বস্তু A, B এবং C যথাক্রমে.
সিমুলেশনে বস্তুর মধ্যে তথ্য বিনিময়ের জন্য এই ধরনের বাঁধাই ব্যবহার করা যেতে পারে;
বিশেষভাবে, আবদ্ধ কলব্যাকগুলিকে ট্রেসড কলব্যাক হিসাবে ব্যবহার করা যেতে পারে, যা বর্ণনা করা হবে
পরবর্তী অধ্যায়।
আঁকা কলব্যাকস
প্লেসহোল্ডার উপধারা
কলব্যাক অবস্থানগুলি in ns-3
যেখানে কলব্যাকগুলি প্রায়শই ব্যবহৃত হয়৷ ns-3? এখানে আরো দৃশ্যমান বেশী কিছু আছে
সাধারণ ব্যবহারকারী:
· সকেট API
লেয়ার-2/লেয়ার-3 API
· ট্রেসিং সাবসিস্টেম
আইপি এবং রাউটিং সাবসিস্টেমের মধ্যে API
বাস্তবায়ন বিস্তারিত
উপরের কোড স্নিপেটগুলি সরল এবং শুধুমাত্র প্রক্রিয়াটি ব্যাখ্যা করার জন্য ডিজাইন করা হয়েছে
নিজেই প্রকৃত কলব্যাক কোডটি বেশ জটিল এবং খুব টেমপ্লেট-তীব্র এবং ক
কোডের গভীর বোঝার প্রয়োজন নেই। আগ্রহী হলে, বিশেষজ্ঞ ব্যবহারকারীরা খুঁজে পেতে পারেন
নিম্নলিখিত দরকারী.
কোডটি মূলত বর্ণিত কৌশলগুলির উপর ভিত্তি করে লেখা হয়েছিল
http://www.codeproject.com/cpp/TTLFunction.asp. এটি পরবর্তীতে অনুসরণ করার জন্য পুনরায় লেখা হয়েছিল
মধ্যে স্থাপত্য রূপরেখা আধুনিক সি ++ ডিজাইন, জাতিবাচক প্রোগ্রামিং এবং নকশা প্যাটার্নস
প্রয়োগ করা হয়েছে, আলেকজান্দ্রেস্কু, অধ্যায় 5, জেনারালাইজড ফাংশন.
এই কোড ব্যবহার করে:
· ডিফল্ট টেমপ্লেট পরামিতি ব্যবহারকারীদের যখন খালি পরামিতি নির্দিষ্ট করতে হচ্ছে থেকে সংরক্ষণ করে
প্যারামিটারের সংখ্যা সর্বাধিক সমর্থিত সংখ্যার চেয়ে ছোট
· পিম্পল ইডিয়ম: কলব্যাক ক্লাসটি মূল্যের দ্বারা পাস করা হয় এবং এর মূল অংশকে অর্পণ করে
কাজ তার pimpl পয়েন্টার.
· দুটি পিম্পল ইমপ্লিমেন্টেশন যা CallbackImpl FunctorCallbackImpl থেকে প্রাপ্ত ব্যবহার করা যেতে পারে
যেকোন ফাংশন-টাইপের সাথে মেমপিটিআরক্যালব্যাক ইমপ্লকে সদস্যদের পয়েন্টার সহ ব্যবহার করা যেতে পারে
ফাংশন।
একটি রেফারেন্স তালিকা বাস্তবায়ন কলব্যাকের মান শব্দার্থবিদ্যা বাস্তবায়নের জন্য।
এই কোডটি সবচেয়ে উল্লেখযোগ্যভাবে আলেকজান্দ্রেস্কু বাস্তবায়ন থেকে প্রস্থান করে যে এটি করে না
কলব্যাক আর্গুমেন্টের ধরন নির্দিষ্ট করতে এবং পাস করতে টাইপ তালিকা ব্যবহার করুন। অবশ্যই,
এটি কপি-ধ্বংস শব্দার্থবিদ্যাও ব্যবহার করে না এবং এর পরিবর্তে একটি রেফারেন্স তালিকার উপর নির্ভর করে
পয়েন্টার ধরে রাখতে autoPtr.
উদ্দেশ্য মডেল
ns-3 মূলত একটি C++ অবজেক্ট সিস্টেম। অবজেক্ট হিসাবে ঘোষণা এবং তাত্ক্ষণিক করা যেতে পারে
স্বাভাবিক, C++ নিয়ম অনুযায়ী। ns-3 এছাড়াও প্রথাগত C++ অবজেক্টে কিছু বৈশিষ্ট্য যোগ করে, যেমন
বৃহত্তর কার্যকারিতা এবং বৈশিষ্ট্য প্রদান করার জন্য নীচে বর্ণিত। এই ম্যানুয়াল অধ্যায় হয়
এর সাথে পাঠককে পরিচয় করিয়ে দেওয়ার উদ্দেশ্যে ns-3 বস্তুর মডেল।
এই বিভাগে C++ ক্লাসের নকশা বর্ণনা করে ns-3 বস্তু সংক্ষেপে, বেশ কয়েকটি নকশা
ব্যবহৃত নিদর্শনগুলির মধ্যে রয়েছে ক্লাসিক অবজেক্ট-ওরিয়েন্টেড ডিজাইন (পলিমরফিক ইন্টারফেস এবং
বাস্তবায়ন), ইন্টারফেস এবং বাস্তবায়নের পৃথকীকরণ, অ-ভার্চুয়াল পাবলিক
ইন্টারফেস ডিজাইন প্যাটার্ন, একটি অবজেক্ট অ্যাগ্রিগেশন সুবিধা এবং রেফারেন্স কাউন্টিং এর জন্য
স্মৃতি ব্যবস্থাপনা. COM বা Bonobo এর মতো কম্পোনেন্ট মডেলের সাথে যারা পরিচিত তারা করবে
মধ্যে নকশা উপাদান চিনতে ns-3 বস্তু একত্রীকরণ মডেল, যদিও ns-3
নকশা কঠোরভাবে হয় অনুযায়ী হয় না.
অবজেক্ট ওরিয়েন্টেড আচরণ
C++ বস্তু, সাধারণভাবে, সাধারণ বস্তু-ভিত্তিক ক্ষমতা প্রদান করে (বিমূর্ততা,
এনক্যাপসুলেশন, উত্তরাধিকার এবং পলিমরফিজম) যা ক্লাসিক অবজেক্ট-ওরিয়েন্টেডের অংশ
নকশা. ns-3 বস্তু এই বৈশিষ্ট্য ব্যবহার করে; এই ক্ষেত্রে:
ক্লাসের ঠিকানা
{
প্রকাশ্য:
ঠিকানা ();
ঠিকানা (uint8_t প্রকার, const uint8_t *বাফার, uint8_t লেন);
ঠিকানা (const Address & address);
ঠিকানা এবং অপারেটর = (const ঠিকানা এবং ঠিকানা);
...
ব্যক্তিগত:
uint8_t m_type;
uint8_t m_len;
...
};
উদ্দেশ্য ভিত্তি ক্লাস
তিনটি বিশেষ বেস ক্লাস ব্যবহার করা হয় ns-3. এই বেস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাস
ক্লাসগুলি বিশেষ বৈশিষ্ট্য সহ বস্তুগুলিকে তাত্ক্ষণিক করতে পারে। এই বেস ক্লাস হল:
· ক্লাস উদ্দেশ্য
· ক্লাস অবজেক্টবেস
· ক্লাস সরলরেফ কাউন্ট
এটার প্রয়োজন নেই ns-3 বস্তু এই শ্রেণীর থেকে উত্তরাধিকারসূত্রে, কিন্তু যারা পেতে
বিশেষ বৈশিষ্ট্য। ক্লাস থেকে প্রাপ্ত ক্লাস উদ্দেশ্য নিম্নলিখিত বৈশিষ্ট্য পান।
· দ্য ns-3 টাইপ এবং অ্যাট্রিবিউট সিস্টেম (এট্রিবিউট দেখুন)
একটি বস্তু একত্রীকরণ সিস্টেম
একটি স্মার্ট-পয়েন্টার রেফারেন্স কাউন্টিং সিস্টেম (ক্লাস Ptr)
ক্লাস যে ক্লাস থেকে উদ্ভূত অবজেক্টবেস উপরের প্রথম দুটি বৈশিষ্ট্য পান, কিন্তু না
স্মার্ট পয়েন্টার পান। ক্লাস যে ক্লাস থেকে উদ্ভূত সরলরেফ কাউন্ট: শুধুমাত্র পেতে
স্মার্ট-পয়েন্টার রেফারেন্স গণনা সিস্টেম।
অনুশীলনে, ক্লাস উদ্দেশ্য উপরের তিনটির বৈকল্পিক ns-3 বিকাশকারী করবে
সবচেয়ে সাধারণ সম্মুখীন.
স্মৃতি ব্যবস্থাপনা এবং শ্রেণী ptr
একটি C++ প্রোগ্রামে মেমরি ম্যানেজমেন্ট একটি জটিল প্রক্রিয়া এবং প্রায়শই ভুলভাবে করা হয়
অসামঞ্জস্যপূর্ণভাবে আমরা নিম্নরূপ বর্ণিত একটি রেফারেন্স গণনা নকশা স্থির করেছি.
রেফারেন্স গণনা ব্যবহার করে সমস্ত বস্তু নির্ধারণ করতে একটি অভ্যন্তরীণ রেফারেন্স গণনা বজায় রাখে
যখন একটি বস্তু নিরাপদে নিজেকে মুছে ফেলতে পারে। প্রতিটি সময় যে একটি পয়েন্টার একটি প্রাপ্ত করা হয়
ইন্টারফেস, কলের মাধ্যমে বস্তুর রেফারেন্স কাউন্ট বৃদ্ধি করা হয় রেফ()। এটা
স্পষ্টভাবে নির্দেশক ব্যবহারকারীর বাধ্যবাধকতা Unref() নির্দেশক যখন সম্পন্ন হয়. কখন
রেফারেন্স গণনা শূন্যে পড়ে, বস্তুটি মুছে ফেলা হয়।
· যখন ক্লায়েন্ট কোড বস্তু তৈরির মাধ্যমে বস্তু থেকে একটি পয়েন্টার পায়,
অথবা GetObject এর মাধ্যমে, এটিকে রেফারেন্স কাউন্ট বৃদ্ধি করতে হবে না।
· যখন ক্লায়েন্ট কোড অন্য উৎস থেকে একটি পয়েন্টার প্রাপ্ত করে (যেমন, একটি পয়েন্টার অনুলিপি করা) এটি আবশ্যক
কল রেফ() রেফারেন্স কাউন্ট বাড়ানোর জন্য।
· অবজেক্ট পয়েন্টারের সকল ব্যবহারকারীকে অবশ্যই কল করতে হবে Unref() রেফারেন্স প্রকাশ করতে।
ডাকার ভার Unref() রেফারেন্স গণনা ব্যবহার করে কিছুটা উপশম হয়
নীচে বর্ণিত স্মার্ট পয়েন্টার ক্লাস।
নিম্ন-স্তরের API ব্যবহারকারী ব্যবহারকারী যারা স্পষ্টভাবে অ-রেফারেন্স-গণনা করা বস্তু বরাদ্দ করতে চান
on the heap, অপারেটর নতুন ব্যবহার করে, এই ধরনের বস্তু মুছে ফেলার জন্য দায়ী।
উল্লেখ গণনাকারী স্মার্ট ইশারা (Ptr)
কল করা হচ্ছে রেফ() এবং Unref() সব সময় কষ্টকর হবে, তাই ns-3 একটি স্মার্ট প্রদান করে
পয়েন্টার ক্লাস ptr অনুরূপ, একই, সমতুল্য Boost::intrusive_ptr. এই স্মার্ট-পয়েন্টার ক্লাস অনুমান করে যে
অন্তর্নিহিত প্রকার একটি জোড়া প্রদান করে সূত্র এবং আনরেফ প্রত্যাশিত পদ্ধতি
অবজেক্ট ইনস্ট্যান্সের অভ্যন্তরীণ রিফকাউন্ট বৃদ্ধি এবং হ্রাস।
এই ইমপ্লিমেন্টেশনটি আপনাকে স্মার্ট পয়েন্টারকে ম্যানিপুলেট করতে দেয় যেন এটি একটি স্বাভাবিক
পয়েন্টার: আপনি এটিকে শূন্যের সাথে তুলনা করতে পারেন, অন্যান্য পয়েন্টারের সাথে তুলনা করতে পারেন, শূন্য নির্ধারণ করতে পারেন
এটা, ইত্যাদি
এটি দিয়ে এই স্মার্ট পয়েন্টার থেকে কাঁচা পয়েন্টার বের করা সম্ভব GetPointer()
এবং পিকপয়েন্টার() পদ্ধতি।
আপনি যদি একটি স্মার্ট পয়েন্টারে একটি নতুন বস্তু সংরক্ষণ করতে চান, আমরা আপনাকে ব্যবহার করার পরামর্শ দিই
CreateObject টেমপ্লেট ফাংশন অবজেক্ট তৈরি করে এবং এটিকে একটি স্মার্ট পয়েন্টারে সংরক্ষণ করে
মেমরি ফাঁস এড়ান। এই ফাংশন সত্যিই ছোট সুবিধার ফাংশন এবং তাদের লক্ষ্য
শুধুমাত্র আপনাকে টাইপ করার একটি ছোট বিট সংরক্ষণ করা হয়.
অবজেক্ট তৈরি করুন এবং সৃষ্টি
C++ এ অবজেক্টগুলি স্থির, গতিশীল বা স্বয়ংক্রিয়ভাবে তৈরি হতে পারে। এই সত্য ঝুলিতে
উন্নত ns-3 এছাড়াও, কিন্তু সিস্টেমের কিছু বস্তুর কিছু অতিরিক্ত ফ্রেমওয়ার্ক উপলব্ধ রয়েছে।
বিশেষত, রেফারেন্স গণনা করা বস্তুগুলি সাধারণত একটি টেমপ্লেটেড তৈরি বা ব্যবহার করে বরাদ্দ করা হয়
CreateObject পদ্ধতি, নিম্নরূপ।
ক্লাস থেকে প্রাপ্ত বস্তুর জন্য উদ্দেশ্য:
Ptr ডিভাইস = CreateObject ();
ব্যবহার করে এই ধরনের বস্তু তৈরি করবেন না দয়া করে অপারেটর নতুন; ব্যবহার করে তাদের তৈরি করুন CreateObject()
পরিবর্তে.
ক্লাস থেকে প্রাপ্ত বস্তুর জন্য সরলরেফ কাউন্ট, বা অন্যান্য বস্তু যা ব্যবহার সমর্থন করে
স্মার্ট পয়েন্টার ক্লাস, একটি টেমপ্লেটেড হেল্পার ফাংশন উপলব্ধ এবং ব্যবহার করার জন্য সুপারিশ করা হয়:
Ptr b = Create ();
এটি কেবল নতুন অপারেটরের চারপাশে একটি মোড়ক যা সঠিকভাবে রেফারেন্স গণনা পরিচালনা করে
পদ্ধতি.
সংক্ষেপে, ব্যবহার করুন সৃষ্টি যদি B একটি বস্তু না হয় তবে শুধুমাত্র রেফারেন্স গণনা ব্যবহার করে (যেমন
মোড়ক), আর ব্যবহার করুন অবজেক্ট তৈরি করুন যদি B থেকে উদ্ভূত হয় ns3::অবজেক্ট.
মোট পরিমাণ
সার্জারির ns-3 বস্তু একত্রীকরণ সিস্টেম একটি স্বীকৃতি দ্বারা শক্তিশালী অংশে অনুপ্রাণিত হয় যে একটি
জন্য সাধারণ ব্যবহারের ক্ষেত্রে ns-2 প্রসারিত করার জন্য উত্তরাধিকার এবং পলিমারফিজম ব্যবহার করা হয়েছে
প্রোটোকল মডেল। উদাহরণস্বরূপ, TCP এর বিশেষ সংস্করণ যেমন RenoTcpAgent প্রাপ্ত হয়
ক্লাস TcpAgent থেকে (এবং থেকে ফাংশন ওভাররাইড করুন)।
তবে দুটি সমস্যা দেখা দিয়েছে ns-2 মডেল ডাউনকাস্ট এবং "দুর্বল ভিত্তি
ক্লাস।" ডাউনকাস্টিং বলতে একটি অবজেক্টে বেস ক্লাস পয়েন্টার ব্যবহার করার পদ্ধতি বোঝায় এবং
টাইপ তথ্য খুঁজে বের করার জন্য রান টাইমে এটি অনুসন্ধান করা, স্পষ্টভাবে পয়েন্টার কাস্ট করতে ব্যবহৃত
একটি সাবক্লাস পয়েন্টারে যাতে সাবক্লাস API ব্যবহার করা যায়। দুর্বল বেস ক্লাস বোঝায়
যে সমস্যাগুলি দেখা দেয় যখন একটি ক্লাস কার্যকরভাবে পুনরায় ব্যবহার করা যায় না (এর থেকে উদ্ভূত) কারণ এটি
প্রয়োজনীয় কার্যকারিতার অভাব রয়েছে, যার ফলে বিকাশকারীকে বেস ক্লাস এবং পরিবর্তন করতে হবে
বেস ক্লাস API কলের বিস্তার ঘটায়, যার মধ্যে কিছু শব্দার্থগতভাবে নাও হতে পারে
সমস্ত উপশ্রেণীর জন্য সঠিক।
ns-3 এই সমস্যাগুলি এড়াতে ক্যোয়ারী ইন্টারফেস ডিজাইন প্যাটার্নের একটি সংস্করণ ব্যবহার করছে।
এই নকশা উপাদান উপর ভিত্তি করে উপাদান উদ্দেশ্য মডেল এবং জিনোম বনোবো যদিও
প্রতিস্থাপনযোগ্য উপাদানগুলির সম্পূর্ণ বাইনারি-স্তরের সামঞ্জস্যতা সমর্থিত নয় এবং আমাদের আছে
সিনট্যাক্স এবং মডেল ডেভেলপারদের উপর প্রভাব সরল করার চেষ্টা করেছে।
উদাহরণ
মোট পরিমাণ উদাহরণ
নোড মধ্যে একত্রিতকরণ ব্যবহারের একটি ভাল উদাহরণ ns-3. উল্লেখ্য যে উদ্ভূত হয় না
নোডের ক্লাস ns-3 যেমন ক্লাস ইন্টারনেট নোড. পরিবর্তে, উপাদান (প্রোটোকল) হয়
একটি নোড একত্রিত. আসুন দেখি কিভাবে কিছু Ipv4 প্রোটোকল একটি নোডে যোগ করা হয়।
স্থির শূন্য
AddIpv4Stack(Ptr নোড)
{
Ptr ipv4 = CreateObject ();
ipv4->SetNode (নোড);
node->AggregateObject (ipv4);
Ptr ipv4Impl = CreateObject ();
ipv4Impl->SetIpv4 (ipv4);
node->AggregateObject (ipv4Impl);
}
উল্লেখ্য যে Ipv4 প্রোটোকল ব্যবহার করে তৈরি করা হয় CreateObject(). তারপর, তারা একত্রিত হয়
নোডের কাছে। এই পদ্ধতিতে, ব্যবহারকারীদের অনুমতি দেওয়ার জন্য নোড বেস ক্লাস সম্পাদনা করার প্রয়োজন নেই
Ipv4 ইন্টারফেস অ্যাক্সেস করতে একটি বেস ক্লাস নোড পয়েন্টার সহ; ব্যবহারকারীরা একটি জন্য নোড জিজ্ঞাসা করতে পারেন
রানটাইমে এর Ipv4 ইন্টারফেসে পয়েন্টার। ব্যবহারকারী কীভাবে নোডকে জিজ্ঞাসা করে তা বর্ণনা করা হয়েছে
পরবর্তী উপধারা।
মনে রাখবেন যে একই ধরণের একাধিক বস্তুকে একত্রিত করা একটি প্রোগ্রামিং ত্রুটি
an ns3::অবজেক্ট. সুতরাং, উদাহরণস্বরূপ, একত্রিতকরণ সমস্ত সঞ্চয় করার জন্য একটি বিকল্প নয়
একটি নোডের সক্রিয় সকেট।
GetObject উদাহরণ
GetObject হল একটি নিরাপদ ডাউনকাস্টিং অর্জন করার এবং ইন্টারফেসগুলিকে অনুমতি দেওয়ার একটি টাইপ-নিরাপদ উপায়
একটি বস্তুর উপর পাওয়া যায়।
একটি নোড পয়েন্টার বিবেচনা করুন m_node যে একটি নোড অবজেক্ট নির্দেশ করে যে একটি বাস্তবায়ন আছে
IPv4 পূর্বে এটি একত্রিত. ক্লায়েন্ট কোড একটি ডিফল্ট রুট কনফিগার করতে চায়। প্রতি
এটি করতে, এটি অবশ্যই নোডের মধ্যে একটি বস্তু অ্যাক্সেস করতে হবে যার আইপি ফরওয়ার্ডিংয়ের একটি ইন্টারফেস রয়েছে
কনফিগারেশন. এটি নিম্নলিখিত কাজ করে:
Ptr ipv4 = m_node->GetObject ();
যদি নোডের সাথে একটি Ipv4 বস্তু একত্রিত না হয়, তাহলে পদ্ধতিটি হবে
রিটার্ন নাল। অতএব, এই জাতীয় ফাংশন থেকে রিটার্ন মান পরীক্ষা করা ভাল অনুশীলন
কল সফল হলে, ব্যবহারকারী এখন Ipv4 অবজেক্টে Ptr ব্যবহার করতে পারবেন যা আগে ছিল
নোড একত্রিত.
কিভাবে একত্রিতকরণ ব্যবহার করতে পারে তার আরেকটি উদাহরণ হল বস্তুতে ঐচ্ছিক মডেল যোগ করা। জন্য
উদাহরণস্বরূপ, একটি বিদ্যমান নোড অবজেক্টে এটিতে একত্রিত একটি "এনার্জি মডেল" অবজেক্ট থাকতে পারে
রান টাইম (নোড ক্লাস পরিবর্তন এবং পুনরায় কম্পাইল না করে)। একটি বিদ্যমান মডেল (যেমন a
বেতার নেট ডিভাইস) পরে শক্তি মডেলের জন্য "GetObject" করতে পারে এবং যথাযথভাবে কাজ করতে পারে
যদি ইন্টারফেসটি অন্তর্নিহিত নোড অবজেক্টে তৈরি করা হয় বা একত্রিত করা হয়
এটি চালানোর সময়। যাইহোক, অন্যান্য নোডের শক্তি মডেল সম্পর্কে কিছু জানার প্রয়োজন নেই।
আমরা আশা করি যে প্রোগ্রামিংয়ের এই মোডটি পরিবর্তন করার জন্য বিকাশকারীদের অনেক কম প্রয়োজন হবে
বেস ক্লাস।
উদ্দেশ্য কারখানা
একটি সাধারণ ব্যবহারের ক্ষেত্রে একইভাবে কনফিগার করা প্রচুর বস্তু তৈরি করা হয়। একজন বারবার পারে
কল CreateObject() কিন্তু একটি কারখানা নকশা প্যাটার্ন ব্যবহার করা হয় ns-3 পদ্ধতি.
এটি "সহায়ক" API এ ব্যাপকভাবে ব্যবহৃত হয়।
শ্রেণী অবজেক্ট ফ্যাক্টরি অবজেক্ট ইনস্ট্যান্টিয়েট করতে এবং বৈশিষ্ট্যগুলি কনফিগার করতে ব্যবহার করা যেতে পারে
ঐ বস্তু:
void SetTypeId (TypeId tid);
void সেট (std::string name, const AttributeValue &value);
Ptr তৈরি করুন (অকার্যকর) const;
প্রথম পদ্ধতি একটি ব্যবহার করার অনুমতি দেয় ns-3 বস্তুর ধরন নির্দিষ্ট করতে TypeId সিস্টেম
তৈরি দ্বিতীয়টি একটিকে তৈরি করা বস্তুগুলিতে বৈশিষ্ট্যগুলি সেট করার অনুমতি দেয় এবং
তৃতীয়টি কাউকে নিজেরাই বস্তু তৈরি করতে দেয়।
উদাহরণ স্বরূপ:
অবজেক্ট ফ্যাক্টরি কারখানা;
// এই ফ্যাক্টরিতে FriisPropagationLossModel ধরনের অবজেক্ট তৈরি করুন
factory.SetTypeId ("ns3::FriisPropagationLossModel")
// এই ফ্যাক্টরি অবজেক্টটিকে একটি বৈশিষ্ট্যের একটি ডিফল্ট মান পরিবর্তন করুন, এর জন্য
// পরবর্তীতে তৈরি করা বস্তু
factory.Set ("SystemLoss", DoubleValue (2.0));
// এমন একটি বস্তু তৈরি করুন
Ptr object = factory.Create ();
factory.Set ("SystemLoss", DoubleValue (3.0));
// একটি ভিন্ন SystemLoss দিয়ে অন্য বস্তু তৈরি করুন
Ptr object = factory.Create ();
ডাউনকাস্টিং
একটি প্রশ্ন যা বেশ কয়েকবার উঠেছে, "যদি আমার কাছে একটি বেস ক্লাস পয়েন্টার (Ptr) থাকে
অবজেক্ট এবং আমি প্রাপ্ত ক্লাস পয়েন্টার চাই, আমি কি ডাউনকাস্ট করব (C++ ডাইনামিক কাস্টের মাধ্যমে)
প্রাপ্ত পয়েন্টার পান, অথবা আমি অবজেক্ট এগ্রিগেশন সিস্টেম ব্যবহার করব GetObject<> ()
সাবক্লাস API এর ইন্টারফেসে একটি Ptr খুঁজে পেতে?
এর উত্তর হল অনেক পরিস্থিতিতে উভয় কৌশলই কাজ করবে। ns-3 একটি প্রদান করে
অবজেক্ট ডাইনামিক কাস্টিং এর সিনট্যাক্স তৈরির জন্য টেমপ্লেটেড ফাংশন অনেক বেশি ব্যবহারকারী
বন্ধুত্বপূর্ণ:
টেমপ্লেট
Ptr
DynamicCast (Ptr const&p)
{
Ptr ফিরে (গতিশীল_কাস্ট (পিকপয়েন্টার (পি)));
}
DynamicCast কাজ করে যখন প্রোগ্রামারের একটি বেস টাইপ পয়েন্টার থাকে এবং a এর বিরুদ্ধে পরীক্ষা করে
সাবক্লাস পয়েন্টার। GetObject কাজ করে যখন বিভিন্ন বস্তুর সমষ্টির সন্ধান করে, কিন্তু এছাড়াও
ডাইনামিককাস্টের মতো একইভাবে সাবক্লাসের সাথে কাজ করে। অনিশ্চিত হলে, প্রোগ্রামার উচিত
GetObject ব্যবহার করুন, কারণ এটি সব ক্ষেত্রে কাজ করে। প্রোগ্রামার যদি ক্লাসের শ্রেণিবিন্যাস জানেন
বিবেচনাধীন বস্তু, এটি শুধুমাত্র DynamicCast ব্যবহার করা আরও সরাসরি।
কনফিগারেশন এবং আরোপ করা
In ns-3 সিমুলেশন, কনফিগারেশনের দুটি প্রধান দিক রয়েছে:
· সিমুলেশন টপোলজি এবং কিভাবে বস্তু সংযুক্ত করা হয়।
· টপোলজিতে তাত্ক্ষণিক মডেল দ্বারা ব্যবহৃত মান।
এই অধ্যায়টি উপরের দ্বিতীয় আইটেমের উপর ফোকাস করে: কতগুলি মান ব্যবহার করা হচ্ছে ns-3 হয়
দ্বারা সংগঠিত, নথিভুক্ত, এবং পরিবর্তনযোগ্য ns-3 ব্যবহারকারী দ্য ns-3 বৈশিষ্ট্য সিস্টেম এছাড়াও
সিমুলেটরে কীভাবে ট্রেস এবং পরিসংখ্যান সংগ্রহ করা হয় তার আন্ডারপিনিং।
এই অধ্যায়ের কোর্সে আমরা মান সেট বা পরিবর্তন করার বিভিন্ন উপায় নিয়ে আলোচনা করব
দ্বারা ব্যবহৃত ns-3 মডেল বস্তু। নির্দিষ্টতার ক্রমবর্ধমান ক্রমে, এগুলি হল:
┌─────────────────────────────────┬─────────────── ───────────────────┐
│পদ্ধতি │ সুযোগ │
├─────────────────────────────────┼─────────────── ───────────────────┤
│ডিফল্ট অ্যাট্রিবিউট মান সেট │ │ এর সমস্ত দৃষ্টান্তকে প্রভাবিত করে
│ যখন গুণাবলী │ ক্লাসে সংজ্ঞায়িত করা হয়। │
│GetTypeId (). │ │
└─────────────────────────────────┴─────────────── ───────────────────┘
│কমান্ডলাইন │ ভবিষ্যতের সব ঘটনাকে প্রভাবিত করে। │
│কনফিগ::সেটডিফল্ট() │ │
│কনফিগারস্টোর │ │
├─────────────────────────────────┼─────────────── ───────────────────┤
│অবজেক্ট ফ্যাক্টরি │ তৈরি করা সমস্ত দৃষ্টান্তকে প্রভাবিত করে │৷
│ │ কারখানার সাথে। │
├─────────────────────────────────┼─────────────── ───────────────────┤
│XHelperSetAttribute () │ │ দ্বারা তৈরি সমস্ত দৃষ্টান্তকে প্রভাবিত করে৷
│ │ সাহায্যকারী। │
├─────────────────────────────────┼─────────────── ───────────────────┤
│মাইক্লাস::সেটএক্স () │ এই বিশেষ দৃষ্টান্ত পরিবর্তন করে। │
│বস্তু::SetAttribute () │ সাধারণত এটিই একমাত্র ফর্ম │৷
│কনফিগার::সেট() │ যা পরিবর্তন করার জন্য নির্ধারিত হতে পারে │৷
│ │ একটি উদাহরণ একবার সিমুলেশন │
│ │ চলছে। │
└─────────────────────────────────┴─────────────── ───────────────────┘
"নির্দিষ্টতা" দ্বারা আমরা বোঝাতে চাই যে টেবিলের পরবর্তী সারির পদ্ধতিগুলি সেট মানগুলিকে ওভাররাইড করে
দ্বারা, এবং সাধারণত পূর্বের পদ্ধতিগুলির তুলনায় কম দৃষ্টান্তগুলিকে প্রভাবিত করে।
অ্যাট্রিবিউট ভ্যালু সিস্টেমের বিস্তারিত জানার আগে, এটি কিছু পর্যালোচনা করতে সাহায্য করবে
শ্রেণীর মৌলিক বৈশিষ্ট্য উদ্দেশ্য.
উদ্দেশ্য সংক্ষিপ্ত বিবরণ
ns-3 মূলত একটি C++ অবজেক্ট-ভিত্তিক সিস্টেম। এর দ্বারা আমরা নতুন C++ ক্লাস বলতে চাচ্ছি
(প্রকার) যথারীতি ঘোষিত, সংজ্ঞায়িত এবং উপশ্রেণীভুক্ত করা যেতে পারে।
অনেক ns-3 বস্তু থেকে উত্তরাধিকারসূত্রে পাওয়া যায় উদ্দেশ্য বেস ক্লাস। এই বস্তুর কিছু অতিরিক্ত আছে
বৈশিষ্ট্যগুলি যা আমরা সিস্টেমকে সংগঠিত করার জন্য এবং মেমরি পরিচালনার উন্নতির জন্য ব্যবহার করি
আমাদের বস্তুর:
· "মেটাডেটা" সিস্টেম যা ক্লাসের নামটিকে অনেক মেটা-তথ্যের সাথে লিঙ্ক করে
বস্তু, সহ:
সাবক্লাসের বেস ক্লাস,
সাবক্লাসে অ্যাক্সেসযোগ্য কনস্ট্রাক্টরদের সেট,
সাবক্লাসের "গুণাবলী" এর সেট,
· প্রতিটি অ্যাট্রিবিউট সেট করা যেতে পারে, নাকি শুধুমাত্র পঠনযোগ্য,
· প্রতিটি বৈশিষ্ট্যের জন্য মানগুলির অনুমোদিত পরিসর।
· রেফারেন্স গণনা স্মার্ট পয়েন্টার বাস্তবায়ন, মেমরি পরিচালনার জন্য।
ns-3 যে বস্তুগুলি অ্যাট্রিবিউট সিস্টেম ব্যবহার করে সেগুলি যেকোন একটি থেকে পাওয়া যায় উদ্দেশ্য or অবজেক্টবেস। সবচেয়ে
ns-3 আমরা যে বস্তুগুলি থেকে উদ্ভূত আলোচনা করব উদ্দেশ্য, কিন্তু স্মার্ট বাইরে যে কয়েক
পয়েন্টার মেমরি ম্যানেজমেন্ট ফ্রেমওয়ার্ক থেকে প্রাপ্ত অবজেক্টবেস.
আসুন এই বস্তুগুলির কয়েকটি বৈশিষ্ট্য পর্যালোচনা করি।
স্মার্ট Pointers
হিসাবে চালু করা হয়েছে ns-3 টিউটোরিয়াল, ns-3 বস্তু একটি দ্বারা পরিচালিত মেমরি হয় উল্লেখ
গণনাকারী স্মার্ট ইশারা বাস্তবায়ন, ক্লাস ptr.
স্মার্ট পয়েন্টার ব্যাপকভাবে ব্যবহৃত হয় ns-3 এপিআই, রেফারেন্স পাস এড়াতে
স্তূপ-বরাদ্দ বস্তু যা মেমরি লিক হতে পারে। বেশিরভাগ মৌলিক ব্যবহারের জন্য (সিনট্যাক্স), চিকিত্সা
একটি নিয়মিত পয়েন্টারের মত একটি স্মার্ট পয়েন্টার:
Ptr nd = ...;
nd->CallSomeFunction ();
// ইত্যাদি
সুতরাং কিভাবে আপনি একটি বস্তুর একটি স্মার্ট পয়েন্টার পেতে, এই উদাহরণের প্রথম লাইন হিসাবে?
অবজেক্ট তৈরি করুন
যেমনটি আমরা উপরে আলোচনা করেছি মেমরি-ম্যানেজমেন্ট-এবং ক্লাস-পিটিআর-এ, সর্বনিম্ন-স্তরের API-এ, বস্তু
প্রকারের উদ্দেশ্য ব্যবহার করে তাৎক্ষণিক হয় না অপারেটর নতুন যথারীতি কিন্তু পরিবর্তে একটি টেমপ্লেটেড
ফাংশন বলা হয় অবজেক্ট তৈরি করুন ().
এই ধরনের একটি বস্তু তৈরি করার একটি সাধারণ উপায় নিম্নরূপ:
Ptr nd = CreateObject ();
আপনি এটিকে কার্যকরীভাবে সমতুল্য হিসাবে ভাবতে পারেন:
WifiNetDevice*nd = নতুন WifiNetDevice ();
যে বস্তু থেকে উদ্ভূত উদ্দেশ্য ব্যবহার করে গাদা উপর বরাদ্দ করা আবশ্যক অবজেক্ট তৈরি করুন ()। সেগুলো
থেকে প্রাপ্ত অবজেক্টবেস, যেমন ns-3 হেল্পার ফাংশন এবং প্যাকেট হেডার এবং ট্রেলার,
স্ট্যাকের উপর বরাদ্দ করা যেতে পারে।
কিছু স্ক্রিপ্টে, আপনি অনেক কিছু দেখতে পাবেন না অবজেক্ট তৈরি করুন () কোড কল; এই
কারণ কার্যকর কিছু সহায়ক বস্তু আছে যা করছে অবজেক্ট তৈরি করুন () কল
তোমার জন্য.
টাইপআইডি
ns-3 ক্লাস যে ক্লাস থেকে উদ্ভূত উদ্দেশ্য নামক একটি মেটাডেটা ক্লাস অন্তর্ভুক্ত করতে পারে টাইপআইডি যে
অবজেক্ট অ্যাগ্রিগেশন এবং কম্পোনেন্টে ব্যবহারের জন্য ক্লাস সম্পর্কে মেটা-তথ্য রেকর্ড করে
ম্যানেজার সিস্টেম:
· ক্লাস সনাক্তকারী একটি অনন্য স্ট্রিং।
মেটাডেটা সিস্টেমের মধ্যে সাবক্লাসের বেস ক্লাস।
সাবক্লাসে অ্যাক্সেসযোগ্য কনস্ট্রাক্টরের সেট।
· ক্লাসের সর্বজনীনভাবে অ্যাক্সেসযোগ্য বৈশিষ্ট্যগুলির একটি তালিকা ("গুণাবলী")।
উদ্দেশ্য সারাংশ
এই সমস্ত ধারণাগুলি একসাথে রেখে, আসুন একটি নির্দিষ্ট উদাহরণ দেখি: ক্লাস নোড.
পাবলিক হেডার ফাইল node.h একটি স্ট্যাটিক অন্তর্ভুক্ত একটি ঘোষণা আছে GetTypeId ()
ফাংশন কল:
ক্লাস নোড: পাবলিক অবজেক্ট
{
প্রকাশ্য:
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর);
...
এই সংজ্ঞায়িত করা হয় node.cc নিম্নরূপ ফাইল:
টাইপআইডি
নোড::GetTypeId (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::Node")
.SetParent ()
.AddConstructor ()
.AddAttribute ("ডিভাইসলিস্ট",
"এই নোডের সাথে যুক্ত ডিভাইসের তালিকা।",
অবজেক্টভেক্টর ভ্যালু (),
MakeObjectVectorAccessor (&Node::m_devices),
MakeObjectVectorChecker ())
.AddAttribute ("অ্যাপ্লিকেশনলিস্ট",
"এই নোডের সাথে যুক্ত অ্যাপ্লিকেশনের তালিকা।",
অবজেক্টভেক্টর ভ্যালু (),
MakeObjectVectorAccessor (&Node::m_applications),
MakeObjectVectorChecker ())
.AddAttribute ("Id",
"এই নোডের আইডি (অনন্য পূর্ণসংখ্যা)।",
TypeId::ATTR_GET, // শুধুমাত্র এটি পাওয়ার অনুমতি দিন।
UintegerValue (0),
MakeUintegerAccessor (&Node::m_id),
MakeUintegerChecker ())
;
রিটার্ন tid;
}
বিবেচনা করুন টাইপআইডি এর ns-3 উদ্দেশ্য রান টাইপ টাইপের বর্ধিত ফর্ম হিসাবে ক্লাস
তথ্য (RTTI)। সমর্থন করার জন্য C++ ভাষাতে একটি সাধারণ ধরনের RTTI অন্তর্ভুক্ত রয়েছে
গতিশীল_কাস্ট এবং typeid অপারেটর।
সার্জারির সেট প্যারেন্ট () উপরের সংজ্ঞায় কল আমাদের সাথে একযোগে ব্যবহৃত হয়
উত্তরাধিকার গাছে নিরাপদ আপ এবং ডাউন-কাস্টিংয়ের অনুমতি দেওয়ার জন্য অবজেক্ট অ্যাগ্রিগেশন মেকানিজম
সময় GetObject (). এটি সাবক্লাসগুলিকে তাদের পিতামাতার বৈশিষ্ট্যগুলি উত্তরাধিকারী করতে সক্ষম করে
বর্গ.
সার্জারির অ্যাডকনস্ট্রাক্টর () কল আমাদের বিমূর্ত বস্তু কারখানার সাথে একযোগে ব্যবহৃত হয়
কোনো ব্যবহারকারীকে জানতে বাধ্য না করে আমাদেরকে C++ অবজেক্ট তৈরি করার অনুমতি দেওয়ার প্রক্রিয়া
তিনি যে বস্তুটি নির্মাণ করছেন তার কংক্রিট ক্লাস।
তিনজনকে ডাকে গুনগত মান যোগ করা () একটি দৃঢ়ভাবে টাইপ করা মান সঙ্গে একটি প্রদত্ত স্ট্রিং সংযুক্ত করুন
শ্রেণী. লক্ষ্য করুন যে আপনাকে অবশ্যই একটি সাহায্য স্ট্রিং প্রদান করতে হবে যা প্রদর্শিত হতে পারে, উদাহরণস্বরূপ,
মাধ্যমে কমান্ড লাইন প্রসেসর। প্রতিটি গুণ অ্যাক্সেস করার প্রক্রিয়ার সাথে যুক্ত
বস্তুর অন্তর্নিহিত সদস্য পরিবর্তনশীল (উদাহরণস্বরূপ, MakeUintegerAccessor () বলে
জেনেরিক গুণ কোড কিভাবে উপরে নোড আইডি পেতে হয়)। এছাড়াও "চেকার" আছে
পদ্ধতি যা পরিসীমা সীমাবদ্ধতার বিরুদ্ধে মান যাচাই করতে ব্যবহৃত হয়, যেমন সর্বাধিক এবং
ন্যূনতম অনুমোদিত মান।
যখন ব্যবহারকারীরা নোড তৈরি করতে চায়, তখন তারা সাধারণত কিছু ফর্ম কল করবে অবজেক্ট তৈরি করুন (),:
Ptr n = CreateObject ();
বা আরও বিমূর্তভাবে, একটি বস্তুর কারখানা ব্যবহার করে, আপনি একটি তৈরি করতে পারেন নোড বিনা বস্তু
কংক্রিট C++ প্রকার জানা:
অবজেক্ট ফ্যাক্টরি কারখানা;
const std::string typeId = "ns3::Node'';
factory.SetTypeId (টাইপআইডি);
Ptr node = factory.Create ();
এই উভয় পদ্ধতির ফলে সম্পূর্ণরূপে প্রারম্ভিক বৈশিষ্ট্যগুলি পাওয়া যায়
ফলে এবং উদ্দেশ্য উদাহরণস্বরূপ।
আমরা পরবর্তীতে আলোচনা করব কিভাবে বৈশিষ্ট্যগুলি (মানগুলি সদস্য ভেরিয়েবল বা ফাংশনের সাথে যুক্ত
ক্লাস) উপরোক্ত মধ্যে plumbed হয় টাইপআইডি.
আরোপ করা
অ্যাট্রিবিউট সিস্টেমের লক্ষ্য হল a এর অভ্যন্তরীণ সদস্য বস্তুর অ্যাক্সেস সংগঠিত করা
সিমুলেশন এই লক্ষ্যটি উদ্ভূত হয় কারণ, সাধারণত সিমুলেশনে, ব্যবহারকারীরা কাটবে এবং
বিদ্যমান সিমুলেশন স্ক্রিপ্টগুলি আটকান/পরিবর্তন করুন, অথবা উচ্চ-স্তরের সিমুলেশন নির্মাণ ব্যবহার করবেন,
কিন্তু প্রায়ই অধ্যয়ন বা নির্দিষ্ট অভ্যন্তরীণ ভেরিয়েবল ট্রেসিং আগ্রহী হবে. জন্য
উদাহরণস্বরূপ, ক্ষেত্রে ব্যবহার করুন যেমন:
· "I প্রয়োজন থেকে চিহ্ন দ্য প্যাকেট on দ্য বেতার ইন্টারফেস কেবল on দ্য প্রথম প্রবেশ পয়েন্ট।"
· "I প্রয়োজন থেকে চিহ্ন দ্য মূল্য of দ্য বিভিন্ন TCP পূর্ণতা জানলা (প্রতি সময় it পরিবর্তন) on a
বিশেষ বিভিন্ন TCP সকেট."
· "I প্রয়োজন a মনমরা ভাব of সব মূল্যবোধ যে ছিল ব্যবহৃত in my সিমুলেশন।"
একইভাবে, ব্যবহারকারীরা সিমুলেশনে অভ্যন্তরীণ ভেরিয়েবলগুলিতে সূক্ষ্ম-দানাযুক্ত অ্যাক্সেস চাইতে পারে, বা
একটি নির্দিষ্ট প্যারামিটারের জন্য ব্যবহৃত প্রাথমিক মানটি ব্যাপকভাবে পরিবর্তন করতে চাইতে পারে
পরবর্তীতে তৈরি করা বস্তু। অবশেষে, ব্যবহারকারীরা জানতে চাইতে পারে কোন ভেরিয়েবল সেট করা যায়
এবং একটি সিমুলেশন কনফিগারেশনে পুনরুদ্ধারযোগ্য। এটি শুধুমাত্র সরাসরি সিমুলেশনের জন্য নয়
কমান্ড লাইনে মিথস্ক্রিয়া; একটি (ভবিষ্যত) গ্রাফিকাল ইউজার ইন্টারফেসও বিবেচনা করুন
একটি বৈশিষ্ট্য প্রদান করতে সক্ষম হতে চাই যার মাধ্যমে একজন ব্যবহারকারী একটি নোডে ডান-ক্লিক করতে পারে
ক্যানভাস এবং পরামিতিগুলির একটি শ্রেণিবদ্ধ, সংগঠিত তালিকা দেখুন যা সেট করা যায়
নোড এবং এর উপাদান সদস্য অবজেক্ট, এবং প্রতিটির জন্য সাহায্য টেক্সট এবং ডিফল্ট মান
প্যারামিটার।
সংজ্ঞা আরোপ করা
আমরা ব্যবহারকারীদের সিস্টেমের গভীরে মানগুলি অ্যাক্সেস করার একটি উপায় প্রদান করি, প্লাম্বিং ছাড়াই৷
অ্যাক্সেসর (পয়েন্টার) সিস্টেমের মাধ্যমে এবং তাদের পেতে পয়েন্টার চেইন হাঁটা. একটি বিবেচনা করুন
শ্রেণী DropTailQueue যে একটি সদস্য পরিবর্তনশীল যে একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা আছে m_max প্যাকেট;
এই সদস্য ভেরিয়েবল সারির গভীরতা নিয়ন্ত্রণ করে।
আমরা যদি এর ঘোষণা দেখি DropTailQueue, আমরা নিম্নলিখিত দেখতে পাই:
ক্লাস DropTailQueue : সর্বজনীন সারি {
প্রকাশ্য:
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর);
...
ব্যক্তিগত:
std:: সারি > m_packets;
uint32_t m_max প্যাকেট;
};
আসুন এমন জিনিসগুলি বিবেচনা করি যা একজন ব্যবহারকারীর মান দিয়ে করতে চান m_max প্যাকেট:
সিস্টেমের জন্য একটি ডিফল্ট মান সেট করুন, যেমন যখনই একটি নতুন DropTailQueue সৃষ্ট,
এই সদস্য যে ডিফল্ট থেকে আরম্ভ করা হয়.
· ইতিমধ্যেই তাত্ক্ষণিক সারিতে মান সেট করুন বা পান।
উপরোক্ত জিনিসগুলি সাধারণত প্রদান করা প্রয়োজন সেট () এবং পাওয়া () ফাংশন, এবং কিছু ধরনের
বিশ্বব্যাপী ডিফল্ট মান।
মধ্যে ns-3 বৈশিষ্ট্য সিস্টেম, এই মান সংজ্ঞা এবং অ্যাক্সেসর ফাংশন নিবন্ধন
মধ্যে সরানো হয় টাইপআইডি ক্লাস; যেমন.:
NS_OBJECT_ENSURE_REGISTERED (ড্রপটেইল সারি);
টাইপআইডি
DropTailQueue::GetTypeId (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::DropTailQueue")
.SetParent ()
.AddConstructor ()
.AddAttribute ("MaxPackets",
"এই DropTailQueue দ্বারা সর্বাধিক সংখ্যক প্যাকেট গ্রহণ করা হয়েছে।",
UintegerValue (100),
MakeUintegerAccessor (&DropTailQueue::m_maxPackets),
MakeUintegerChecker ())
;
রিটার্ন tid;
}
সার্জারির গুনগত মান যোগ করা () পদ্ধতি জন্য জিনিস একটি সংখ্যা সঞ্চালন করা হয় m_max প্যাকেট মান:
· (সাধারণত ব্যক্তিগত) সদস্য ভেরিয়েবল বাঁধাই m_max প্যাকেট একটি পাবলিক স্ট্রিং থেকে
"ম্যাক্সপ্যাকেট".
· একটি ডিফল্ট মান প্রদান করা (100 প্যাকেট)।
মানটির অর্থ সংজ্ঞায়িত করে কিছু সহায়তা পাঠ্য সরবরাহ করা।
· একটি "চেকার" প্রদান করা (এই উদাহরণে ব্যবহার করা হয়নি) যা সীমা নির্ধারণ করতে ব্যবহার করা যেতে পারে
মানগুলির অনুমোদিত পরিসীমা।
মূল বিষয় হল এখন এই ভেরিয়েবলের মান এবং এর ডিফল্ট মান অ্যাক্সেসযোগ্য
বৈশিষ্ট্যের নামস্থানে, যা স্ট্রিংগুলির উপর ভিত্তি করে যেমন "ম্যাক্সপ্যাকেট" এবং টাইপআইডি নাম
স্ট্রিং পরবর্তী বিভাগে, আমরা একটি উদাহরণ স্ক্রিপ্ট প্রদান করব যা দেখায় কিভাবে ব্যবহারকারীরা করতে পারেন
এই মান ম্যানিপুলেট.
উল্লেখ্য যে অ্যাট্রিবিউটের প্রারম্ভিকতা ম্যাক্রোর উপর নির্ভর করে NS_OBJECT_ENSURE_REGISTERED
(ড্রপটেইল সারি) বলা হচ্ছে; যদি আপনি এটিকে আপনার নতুন ক্লাস বাস্তবায়নের বাইরে রেখে যান, আপনার
গুণাবলী সঠিকভাবে আরম্ভ করা হবে না.
যদিও আমরা বৈশিষ্ট্যগুলি কীভাবে তৈরি করতে হয় তা বর্ণনা করেছি, আমরা এখনও কীভাবে অ্যাক্সেস করব তা বর্ণনা করিনি
এবং এই মানগুলি পরিচালনা করুন। উদাহরণস্বরূপ, নেই globals.h হেডার ফাইল যেখানে এই আছে
সংরক্ষিত গুণাবলী তাদের ক্লাসের সাথে সংরক্ষণ করা হয়। স্বাভাবিকভাবেই প্রশ্ন উঠছে কিভাবে
ব্যবহারকারীরা কি সহজেই তাদের মডেলের সমস্ত বৈশিষ্ট্য সম্পর্কে এবং একজন ব্যবহারকারী কীভাবে শিখতে পারে
এই বৈশিষ্ট্যগুলি অ্যাক্সেস করুন বা তাদের রেকর্ডের অংশ হিসাবে তাদের মান নথিভুক্ত করুন
অনুকরণ?
একটি প্রকারের জন্য সংজ্ঞায়িত প্রকৃত বৈশিষ্ট্যগুলির বিশদ ডকুমেন্টেশন এবং এর একটি বিশ্বব্যাপী তালিকা
সমস্ত সংজ্ঞায়িত বৈশিষ্ট্য, API ডকুমেন্টেশনে উপলব্ধ। এই বাকি জন্য
নথিতে আমরা বৈশিষ্ট্যগুলি পাওয়ার এবং সেট করার বিভিন্ন উপায় প্রদর্শন করতে যাচ্ছি
মান।
বিন্যাস ডিফল্ট মানগুলি
Config::SetDefault এবং কমান্ডলাইন
আসুন দেখি কিভাবে একটি ব্যবহারকারী স্ক্রিপ্ট একটি নির্দিষ্ট বৈশিষ্ট্য মান অ্যাক্সেস করতে পারে। আমরা যাচ্ছি
ব্যবহার src/point-to-point/examples/main-attribute-value.cc চিত্রের জন্য স্ক্রিপ্ট, সঙ্গে
কিছু বিবরণ ছিনতাই আউট. দ্য প্রধান ফাংশন শুরু হয়:
// এটি অ্যাট্রিবিউট সিস্টেম ব্যবহার করার একটি মৌলিক উদাহরণ
// সেট করুন এবং অন্তর্নিহিত সিস্টেমে একটি মান পান; যথা, একটি স্বাক্ষরবিহীন
// একটি সারিতে সর্বাধিক সংখ্যক প্যাকেটের পূর্ণসংখ্যা
//
কোন int
প্রধান (int argc, char *argv[])
{
// ডিফল্টরূপে, MaxPackets অ্যাট্রিবিউটের 100 প্যাকেটের মান থাকে
// (এই ডিফল্টটি DropTailQueue::GetTypeId ফাংশনে লক্ষ্য করা যেতে পারে)
//
// এখানে, আমরা এটি 80 প্যাকেটে সেট করি। আমরা দুটি মান প্রকারের একটি ব্যবহার করতে পারি:
// একটি স্ট্রিং-ভিত্তিক মান বা একটি Uinteger মান
Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("80"));
// নীচের ফাংশন কল অপ্রয়োজনীয়
Config::SetDefault ("ns3::DropTailQueue::MaxPackets", UintegerValue (80));
// ব্যবহারকারীকে ডিফল্ট এবং উপরের যেকোনোটি ওভাররাইড করার অনুমতি দিন
// সেটডিফল্ট () রান-টাইমে, কমান্ড-লাইন আর্গুমেন্টের মাধ্যমে
// উদাহরণস্বরূপ, "--ns3::DropTailQueue::MaxPackets=80" এর মাধ্যমে
কমান্ডলাইন cmd;
// এটি কমান্ড লাইন থেকে মান সেট করার আরেকটি উপায় প্রদান করে:
cmd.AddValue ("maxPackets", "ns3::DropTailQueue::MaxPackets");
cmd.Parse (argc, argv);
উপরে লক্ষ্য করার প্রধান জিনিস হল দুটি সমতুল্য কল Config::SetDefault
(). এইভাবে আমরা পরবর্তীতে তাত্ক্ষণিক সকলের জন্য ডিফল্ট মান সেট করি
DropTailQueues আমরা যে দুই ধরনের চিত্রিত মূল্য ক্লাস, ক তারের উপকারিতা এবং একটি
UintegerValue class, দ্বারা নামযুক্ত বৈশিষ্ট্যের মান নির্ধারণ করতে ব্যবহার করা যেতে পারে
"ns3::DropTailQueue::MaxPackets"।
এটি ব্যবহার করে গুণাবলী ম্যানিপুলেট করাও সম্ভব কমান্ডলাইন; আমরা কিছু উদাহরণ দেখেছি
টিউটোরিয়ালের প্রথম দিকে। বিশেষ করে, সংক্ষেপে যুক্তি যোগ করা সহজ
নাম, যেমন -- ম্যাক্স প্যাকেট, একটি বৈশিষ্ট্যের জন্য যা আপনার মডেলের জন্য বিশেষভাবে প্রাসঙ্গিক,
এক্ষেত্রে "ns3::DropTailQueue::MaxPackets". এই অতিরিক্ত বৈশিষ্ট্য আছে যে
অ্যাট্রিবিউটের জন্য হেল্প স্ট্রিং স্ক্রিপ্টের ব্যবহারের বার্তার অংশ হিসাবে মুদ্রিত হবে।
আরো তথ্যের জন্য দেখুন কমান্ডলাইন API ডকুমেন্টেশন।
এখন, আমরা নিম্ন-স্তরের API ব্যবহার করে কয়েকটি অবজেক্ট তৈরি করব। আমাদের নতুন তৈরি সারি হবে
নেই m_max প্যাকেট 100 প্যাকেটে শুরু করা হয়েছে, যেমন সংজ্ঞায়িত করা হয়েছে
DropTailQueue::GetTypeId () ফাংশন, কিন্তু 80 প্যাকেটে, কারণ আমরা উপরে কি করেছি
ডিফল্ট মান.:
Ptr n0 = CreateObject ();
Ptr net0 = CreateObject ();
n0->অ্যাডডিভাইস (নেট0);
Ptr q = CreateObject ();
net0->AddQueue(q);
এই মুহুর্তে, আমরা একটি একক তৈরি করেছি নোড (n0) এবং একক PointToPointNetDevice
(net0), এবং যোগ করা একটি DropTailQueue (q) থেকে net0.
নির্মাণকারী, সাহায্যকারী এবং অবজেক্ট ফ্যাক্টরি
গুণাবলীর নির্বিচারে সমন্বয় সেট করা যেতে পারে এবং সাহায্যকারী এবং নিম্ন-স্তরের থেকে আনা যায়
এপিআই; হয় কনস্ট্রাক্টরদের থেকে:
Ptr p =
CreateObjectWithAttributes
("MinX", DoubleValue (-100.0),
"MinY", DoubleValue (-100.0),
"DeltaX", DoubleValue (5.0),
"DeltaY", DoubleValue (20.0),
"গ্রিডউইথ", UintegerValue (20),
"LayoutType", StringValue ("RowFirst"));
অথবা উচ্চ-স্তরের সাহায্যকারী API থেকে, যেমন:
গতিশীলতা।সেট অবস্থান বরাদ্দকারী
("ns3::GridPosition Allocator",
"MinX", DoubleValue (-100.0),
"MinY", DoubleValue (-100.0),
"DeltaX", DoubleValue (5.0),
"DeltaY", DoubleValue (20.0),
"গ্রিডউইথ", UintegerValue (20),
"LayoutType", StringValue ("RowFirst"));
আমরা এখানে এটি চিত্রিত করি না, তবে আপনি একটি কনফিগারও করতে পারেন অবজেক্ট ফ্যাক্টরি নতুন মান সহ
নির্দিষ্ট বৈশিষ্ট্যের জন্য। দ্বারা নির্মিত দৃষ্টান্ত অবজেক্ট ফ্যাক্টরি এগুলো থাকবে
নির্মাণের সময় সেট করা বৈশিষ্ট্যগুলি। এটি সহায়ক APIগুলির একটি ব্যবহার করার মতোই
ক্লাসের জন্য।
পর্যালোচনা করার জন্য, ক্লাস ইনস্ট্যান্সের জন্য বৈশিষ্ট্যগুলির জন্য মান সেট করার বিভিন্ন উপায় রয়েছে থেকে be
নির্মিত in দ্য ভবিষ্যৎ
· Config::SetDefault ()
· কমান্ডলাইন::অ্যাড ভ্যালু ()
· CreateObjectWithAttributes<> ()
· বিভিন্ন সাহায্যকারী API
কিন্তু আপনি যদি ইতিমধ্যে একটি উদাহরণ তৈরি করে থাকেন এবং আপনি এর মান পরিবর্তন করতে চান তাহলে কী হবে
বৈশিষ্ট্য? এই উদাহরণে, আমরা কিভাবে ম্যানিপুলেট করতে পারি m_max প্যাকেট ইতিমধ্যে মান
তাত্ক্ষণিক DropTailQueue? এটি করার জন্য এখানে বিভিন্ন উপায় রয়েছে।
পরিবর্তন মানগুলি
স্মার্টপয়েন্টার
অনুমান করুন যে একটি স্মার্ট পয়েন্টার (ptr) একটি প্রাসঙ্গিক নেটওয়ার্ক ডিভাইস হাতে আছে; বর্তমানের মধ্যে
উদাহরণ, এটা net0 পয়েন্টার
মান পরিবর্তন করার একটি উপায় হল অন্তর্নিহিত সারিতে একটি পয়েন্টার অ্যাক্সেস করা এবং তার পরিবর্তন করা
বৈশিষ্ট্যাবলী।
প্রথমত, আমরা লক্ষ্য করি যে আমরা একটি পয়েন্টার পেতে পারি (বেস ক্লাস) কিউ মাধ্যমে দ্য
PointToPointNetDevice গুণাবলী, যেখানে এটি বলা হয় "TxQueue":
পয়েন্টার ভ্যালু tmp;
net0->GetAttribute ("TxQueue", tmp);
Ptr txQueue = tmp.GetObject ();
উপরের GetObject () ফাংশন, আমরা একটি নিরাপদ downcast সঞ্চালন করতে পারেন DropTailQueue, কোথায়
"ম্যাক্সপ্যাকেট" একটি বৈশিষ্ট্য:
Ptr dtq = txQueue->GetObject ();
NS_ASSERT (dtq != 0);
পরবর্তী, আমরা এই সারিতে একটি বৈশিষ্ট্যের মান পেতে পারি। আমরা মোড়ক চালু আছে
মূল্য অন্তর্নিহিত ডেটা প্রকারের জন্য ক্লাস, এই ধরনের চারপাশে জাভা র্যাপারের মতো,
যেহেতু অ্যাট্রিবিউট সিস্টেম স্ট্রিং-এ ক্রমানুসারে করা মান সঞ্চয় করে, ভিন্ন ধরনের নয়।
এখানে, অ্যাট্রিবিউটের মান a কে বরাদ্দ করা হয়েছে UintegerValue, এবং পাওয়া () এই পদ্ধতি
মান উৎপন্ন করে (আবড়ানো) uint32_t.:
UintegerValue সীমা;
dtq->GetAttribute ("ম্যাক্সপ্যাকেটস", সীমা);
NS_LOG_INFO ("1. dtq সীমা: " << limit. পান () << " প্যাকেটগুলি");
উল্লেখ্য যে উপরের ডাউনকাস্টের আসলেই প্রয়োজন নেই; আমরা বৈশিষ্ট্য অর্জিত হতে পারে
মান সরাসরি থেকে txQueue, যা একটি উদ্দেশ্য:
txQueue->GetAttribute ("MaxPackets", সীমা);
NS_LOG_INFO ("2. txQueue সীমা: " << limit. পান () << " প্যাকেটগুলি");
এখন, এটিকে অন্য মান (60 প্যাকেট) এ সেট করা যাক:
txQueue->SetAttribute("MaxPackets", UintegerValue (60));
txQueue->GetAttribute ("MaxPackets", সীমা);
NS_LOG_INFO ("3. txQueue সীমা পরিবর্তিত হয়েছে: " << limit. পান () << " প্যাকেটগুলি");
কনফিগ নামস্থান পথ
অ্যাট্রিবিউটে যাওয়ার একটি বিকল্প উপায় হল কনফিগারেশন নেমস্পেস ব্যবহার করা। এখানে,
এই বৈশিষ্ট্যটি এই নামস্থানে একটি পরিচিত পথে থাকে; এই পদ্ধতি দরকারী যদি এক
অন্তর্নিহিত পয়েন্টারগুলিতে অ্যাক্সেস নেই এবং একটি নির্দিষ্ট কনফিগার করতে চাই
একটি একক বিবৃতি সহ বৈশিষ্ট্য.:
কনফিগার::সেট ("/NodeList/0/DeviceList/0/TxQueue/MaxPackets",
UintegerValue (25%);
txQueue->GetAttribute ("MaxPackets", সীমা);
NS_LOG_INFO ("4. নামস্থানের মাধ্যমে txQueue সীমা পরিবর্তিত হয়েছে:"
<< সীমা। পান () << " প্যাকেটগুলি");
কনফিগারেশন পাথ প্রায়ই ফর্ম আছে ".../
নাম>/ /.../ / " একটি সূচক দ্বারা একটি নির্দিষ্ট উদাহরণ উল্লেখ করতে
পাত্রে বস্তু। এই ক্ষেত্রে প্রথম ধারক সব তালিকা নোডs; দ্য
দ্বিতীয় ধারক সব তালিকা নেটডিভাইসনির্বাচিত উপর s নোড। অবশেষে,
কনফিগারেশন পাথ সাধারণত সদস্য গুণাবলীর উত্তরাধিকার দিয়ে শেষ হয়, এই ক্ষেত্রে
"ম্যাক্সপ্যাকেট" এর বৈশিষ্ট্য "TxQueue" নির্বাচিতদের নেটডিভাইস.
আমরা সমস্ত নোড এবং সমস্ত নেট ডিভাইসের জন্য এই মান সেট করতে ওয়াইল্ডকার্ড ব্যবহার করতে পারতাম
(যা এই সাধারণ উদাহরণে আগেরটির মতো একই প্রভাব রয়েছে কনফিগার::সেট ()):
কনফিগার::সেট ("/NodeList/*/DeviceList/*/TxQueue/MaxPackets",
UintegerValue (15%);
txQueue->GetAttribute ("MaxPackets", সীমা);
NS_LOG_INFO ("5. txQueue সীমা ওয়াইল্ডকার্ডেড নামস্থানের মাধ্যমে পরিবর্তিত হয়েছে:"
<< সীমা। পান () << " প্যাকেটগুলি");
উদ্দেশ্য নাম সেবা
অ্যাট্রিবিউটে যাওয়ার আরেকটি উপায় হল অবজেক্ট নেম সার্ভিস সুবিধা ব্যবহার করা। দ্য
অবজেক্ট নেম সার্ভিস আমাদেরকে এর অধীনে কনফিগারেশন নেমস্পেসে আইটেম যোগ করতে দেয়
"/নাম/" একটি ব্যবহারকারী-সংজ্ঞায়িত নামের স্ট্রিং সহ পথ। এই পদ্ধতিটি দরকারী যদি কেউ না করে
অন্তর্নিহিত পয়েন্টারগুলিতে অ্যাক্সেস আছে এবং প্রয়োজনীয় নির্ধারণ করা কঠিন
কংক্রিট কনফিগারেশন নামস্থান পাথ।
নাম::যোগ করুন ("সার্ভার", n0);
নাম::যোগ করুন ("সার্ভার/eth0", net0);
...
Config::Set ("/Names/server/eth0/TxQueue/MaxPackets", UintegerValue (25));
এখানে আমরা পাথ উপাদান যোগ করেছি "সার্ভার" এবং "eth0" অধীনে "/নাম/" নামস্থান, তারপর
অ্যাট্রিবিউট সেট করতে ফলাফল কনফিগারেশন পাথ ব্যবহার করে।
একটি সম্পূর্ণ চিকিত্সার জন্য অবজেক্ট-নাম দেখুন ns-3 কনফিগারেশন নামস্থান।
বাস্তবায়ন বিস্তারিত
মূল্য ক্লাস
পাঠকরা নোট করবেন TypeValue যে শ্রেণীগুলি হল এর সাবক্লাস অ্যাট্রিবিউট ভ্যালু ভিত্তি
ক্লাস এগুলিকে মধ্যবর্তী শ্রেণী হিসাবে ভাবা যেতে পারে যা কাঁচা থেকে রূপান্তর করতে ব্যবহৃত হয়
থেকে প্রকার অ্যাট্রিবিউট ভ্যালুs যা অ্যাট্রিবিউট সিস্টেম দ্বারা ব্যবহৃত হয়। মনে রাখবেন যে এই
ডাটাবেস অনেক ধরনের বস্তুকে স্ট্রিং-এ ক্রমিকভাবে ধারণ করে। এই ধরনের রূপান্তর
হয় একটি মধ্যবর্তী ক্লাস ব্যবহার করে করা যেতে পারে (যেমন পূর্ণসংখ্যা মান, বা ডাবল ভ্যালু উন্নত
ভাসমান বিন্দু সংখ্যা) বা মাধ্যমে স্ট্রিং প্রকারের সরাসরি অন্তর্নিহিত রূপান্তর
অ্যাট্রিবিউট ভ্যালু সত্যিই ব্যবহারিক নয়। সুতরাং উপরে, ব্যবহারকারীদের ব্যবহার করার একটি পছন্দ আছে
স্ট্রিং বা মান:
p->সেট ("cwnd", StringValue ("100")); // স্ট্রিং-ভিত্তিক সেটার
p->সেট ("cwnd", IntegerValue (100)); // পূর্ণসংখ্যা-ভিত্তিক সেটার
সিস্টেমটি কিছু ম্যাক্রো প্রদান করে যা ব্যবহারকারীদের নতুন অ্যাট্রিবিউট ভ্যালু ঘোষণা এবং সংজ্ঞায়িত করতে সহায়তা করে
নতুন ধরনের সাবক্লাস যা তারা অ্যাট্রিবিউট সিস্টেমে প্রবর্তন করতে চায়:
· ATTRIBUTE_HELPER_HEADER
· ATTRIBUTE_HELPER_CPP
আরও তথ্যের জন্য এই গঠনগুলির জন্য API ডকুমেন্টেশন দেখুন।
আরম্ভ অর্ডার
সিস্টেমের বৈশিষ্ট্যগুলি অবশ্যই এতে অন্য কোনও বৈশিষ্ট্যের অবস্থার উপর নির্ভর করবে না
পদ্ধতি. এটি কারণ অ্যাট্রিবিউট প্রারম্ভিকতার একটি ক্রম নির্দিষ্ট করা হয়নি, বা
সিস্টেম দ্বারা প্রয়োগ করা হয়। এর একটি নির্দিষ্ট উদাহরণ স্বয়ংক্রিয় কনফিগারেশনে দেখা যেতে পারে
প্রোগ্রাম যেমন কনফিগারস্টোর. যদিও একটি প্রদত্ত মডেল এটি ব্যবস্থা করতে পারে যাতে বৈশিষ্ট্যগুলি
একটি নির্দিষ্ট ক্রমে শুরু করা হয়, অন্য স্বয়ংক্রিয় কনফিগারার সিদ্ধান্ত নিতে পারে
স্বতন্ত্রভাবে বৈশিষ্ট্যগুলি পরিবর্তন করতে, উদাহরণস্বরূপ, বর্ণানুক্রমিক ক্রমে।
এই অ-নির্দিষ্ট ক্রম-এর কারণে, সিস্টেমের কোনো বৈশিষ্ট্যের কোনো নির্ভরতা থাকতে পারে
অন্য কোনো অ্যাট্রিবিউটে। ফলস্বরূপ, অ্যাট্রিবিউট সেটকারীরা অবশ্যই রাষ্ট্রের কারণে ব্যর্থ হবেন না
অন্য বৈশিষ্ট্যের। কোনো অ্যাট্রিবিউট সেটার অন্য কোনো অ্যাট্রিবিউট মান পরিবর্তন (সেট) করতে পারে না
এর মান পরিবর্তনের ফলাফল।
এটি একটি খুব শক্তিশালী সীমাবদ্ধতা এবং এমন কিছু ক্ষেত্রে রয়েছে যেখানে বৈশিষ্ট্যগুলি অবশ্যই সেট করা উচিত
ধারাবাহিকভাবে সঠিক অপারেশন অনুমতি দিতে. এই লক্ষ্যে আমরা ধারাবাহিকতা যাচাই করার অনুমতি দিই
কখন দ্য গুণ is ব্যবহৃত (cf. NS_ASSERT_MSG or NS_ABORT_MSG).
সাধারণভাবে, অন্তর্নিহিত ক্লাস সদস্য ভেরিয়েবলের মান নির্ধারণের জন্য অ্যাট্রিবিউট কোড
একটি বস্তু নির্মাণ করা হয় পরে মৃত্যুদন্ড কার্যকর করা হয়. কিন্তু যদি আপনি নির্ধারিত মান প্রয়োজন হয়
কনস্ট্রাক্টর বডি কার্যকর করার আগে, কারণ আপনার যুক্তিতে তাদের প্রয়োজন
নির্মাণকারী? এটি করার একটি উপায় আছে, উদাহরণস্বরূপ ক্লাসে ব্যবহৃত হয় কনফিগারস্টোর: কল
অবজেক্টবেস::ConstructSelf () নিম্নরূপ:
ConfigStore::ConfigStore ()
{
অবজেক্টবেস::ConstructSelf (AttributeConstructionList ());
// কনস্ট্রাক্টরের সাথে চালিয়ে যান।
}
সতর্ক থাকুন যে অবজেক্ট এবং এর সমস্ত প্রাপ্ত ক্লাসগুলিকেও একটি প্রয়োগ করতে হবে GetInstanceTypeId
() পদ্ধতি অন্যথায় অবজেক্টবেস::ConstructSelf () পড়তে পারবে না
বৈশিষ্ট্যাবলী।
যোগ করার পদ্ধতি আরোপ করা
সার্জারির ns-3 সিস্টেম অ্যাট্রিবিউট সিস্টেমের অধীনে বেশ কয়েকটি অভ্যন্তরীণ মান স্থাপন করবে, কিন্তু
নিঃসন্দেহে ব্যবহারকারীরা এটিকে প্রসারিত করতে চাইবেন যা আমরা মিস করেছি বা তাদের যোগ করতে
সিস্টেমের নিজস্ব ক্লাস।
তিনটি সাধারণ ব্যবহারের ক্ষেত্রে রয়েছে:
একটি বিদ্যমান ক্লাস ডেটা সদস্যকে অ্যাট্রিবিউট হিসাবে অ্যাক্সেসযোগ্য করা, যখন এটি ইতিমধ্যেই নেই।
· একটি নতুন ক্লাসকে একটি TypeId দিয়ে কিছু ডেটা সদস্যকে বৈশিষ্ট্য হিসাবে প্রকাশ করতে সক্ষম করা।
একটি তৈরি করা অ্যাট্রিবিউট ভ্যালু একটি নতুন ক্লাসের জন্য সাবক্লাস যাতে এটি একটি হিসাবে অ্যাক্সেস করা যায়
বৈশিষ্ট্য
বর্তমান সদস্য পরিবর্তনশীল
এই পরিবর্তনশীল বিবেচনা করুন TcpSocket:
uint32_t m_cWnd; // যানজট জানালা
ধরুন যে কেউ TCP এর সাথে কাজ করে সেই ভেরিয়েবলের মান পেতে বা সেট করতে চায়
মেটাডেটা সিস্টেম ব্যবহার করে। যদি এটি ইতিমধ্যে দ্বারা প্রদান করা হয় না ns-3, ব্যবহারকারী ঘোষণা করতে পারে
রানটাইম মেটাডেটা সিস্টেমে নিম্নলিখিত সংযোজন (এ GetTypeId() জন্য সংজ্ঞা
TcpSocket):
.AddAttribute ("কনজেশন উইন্ডো",
"Tcp কনজেশন উইন্ডো (বাইট)",
UintegerValue (1),
MakeUintegerAccessor (&TcpSocket::m_cWnd),
MakeUintegerChecker ())
এখন, একটি পয়েন্টার সঙ্গে ব্যবহারকারী একটি TcpSocket উদাহরণ যেমন অপারেশন করতে পারেন
এই ফাংশনগুলি স্পষ্টভাবে যোগ না করেই মান নির্ধারণ করা এবং পাওয়া।
উপরন্তু, অ্যাক্সেস নিয়ন্ত্রণ প্রয়োগ করা যেতে পারে, যেমন প্যারামিটার পড়ার অনুমতি দেওয়া এবং
লিখিত নয়, বা অনুমোদিত মানগুলির উপর সীমানা পরীক্ষা প্রয়োগ করা যেতে পারে।
নতুন শ্রেণী টাইপআইডি
এখানে, আমরা এমন একজন ব্যবহারকারীর উপর প্রভাব নিয়ে আলোচনা করি যিনি একটি নতুন ক্লাস যোগ করতে চান ns-3। কি
এটি বৈশিষ্ট্যগুলি ধরে রাখতে সক্ষম করার জন্য অতিরিক্ত জিনিসগুলি করতে হবে?
এর আমাদের নতুন ক্লাস অনুমান করা যাক, বলা হয় ns3::মাই মোবিলিটি, গতিশীলতার মডেলের একটি প্রকার। প্রথম,
ক্লাসটি তার পিতামাতার শ্রেণী থেকে উত্তরাধিকারসূত্রে পাওয়া উচিত, ns3::মোবিলিটি মডেল। মধ্যে my-mobility.h
হেডার ফাইল:
নামস্থান ns3 {
ক্লাস মাইক্লাস: পাবলিক মোবিলিটি মডেল
{
এই আমরা ঘোষণা প্রয়োজন GetTypeId () ফাংশন এটি একটি এক-লাইন পাবলিক ফাংশন
ঘোষণা:
প্রকাশ্য:
/ **
* এই ধরনের নিবন্ধন.
* \ অবজেক্ট TypeId ফেরত দিন।
*/
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর);
আমরা ইতিমধ্যে কি একটি চালু করেছি টাইপআইডি সংজ্ঞা মত দেখাবে my-mobility.cc
বাস্তবায়ন ফাইল:
NS_OBJECT_ENSURE_REGISTERED (মাই মোবিলিটি);
টাইপআইডি
মাইমোবিলিটি::গেটটাইপআইডি (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::MyMobility")
.SetParent ()
.SetGroupName ("গতিশীলতা")
.AddConstructor ()
.AddAttribute ("সীমানা",
"ক্রুজ এলাকার সীমানা।",
আয়তক্ষেত্রের মান (আয়তক্ষেত্র (0.0, 0.0, 100.0, 100.0)),
MakeRectangleAccessor (&MyMobility::m_bounds),
MakeRectangleChecker ())
.AddAttribute ("সময়",
"এই বিলম্বের জন্য সরানোর পরে বর্তমান দিক এবং গতি পরিবর্তন করুন।",
সময়ের মান (সেকেন্ড (1.0)),
MakeTimeAccessor (&MyMobility::m_modeTime),
MakeTimeChecker ())
// ইত্যাদি (আরো প্যারামিটার)।
;
রিটার্ন tid;
}
যদি আমরা একটি বিদ্যমান ক্লাস থেকে সাবক্লাস করতে না চাই, তাহলে হেডার ফাইলে আমরা কেবল উত্তরাধিকারী হই
থেকে ns3::অবজেক্ট, এবং অবজেক্ট ফাইলে আমরা প্যারেন্ট ক্লাস সেট করি ns3::অবজেক্ট সঙ্গে
.SetParent ().
এখানে সাধারণ ভুলগুলি জড়িত:
· ডাকছে না NS_OBJECT_ENSURE_REGISTERED ()
· কল করছে না সেট প্যারেন্ট () পদ্ধতি, বা ভুল টাইপ দিয়ে কল করা।
· কল করছে না অ্যাডকনস্ট্রাক্টর () পদ্ধতি, বা ভুল টাইপ দিয়ে কল করা।
· এর নামে একটি টাইপোগ্রাফিক ত্রুটি প্রবর্তন করা হচ্ছে টাইপআইডি এর কনস্ট্রাক্টরে
· C++ ক্লাসের সম্পূর্ণ-যোগ্য C++ টাইপনেম ব্যবহার না করা
টাইপআইডি। মনে রাখবেন যে "ns3::" দরকার.
এসব ভুলের কোনোটিই শনাক্ত করতে পারবে না ns-3 কোডবেস, তাই ব্যবহারকারীদের চেক করার পরামর্শ দেওয়া হয়
সাবধানে একাধিকবার যে তারা এই অধিকার পেয়েছে।
নতুন অ্যাট্রিবিউট ভ্যালু আদর্শ
ব্যবহারকারীর দৃষ্টিকোণ থেকে যিনি সিস্টেমে একটি নতুন ক্লাস লেখেন এবং এটি হতে চান
একটি বৈশিষ্ট্য হিসাবে অ্যাক্সেসযোগ্য, সেখানে প্রধানত রূপান্তরগুলি থেকে/থেকে লেখার বিষয় রয়েছে৷
স্ট্রিং এবং বৈশিষ্ট্য মান. এর বেশিরভাগই ম্যাক্রো-আইজড কোড দিয়ে কপি/পেস্ট করা যেতে পারে। জন্য
উদাহরণস্বরূপ, জন্য একটি ক্লাস ঘোষণা বিবেচনা করুন আয়তক্ষেত্র মধ্যে src/গতিশীলতা/মডেল ডিরেক্টরি:
শিরোলেখ ফাইল
/ **
* সংক্ষিপ্ত একটি 2d আয়তক্ষেত্র
*/
বর্গ আয়তক্ষেত্র
{
...
ডবল xMin;
ডবল xMax;
দ্বিগুণ yMin;
ডবল yMax;
};
একটি ম্যাক্রো কল এবং দুটি অপারেটর, ক্লাস ঘোষণার নীচে যোগ করতে হবে
দ্বারা ব্যবহারযোগ্য একটি মান একটি আয়তক্ষেত্র চালু করুন গুণ পদ্ধতি:
std::ostream &operator << (std::ostream &os, const আয়তক্ষেত্র এবং আয়তক্ষেত্র);
std::istream & operator >> (std::istream &is, আয়তক্ষেত্র এবং আয়তক্ষেত্র);
ATTRIBUTE_HELPER_HEADER (আয়তক্ষেত্র);
বাস্তবায়ন ফাইল
শ্রেণীর সংজ্ঞায় (.cc ফাইল), কোড এই মত দেখায়:
ATTRIBUTE_HELPER_CPP (আয়তক্ষেত্র);
std::ostream এবং
অপারেটর << (std::ostream &os, const আয়তক্ষেত্র এবং আয়তক্ষেত্র)
{
os << rectangle.xMin << "|" << rectangle.xMax << "|" << rectangle.yMin << "|"
<< rectangle.yMax;
রিটার্ন ওএস;
}
std::istream এবং
অপারেটর >> (std::istream &is, আয়তক্ষেত্র এবং আয়তক্ষেত্র)
{
char c1, c2, c3;
হল >> rectangle.xMin >> c1 >> rectangle.xMax >> c2 >> rectangle.yMin >> c3
>> rectangle.yMax;
যদি (c1 != '|' ||
c2 != '|' ||
c3 != '|')
{
is.setstate (std::ios_base::failbit);
}
প্রত্যাবর্তন হয়;
}
এই স্ট্রীম অপারেটরগুলি কেবল আয়তক্ষেত্রের একটি স্ট্রিং উপস্থাপনা থেকে রূপান্তর করে
("xMin|xMax|yMin|yMax") অন্তর্নিহিত আয়তক্ষেত্রে। মডেলারকে অবশ্যই এইগুলি নির্দিষ্ট করতে হবে
অপারেটর এবং নতুন ক্লাসের একটি উদাহরণের স্ট্রিং সিনট্যাক্টিক্যাল উপস্থাপনা।
কনফিগারস্টোর
জন্য মান ns-3 বৈশিষ্ট্যগুলি একটি ASCII বা XML টেক্সট ফাইলে সংরক্ষণ করা যেতে পারে এবং a এ লোড করা যেতে পারে
ভবিষ্যতের সিমুলেশন রান। এই বৈশিষ্ট্য হিসাবে পরিচিত ns-3 কনফিগারস্টোর। দ্য কনফিগারস্টোর is
অ্যাট্রিবিউট মান এবং ডিফল্ট মানগুলির জন্য একটি বিশেষ ডাটাবেস।
যদিও এটি একটি পৃথকভাবে রক্ষণাবেক্ষণ করা মডিউল src/config-store/ ডিরেক্টরি, আমরা
এর একমাত্র নির্ভরতার কারণে এটি এখানে নথিভুক্ত করুন ns-3 মূল মডিউল এবং গুণাবলী।
থেকে একটি উদাহরণ ব্যবহার করে আমরা এই সিস্টেমটি অন্বেষণ করতে পারি
src/config-store/examples/config-store-save.cc.
প্রথমত, সমস্ত ব্যবহারকারী কনফিগারস্টোর নিম্নলিখিত বিবৃতি অন্তর্ভুক্ত করা আবশ্যক:
# "ns3/config-store-module.h" অন্তর্ভুক্ত করুন
পরবর্তী, এই প্রোগ্রাম একটি নমুনা বস্তু যোগ করে ConfigExample সিস্টেমটি কীভাবে প্রসারিত হয় তা দেখানোর জন্য:
ক্লাস কনফিগার উদাহরণ: পাবলিক অবজেক্ট
{
প্রকাশ্য:
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর) {
স্ট্যাটিক TypeId tid = TypeId ("ns3::A")
.SetParent ()
.AddAttribute ("TestInt16", "সহায়তা পাঠ্য",
IntegerValue (-2),
MakeIntegerAccessor (&A::m_int16),
MakeIntegerChecker ())
;
রিটার্ন tid;
}
int16_t m_int16;
};
NS_OBJECT_ENSURE_REGISTERED (ConfigExample);
এরপরে, আমরা কয়েকটি উপায়ে ডিফল্ট ওভাররাইড করতে কনফিগ সাবসিস্টেম ব্যবহার করি:
Config::SetDefault ("ns3::ConfigExample::TestInt16", IntegerValue (-5));
Ptr a_obj = CreateObject ();
NS_ABORT_MSG_UNLESS (a_obj->m_int16 == -5,
"ConfigExample এর পূর্ণসংখ্যা বৈশিষ্ট্য Config::SetDefault এর মাধ্যমে সেট করা যাবে না");
Ptr a2_obj = CreateObject ();
a2_obj->SetAttribute ("TestInt16", IntegerValue (-3));
IntegerValue iv;
a2_obj->GetAttribute ("TestInt16", iv);
NS_ABORT_MSG_UNLESS (iv. পান () == -3,
"SetAttribute এর মাধ্যমে ConfigExample এর পূর্ণসংখ্যা বৈশিষ্ট্য সেট করা যাবে না");
পরবর্তী বিবৃতিটি নিশ্চিত করার জন্য প্রয়োজনীয় যে (একটি) বস্তুটি রুট করা হয়েছে
একটি অবজেক্ট উদাহরণ হিসাবে কনফিগারেশন নামস্থানে। এটি সাধারণত ঘটে যখন আপনি
বস্তুর সমষ্টি a ns3::নোড or ns3::চ্যানেল উদাহরণ, কিন্তু এখানে, যেহেতু আমরা কাজ করছি
মূল স্তরে, আমাদের একটি নতুন রুট নেমস্পেস অবজেক্ট তৈরি করতে হবে:
Config::RegisterRootNamespaceObject (a2_obj);
লেখা
এর পরে, আমরা কনফিগারেশন স্টোর আউটপুট করতে চাই। উদাহরণগুলি দেখায় কিভাবে এটি দুটিতে করা যায়
বিন্যাস, XML এবং কাঁচা পাঠ্য। অনুশীলনে, কল করার ঠিক আগে এই পদক্ষেপটি সম্পাদন করা উচিত
সিমুলেটর::চালান () সিমুলেশন চালানোর ঠিক আগে চূড়ান্ত কনফিগারেশন সংরক্ষণ করতে।
কনফিগারস্টোরের আচরণ নিয়ন্ত্রণ করে এমন তিনটি বৈশিষ্ট্য রয়েছে: "মোড",
"ফাইলের নাম", এবং "ফাইলের বিন্যাস". মোড (ডিফল্ট "কিছুই না") কনফিগার করে কিনা ns-3 উচিত
পূর্বে সংরক্ষিত ফাইল থেকে কনফিগারেশন লোড করুন (নির্দিষ্ট করুন "মোড = লোড") বা এটি একটি ফাইলে সংরক্ষণ করুন
(নির্দিষ্ট করুন "মোড = সংরক্ষণ করুন") ফাইলের নাম (ডিফল্ট "") যেখানে ConfigStore পড়া উচিত বা
তার তথ্য লিখুন। ফাইল ফরম্যাট (ডিফল্ট "কাঁচা লেখা") ConfigStore বিন্যাস কিনা তা নিয়ন্ত্রণ করে
প্লেইন টেক্সট বা এক্সএমএল ("ফাইল ফরম্যাট = Xml")
উদাহরণ দেখায়:
Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("output-attributes.xml"));
Config::SetDefault ("ns3::ConfigStore::FileFormat", StringValue ("Xml"));
Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Save"));
ConfigStore outputConfig;
outputConfig.ConfigureDefaults ();
outputConfig.ConfigureAttributes ();
// txt ফরম্যাটে আউটপুট কনফিগার স্টোর
Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("output-attributes.txt"));
Config::SetDefault ("ns3::ConfigStore::FileFormat", StringValue ("RawText"));
Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Save"));
ConfigStore outputConfig2;
outputConfig2.ConfigureDefaults ();
outputConfig2.ConfigureAttributes();
সিমুলেটর::রান ();
সিমুলেটর::ধ্বংস ();
ঠিক আগে এই বিবৃতি বসানো নোট সিমুলেটর::চালান () বিবৃতি।
এই আউটপুটটি সিমুলেশন শুরু করার ঠিক আগে সমস্ত মান লগ করে (অর্থাত.
সমস্ত কনফিগারেশন সঞ্চালিত হওয়ার পরে)।
চালানোর পরে, আপনি খুলতে পারেন output-attributes.txt ফাইল এবং দেখুন:
ডিফল্ট ns3::RealtimeSimulatorImpl::SynchronizationMode "BestEffort"
ডিফল্ট ns3::RealtimeSimulatorImpl::HardLimit "+100000000.0ns"
ডিফল্ট ns3::PcapFileWrapper::CaptureSize "65535"
ডিফল্ট ns3::PacketSocket::RcvBufSize "131072"
ডিফল্ট ns3::ErrorModel::IsEnabled "true"
ডিফল্ট ns3::RateErrorModel::ErrorUnit "EU_BYTE"
ডিফল্ট ns3::RateErrorModel::ErrorRate "0"
ডিফল্ট ns3::RateErrorModel::RanVar "Uniform:0:1"
ডিফল্ট ns3::DropTailQueue::মোড "প্যাকেট"
ডিফল্ট ns3::DropTailQueue::MaxPackets "100"
ডিফল্ট ns3::DropTailQueue::MaxBytes "6553500"
ডিফল্ট ns3::Application::StartTime "+0.0ns"
ডিফল্ট ns3::Application::StopTime "+0.0ns"
ডিফল্ট ns3::ConfigStore::মোড "সংরক্ষণ করুন"
ডিফল্ট ns3::ConfigStore::ফাইলের নাম "output-attributes.txt"
ডিফল্ট ns3::ConfigStore::FileFormat "RawText"
ডিফল্ট ns3::ConfigExample::TestInt16 "-5"
গ্লোবাল RngSeed "1"
বিশ্বব্যাপী RngRun "1"
গ্লোবাল সিমুলেটর ইমপ্লিমেন্টেশন টাইপ "ns3::DefaultSimulatorImpl"
গ্লোবাল শিডিউলার টাইপ "ns3::MapScheduler"
বিশ্বব্যাপী চেকসাম সক্ষম "মিথ্যা"
মান /$ns3::ConfigExample/TestInt16 "-3"
উপরে, মূল মডিউলের বৈশিষ্ট্যগুলির জন্য সমস্ত ডিফল্ট মান দেখানো হয়েছে।
তারপর, জন্য সব মান ns-3 বিশ্বব্যাপী মান রেকর্ড করা হয়। অবশেষে, মান
উদাহরণস্বরুপ ConfigExample যেটি কনফিগারেশনে রুট করা ছিল নেমস্পেস দেখানো হয়েছে। এ
বাস্তব ns-3 প্রোগ্রাম, আরও অনেক মডেল, বৈশিষ্ট্য এবং ডিফল্ট দেখানো হবে।
একটি XML সংস্করণ এছাড়াও বিদ্যমান output-attributes.xml:
এই ফাইলটি আপনার সিমুলেশন স্ক্রিপ্ট এবং আউটপুট ডেটা দিয়ে আর্কাইভ করা যেতে পারে।
পড়া
এর পরে, আমরা সিমুলেশন কনফিগার করার বিষয়ে আলোচনা করি মাধ্যমে একটি সংরক্ষিত ইনপুট কনফিগারেশন ফাইল। সেখানে
চূড়ান্ত সিমুলেশন কনফিগারেশন লেখার তুলনায় কয়েকটি মূল পার্থক্য।
প্রথমত, আমাদের প্রোগ্রামের শুরুতে, আগে এই ধরনের স্টেটমেন্ট রাখতে হবে
সিমুলেশন কনফিগারেশন স্টেটমেন্ট লেখা হয় (তাই মানগুলি হওয়ার আগে নিবন্ধিত হয়
বস্তু নির্মাণে ব্যবহৃত হয়)।
Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("input-defaults.xml"));
Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Load"));
Config::SetDefault ("ns3::ConfigStore::FileFormat", StringValue ("Xml"));
ConfigStore inputConfig;
inputConfig.ConfigureDefaults ();
পরবর্তী, নোট করুন যে ইনপুট কনফিগারেশন ডেটা লোড করা অ্যাট্রিবিউট ডিফল্টে সীমাবদ্ধ (অর্থাত.
উদাহরণ নয়) মান, এবং বৈশ্বিক মান। অ্যাট্রিবিউট ইনস্ট্যান্স মান সমর্থিত নয়
কারণ সিমুলেশনের এই পর্যায়ে, কোনো বস্তু নির্মাণের আগে, সেখানে নেই
চারপাশে যেমন বস্তুর দৃষ্টান্ত। (দ্রষ্টব্য, কনফিগার স্টোরের ভবিষ্যতের উন্নতিগুলি পরিবর্তিত হতে পারে
এই আচরণ)।
দ্বিতীয়, যখন আউটপুট কনফিগারস্টোর রাষ্ট্র ডাটাবেসের সবকিছু তালিকাভুক্ত করবে,
ইনপুট ফাইলে ওভাররাইড করার জন্য শুধুমাত্র নির্দিষ্ট মান থাকতে হবে। সুতরাং, এক উপায় ব্যবহার
ইনপুট ফাইল কনফিগারেশনের জন্য এই ক্লাসটি ব্যবহার করে একটি প্রাথমিক কনফিগারেশন তৈরি করতে হয়
আউটপুট ("সংরক্ষণ") "মোড" উপরে বর্ণিত, শুধুমাত্র সেই কনফিগারেশন ফাইল থেকে এক্সট্র্যাক্ট করুন
যে উপাদানগুলি একজন পরিবর্তন করতে চায়, এবং এই ন্যূনতম উপাদানগুলিকে একটি নতুন কনফিগারেশন ফাইলে সরাতে চায়
যা পরবর্তীতে পরবর্তী সিমুলেশন রানে নিরাপদে সম্পাদনা এবং লোড করা যেতে পারে।
যখন কনফিগারস্টোর বস্তু তাত্ক্ষণিক হয়, তার বৈশিষ্ট্য "ফাইলের নাম", "মোড", এবং
"ফাইলের বিন্যাস" সেট করা আবশ্যক, হয় মাধ্যমে কমান্ড লাইন বা মাধ্যমে প্রোগ্রাম বিবৃতি।
পড়া লেখা উদাহরণ
আরও জটিল উদাহরণ হিসাবে, ধরা যাক যে আমরা এর কনফিগারেশনে পড়তে চাই
নামের একটি ইনপুট ফাইল থেকে ডিফল্ট input-defaults.xml, এবং ফলাফল লিখুন
নামক একটি পৃথক ফাইলের বৈশিষ্ট্য output-attributes.xml.:
# "ns3/config-store-module.h" অন্তর্ভুক্ত করুন
...
int প্রধান (...)
{
Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("input-defaults.xml"));
Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Load"));
Config::SetDefault ("ns3::ConfigStore::FileFormat", StringValue ("Xml"));
ConfigStore inputConfig;
inputConfig.ConfigureDefaults ();
//
// ব্যবহারকারীকে যেকোনো ডিফল্ট এবং উপরের Bind () এ ওভাররাইড করার অনুমতি দিন
// রান-টাইম, viacommand-line আর্গুমেন্ট
//
কমান্ডলাইন cmd;
cmd.Parse (argc, argv);
// সেটআপ টপোলজি
...
// সিমুলেটরে প্রবেশের ঠিক আগে আহ্বান করুন::চালান ()
Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("output-attributes.xml"));
Config::SetDefault ("ns3::ConfigStore::Mode", StringValue ("Save"));
ConfigStore outputConfig;
outputConfig.ConfigureAttributes ();
সিমুলেটর::রান ();
}
কনফিগারস্টোর গুই
ConfigStore এর জন্য একটি GTK-ভিত্তিক ফ্রন্ট এন্ড রয়েছে। এটি ব্যবহারকারীদের একটি GUI ব্যবহার করার অনুমতি দেয়
অ্যাক্সেস এবং পরিবর্তনশীল পরিবর্তন. এই বৈশিষ্ট্যের স্ক্রিনশট পাওয়া যায় |ns3|
সংক্ষিপ্ত বিবরণ উপস্থাপনা।
এই বৈশিষ্ট্যটি ব্যবহার করতে, একজনকে অবশ্যই ইনস্টল করতে হবে libgtk এবং libgtk-dev; একটি উদাহরণ উবুন্টু
ইনস্টলেশন কমান্ড হল:
$ sudo apt-get install libgtk2.0-0 libgtk2.0-dev
এটি কনফিগার করা হয়েছে কিনা তা পরীক্ষা করতে, ধাপের আউটপুটটি পরীক্ষা করুন:
$ ./waf কনফিগার --enable-examples --enable-tests
---- ঐচ্ছিক NS-3 বৈশিষ্ট্যের সারাংশ:
পাইথন বাইন্ডিং: সক্ষম
পাইথন API স্ক্যানিং সমর্থন: সক্ষম
NS-3 ক্লিক ইন্টিগ্রেশন: সক্রিয়
GtkConfigStore : সক্রিয় করা হয়নি (লাইব্রেরি 'gtk+-2.0 >= 2.12' পাওয়া যায়নি)
উপরের উদাহরণে, এটি সক্ষম করা হয়নি, তাই এটি একটি উপযুক্ত সংস্করণ না হওয়া পর্যন্ত ব্যবহার করা যাবে না
ইনস্টল করা এবং:
$ ./waf কনফিগার --enable-examples --enable-tests
$./waf
পুনরায় চালানো হয়
ব্যবহার প্রায় নন-GTK-ভিত্তিক সংস্করণের মতো, কিন্তু নেই কনফিগারস্টোর
জড়িত বৈশিষ্ট্য:
// সিমুলেটরে প্রবেশের ঠিক আগে আহ্বান করুন::চালান ()
GtkConfigStore কনফিগারেশন;
config.ConfigureDefaults ();
config.ConfigureAttributes ();
এখন, যখন আপনি স্ক্রিপ্ট চালান, একটি GUI পপ আপ করা উচিত, যা আপনাকে এর মেনু খুলতে দেয়
বিভিন্ন নোড/অবজেক্টের বৈশিষ্ট্যগুলি, এবং তারপরে যখন আপনি সিমুলেশন এক্সিকিউশন চালু করুন
সমাপ্ত হল.
ভবিষ্যৎ কাজ
কয়েকটি সম্ভাব্য উন্নতি রয়েছে:
· ফাইলের শুরুতে তারিখ এবং সময় সহ একটি অনন্য সংস্করণ নম্বর সংরক্ষণ করুন।
rng প্রাথমিক বীজ কোথাও সংরক্ষণ করুন।
· প্রতিটি র্যান্ডমভেরিয়েবলকে তার নিজস্ব প্রাথমিক বীজ ক্রমিক করুন এবং পরে এটি পুনরায় পড়ুন।
উদ্দেশ্য নাম
প্লেসহোল্ডার অধ্যায়
লগিং
সার্জারির ns-3 লগিং সুবিধা সিমুলেশনের অগ্রগতি নিরীক্ষণ বা ডিবাগ করতে ব্যবহার করা যেতে পারে
প্রোগ্রাম লগিং আউটপুট আপনার প্রোগ্রাম বিবৃতি দ্বারা সক্রিয় করা যেতে পারে প্রধান () প্রোগ্রাম বা
ব্যবহার করে NS_LOG পরিবেশ সূচক.
লগিং বিবৃতি অপ্টিমাইজ করা বিল্ডে কম্পাইল করা হয় না ns-3. লগিং ব্যবহার করতে, এক
এর (ডিফল্ট) ডিবাগ বিল্ড তৈরি করতে হবে ns-3.
লগিং আউটপুট একই থাকবে কিনা সে বিষয়ে প্রকল্পটি কোন গ্যারান্টি দেয় না
সময় লগিং এর উপরে সিমুলেশন আউটপুট ফ্রেমওয়ার্ক তৈরি করার বিরুদ্ধে ব্যবহারকারীদের সতর্ক করা হয়
কোড, আউটপুট হিসাবে এবং আউটপুট সক্রিয় করার উপায় সময়ের সাথে পরিবর্তিত হতে পারে।
সংক্ষিপ্ত বিবরণ
ns-3 লগিং স্টেটমেন্টগুলি সাধারণত বিভিন্ন প্রোগ্রাম এক্সিকিউশন ইভেন্ট লগ করতে ব্যবহৃত হয়, যেমন
সিমুলেশন ইভেন্টের ঘটনা বা একটি নির্দিষ্ট ফাংশনের ব্যবহার হিসাবে।
উদাহরণস্বরূপ, এই কোড স্নিপেট থেকে Ipv4L3Protocol::IsDestinationAddress():
যদি (ঠিকানা == iaddr.GetBroadcast ())
{
NS_LOG_LOGIC ("আমার জন্য (ইন্টারফেস সম্প্রচার ঠিকানা)");
সত্য ফিরে আসা;
}
লগিং এর জন্য সক্রিয় করা হয়েছে Ipv4L3 প্রোটোকল এর তীব্রতায় উপাদান যুক্তিবিদ্যা or
উপরে (লগের তীব্রতা সম্পর্কে নীচে দেখুন), বিবৃতিটি প্রিন্ট করা হবে; অন্যথায়, এটা
দমন করা হবে।
সক্ষম করা হলে তা আউটপুট
ব্যবহারকারীরা সাধারণত লগ আউটপুট নিয়ন্ত্রণ করে এমন দুটি উপায় রয়েছে। প্রথমটি সেট করে
NS_LOG পরিবেশ সূচক; যেমন:
$NS_LOG="*" ./waf --প্রথমে চালান
চালাবে প্রথম সমস্ত লগিং আউটপুট সহ টিউটোরিয়াল প্রোগ্রাম। (এর বিশেষত্ব NS_LOG
বিন্যাস নীচে আলোচনা করা হবে.)
পৃথক উপাদান নির্বাচন করে এটি আরও দানাদার করা যেতে পারে:
$ NS_LOG="Ipv4L3Protocol" ./waf --প্রথমে চালান৷
আউটপুটটি উপসর্গ বিকল্পগুলির সাথে আরও উপযোগী করা যেতে পারে।
লগিং সক্ষম করার দ্বিতীয় উপায় হল আপনার প্রোগ্রামে স্পষ্ট বিবৃতি ব্যবহার করা, যেমন in
দ্য প্রথম টিউটোরিয়াল প্রোগ্রাম:
কোন int
প্রধান (int argc, char *argv[])
{
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
...
(অর্থ LOG_LEVEL_INFO, এবং অন্যান্য সম্ভাব্য মান, নীচে আলোচনা করা হবে।)
NS_LOG বাক্য গঠন
সার্জারির NS_LOG এনভায়রনমেন্ট ভেরিয়েবলে লগ উপাদান এবং বিকল্পগুলির একটি তালিকা রয়েছে। লগ
উপাদানগুলি `:' অক্ষর দ্বারা পৃথক করা হয়:
$ NS_LOG=" : ..."
প্রতিটি লগ উপাদানের জন্য বিকল্পগুলি প্রতিটি লগ উপাদানের পরে পতাকা হিসাবে দেওয়া হয়:
$ NS_LOG=" = | ...: ..."
বিকল্পগুলি সেই উপাদানটির তীব্রতা এবং স্তর নিয়ন্ত্রণ করে এবং ঐচ্ছিক কিনা
তথ্য অন্তর্ভুক্ত করা উচিত, যেমন সিমুলেশন সময়, সিমুলেশন নোড, ফাংশন
নাম, এবং প্রতীকী তীব্রতা।
লগিন উপাদান
সাধারণত একটি লগ উপাদান একটি একক উত্স কোড বোঝায় .cc ফাইল, এবং অন্তর্ভুক্ত করে
সম্পূর্ণ ফাইল।
কিছু সাহায্যকারীর একটি মডিউলে সমস্ত উপাদান লগিং সক্ষম করার জন্য বিশেষ পদ্ধতি রয়েছে,
বিভিন্ন সংকলন ইউনিট বিস্তৃত, কিন্তু যৌক্তিকভাবে একসাথে গোষ্ঠীবদ্ধ, যেমন ns-3
ওয়াইফাই কোড:
WifiHelper wifiHelper;
wifiHelper.EnableLogComponents ();
সার্জারির NS_LOG লগ কম্পোনেন্ট ওয়াইল্ডকার্ড `*' সমস্ত উপাদান সক্রিয় করবে।
লগ উপাদানগুলি সংজ্ঞায়িত করা হয়েছে তা দেখতে, এর মধ্যে যেকোনো একটি কাজ করবে:
$ NS_LOG="প্রিন্ট-তালিকা" ./waf --run ...
$ NS_LOG="foo" # একটি টোকেন কোনো লগ-কম্পোনেন্টের সাথে মেলে না
প্রথম ফর্মটি সমস্ত লগ উপাদানগুলির জন্য নাম এবং সক্রিয় পতাকা মুদ্রণ করবে
লিঙ্ক করা এটি দিয়ে চেষ্টা করুন স্ক্র্যাচ-সিমুলেটর. দ্বিতীয় ফর্মটি সমস্ত নিবন্ধিত লগ প্রিন্ট করে
উপাদান, তারপর একটি ত্রুটি সঙ্গে প্রস্থান করুন.
নির্দয়তা এবং উচ্চতা অপশন সমূহ
স্বতন্ত্র বার্তাগুলি একটি একক "তীব্রতা শ্রেণীর" অন্তর্গত, যা ম্যাক্রো তৈরি করে
বার্তা উপরের উদাহরণে, NS_LOG_LOGIC(..) তে বার্তা তৈরি করে LOG_LOGIC
তীব্রতা শ্রেণী।
নিম্নলিখিত তীব্রতা ক্লাস হিসাবে সংজ্ঞায়িত করা হয় এনাম ধ্রুবক:
┌───────────────┬─────────────────────────────────. ─┐
│ তীব্রতা শ্রেণী │ অর্থ │
├───────────────┼─────────────────────────────────. ─┤
│LOG_NONE │ ডিফল্ট, কোনো লগিং নেই │৷
├───────────────┼─────────────────────────────────. ─┤
│LOG_ERROR │ শুধুমাত্র গুরুতর ত্রুটি বার্তা │
├───────────────┼─────────────────────────────────. ─┤
│LOG_WARN │ সতর্কতা বার্তা │
├───────────────┼─────────────────────────────────. ─┤
│LOG_DEBUG │ ডিবাগিং এ ব্যবহারের জন্য │
├───────────────┼─────────────────────────────────. ─┤
│LOG_INFO │ তথ্যমূলক │
├───────────────┼─────────────────────────────────. ─┤
│LOG_FUNCTION │ ফাংশন ট্রেসিং │
├───────────────┼─────────────────────────────────. ─┤
│LOG_LOGIC │ এর মধ্যে ফ্লো ট্রেসিং নিয়ন্ত্রণ করুন
│ │ ফাংশন │
└───────────────┴─────────────────────────────────. ─┘
সাধারণত একজন প্রদত্ত তীব্রতা ক্লাসে বার্তা দেখতে চায় এবং ঊর্ধ্বতন। এটি দ্বারা করা হয়
অন্তর্ভুক্তিমূলক লগিং "স্তর" সংজ্ঞায়িত করা:
┌───────────────────┬───────────────────────────── ─────┐
│স্তর │ অর্থ │
├───────────────────┼───────────────────────────── ─────┤
│LOG_LEVEL_ERROR │ শুধুমাত্র LOG_ERROR তীব্রতা শ্রেণী │
│ │ বার্তা। │
├───────────────────┼───────────────────────────── ─────┤
│LOG_LEVEL_WARN │ LOG_WARN এবং উপরে. │
├───────────────────┼───────────────────────────── ─────┤
│LOG_LEVEL_DEBUG │ LOG_DEBUG এবং উপরে. │
├───────────────────┼───────────────────────────── ─────┤
│LOG_LEVEL_INFO │ LOG_INFO এবং উপরে. │
├───────────────────┼───────────────────────────── ─────┤
│LOG_LEVEL_FUNCTION │ LOG_FUNCTION এবং উপরে. │
├───────────────────┼───────────────────────────── ─────┤
│LOG_LEVEL_LOGIC │ LOG_LOGIC এবং উপরে. │
├───────────────────┼───────────────────────────── ─────┤
│LOG_LEVEL_ALL │ সমস্ত তীব্রতা ক্লাস। │
├───────────────────┼───────────────────────────── ─────┤
│LOG_ALL │ এর সমার্থক LOG_LEVEL_ALL │
└───────────────────┴───────────────────────────── ─────┘
তীব্রতা শ্রেণী এবং স্তর বিকল্প দেওয়া যেতে পারে NS_LOG দ্বারা পরিবেশ পরিবর্তনশীল
এই টোকেন:
┌─────────┬────────────────────
│শ্রেণি │ স্তর │
├─────────┼────────────────────
│ভুল │ স্তর_ত্রুটি │
├─────────┼────────────────────
│সতর্ক │ স্তর_সতর্ক │
├─────────┼────────────────────
│ডেবাগ্ করা │ লেভেল_ডিবাগ │
├─────────┼────────────────────
│তথ্য │ স্তর_তথ্য │
├─────────┼────────────────────
│ক্রিয়া │ লেভেল_ফাংশন │
├─────────┼────────────────────
│যুক্তিবিদ্যা │ স্তর_যুক্তি │
├─────────┼────────────────────
│ │ স্তর_সমস্ত │
│ │ সব │
│ │ * │
└─────────┴────────────────────
একটি তীব্রতা শ্রেণীর টোকেন ব্যবহার করে শুধুমাত্র সেই তীব্রতায় লগ বার্তাগুলিকে সক্ষম করে৷ উদাহরণ স্বরূপ,
NS_LOG="*=সতর্ক" তীব্রতার সাথে বার্তা আউটপুট করবে না ভুল. NS_LOG="*=level_debug" ইচ্ছা
তীব্রতা স্তরে আউটপুট বার্তা ডেবাগ্ করা এবং উপরে.
তীব্রতা ক্লাস এবং স্তরগুলিকে `|' এর সাথে একত্রিত করা যেতে পারে অপারেটর:
NS_LOG="*=level_warn|যুক্তি" তীব্রতা স্তরে বার্তা আউটপুট হবে ভুল, সতর্ক এবং যুক্তিবিদ্যা.
সার্জারির NS_LOG তীব্রতা স্তর ওয়াইল্ডকার্ড `*' এবং সব এর প্রতিশব্দ স্তর_সমস্ত.
লগ উপাদানের জন্য শুধুমাত্র উল্লিখিত NS_LOG
$ NS_LOG=" :..."
ডিফল্ট তীব্রতা হয় LOG_LEVEL_ALL.
উপসর্গ অপশন সমূহ
একটি বার্তা কোথায় এবং কখন উদ্ভূত হয়েছে এবং কিসে এসেছে তা চিহ্নিত করতে অনেকগুলি উপসর্গ সাহায্য করতে পারে
নির্দয়তা.
উপলব্ধ উপসর্গ বিকল্পগুলি (যেমন এনাম ধ্রুবক) হয়
┌─────────────────┬─────────────────────────────── ───┐
│প্রিফিক্স চিহ্ন │ অর্থ │
├─────────────────┼─────────────────────────────── ───┤
│LOG_PREFIX_FUNC │ কলিং এর নামের উপসর্গ │
│ │ ফাংশন। │
├─────────────────┼─────────────────────────────── ───┤
│LOG_PREFIX_TIME │ সিমুলেশন সময় উপসর্গ। │
├─────────────────┼─────────────────────────────── ───┤
│LOG_PREFIX_NODE │ নোড আইডি উপসর্গ. │
├─────────────────┼─────────────────────────────── ───┤
│LOG_PREFIX_LEVEL │ তীব্রতা স্তরের উপসর্গ। │
├─────────────────┼─────────────────────────────── ───┤
│LOG_PREFIX_ALL │ সমস্ত উপসর্গ সক্রিয় করুন। │
└─────────────────┴─────────────────────────────── ───┘
উপসর্গ বিকল্পগুলি নীচে সংক্ষেপে বর্ণনা করা হয়েছে।
অপশন দেওয়া যেতে পারে NS_LOG এই টোকেন দ্বারা পরিবেশ পরিবর্তনশীল:
┌─────────────┬───────────
│টোকেন │ বিকল্প │
├─────────────┼────────────────
│prefix_func │ ফাংশন │
├─────────────┼────────────────
│উপসর্গ_সময় │ সময় │
└─────────────┴───────────────┘
│উপসর্গ_নোড │ নোড │
├─────────────┼────────────────
│উপসর্গ_স্তর │ স্তর │
├─────────────┼────────────────
│উপসর্গ_সমস্ত │ সব │
│ │ * │
└─────────────┴───────────────┘
লগ উপাদানের জন্য শুধুমাত্র উল্লিখিত NS_LOG
$ NS_LOG=" :..."
ডিফল্ট উপসর্গ অপশন হয় LOG_PREFIX_ALL.
নির্দয়তা উপসর্গ
বিকল্পগুলির সাথে একটি বার্তার তীব্রতা শ্রেণী অন্তর্ভুক্ত করা যেতে পারে উপসর্গ_স্তর or স্তর.
উদাহরণস্বরূপ, এই মান NS_LOG সমস্ত লগ উপাদান (`*') এবং সকলের জন্য লগিং সক্ষম করে
তীব্রতা ক্লাস (= সব), এবং বার্তাটিকে তীব্রতা শ্রেণির সাথে উপসর্গ (|প্রিফিক্স_লেভেল).
$NS_LOG="*=all|prefix_level" ./waf --run স্ক্র্যাচ-সিমুলেটর
স্ক্র্যাচ সিমুলেটর
[ত্রুটি] ত্রুটি বার্তা
[সতর্ক] সতর্কবার্তা
[ডিবাগ] ডিবাগ বার্তা
[INFO] তথ্য বার্তা
[FUNCT] ফাংশন বার্তা
[লজিক] যুক্তি বার্তা
সময় উপসর্গ
সিমুলেশন সময় বিকল্পগুলির সাথে অন্তর্ভুক্ত করা যেতে পারে উপসর্গ_সময় or সময়. এই প্রিন্ট
সেকেন্ডে সিমুলেশন সময়।
নোড উপসর্গ
সিমুলেশন নোড আইডি বিকল্পগুলির সাথে অন্তর্ভুক্ত করা যেতে পারে উপসর্গ_নোড or নোড.
ক্রিয়া উপসর্গ
কলিং ফাংশনের নাম বিকল্পগুলির সাথে অন্তর্ভুক্ত করা যেতে পারে prefix_func or ফাংশন.
NS_LOG ওয়াইল্ডকার্ড
লগ কম্পোনেন্ট ওয়াইল্ডকার্ড `*' সমস্ত উপাদান সক্রিয় করবে। একটি এ সমস্ত উপাদান সক্রিয় করতে
নির্দিষ্ট তীব্রতা স্তর ব্যবহার *=.
তীব্রতা স্তর বিকল্প ওয়াইল্ডকার্ড `*' এর প্রতিশব্দ সব. এটা যে কোন আগে ঘটতে হবে
`|' অক্ষর আলাদা করার বিকল্প। সমস্ত তীব্রতা ক্লাস সক্ষম করতে, ব্যবহার করুন =*,
or =*|.
বিকল্প ওয়াইল্ডকার্ড `*' বা টোকেন সব সমস্ত উপসর্গ বিকল্প সক্রিয় করে, কিন্তু ঘটতে হবে পরে a
`|' চরিত্র একটি নির্দিষ্ট তীব্রতা শ্রেণী বা স্তর সক্ষম করতে, এবং সমস্ত উপসর্গ ব্যবহার করুন
= |*.
সম্মিলিত বিকল্প ওয়াইল্ডকার্ড ** সমস্ত তীব্রতা এবং সমস্ত উপসর্গ সক্ষম করে; উদাহরণ স্বরূপ,
=**.
উবার-ওয়াইল্ডকার্ড *** সমস্ত লগ উপাদানের জন্য সমস্ত তীব্রতা এবং সমস্ত উপসর্গ সক্ষম করে।
এই সব সমতুল্য:
$NS_LOG="***" ... $NS_LOG="*=all|*" ... $NS_LOG="*=*|সমস্ত" ...
$NS_LOG="*=**" ... $NS_LOG="*=level_all|*" ... $NS_LOG="*=*|prefix_all" ...
$NS_LOG="*=*|*"...
পরামর্শ দেওয়া: এমনকি তুচ্ছ স্ক্র্যাচ-সিমুলেটর এর সাথে 46K লাইনের বেশি আউটপুট তৈরি করে
NS_LOG="***"!
কিভাবে থেকে যোগ লগিং থেকে তোমার কোড
আপনার কোডে লগিং যোগ করা খুবই সহজ:
1. আহ্বান করুন NS_LOG_COMPONENT_DEFINE (...); এর ভিতরে ম্যাক্রো নামস্থান ns3.
একটি অনন্য স্ট্রিং শনাক্তকারী তৈরি করুন (সাধারণত ফাইল এবং/অথবা শ্রেণীর নামের উপর ভিত্তি করে
ফাইলের মধ্যে সংজ্ঞায়িত) এবং এটি একটি ম্যাক্রো কলের সাথে নিবন্ধন করুন যেমন নিম্নরূপ:
নামস্থান ns3 {
NS_LOG_COMPONENT_DEFINE ("Ipv4L3Protocol");
...
এই নিবন্ধন Ipv4L3 প্রোটোকল একটি লগ উপাদান হিসাবে।
(এর ভিতরে বা বাইরে অন্তর্ভুক্তির অনুমতি দেওয়ার জন্য ম্যাক্রোটি সাবধানে লেখা হয়েছিল
নামস্থান ns3, এবং ব্যবহার কোডবেস জুড়ে পরিবর্তিত হবে, কিন্তু মূল উদ্দেশ্য ছিল
এই নিবন্ধন বাহিরে নামস্থান ns3 ফাইল গ্লোবাল স্কোপে।)
2. আপনার ফাংশন এবং ফাংশন বডিতে লগিং স্টেটমেন্ট (ম্যাক্রো কল) যোগ করুন।
লগিং ম্যাক্রো
লগিং ম্যাক্রো এবং সংশ্লিষ্ট তীব্রতা স্তর হয়
┌───────────────┬───────────────────
│ তীব্রতা শ্রেণী │ ম্যাক্রো │
├───────────────┼────────────────────────────
│LOG_NONE │ (কোনও প্রয়োজন নেই) │
├───────────────┼────────────────────────────
│LOG_ERROR │ NS_LOG_ERROR (...); │
├───────────────┼────────────────────────────
│LOG_WARN │ NS_LOG_WARN (...); │
├───────────────┼────────────────────────────
│LOG_DEBUG │ NS_LOG_DEBUG (...); │
├───────────────┼────────────────────────────
│LOG_INFO │ NS_LOG_INFO (...); │
├───────────────┼────────────────────────────
│LOG_FUNCTION │ NS_LOG_FUNCTION (...); │
├───────────────┼────────────────────────────
│LOG_LOGIC │ NS_LOG_LOGIC (...); │
└───────────────┴───────────────────────
ম্যাক্রোগুলি আউটপুট স্ট্রীমার হিসাবে কাজ করে, তাই আপনি যা কিছু পাঠাতে পারেন std::out, যোগদান
by << অপারেটর, অনুমোদিত:
void MyClas::চেক করুন (int value, char * আইটেম)
{
NS_LOG_FUNCTION (এই << arg << আইটেম);
যদি (arg > 10)
{
NS_LOG_ERROR ("খারাপ মান" << মান <
" চেক করার সময় " << নাম << "!");
}
...
}
মনে রাখবেন যে NS_LOG_FUNCTION স্বয়ংক্রিয়ভাবে একটি ` সন্নিবেশ করায়,' (কমা-স্পেস) এর মধ্যে বিভাজক
এর প্রতিটি আর্গুমেন্ট। এটি ফাংশন আর্গুমেন্টের লগিং সহজ করে; শুধু সংযুক্ত করা
তাদের সাথে << উপরের উদাহরণ হিসাবে।
শর্তহীন লগিং
একটি সুবিধা হিসাবে, NS_LOG_UNCOND (...); ম্যাক্রো সবসময় তার আর্গুমেন্ট লগ করবে, এমনকি যদি
সংশ্লিষ্ট লগ-কম্পোনেন্ট কোনো তীব্রতায় সক্ষম নয়। এই ম্যাক্রো কোনো ব্যবহার করে না
উপসর্গ বিকল্পগুলির। মনে রাখবেন যে লগিং শুধুমাত্র ডিবাগ বিল্ডে সক্রিয় করা হয়েছে; এই ম্যাক্রো
অপ্টিমাইজড বিল্ডে আউটপুট তৈরি করবে না।
নির্দেশিকা
প্রতিটি ক্লাস পদ্ধতি দিয়ে শুরু করুন NS_LOG_FUNCTION (এই << args...); এই সহজ সক্রিয়
ফাংশন কল ট্রেসিং।
· ব্যতীত: অপারেটর বা স্পষ্ট অনুলিপি কনস্ট্রাক্টর লগ করবেন না, কারণ এটি ঘটবে
অসীম পুনরাবৃত্তি এবং স্ট্যাক ওভারফ্লো।
আর্গুমেন্ট ছাড়া পদ্ধতির জন্য একই ফর্ম ব্যবহার করুন: NS_LOG_FUNCTION (এই);
· স্ট্যাটিক ফাংশনের জন্য:
আর্গুমেন্ট ব্যবহার সঙ্গে NS_LOG_FUNCTION (...); স্বাভাবিকের মত.
· যুক্তি ব্যবহার ছাড়া NS_LOG_FUNCTION_NOARGS ();
· ব্যবহার করুন NS_LOG_ERROR গুরুতর ত্রুটি অবস্থার জন্য যা সম্ভবত সিমুলেশনটি অবৈধ করে
মৃত্যুদন্ড।
· ব্যবহার করুন NS_LOG_WARN অস্বাভাবিক অবস্থার জন্য যা সংশোধনযোগ্য হতে পারে। কিছু ইঙ্গিত দিন
সমস্যার প্রকৃতি এবং কিভাবে এটি সংশোধন করা যেতে পারে।
· NS_LOG_DEBUG সাধারণত একটি ব্যবহার করা হয় ad হক একটি মডেলের সম্পাদন বোঝার উপায়।
· ব্যবহার করুন NS_LOG_INFO মৃত্যুদন্ড সম্পর্কে অতিরিক্ত তথ্যের জন্য, যেমন a এর আকার
এটি থেকে যোগ / অপসারণ করার সময় ডেটা গঠন।
· ব্যবহার করুন NS_LOG_LOGIC একটি ফাংশনের মধ্যে গুরুত্বপূর্ণ যুক্তিবিদ্যা শাখা ট্রেস করতে.
· পরীক্ষা করুন যে আপনার লগিং পরিবর্তনগুলি কোডটি ভঙ্গ করে না। এর সাথে কিছু উদাহরণ প্রোগ্রাম চালান
সমস্ত লগ উপাদান চালু (যেমন NS_LOG="***").
রচনা
ট্রেসিং সাবসিস্টেমটি বোঝার জন্য সবচেয়ে গুরুত্বপূর্ণ প্রক্রিয়াগুলির মধ্যে একটি ns-3. মধ্যে
অধিকাংশ ক্ষেত্রে, ns-3 ব্যবহারকারীদের কিছু নতুন এবং উন্নত নেটওয়ার্কিংয়ের জন্য একটি উজ্জ্বল ধারণা থাকবে
বৈশিষ্ট্য এই ধারণাটি কাজ করে তা যাচাই করার জন্য, গবেষক একটিতে পরিবর্তন করবেন
বিদ্যমান সিস্টেম এবং তারপর নতুন বৈশিষ্ট্য সংগ্রহ করে কিভাবে আচরণ করে তা দেখতে পরীক্ষা চালান
পরিসংখ্যান যা বৈশিষ্ট্যের আচরণ ক্যাপচার করে।
অন্য কথায়, একটি সিমুলেশন চালানোর পুরো পয়েন্ট হল আরও আউটপুট তৈরি করা
অধ্যয়ন. ভিতরে ns-3, সাবসিস্টেম যা একজন গবেষককে এটি করতে সক্ষম করে তা হল ট্রেসিং
সাবসিস্টেম
রচনা প্রেরণা
একটি প্রোগ্রাম থেকে তথ্য পেতে অনেক উপায় আছে. সবচেয়ে সোজা উপায় হল
স্ট্যান্ডার্ড আউটপুটে তথ্য সরাসরি প্রিন্ট করতে, যেমন,
# অন্তর্ভুক্ত
...
int প্রধান ()
{
...
std::cout << "x এর মান হল " << x << std::endl;
...
}
এটি ছোট পরিবেশে কার্যকর, কিন্তু আপনার সিমুলেশনগুলি আরও বেশি করে
জটিল, আপনি আরও বেশি সংখ্যক প্রিন্ট এবং পার্সিং এবং পারফর্ম করার কাজ দিয়ে শেষ করবেন
আউটপুটে গণনা কঠিন থেকে কঠিন হতে শুরু করে।
আরেকটি বিষয় বিবেচনা করা হয় যে প্রতিবার একটি নতুন tidbit প্রয়োজন হয়, সফ্টওয়্যার কোর
সম্পাদনা করতে হবে এবং অন্য প্রিন্ট চালু করতে হবে। সব নিয়ন্ত্রণ করার কোন মানসম্মত উপায় নেই
এই আউটপুটের, তাই আউটপুটের পরিমাণ সীমা ছাড়াই বাড়তে থাকে। অবশেষে,
শুধুমাত্র এই তথ্য আউটপুট করার জন্য প্রয়োজনীয় ব্যান্ডউইথ চলমান সময়কে সীমিত করতে শুরু করে
সিমুলেশন এর আউটপুট ফাইলগুলি বিশাল আকারে বৃদ্ধি পায় এবং সেগুলিকে পার্সিং করা হয়
সমস্যা.
ns-3 লগিং এবং আউটপুট এর মাধ্যমে কিছু নিয়ন্ত্রণ প্রদানের জন্য একটি সহজ প্রক্রিয়া প্রদান করে
লগিন উপাদান, কিন্তু নিয়ন্ত্রণের মাত্রা মোটেই খুব সূক্ষ্ম নয়। লগিং
মডিউল একটি অপেক্ষাকৃত ভোঁতা যন্ত্র।
এটি এমন একটি সুবিধা থাকা বাঞ্ছনীয় যা একজনকে মূল সিস্টেমে পৌঁছানোর অনুমতি দেয় এবং শুধুমাত্র
মূল সিস্টেম পরিবর্তন এবং পুনরায় কম্পাইল না করে প্রয়োজনীয় তথ্য পান। এমন কি
ভাল হবে এমন একটি সিস্টেম যা ব্যবহারকারীকে অবহিত করে যখন আগ্রহের একটি আইটেম পরিবর্তিত হয় বা একটি৷
আকর্ষণীয় ঘটনা ঘটেছে।
সার্জারির ns-3 ট্রেসিং সিস্টেমটি সেই লাইনগুলির সাথে কাজ করার জন্য ডিজাইন করা হয়েছে এবং এর সাথে ভালভাবে সংহত করা হয়েছে৷
বৈশিষ্ট্য এবং কনফিগার সাবস্টেম তুলনামূলকভাবে সহজ ব্যবহারের দৃশ্যের জন্য অনুমতি দেয়।
সংক্ষিপ্ত বিবরণ
ট্রেসিং সাবসিস্টেম এর উপর ব্যাপকভাবে নির্ভর করে ns-3 কলব্যাক এবং অ্যাট্রিবিউট মেকানিজম। আপনি
চেষ্টা করার আগে ম্যানুয়ালটির সংশ্লিষ্ট বিভাগগুলি পড়তে এবং বুঝতে হবে
ট্রেসিং সিস্টেম বুঝুন।
সার্জারির ns-3 ট্রেসিং সিস্টেম স্বাধীন ট্রেসিং উৎসের ধারণার উপর নির্মিত এবং
ট্রেসিং সিঙ্ক; সিঙ্কগুলির সাথে উত্সগুলিকে সংযুক্ত করার জন্য একটি অভিন্ন প্রক্রিয়া সহ।
ট্রেস সোর্স হল সত্তা যা সিমুলেশনে ঘটে যাওয়া ইভেন্টগুলিকে সংকেত দিতে পারে এবং প্রদান করে৷
আকর্ষণীয় অন্তর্নিহিত ডেটা অ্যাক্সেস। উদাহরণস্বরূপ, একটি ট্রেস উত্স নির্দেশ করতে পারে যখন a
প্যাকেট একটি নেট ডিভাইস দ্বারা গৃহীত হয় এবং এর জন্য প্যাকেটের বিষয়বস্তুতে অ্যাক্সেস প্রদান করে
আগ্রহী ট্রেস sinks. একটি ট্রেস উৎস এছাড়াও নির্দেশ করতে পারে যখন একটি আকর্ষণীয় রাষ্ট্র
পরিবর্তন একটি মডেলের মধ্যে ঘটে। উদাহরণস্বরূপ, একটি TCP মডেলের কনজেশন উইন্ডো একটি প্রাইম
একটি ট্রেস উত্স জন্য প্রার্থী.
ট্রেস উত্স নিজেদের দ্বারা দরকারী নয়; তাদের অবশ্যই কোডের অন্যান্য টুকরোগুলির সাথে সংযুক্ত থাকতে হবে
যে আসলে উৎস দ্বারা প্রদত্ত তথ্য সঙ্গে দরকারী কিছু না. দ্য
যে সত্তাগুলি ট্রেস তথ্য ব্যবহার করে তাদের ট্রেস সিঙ্ক বলা হয়। ট্রেস সূত্র হয়
ইভেন্টের জেনারেটর এবং ট্রেস সিঙ্ক হল ভোক্তা।
এই সুস্পষ্ট বিভাগটি চারপাশে ছড়িয়ে ছিটিয়ে থাকা প্রচুর সংখ্যক ট্রেস উত্সের অনুমতি দেয়
এমন জায়গায় সিস্টেম যা মডেল লেখকেরা মনে করেন উপযোগী হতে পারে। একটি ব্যবহারকারী সংযোগ না করা পর্যন্ত
এই উত্সগুলির একটিতে ট্রেস সিঙ্ক, কিছুই আউটপুট নয়। এই ব্যবস্থা তুলনামূলকভাবে অনুমতি দেয়
অপ্রত্যাশিত ব্যবহারকারীরা বিদ্যমান ট্রেসিং উত্সগুলিতে নতুন ধরণের সিঙ্ক সংযুক্ত করতে, ছাড়াই
সিমুলেটরের মূল বা মডেলগুলি সম্পাদনা এবং পুনরায় কম্পাইল করা প্রয়োজন৷
একটি ট্রেস উৎস দ্বারা উত্পন্ন ট্রেস ইভেন্টের শূন্য বা তার বেশি গ্রাহক হতে পারে। একজন পারে
একটি ট্রেস উত্সকে এক ধরণের পয়েন্ট-টু-মাল্টিপয়েন্ট তথ্য লিঙ্ক হিসাবে ভাবুন।
এই ধারণাগত পয়েন্ট-টু-মাল্টিপয়েন্ট লিঙ্কের জন্য "পরিবহন প্রোটোকল" হল একটি ns-3 কলব্যাক.
কলব্যাক বিভাগ থেকে স্মরণ করুন যে কলব্যাক সুবিধা হল দুটি মডিউল প্রবেশ করার একটি উপায়
সিস্টেমটি ফাংশন কলের মাধ্যমে যোগাযোগ করার জন্য একই সময়ে কলিং ডিকপলিং করে
সম্পূর্ণভাবে বলা ক্লাস থেকে ফাংশন. এটি উপরে বর্ণিত হিসাবে একই প্রয়োজনীয়তা
ট্রেসিং সিস্টেমের জন্য।
মূলত, একটি ট্রেস উৎস is একটি কলব্যাক যাতে একাধিক ফাংশন নিবন্ধিত হতে পারে।
যখন একটি ট্রেস সিঙ্ক ট্রেস ইভেন্টগুলি পেতে আগ্রহ প্রকাশ করে, তখন এটি একটি কলব্যাক যোগ করে
ট্রেস সোর্স দ্বারা অনুষ্ঠিত কলব্যাকের তালিকা। একটি আকর্ষণীয় ঘটনা ঘটলে, ট্রেস
উৎস তার আহ্বান অপারেটর() শূন্য বা তার বেশি পরামিতি প্রদান করে। এই সূত্র বলে
একে একে কলব্যাকের তালিকার মধ্য দিয়ে যান। এইভাবে, প্যারামিটার(গুলি)
ট্রেস সিঙ্কের সাথে যোগাযোগ করা হয়, যা শুধুমাত্র ফাংশন।
সার্জারির সহজ উদাহরণ
আমরা যা বলেছি তা শক্তিশালী করার জন্য একটি দ্রুত উদাহরণে হাঁটতে যাওয়া দরকারী হবে।
# "ns3/object.h" অন্তর্ভুক্ত করুন
# "ns3/uinteger.h" অন্তর্ভুক্ত করুন
# "ns3/traced-value.h"" অন্তর্ভুক্ত করুন
# "ns3/trace-source-accessor.h" অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত
নামস্থান ns3 ব্যবহার করে;
প্রথম জিনিসটি প্রয়োজনীয় ফাইলগুলি অন্তর্ভুক্ত করে। উপরে উল্লিখিত হিসাবে, ট্রেস সিস্টেম
অবজেক্ট এবং অ্যাট্রিবিউট সিস্টেমের ভারী ব্যবহার করে। প্রথম দুটি মধ্যে আনা অন্তর্ভুক্ত
যারা সিস্টেমের জন্য ঘোষণা. ফাইল, ট্রেসড-মান প্রয়োজনীয় মধ্যে নিয়ে আসে
তথ্য ট্রেসিং জন্য ঘোষণা যে মান শব্দার্থবিদ্যা মানে.
সাধারণভাবে, মান শব্দার্থবিদ্যার মানে হল যে আপনি বস্তুটিকে চারপাশে পাস করতে পারেন, একটি নয়
ঠিকানা মান শব্দার্থবিদ্যা ব্যবহার করার জন্য আপনার কাছে একটি সহ একটি বস্তু থাকতে হবে
সংশ্লিষ্ট কপি কনস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটর উপলব্ধ। আমরা প্রয়োজনীয়তা প্রসারিত
প্লেইন-ওল্ড-ডেটা (POD) প্রকারের জন্য পূর্ব-নির্ধারিত অপারেটরগুলির সেট সম্পর্কে কথা বলতে।
অপারেটর=, অপারেটর++, অপারেটর--, অপারেটর+, অপারেটর==, ইত্যাদি।
এই সব মানে কি আপনি ব্যবহার করে করা একটি বস্তুর পরিবর্তন ট্রেস করতে সক্ষম হবে
যারা অপারেটর.:
ক্লাস MyObject: পাবলিক অবজেক্ট
{
প্রকাশ্য:
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("MyObject")
.SetParent (অবজেক্ট::GetTypeId ())
.AddConstructor ()
.AddTraceSource ("MyInteger",
"ট্রেস করার জন্য একটি পূর্ণসংখ্যার মান।",
MakeTraceSourceAccessor (&MyObject::m_myInt))
;
রিটার্ন tid;
}
MyObject () {}
ট্রেসড ভ্যালু m_myInt;
};
যেহেতু ট্রেসিং সিস্টেমটি অ্যাট্রিবিউটের সাথে একীভূত, এবং অ্যাট্রিবিউটগুলি অবজেক্টের সাথে কাজ করে,
একটি হতে হবে ns-3 উদ্দেশ্য বসবাসের জন্য ট্রেস উৎসের জন্য। দুটি গুরুত্বপূর্ণ লাইন
কোড হল .TraceSource যোগ করুন এবং শীর্ষ XNUMX গ্লোবাল HR এক্সিলেন্স অ্যাওয়ার্ডের ট্রেসড ভ্যালু ঘোষণা
সার্জারির .TraceSource যোগ করুন ট্রেস উৎসের সাথে সংযোগ করার জন্য ব্যবহৃত "হুক" প্রদান করে
পৃথিবীর বাইরে. দ্য ট্রেসড ভ্যালু ঘোষণা পরিকাঠামো প্রদান করে যা ওভারলোড করে
উপরে উল্লিখিত অপারেটর এবং কলব্যাক প্রক্রিয়া চালায়।:
অকার্যকর
IntTrace (Int oldValue, Int newValue)
{
std::cout << "ট্রেস করা হয়েছে " << oldValue << " থেকে " << newValue << std::endl;
}
এটি ট্রেস সিঙ্কের সংজ্ঞা। এটি সরাসরি কলব্যাক ফাংশনের সাথে মিলে যায়।
এই ফাংশনটি কল করা হবে যখনই অপারেটরদের একজন ট্রেসড ভ্যালু is
নিষ্পন্ন.:
কোন int
প্রধান (int argc, char *argv[])
{
Ptr myObject = CreateObject ();
myObject->TraceConnectWithoutContext ("MyInteger", MakeCallback(&IntTrace));
myObject->m_myInt = 1234;
}
এই স্নিপেটে, প্রথমে যে জিনিসটি করা দরকার তা হল যে বস্তুটি তৈরি করা
ট্রেস উৎস জীবন.
পরবর্তী ধাপ, TraceConnectWithout Context, ট্রেসের মধ্যে সংযোগ গঠন করে
উৎস এবং ট্রেস সিঙ্ক. লক্ষ্য করুন কলব্যাক করুন টেমপ্লেট ফাংশন। থেকে প্রত্যাহার
কলব্যাক বিভাগ যা এটি প্রদানের জন্য দায়ী বিশেষ ফাংশন তৈরি করে
ওভারলোড অপারেটর() কলব্যাককে "ফায়ার" করতে ব্যবহৃত হয়। ওভারলোড অপারেটর (++, --, ইত্যাদি)
এটি ব্যবহার করবে অপারেটর() আসলে কলব্যাক আহ্বান করতে. দ্য TraceConnectWithout Context,
একটি স্ট্রিং প্যারামিটার নেয় যা ট্রেসের জন্য নির্ধারিত বৈশিষ্ট্যের নাম প্রদান করে
সূত্র. আসুন এখনকার জন্য প্রসঙ্গ সম্পর্কে বিট উপেক্ষা করি যেহেতু এটি এখনও গুরুত্বপূর্ণ নয়।
অবশেষে, লাইন,:
myObject->m_myInt = 1234;
একটি আহ্বান হিসাবে ব্যাখ্যা করা উচিত অপারেটর= সদস্য পরিবর্তনশীল উপর m_myInt সঙ্গে
পূর্ণসংখ্যা 1234 একটি প্যারামিটার হিসাবে পাস করেছে। দেখা যাচ্ছে যে এই অপারেটরটি সংজ্ঞায়িত করা হয়েছে (দ্বারা
ট্রেসড ভ্যালু) একটি কলব্যাক কার্যকর করতে যা অকার্যকর প্রদান করে এবং দুটি পূর্ণসংখ্যার মান হিসাবে নেয়
পরামিতি -- একটি পুরানো মান এবং প্রশ্নে থাকা পূর্ণসংখ্যার জন্য একটি নতুন মান৷ ঠিক তাই
আমরা প্রদান করেছি কলব্যাক ফাংশনের জন্য ফাংশন স্বাক্ষর -- ইন্ট্রাস.
সংক্ষেপে বলতে গেলে, একটি ট্রেস সোর্স হল, সারমর্মে, একটি পরিবর্তনশীল যা কলব্যাকের একটি তালিকা ধারণ করে। ক
ট্রেস সিঙ্ক হল একটি ফাংশন যা একটি কলব্যাকের লক্ষ্য হিসাবে ব্যবহৃত হয়। বৈশিষ্ট্য এবং বস্তুর ধরন
তথ্য সিস্টেমগুলি ট্রেস সোর্সগুলিকে ট্রেস সিঙ্কগুলির সাথে সংযোগ করার একটি উপায় প্রদান করতে ব্যবহৃত হয়। দ্য
একটি ট্রেস সোর্সকে "হিট" করার কাজটি ট্রেস সোর্সে একজন অপারেটরকে নির্বাহ করছে যা ফায়ার করে
কলব্যাক এর ফলে ট্রেস সিঙ্ক কলব্যাকগুলি উত্সে আগ্রহ নিবন্ধন করে৷
উত্স দ্বারা প্রদত্ত পরামিতিগুলির সাথে কল করা হচ্ছে৷
ব্যবহার দ্য কনফিগ সাবসিস্টেম থেকে সংযোগ করা থেকে চিহ্ন সোর্স
সার্জারির TraceConnectWithout Context সহজ উদাহরণে উপরে দেখানো কল আসলে খুব
সিস্টেমে খুব কমই ব্যবহৃত হয়। আরো সাধারণত, কনফিগ নির্বাচন করার অনুমতি দিতে সাবসিস্টেম ব্যবহার করা হয়
সিস্টেমে একটি ট্রেস উৎস যাকে বলা হয় তা ব্যবহার করে কনফিগ পথ.
উদাহরণস্বরূপ, কেউ এমন কিছু খুঁজে পেতে পারে যা সিস্টেমে নিম্নলিখিতটির মতো দেখায় (গৃহীত
থেকে উদাহরণ/tcp-large-transfer.cc):
void CwndTracer (uint32_t oldval, uint32_t newval) {}
...
Config::ConnectWithoutContext (
"/NodeList/0/$ns3::TcpL4Protocol/SocketList/0/CongestionWindow",
মেককলব্যাক (&CwndTracer));
এই খুব পরিচিত দেখতে হবে. এটি বাদ দিয়ে আগের উদাহরণের মতো একই জিনিস
ক্লাসের একটি স্ট্যাটিক সদস্য ফাংশন কনফিগ একটি পদ্ধতির পরিবর্তে কল করা হচ্ছে উদ্দেশ্য;
এবং পরিবর্তে একটি গুণ নাম, একটি পথ প্রদান করা হচ্ছে।
প্রথম কাজটি হ'ল পথটি পিছিয়ে পড়া। পথের শেষ সেগমেন্ট হতে হবে
an গুণ একজন উদ্দেশ্য. আসলে, যদি আপনি একটি পয়েন্টার ছিল উদ্দেশ্য যে আছে
"জট জানালা" গুণ সহজ (এটিকে কল করুন বস্তু), আপনি ঠিক এই মত লিখতে পারেন
আগের উদাহরণ:
void CwndTracer (uint32_t oldval, uint32_t newval) {}
...
theObject->TraceConnectWithoutContext ("CongestionWindow", MakeCallback (&CwndTracer));
এটা যে জন্য কোড সক্রিয় আউট Config::ConnectWithoutContext ঠিক তাই করে। এই
ফাংশন একটি পথ নেয় যা একটি চেইন প্রতিনিধিত্ব করে উদ্দেশ্য নির্দেশক এবং এটি পর্যন্ত তাদের অনুসরণ
পাথের শেষে যায় এবং শেষ সেগমেন্টটিকে একটি হিসাবে ব্যাখ্যা করে গুণ সর্বশেষে
বস্তু এর কি হয় মাধ্যমে হাঁটা যাক.
পথের অগ্রণী "/" অক্ষরটি একটি তথাকথিত নামস্থানকে নির্দেশ করে৷ অন্যতম
কনফিগারেশন সিস্টেমে পূর্বনির্ধারিত নামস্থান হল "নোডলিস্ট" যা সকলের একটি তালিকা
সিমুলেশন মধ্যে নোড. তালিকার আইটেম তালিকার মধ্যে সূচক দ্বারা উল্লেখ করা হয়, তাই
"/NodeList/0" সিমুলেশন দ্বারা তৈরি নোডের তালিকার জিরোথ নোডকে বোঝায়।
এই নোড আসলে একটি Ptr এবং তাই an এর একটি সাবক্লাস ns3::অবজেক্ট.
অবজেক্ট-মডেল বিভাগে বর্ণিত হিসাবে, ns-3 একটি বস্তু একত্রীকরণ মডেল সমর্থন করে। দ্য
পরবর্তী পাথ সেগমেন্ট "$" অক্ষর দিয়ে শুরু হয় যা a নির্দেশ করে GetObject কল করা উচিত
নিম্নলিখিত যে ধরনের খুঁজছেন করা হয়েছে. যখন একটি নোড একটি দ্বারা আরম্ভ করা হয়
ইন্টারনেটস্ট্যাকহেল্পার বেশ কয়েকটি ইন্টারফেস নোডে একত্রিত হয়। এর মধ্যে একটি হল
টিসিপি লেভেল ফোর প্রোটোকল। এই প্রোটোকল অবজেক্টের রানটাইম হল ns3::TcpL4Protocol''।
কখন দ্য ``গেটঅবজেক্ট সম্পাদিত হয়, এটি এই ধরনের বস্তুতে একটি পয়েন্টার প্রদান করে।
সার্জারির TcpL4 প্রোটোকল ক্লাস "সকেটলিস্ট" নামক একটি বৈশিষ্ট্যকে সংজ্ঞায়িত করে যা একটি তালিকা
সকেট প্রতিটি সকেট আসলে একটি ns3::অবজেক্ট নিজের সাথে আরোপ করা. মধ্যে আইটেম
নোডলিস্টের মতোই সকেটের তালিকা সূচক দ্বারা উল্লেখ করা হয়, তাই "সকেটলিস্ট/0"
নোডলিস্টে জিরোথ নোডের সকেটের তালিকায় জিরোথ সকেটকে বোঝায় --
সিমুলেশনে নির্মিত প্রথম নোড।
এই সকেট, যা একটি হতে সক্রিয় আউট ns3::TcpSocketImpl একটি বৈশিষ্ট্য সংজ্ঞায়িত করে
"কনজেসন উইন্ডো" বলা হয় যা একটি ট্রেসড ভ্যালু. দ্য
Config::ConnectWithoutContext এখন একটি করে,:
বস্তু->TraceConnectWithoutContext ("CongestionWindow", MakeCallback (&CwndTracer));
"সকেটলিস্ট/0" থেকে অবজেক্ট পয়েন্টার ব্যবহার করে যা ট্রেসের মধ্যে সংযোগ তৈরি করে
কলব্যাকের জন্য সকেটে সংজ্ঞায়িত উৎস -- CwndTracer.
এখন, যখনই একটি পরিবর্তন করা হয় ট্রেসড ভ্যালু যানজটের প্রতিনিধিত্ব করে
TCP সকেটে উইন্ডো, নিবন্ধিত কলব্যাক কার্যকর হবে এবং ফাংশন
CwndTracer টিসিপি কনজেশনের পুরানো এবং নতুন মান মুদ্রণ বলা হবে
জানলা.
ব্যবহার দ্য রচনা এপিআই
ট্রেসিং সিস্টেমের সাথে ইন্টারঅ্যাকশনের তিনটি স্তর রয়েছে:
· প্রাথমিক ব্যবহারকারী সহজেই নিয়ন্ত্রণ করতে পারে কোন বস্তুগুলি ট্রেসিংয়ে অংশগ্রহণ করছে;
· মধ্যবর্তী ব্যবহারকারীরা উৎপন্ন আউটপুট বিন্যাস পরিবর্তন করতে ট্রেসিং সিস্টেমকে প্রসারিত করতে পারে
বা এর মূল পরিবর্তন না করেই বিদ্যমান ট্রেস উত্সগুলিকে বিভিন্ন উপায়ে ব্যবহার করুন৷
সিমুলেটর;
· উন্নত ব্যবহারকারীরা নতুন ট্রেসিং উত্স এবং সিঙ্ক যোগ করতে সিমুলেটর কোর পরিবর্তন করতে পারে।
ব্যবহার চিহ্ন সাহায্যকারী
সার্জারির ns-3 ট্রেস সহায়ক বিভিন্ন কনফিগার এবং নির্বাচন করার জন্য একটি সমৃদ্ধ পরিবেশ প্রদান করে
ঘটনাগুলি ট্রেস করুন এবং ফাইলগুলিতে লিখুন। পূর্ববর্তী বিভাগে, প্রাথমিকভাবে "বিল্ডিং
টপোলজিস," আমরা ব্যবহারের জন্য ডিজাইন করা ট্রেস হেল্পার পদ্ধতির বিভিন্ন প্রকার দেখেছি
অন্যান্য (ডিভাইস) সাহায্যকারীদের ভিতরে।
সম্ভবত আপনি এই বৈচিত্র্যের কিছু দেখে মনে করবেন:
pointToPoint.EnablePcapAll ("সেকেন্ড");
pointToPoint.EnablePcap ("সেকেন্ড", p2pNodes.Get (0)->GetId (), 0);
csma.EnablePcap ("তৃতীয়", csmaDevices.Get (0), সত্য);
pointToPoint.EnableAsciiAll (ascii.CreateFileStream ("myfirst.tr"));
যা সুস্পষ্ট নাও হতে পারে, যদিও, সবগুলির জন্য একটি সামঞ্জস্যপূর্ণ মডেল রয়েছে৷
সিস্টেমে পাওয়া ট্রেস-সম্পর্কিত পদ্ধতি। আমরা এখন একটু সময় নিয়ে দেখে নেব
"বড় ছবি" এ
বর্তমানে ট্রেসিং হেল্পারগুলির দুটি প্রাথমিক ব্যবহারের ক্ষেত্রে রয়েছে৷ ns-3: ডিভাইস সাহায্যকারী
এবং প্রোটোকল সাহায্যকারী। ডিভাইস সাহায্যকারীরা কোন ট্রেস করা উচিত তা নির্দিষ্ট করার সমস্যাটি দেখে
একটি নোড, ডিভাইস জোড়ার মাধ্যমে সক্রিয় করা হবে। উদাহরণস্বরূপ, আপনি সেই pcap নির্দিষ্ট করতে চাইতে পারেন
একটি নির্দিষ্ট নোডে একটি নির্দিষ্ট ডিভাইসে ট্রেসিং সক্ষম করা উচিত। এই থেকে অনুসরণ করে
ns-3 ডিভাইস ধারণাগত মডেল, এবং এছাড়াও বিভিন্ন ডিভাইসের ধারণাগত মডেল
সাহায্যকারী স্বাভাবিকভাবেই এর থেকে অনুসরণ করে, তৈরি করা ফাইলগুলি একটি অনুসরণ করে
- - নামকরণের রীতি।
প্রোটোকল সাহায্যকারীরা কোন ট্রেসের মাধ্যমে সক্রিয় করা উচিত তা নির্দিষ্ট করার সমস্যাটি দেখে
একটি প্রোটোকল এবং ইন্টারফেস জোড়া। এই থেকে অনুসরণ করে ns-3 প্রোটোকল স্ট্যাক ধারণাগত মডেল,
এবং ইন্টারনেট স্ট্যাক সাহায্যকারীর ধারণাগত মডেল। স্বাভাবিকভাবেই, ট্রেস ফাইল
একটি অনুসরণ করা উচিত - - নামকরণের রীতি।
ট্রেস সাহায্যকারীরা তাই স্বাভাবিকভাবেই দ্বি-মাত্রিক শ্রেণীবিন্যাসে পড়ে। সেখানে
সূক্ষ্মতা যা চারটি শ্রেণীকে অভিন্ন আচরণ করতে বাধা দেয়, কিন্তু আমরা চেষ্টা করি
তাদের সকলকে যতটা সম্ভব একইভাবে কাজ করতে দিন; এবং যখনই সম্ভব এর জন্য অ্যানালগ আছে
সমস্ত ক্লাসে সমস্ত পদ্ধতি।
┌───────────────────────────────────
│ │ pcap │ ascii │
├────────────────┼─────┼────────────
│ডিভাইস হেল্পার │ │ │
├────────────────┼─────┼────────────
│প্রটোকল হেল্পার │ │ │
└────────────────┴─────┴────┴───────
আমরা একটি নামক একটি পদ্ধতি ব্যবহার করি মিশ্রণ আমাদের হেল্পার ক্লাসে ট্রেসিং কার্যকারিতা যোগ করতে। ক
মিশ্রণ একটি শ্রেণী যা কার্যকারিতা প্রদান করে যা একটি সাবক্লাস দ্বারা উত্তরাধিকারসূত্রে পাওয়া যায়।
একটি মিক্সিন থেকে উত্তরাধিকার সূত্রে পাওয়াকে বিশেষীকরণের একটি ফর্ম হিসাবে বিবেচনা করা হয় না তবে এটি সত্যিই একটি উপায়
কার্যকারিতা সংগ্রহ।
আসুন এই চারটি মামলা এবং তাদের নিজ নিজ বিষয়ে দ্রুত নজর দেওয়া যাক মিশ্রণ.
Pcap রচনা যন্ত্র সাহায্যকারী
এই সাহায্যকারীদের লক্ষ্য হল একটি সামঞ্জস্যপূর্ণ pcap ট্রেস সুবিধা যোগ করা সহজ করা
ns-3 যন্ত্র. আমরা চাই pcap ট্রেসিং-এর বিভিন্ন ফ্লেভার একইভাবে কাজ করুক
সমস্ত ডিভাইস, তাই এই সাহায্যকারীদের পদ্ধতিগুলি ডিভাইস সাহায্যকারীদের দ্বারা উত্তরাধিকারসূত্রে পাওয়া যায়। এক নজর দেখে নাও
at src/network/helper/trace-helper.h আপনি যখন আলোচনা অনুসরণ করতে চান
বাস্তব কোড।
শ্রেণী PcapHelperForDevice ইহা একটি মিশ্রণ ব্যবহারের জন্য উচ্চ স্তরের কার্যকারিতা প্রদান করে
একটি মধ্যে pcap ট্রেসিং ns-3 যন্ত্র. প্রতিটি ডিভাইস একটি একক ভার্চুয়াল পদ্ধতি প্রয়োগ করা আবশ্যক
এই ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত।:
ভার্চুয়াল অকার্যকর EnablePcapInternal (std::string prefix, Ptr nd, bool promiscuous) = 0;
এই পদ্ধতির স্বাক্ষর এই পরিস্থিতির ডিভাইস-কেন্দ্রিক দৃষ্টিভঙ্গি প্রতিফলিত করে
স্তর সমস্ত পাবলিক পদ্ধতি ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত PcapUserHelperForDevice কমাতে
এই একক ডিভাইস-নির্ভর বাস্তবায়ন পদ্ধতি কলিং. উদাহরণস্বরূপ, সর্বনিম্ন স্তর
pcap পদ্ধতি,:
void EnablePcap (std::string prefix, Ptr nd, bool promiscuous = মিথ্যা, bool explicitFilename = মিথ্যা);
ডিভাইস বাস্তবায়ন কল করবে PcapInternal সক্ষম করুন সরাসরি অন্য সব পাবলিক pcap
ট্রেসিং পদ্ধতিগুলি অতিরিক্ত ব্যবহারকারী-স্তরের প্রদানের জন্য এই বাস্তবায়নের উপর তৈরি করে
কার্যকারিতা ব্যবহারকারীর কাছে এর অর্থ কী যে সিস্টেমের সমস্ত ডিভাইস সাহায্যকারীরা করবে
সমস্ত pcap ট্রেস পদ্ধতি উপলব্ধ আছে; এবং এই পদ্ধতি সব একই কাজ করবে
ডিভাইস জুড়ে উপায় যদি ডিভাইস প্রয়োগ করা হয় PcapInternal সক্ষম করুন সঠিকভাবে।
Pcap রচনা যন্ত্র সাহায্যকারী পদ্ধতি
void EnablePcap (std::string prefix, Ptr nd,
bool promiscuous = মিথ্যা, bool explicitFilename = মিথ্যা);
void EnablePcap (std::string উপসর্গ, std::string ndName,
bool promiscuous = মিথ্যা, bool explicitFilename = মিথ্যা);
void EnablePcap (std::স্ট্রিং উপসর্গ, NetDeviceContainer d,
bool promiscuous = মিথ্যা);
void EnablePcap (std::স্ট্রিং উপসর্গ, NodeContainer n,
bool promiscuous = মিথ্যা);
void EnablePcap (std::string prefix, uint32_t nodeid, uint32_t deviceid,
bool promiscuous = মিথ্যা);
void EnablePcapAll (std::স্ট্রিং উপসর্গ, bool promiscuous = মিথ্যা);
উপরে দেখানো পদ্ধতিগুলির প্রতিটিতে, একটি ডিফল্ট প্যারামিটার বলা হয় অশ্লীল যে
ডিফল্ট থেকে মিথ্যা এই প্যারামিটারটি নির্দেশ করে যে ট্রেসটি সংগ্রহ করা উচিত নয়
এলোমেলো অবস্থা. আপনি যদি চান আপনার ট্রেস ডিভাইস দ্বারা দেখা সমস্ত ট্র্যাফিক অন্তর্ভুক্ত করতে
(এবং যদি ডিভাইসটি একটি প্রমিসকিউয়াস মোড সমর্থন করে) কেবলমাত্র যেকোনো একটিতে একটি সত্য প্যারামিটার যোগ করুন
উপরে কল. উদাহরণ স্বরূপ,:
Ptr nd;
...
helper.EnablePcap ("উপসর্গ", nd, সত্য);
তে প্রমিসকিউয়াস মোড ক্যাপচার সক্ষম করবে নেটডিভাইস দ্বারা নির্দিষ্ট করা হয়েছে nd.
প্রথম দুটি পদ্ধতিতে একটি ডিফল্ট পরামিতিও অন্তর্ভুক্ত রয়েছে যা বলা হয় স্পষ্ট ফাইলের নাম ওইটা হবে
নীচে আলোচনা করা হবে।
আপনাকে ক্লাসের জন্য ডক্সিজেন ব্যবহার করতে উৎসাহিত করা হচ্ছে PcapHelperForDevice বিস্তারিত জানতে
এই পদ্ধতি; কিন্তু সংক্ষেপে...
আপনি একটি প্রদান করে একটি নির্দিষ্ট নোড/নেট-ডিভাইস জোড়ায় pcap ট্রেসিং সক্ষম করতে পারেন
Ptr একটিতে পিক্যাপ সক্ষম করুন পদ্ধতি দ্য Ptr নেট ডিভাইস থেকে অন্তর্নিহিত
ঠিক একজনের অন্তর্গত হতে হবে নোড. উদাহরণ স্বরূপ,:
Ptr nd;
...
helper.EnablePcap ("উপসর্গ", nd);
আপনি একটি প্রদান করে একটি নির্দিষ্ট নোড/নেট-ডিভাইস জোড়ায় pcap ট্রেসিং সক্ষম করতে পারেন
std::স্ট্রিং একটি বস্তুর নাম পরিষেবা স্ট্রিং একটি প্রতিনিধিত্ব করে পিক্যাপ সক্ষম করুন পদ্ধতি দ্য
Ptr নাম স্ট্রিং থেকে দেখা হয়. আবার, থেকে অন্তর্নিহিত
নামযুক্ত নেট ডিভাইসটি অবশ্যই একটির অন্তর্গত নোড. উদাহরণ স্বরূপ,:
নাম::যোগ করুন ("সার্ভার" ...);
নাম::যোগ করুন ("সার্ভার/eth0" ...);
...
helper.EnablePcap ("উপসর্গ", "server/ath0");
আপনি একটি প্রদান করে নোড/নেট-ডিভাইস জোড়ার সংগ্রহে pcap ট্রেসিং সক্ষম করতে পারেন
NetDevice Container। প্রতিটির জন্য, প্রত্যেকটির জন্য নেটডিভাইস পাত্রে টাইপ চেক করা হয়। প্রতিটির জন্য
সঠিক ধরণের ডিভাইস (যেমন ডিভাইস হেল্পার দ্বারা পরিচালিত হয় একই ধরণের), ট্রেসিং
সক্রিয় আবার, নিহিত যেহেতু পাওয়া নেট ডিভাইসটি অবশ্যই হুবহু অন্তর্গত
এক নোড. উদাহরণ স্বরূপ,:
NetDeviceContainer d = ...;
...
helper.EnablePcap ("উপসর্গ", d);
আপনি একটি প্রদান করে নোড/নেট-ডিভাইস জোড়ার সংগ্রহে pcap ট্রেসিং সক্ষম করতে পারেন
নোডকন্টেইনার। প্রতিটির জন্য, প্রত্যেকটির জন্য নোড মধ্যে নোডকন্টেইনার এটি সংযুক্ত NetDevices পুনরাবৃত্তি করা হয়
প্রতিটির জন্য নেটডিভাইস পাত্রে প্রতিটি নোডের সাথে সংযুক্ত, সেই ডিভাইসের ধরন
চেক করা সঠিক প্রকারের প্রতিটি ডিভাইসের জন্য (একই ধরনের ডিভাইস দ্বারা পরিচালিত হয়
সাহায্যকারী), ট্রেসিং সক্ষম করা হয়েছে।:
নোডকন্টেইনার n;
...
helper.EnablePcap ("উপসর্গ", n);
আপনি নোড আইডি এবং ডিভাইস আইডির পাশাপাশি স্পষ্টভাবে pcap ট্রেসিং সক্ষম করতে পারেন
ptr। প্রতি নোড সিস্টেমে একটি পূর্ণসংখ্যা নোড আইডি রয়েছে এবং প্রতিটি ডিভাইস একটি নোডের সাথে সংযুক্ত রয়েছে
একটি পূর্ণসংখ্যা ডিভাইস আইডি আছে।
helper.EnablePcap ("উপসর্গ", 21, 1);
অবশেষে, আপনি সিস্টেমের সমস্ত ডিভাইসের জন্য pcap ট্রেসিং সক্ষম করতে পারেন, একই প্রকারের সাথে
যেটি ডিভাইস হেল্পার দ্বারা পরিচালিত।:
helper.EnablePcapAll ("উপসর্গ");
Pcap রচনা যন্ত্র সাহায্যকারী ফাইলের নাম নির্বাচন
উপরের পদ্ধতির বর্ণনার মধ্যে নিহিত হল এর দ্বারা একটি সম্পূর্ণ ফাইলের নাম নির্মাণ
বাস্তবায়ন পদ্ধতি। নিয়ম অনুযায়ী, pcap এর মধ্যে ট্রেস করে ns-3 সিস্টেম ফর্ম হয়
- আইডি>- id>.pcap
পূর্বে উল্লিখিত হিসাবে, সিস্টেমের প্রতিটি নোডের একটি সিস্টেম-নির্ধারিত নোড আইডি থাকবে; এবং
প্রতিটি ডিভাইসের নোডের সাথে সম্পর্কিত একটি ইন্টারফেস সূচক (একটি ডিভাইস আইডিও বলা হয়) থাকবে।
ডিফল্টরূপে, তারপরে, প্রথমটিতে ট্রেসিং সক্ষম করার ফলে একটি pcap ট্রেস ফাইল তৈরি হয়
উপসর্গ ব্যবহার করে নোড 21 এর ডিভাইস "প্রিফিক্স" হবে উপসর্গ-21-1.pcap.
আপনি সবসময় ব্যবহার করতে পারেন ns-3 এটি আরও স্পষ্ট করতে বস্তুর নাম পরিষেবা। উদাহরণস্বরূপ, যদি
আপনি নোড 21-এ "সার্ভার" নাম বরাদ্দ করতে অবজেক্ট নেম সার্ভিস ব্যবহার করেন, ফলে pcap
ট্রেস ফাইলের নাম স্বয়ংক্রিয়ভাবে হয়ে যাবে, prefix-server-1.pcap এবং আপনি যদি বরাদ্দ করেন
ডিভাইসে "eth0" নাম দিন, আপনার pcap ফাইলের নাম স্বয়ংক্রিয়ভাবে এটি উঠবে এবং হবে
নামক উপসর্গ-সার্ভার-eth0.pcap.
অবশেষে, উপরে দেখানো পদ্ধতি দুটি,:
void EnablePcap (std::string prefix, Ptr nd, bool promiscuous = মিথ্যা, bool explicitFilename = মিথ্যা);
void EnablePcap (std::string prefix, std::string ndName, bool promiscuous = মিথ্যা, bool explicitFilename = মিথ্যা);
একটি ডিফল্ট প্যারামিটার আছে স্পষ্ট ফাইলের নাম. সত্য হিসাবে সেট করা হলে, এই পরামিতি
স্বয়ংক্রিয় ফাইলের নাম সমাপ্তি প্রক্রিয়া নিষ্ক্রিয় করে এবং আপনাকে একটি স্পষ্ট তৈরি করার অনুমতি দেয়
ফাইলের নাম। এই বিকল্পটি শুধুমাত্র সেই পদ্ধতিগুলিতে উপলব্ধ যা a-তে pcap ট্রেসিং সক্ষম করে
একক ডিভাইস
উদাহরণস্বরূপ, একটি একক প্রমিসকিউস pcap তৈরি করার জন্য একটি ডিভাইস সাহায্যকারীর ব্যবস্থা করার জন্য
একটি নির্দিষ্ট নামের ফাইল ক্যাপচার (my-pcap-file.pcap) একটি প্রদত্ত ডিভাইসে, কেউ পারে:
Ptr nd;
...
helper.EnablePcap ("my-pcap-file.pcap", nd, true, true);
প্রথম সত্য পরামিতি promiscuous মোড ট্রেস সক্ষম করে এবং দ্বিতীয়টি সাহায্যকারীকে বলে
ব্যাখ্যা করতে উপসর্গ একটি সম্পূর্ণ ফাইলের নাম হিসাবে প্যারামিটার।
ASCII রচনা যন্ত্র সাহায্যকারী
Ascii ট্রেস হেল্পার আচরণ মিশ্রণ pcap সংস্করণের মতো যথেষ্ট।
তাকান src/network/helper/trace-helper.h আপনি আলোচনা অনুসরণ করতে চান
বাস্তব কোড দেখার সময়।
শ্রেণী AsciiTraceHelperForDevice ascii ব্যবহার করার জন্য উচ্চ স্তরের কার্যকারিতা যোগ করে
একটি ডিভাইস সাহায্যকারী ক্লাস ট্রেসিং. pcap ক্ষেত্রে যেমন, প্রতিটি ডিভাইসকে অবশ্যই একটি প্রয়োগ করতে হবে
একক ভার্চুয়াল পদ্ধতি ascii ট্রেস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত মিশ্রণ.:
ভার্চুয়াল শূন্যতা EnableAsciiInternal (Ptr স্ট্রিম, std::স্ট্রিং উপসর্গ, Ptr nd) = 0;
এই পদ্ধতির স্বাক্ষর এই পরিস্থিতির ডিভাইস-কেন্দ্রিক দৃষ্টিভঙ্গি প্রতিফলিত করে
স্তর এবং এটিও যে সাহায্যকারী একটি ভাগ করা আউটপুট স্ট্রীমে লিখতে পারে। সব
পাবলিক ascii-ট্রেস-সম্পর্কিত পদ্ধতি ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত AsciiTraceHelperForDevice
এই একক ডিভাইস-নির্ভর বাস্তবায়ন পদ্ধতিকে কল করা কম করুন। উদাহরণস্বরূপ, দ
সর্বনিম্ন স্তরের ascii ট্রেস পদ্ধতি,:
void EnableAscii (std::string prefix, Ptr nd);
শূন্য EnableAscii (Ptr প্রবাহ, Ptr nd);
ডিভাইস বাস্তবায়ন কল করবে AsciiInternal সক্ষম করুন সরাসরি, হয় একটি প্রদান
বৈধ উপসর্গ বা প্রবাহ। অন্যান্য সকল পাবলিক ascii ট্রেসিং পদ্ধতি এগুলোর উপর তৈরি হবে
নিম্ন-স্তরের ফাংশন অতিরিক্ত ব্যবহারকারী-স্তরের কার্যকারিতা প্রদান করতে। এই মানে কি
ব্যবহারকারী হল যে সিস্টেমের সমস্ত ডিভাইস সাহায্যকারীর সমস্ত ascii ট্রেস পদ্ধতি থাকবে
উপলব্ধ এবং এই পদ্ধতিগুলি সমস্ত ডিভাইস জুড়ে একই ভাবে কাজ করবে যদি ডিভাইসগুলি থাকে
বাস্তবায়ন এনাবল অ্যাসিআই ইন্টারনাল সঠিকভাবে।
ASCII রচনা যন্ত্র সাহায্যকারী পদ্ধতি
void EnableAscii (std::string prefix, Ptr nd);
শূন্য EnableAscii (Ptr প্রবাহ, Ptr nd);
void EnableAscii (std::string prefix, std::string ndName);
void EnableAscii (Ptr স্ট্রীম, std::string ndName);
void EnableAscii (std::স্ট্রিং উপসর্গ, NetDeviceContainer d);
শূন্য EnableAscii (Ptr স্ট্রীম, NetDeviceContainer d);
void EnableAscii (std::স্ট্রিং উপসর্গ, NodeContainer n);
শূন্য EnableAscii (Ptr প্রবাহ, NodeContainer n);
void EnableAscii (std::string prefix, uint32_t nodeid, uint32_t deviceid);
void EnableAscii (Ptr স্ট্রিম, uint32_t nodeid, uint32_t deviceid);
void EnableAsciiAll (std::স্ট্রিং উপসর্গ);
void EnableAsciiAll (Ptr প্রবাহ);
আপনাকে ক্লাসের জন্য ডক্সিজেন ব্যবহার করতে উৎসাহিত করা হচ্ছে TraceHelperForDevice খুঁজে পেতে
এই পদ্ধতির বিবরণ; কিন্তু সংক্ষেপে...
ascii ট্রেসিং এর জন্য pcap এর তুলনায় দ্বিগুণ পদ্ধতি উপলব্ধ রয়েছে
ট্রেসিং এর কারণ, pcap-শৈলী মডেল ছাড়াও যেখানে প্রতিটি থেকে ট্রেস পাওয়া যায়
অনন্য নোড/ডিভাইস জোড়া একটি অনন্য ফাইলে লেখা হয়, আমরা এমন একটি মডেলকে সমর্থন করি যেখানে ট্রেস
অনেক নোড/ডিভাইস জোড়ার তথ্য একটি সাধারণ ফাইলে লেখা হয়। এর মানে হল যে
- - ফাইলের নাম জেনারেশন মেকানিজম একটি মেকানিজম দ্বারা প্রতিস্থাপিত হয়
একটি সাধারণ ফাইল পড়ুন; এবং API পদ্ধতির সংখ্যা সকলকে অনুমতি দেওয়ার জন্য দ্বিগুণ করা হয়েছে
সংমিশ্রণ।
ঠিক যেমন pcap ট্রেসিংয়ের ক্ষেত্রে, আপনি একটি নির্দিষ্ট নোড/নেট-ডিভাইস জোড়ায় ascii ট্রেসিং সক্ষম করতে পারেন
একটি প্রদান করে Ptr একটিতে সক্রিয় করুন পদ্ধতি দ্য Ptr থেকে অন্তর্নিহিত
নেট ডিভাইসটি অবশ্যই একটির অন্তর্গত নোড. উদাহরণ স্বরূপ,:
Ptr nd;
...
helper.EnableAscii ("উপসর্গ", nd);
এই ক্ষেত্রে, কোনো ট্রেস প্রসঙ্গ ascii ট্রেস ফাইলে লেখা হয় না যেহেতু সেগুলি হবে
অপ্রয়োজনীয় সিস্টেম একই নিয়ম ব্যবহার করে তৈরি করা ফাইলের নাম বাছাই করবে
pcap বিভাগে বর্ণিত, ফাইলের পরিবর্তে ".tr" প্রত্যয় থাকবে
".pcap"।
আপনি যদি একাধিক নেট ডিভাইসে ascii ট্রেসিং সক্ষম করতে চান এবং সমস্ত ট্রেস পাঠাতে চান
একটি একক ফাইলে, আপনি একটি একক ফাইল উল্লেখ করার জন্য একটি বস্তু ব্যবহার করেও এটি করতে পারেন:
Ptr nd1;
Ptr nd2;
...
Ptr stream = asciiTraceHelper.CreateFileStream ("trace-file-name.tr");
...
helper.EnableAscii (স্ট্রিম, nd1);
helper.EnableAscii (স্ট্রিম, nd2);
এই ক্ষেত্রে, ট্রেস প্রসঙ্গগুলি ascii ট্রেস ফাইলে লেখা হয় যেহেতু তাদের প্রয়োজন হয়
দুটি ডিভাইস থেকে ট্রেস দ্ব্যর্থিত করতে. উল্লেখ্য যে যেহেতু ব্যবহারকারী সম্পূর্ণরূপে
ফাইলের নাম উল্লেখ করে, স্ট্রিংটিতে ধারাবাহিকতার জন্য ".tr" অন্তর্ভুক্ত করা উচিত।
আপনি একটি প্রদান করে একটি নির্দিষ্ট নোড/নেট-ডিভাইস জোড়ায় ascii ট্রেসিং সক্ষম করতে পারেন
std::স্ট্রিং একটি বস্তুর নাম পরিষেবা স্ট্রিং একটি প্রতিনিধিত্ব করে পিক্যাপ সক্ষম করুন পদ্ধতি দ্য
Ptr নাম স্ট্রিং থেকে দেখা হয়. আবার, থেকে অন্তর্নিহিত
নামযুক্ত নেট ডিভাইসটি অবশ্যই একটির অন্তর্গত নোড. উদাহরণ স্বরূপ,:
নাম::যোগ করুন ("ক্লায়েন্ট" ...);
নাম::যোগ করুন ("ক্লায়েন্ট/eth0" ...);
নাম::যোগ করুন ("সার্ভার" ...);
নাম::যোগ করুন ("সার্ভার/eth0" ...);
...
helper.EnableAscii ("উপসর্গ", "ক্লায়েন্ট/eth0");
helper.EnableAscii ("উপসর্গ", "সার্ভার/eth0");
এর ফলে নাম দুটি ফাইল হবে উপসর্গ-ক্লায়েন্ট-eth0.tr এবং prefix-server-eth0.tr সঙ্গে
সংশ্লিষ্ট ট্রেস ফাইলে প্রতিটি ডিভাইসের জন্য ট্রেস। যেহেতু সবগুলো EnableAscii
একটি স্ট্রিম মোড়ক নিতে ফাংশন ওভারলোড করা হয়, আপনি সেই ফর্মটিও ব্যবহার করতে পারেন:
নাম::যোগ করুন ("ক্লায়েন্ট" ...);
নাম::যোগ করুন ("ক্লায়েন্ট/eth0" ...);
নাম::যোগ করুন ("সার্ভার" ...);
নাম::যোগ করুন ("সার্ভার/eth0" ...);
...
Ptr stream = asciiTraceHelper.CreateFileStream ("trace-file-name.tr");
...
helper.EnableAscii (স্ট্রিম, "ক্লায়েন্ট/eth0");
helper.EnableAscii (স্ট্রিম, "সার্ভার/eth0");
এটি একটি একক ট্রেস ফাইল নামক ফলাফল হবে trace-file-name.tr যে সব ধারণ করে
উভয় ডিভাইসের জন্য ঘটনা ট্রেস. ঘটনা ট্রেস প্রসঙ্গ দ্বারা দ্বিধাবিভক্ত করা হবে
স্ট্রিং।
আপনি একটি প্রদান করে নোড/নেট-ডিভাইস জোড়ার সংগ্রহে ascii ট্রেসিং সক্ষম করতে পারেন
NetDevice Container। প্রতিটির জন্য, প্রত্যেকটির জন্য নেটডিভাইস পাত্রে টাইপ চেক করা হয়। প্রতিটির জন্য
সঠিক ধরণের ডিভাইস (যেমন ডিভাইস হেল্পার দ্বারা পরিচালিত হয় একই ধরণের), ট্রেসিং
সক্রিয় আবার, নিহিত যেহেতু পাওয়া নেট ডিভাইসটি অবশ্যই হুবহু অন্তর্গত
এক নোড. উদাহরণ স্বরূপ,:
NetDeviceContainer d = ...;
...
helper.EnableAscii ("উপসর্গ", d);
এর ফলে অনেকগুলি ascii ট্রেস ফাইল তৈরি হবে, যার প্রতিটি অনুসরণ করা হয়েছে
দ্য - - .tr কনভেনশন। একটি মধ্যে ট্রেস সব একত্রিত করা
একক ফাইল উপরের উদাহরণের অনুরূপভাবে সম্পন্ন হয়:
NetDeviceContainer d = ...;
...
Ptr stream = asciiTraceHelper.CreateFileStream ("trace-file-name.tr");
...
helper.EnableAscii (স্ট্রিম, ডি);
আপনি একটি প্রদান করে নোড/নেট-ডিভাইস জোড়ার সংগ্রহে ascii ট্রেসিং সক্ষম করতে পারেন
নোডকন্টেইনার। প্রতিটির জন্য, প্রত্যেকটির জন্য নোড মধ্যে নোডকন্টেইনার এটি সংযুক্ত NetDevices পুনরাবৃত্তি করা হয়
প্রতিটির জন্য নেটডিভাইস পাত্রে প্রতিটি নোডের সাথে সংযুক্ত, সেই ডিভাইসের ধরন
চেক করা সঠিক প্রকারের প্রতিটি ডিভাইসের জন্য (একই ধরনের ডিভাইস দ্বারা পরিচালিত হয়
সাহায্যকারী), ট্রেসিং সক্ষম করা হয়েছে।:
নোডকন্টেইনার n;
...
helper.EnableAscii ("উপসর্গ", n);
এর ফলে অনেকগুলি ascii ট্রেস ফাইল তৈরি হবে, যার প্রতিটি অনুসরণ করা হয়েছে
দ্য - - .tr কনভেনশন। একটি মধ্যে ট্রেস সব একত্রিত করা
একক ফাইল উপরের উদাহরণের অনুরূপভাবে সম্পন্ন হয়:
আপনি নোড আইডি এবং ডিভাইস আইডির পাশাপাশি স্পষ্টভাবে pcap ট্রেসিং সক্ষম করতে পারেন
ptr। প্রতি নোড সিস্টেমে একটি পূর্ণসংখ্যা নোড আইডি রয়েছে এবং প্রতিটি ডিভাইস একটি নোডের সাথে সংযুক্ত রয়েছে
একটি পূর্ণসংখ্যা ডিভাইস আইডি আছে।
helper.EnableAscii ("উপসর্গ", 21, 1);
অবশ্যই, উপরে দেখানো হিসাবে ট্রেসগুলি একটি একক ফাইলে একত্রিত করা যেতে পারে।
অবশেষে, আপনি সিস্টেমের সমস্ত ডিভাইসের জন্য pcap ট্রেসিং সক্ষম করতে পারেন, একই প্রকারের সাথে
যেটি ডিভাইস হেল্পার দ্বারা পরিচালিত।:
helper.EnableAsciiAll ("উপসর্গ");
এর ফলে অনেকগুলি ascii ট্রেস ফাইল তৈরি হবে, প্রতিটি ডিভাইসের জন্য একটি
সাহায্যকারী দ্বারা পরিচালিত ধরনের সিস্টেম। এই সব ফাইল অনুসরণ করবে
- - .tr কনভেনশন। একটি একক মধ্যে ট্রেস সব একত্রিত
ফাইলটি উপরের উদাহরণগুলির অনুরূপভাবে সম্পন্ন হয়।
ASCII রচনা যন্ত্র সাহায্যকারী ফাইলের নাম নির্বাচন
উপরের উপসর্গ-শৈলী পদ্ধতির বর্ণনার মধ্যে নিহিত হল সম্পূর্ণ নির্মাণ
বাস্তবায়ন পদ্ধতি দ্বারা ফাইলের নাম। নিয়ম অনুযায়ী, ascii মধ্যে ট্রেস ns-3 সিস্টেম হয়
ফর্মের - আইডি>- id>.tr.
পূর্বে উল্লিখিত হিসাবে, সিস্টেমের প্রতিটি নোডের একটি সিস্টেম-নির্ধারিত নোড আইডি থাকবে; এবং
প্রতিটি ডিভাইসের নোডের সাথে সম্পর্কিত একটি ইন্টারফেস সূচক (একটি ডিভাইস আইডিও বলা হয়) থাকবে।
ডিফল্টরূপে, তারপরে, প্রথমটিতে ট্রেসিং সক্ষম করার ফলে একটি ascii ট্রেস ফাইল তৈরি হয়
নোড 21-এর ডিভাইস, "উপসর্গ" ব্যবহার করে, হবে উপসর্গ-21-1.tr.
আপনি সবসময় ব্যবহার করতে পারেন ns-3 এটি আরও স্পষ্ট করতে বস্তুর নাম পরিষেবা। উদাহরণস্বরূপ, যদি
আপনি নোড 21 এ "সার্ভার" নাম বরাদ্দ করতে অবজেক্ট নেম সার্ভিস ব্যবহার করেন, ফলে
ascii ট্রেস ফাইলের নাম স্বয়ংক্রিয়ভাবে হয়ে যাবে, prefix-server-1.tr এবং যদি আপনিও বরাদ্দ করেন
ডিভাইসে "eth0" নাম দিলে, আপনার ascii ট্রেস ফাইলের নাম স্বয়ংক্রিয়ভাবে এটি তুলে নেবে
এবং বলা হবে prefix-server-eth0.tr.
Pcap রচনা প্রোটোকল সাহায্যকারী
এগুলোর লক্ষ্য মিশ্রণ এটি একটি সামঞ্জস্যপূর্ণ pcap ট্রেস সুবিধা যোগ করা সহজ করে তোলে
প্রোটোকল আমরা চাই pcap ট্রেসিং-এর বিভিন্ন ফ্লেভার সব জুড়ে একই রকম কাজ করুক
প্রোটোকল, তাই এই সাহায্যকারীদের পদ্ধতি স্ট্যাক সাহায্যকারীদের দ্বারা উত্তরাধিকারসূত্রে পাওয়া যায়। দেখে নিন
src/network/helper/trace-helper.h আপনি যখন আলোচনা অনুসরণ করতে চান
বাস্তব কোড।
এই বিভাগে আমরা প্রোটোকলের প্রয়োগের পদ্ধতিগুলি চিত্রিত করব আইপিভি৪। থেকে
অনুরূপ প্রোটোকলগুলিতে ট্রেস নির্দিষ্ট করুন, শুধু উপযুক্ত প্রকার প্রতিস্থাপন করুন। উদাহরণ স্বরূপ,
ব্যবহার করা Ptr পরিবর্তে ক Ptr এবং কল PcapIpv6 সক্ষম করুন পরিবর্তে PcapIpv4 সক্ষম করুন.
শ্রেণী PcapHelperForIpv4 pcap ট্রেসিং ব্যবহারের জন্য উচ্চ স্তরের কার্যকারিতা প্রদান করে
মধ্যে আইপিভি৪ প্রোটোকল প্রতিটি প্রোটোকল সাহায্যকারী এই পদ্ধতিগুলিকে সক্রিয় করে একটি একক প্রয়োগ করতে হবে
ভার্চুয়াল পদ্ধতি এই ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত। এর জন্য আলাদা বাস্তবায়ন হবে
আইপিভি৪, উদাহরণস্বরূপ, কিন্তু শুধুমাত্র পার্থক্য পদ্ধতির নাম এবং স্বাক্ষর হবে।
ক্লাস দ্ব্যর্থহীন করার জন্য বিভিন্ন পদ্ধতির নাম প্রয়োজন আইপিভি৪ থেকে আইপিভি৪ যা উভয়
ক্লাস থেকে প্রাপ্ত উদ্দেশ্য, এবং পদ্ধতি যা একই স্বাক্ষর ভাগ করে।
ভার্চুয়াল ভ্যায়েড EnablePcapIpv4Internal (std::স্ট্রিং উপসর্গ, Ptr ipv4, uint4_t ইন্টারফেস) = 32;
এই পদ্ধতির স্বাক্ষর প্রোটোকল এবং ইন্টারফেস-কেন্দ্রিক দৃশ্য প্রতিফলিত করে
এই স্তরে পরিস্থিতি। সমস্ত পাবলিক পদ্ধতি ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত PcapHelperForIpv4
এই একক ডিভাইস-নির্ভর বাস্তবায়ন পদ্ধতিকে কল করা হ্রাস করুন। উদাহরণস্বরূপ, দ
সর্বনিম্ন স্তরের pcap পদ্ধতি,:
void EnablePcapIpv4 (std::স্ট্রিং উপসর্গ, Ptr ipv4, uint4_t ইন্টারফেস);
ডিভাইস বাস্তবায়ন কল করবে PcapIpv4 অভ্যন্তরীণ সক্ষম করুন৷ সরাসরি অন্য সব পাবলিক
অতিরিক্ত ব্যবহারকারী-স্তর প্রদানের জন্য এই বাস্তবায়নের উপর pcap ট্রেসিং পদ্ধতি তৈরি করা হয়
কার্যকারিতা ব্যবহারকারীর কাছে এর অর্থ হল সিস্টেমের সমস্ত প্রোটোকল সাহায্যকারীরা করবে৷
সমস্ত pcap ট্রেস পদ্ধতি উপলব্ধ আছে; এবং এই পদ্ধতি সব একই কাজ করবে
সাহায্যকারী প্রয়োগ করলে প্রোটোকল জুড়ে পথ PcapIpv4 অভ্যন্তরীণ সক্ষম করুন৷ সঠিকভাবে।
Pcap রচনা প্রোটোকল সাহায্যকারী পদ্ধতি
এই পদ্ধতিগুলির সাথে এক থেকে এক চিঠিপত্রের জন্য ডিজাইন করা হয়েছে৷ নোড- এবং
নেটডিভাইস- ডিভাইস সংস্করণের কেন্দ্রিক সংস্করণ। পরিবর্তে নোড এবং নেটডিভাইস যুগল
সীমাবদ্ধতা, আমরা প্রোটোকল এবং ইন্টারফেস সীমাবদ্ধতা ব্যবহার করি।
নোট করুন যে ডিভাইস সংস্করণের মতো, ছয়টি পদ্ধতি রয়েছে:
void EnablePcapIpv4 (std::স্ট্রিং উপসর্গ, Ptr ipv4, uint4_t ইন্টারফেস);
void EnablePcapIpv4 (std::string prefix, std::string ipv4Name, uint32_t ইন্টারফেস);
void EnablePcapIpv4 (std::string prefix, Ipv4InterfaceContainer c);
void EnablePcapIpv4 (std::স্ট্রিং উপসর্গ, NodeContainer n);
void EnablePcapIpv4 (std::string prefix, uint32_t nodeid, uint32_t ইন্টারফেস);
void EnablePcapIpv4All (std::স্ট্রিং উপসর্গ);
আপনাকে ক্লাসের জন্য ডক্সিজেন ব্যবহার করতে উৎসাহিত করা হচ্ছে PcapHelperForIpv4 বিস্তারিত জানতে
এই পদ্ধতি; কিন্তু সংক্ষেপে...
আপনি একটি প্রদান করে একটি নির্দিষ্ট প্রোটোকল/ইন্টারফেস জোড়ায় pcap ট্রেসিং সক্ষম করতে পারেন
Ptr এবং ইন্টারফেস একটিতে পিক্যাপ সক্ষম করুন পদ্ধতি উদাহরণ স্বরূপ,:
Ptr ipv4 = নোড->গেটঅবজেক্ট ();
...
helper.EnablePcapIpv4 ("উপসর্গ", ipv4, 0);
আপনি একটি প্রদান করে একটি নির্দিষ্ট নোড/নেট-ডিভাইস জোড়ায় pcap ট্রেসিং সক্ষম করতে পারেন
std::স্ট্রিং একটি বস্তুর নাম পরিষেবা স্ট্রিং একটি প্রতিনিধিত্ব করে পিক্যাপ সক্ষম করুন পদ্ধতি দ্য
Ptr নাম স্ট্রিং থেকে দেখা হয়. উদাহরণ স্বরূপ,:
নাম::যোগ করুন ("serverIPv4" ...);
...
helper.EnablePcapIpv4 ("উপসর্গ", "serverIpv4", 1);
আপনি একটি প্রদান করে প্রোটোকল/ইন্টারফেস জোড়ার সংগ্রহে pcap ট্রেসিং সক্ষম করতে পারেন
আইপিভি 4 ইন্টারফেস কন্টেইনার। প্রতিটির জন্য, প্রত্যেকটির জন্য আইপিভি৪ / কন্টেইনারে ইন্টারফেস জোড়া প্রোটোকল প্রকার
আমি পরীক্ষা করে দেখেছি. সঠিক টাইপের প্রতিটি প্রোটোকলের জন্য (একই টাইপ যা দ্বারা পরিচালিত হয়
ডিভাইস হেল্পার), সংশ্লিষ্ট ইন্টারফেসের জন্য ট্রেসিং সক্ষম করা হয়েছে। উদাহরণ স্বরূপ,:
নোডকন্টেইনার নোড;
...
NetDeviceContainer ডিভাইস = deviceHelper.Install (nodes);
...
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer ইন্টারফেস = ipv4.অ্যাসাইন (ডিভাইস);
...
helper.EnablePcapIpv4 ("উপসর্গ", ইন্টারফেস);
আপনি একটি প্রদান করে প্রোটোকল/ইন্টারফেস জোড়ার সংগ্রহে pcap ট্রেসিং সক্ষম করতে পারেন
নোডকন্টেইনার। প্রতিটির জন্য, প্রত্যেকটির জন্য নোড মধ্যে নোডকন্টেইনার উপযুক্ত প্রোটোকল পাওয়া যায়। জন্য
প্রতিটি প্রোটোকল, এর ইন্টারফেসগুলি গণনা করা হয় এবং ফলাফলে ট্রেসিং সক্ষম করা হয়
জোড়া উদাহরণ স্বরূপ,:
নোডকন্টেইনার n;
...
helper.EnablePcapIpv4 ("উপসর্গ", n);
আপনি নোড আইডি এবং ইন্টারফেসের ভিত্তিতেও pcap ট্রেসিং সক্ষম করতে পারেন। এক্ষেত্রে,
নোড-আইডি একটি অনুবাদ করা হয় Ptr এবং উপযুক্ত প্রোটোকল মধ্যে দেখা হয়
নোড ফলাফল প্রটোকল এবং ইন্টারফেস ফলাফল ট্রেস নির্দিষ্ট করতে ব্যবহৃত হয়
সূত্র.:
helper.EnablePcapIpv4 ("উপসর্গ", 21, 1);
অবশেষে, আপনি সংশ্লিষ্ট সহ সিস্টেমের সমস্ত ইন্টারফেসের জন্য pcap ট্রেসিং সক্রিয় করতে পারেন
ডিভাইস হেল্পার দ্বারা পরিচালিত প্রোটোকলটি একই ধরণের।:
helper.EnablePcapIpv4All ("উপসর্গ");
Pcap রচনা প্রোটোকল সাহায্যকারী ফাইলের নাম নির্বাচন
উপরের সমস্ত পদ্ধতির বর্ণনার মধ্যে নিহিত হল সম্পূর্ণ নির্মাণ
বাস্তবায়ন পদ্ধতি দ্বারা ফাইলের নাম। নিয়ম অনুসারে, ডিভাইসগুলির জন্য pcap ট্রেস নেওয়া হয়েছে
দ্য ns-3 সিস্টেম ফর্ম হয় - আইডি>- id>.pcap। এর ব্যাপারে
প্রোটোকল ট্রেস, প্রোটোকল এবং মধ্যে একটি এক থেকে এক চিঠিপত্র আছে নোড. এই
কারণ প্রোটোকল অবজেক্টস একত্রিত হয় নোড অবজেক্টস. যেহেতু কোন গ্লোবাল প্রোটোকল নেই
সিস্টেমে id, আমরা ফাইলের নামকরণে সংশ্লিষ্ট নোড আইডি ব্যবহার করি। অতএব একটি আছে
স্বয়ংক্রিয়ভাবে নির্বাচিত ট্রেস ফাইল নামগুলিতে ফাইল নামের সংঘর্ষের সম্ভাবনা। এই জন্য
কারণ, প্রোটোকল ট্রেসের জন্য ফাইলের নাম কনভেনশন পরিবর্তন করা হয়েছে।
পূর্বে উল্লিখিত হিসাবে, সিস্টেমের প্রতিটি নোডের একটি সিস্টেম-নিযুক্ত নোড আইডি থাকবে।
যেহেতু প্রোটোকল দৃষ্টান্ত এবং নোড দৃষ্টান্তগুলির মধ্যে এক থেকে এক চিঠিপত্র রয়েছে
আমরা নোড আইডি ব্যবহার করি। প্রতিটি ইন্টারফেসের প্রোটোকলের সাথে সম্পর্কিত একটি ইন্টারফেস আইডি থাকে। আমরা ব্যাবহার করি
সম্মেলন " -n -i .pcap" ফাইলের নামকরণ ট্রেস করার জন্য
প্রোটোকল সাহায্যকারী।
তাই, ডিফল্টরূপে, ট্রেসিং চালু করার ফলে একটি pcap ট্রেস ফাইল তৈরি হয়
নোড 1 এর Ipv4 প্রোটোকলের ইন্টারফেস 21 উপসর্গ ব্যবহার করে "প্রিফিক্স" হবে
"prefix-n21-i1.pcap"।
আপনি সবসময় ব্যবহার করতে পারেন ns-3 এটি আরও স্পষ্ট করতে বস্তুর নাম পরিষেবা। উদাহরণস্বরূপ, যদি
আপনি Ptr-এ "serverIpv4" নাম বরাদ্দ করতে অবজেক্ট নেম সার্ভিস ব্যবহার করেন নোডের উপর
21, ফলস্বরূপ pcap ট্রেস ফাইলের নাম স্বয়ংক্রিয়ভাবে হয়ে যাবে,
"prefix-nserverIpv4-i1.pcap"।
ASCII রচনা প্রোটোকল সাহায্যকারী
ascii ট্রেস হেল্পারদের আচরণ pcap কেসের মতোই যথেষ্ট। ক
তাকানো src/network/helper/trace-helper.h আপনি যখন আলোচনা অনুসরণ করতে চান
বাস্তব কোড খুঁজছেন.
এই বিভাগে আমরা প্রোটোকলের প্রয়োগের পদ্ধতিগুলি চিত্রিত করব আইপিভি৪। থেকে
অনুরূপ প্রোটোকলগুলিতে ট্রেস নির্দিষ্ট করুন, শুধু উপযুক্ত প্রকার প্রতিস্থাপন করুন। উদাহরণ স্বরূপ,
ব্যবহার করা Ptr পরিবর্তে ক Ptr এবং কল AsciiIpv6 সক্ষম করুন পরিবর্তে
AsciiIpv4 সক্ষম করুন.
শ্রেণী AsciiTraceHelperForIpv4 ascii ব্যবহার করার জন্য উচ্চ স্তরের কার্যকারিতা যোগ করে
একটি প্রোটোকল সাহায্যকারী ট্রেসিং. এই পদ্ধতিগুলিকে সক্ষম করে এমন প্রতিটি প্রোটোকল অবশ্যই একটি বাস্তবায়ন করবে
একক ভার্চুয়াল পদ্ধতি এই ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত।:
ভার্চুয়াল শূন্যতা EnableAsciiIpv4Internal (Ptr স্ট্রীম, std::স্ট্রিং উপসর্গ,
Ptr ipv4, uint4_t ইন্টারফেস) = 32;
এই পদ্ধতির স্বাক্ষর প্রোটোকল- এবং ইন্টারফেস-কেন্দ্রিক দৃশ্য প্রতিফলিত করে
এই স্তরে পরিস্থিতি; এবং সাহায্যকারী একটি শেয়ার করা লিখতে পারে যে সত্য
আউটপুট স্ট্রীম। সমস্ত পাবলিক পদ্ধতি ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
PcapAndAsciiTraceHelperForIpv4 এই একক ডিভাইস-নির্ভর কল করা হ্রাস করুন
বাস্তবায়ন পদ্ধতি। উদাহরণস্বরূপ, সর্বনিম্ন স্তরের ascii ট্রেস পদ্ধতি,:
void EnableAsciiIpv4 (std::স্ট্রিং উপসর্গ, Ptr ipv4, uint4_t ইন্টারফেস);
void EnableAsciiIpv4 (Ptr প্রবাহ, Ptr ipv4, uint4_t ইন্টারফেস);
ডিভাইস বাস্তবায়ন কল করবে AsciiIpv4 অভ্যন্তরীণ সক্ষম করুন৷ সরাসরি, হয় প্রদান
উপসর্গ বা প্রবাহ। অন্যান্য সকল পাবলিক ascii ট্রেসিং পদ্ধতি এগুলোর উপর তৈরি হবে
নিম্ন-স্তরের ফাংশন অতিরিক্ত ব্যবহারকারী-স্তরের কার্যকারিতা প্রদান করতে। এই মানে কি
ব্যবহারকারী হল যে সিস্টেমের সমস্ত ডিভাইস সাহায্যকারীর সমস্ত ascii ট্রেস পদ্ধতি থাকবে
উপলব্ধ এবং এই পদ্ধতিগুলি সমস্ত প্রোটোকল জুড়ে একই ভাবে কাজ করবে যদি
প্রোটোকল বাস্তবায়ন EnableAsciiIpv4 অভ্যন্তরীণ সঠিকভাবে।
ASCII রচনা যন্ত্র সাহায্যকারী পদ্ধতি
void EnableAsciiIpv4 (std::স্ট্রিং উপসর্গ, Ptr ipv4, uint4_t ইন্টারফেস);
void EnableAsciiIpv4 (Ptr প্রবাহ, Ptr ipv4, uint4_t ইন্টারফেস);
void EnableAsciiIpv4 (std::string prefix, std::string ipv4Name, uint32_t ইন্টারফেস);
void EnableAsciiIpv4 (Ptr স্ট্রিম, std::string ipv4Name, uint32_t ইন্টারফেস);
void EnableAsciiIpv4 (std::string prefix, Ipv4InterfaceContainer c);
void EnableAsciiIpv4 (Ptr স্ট্রীম, Ipv4InterfaceContainer c);
void EnableAsciiIpv4 (std::স্ট্রিং উপসর্গ, NodeContainer n);
void EnableAsciiIpv4 (Ptr প্রবাহ, NodeContainer n);
void EnableAsciiIpv4 (std::string prefix, uint32_t nodeid, uint32_t deviceid);
void EnableAsciiIpv4 (Ptr স্ট্রিম, uint32_t nodeid, uint32_t ইন্টারফেস);
void EnableAsciiIpv4All (std::স্ট্রিং উপসর্গ);
void EnableAsciiIpv4All (Ptr প্রবাহ);
আপনাকে ক্লাসের জন্য ডক্সিজেন ব্যবহার করতে উৎসাহিত করা হচ্ছে PcapAndAsciiHelperForIpv4 খুঁজে পেতে
এই পদ্ধতির বিবরণ; কিন্তু সংক্ষেপে...
ascii ট্রেসিং এর জন্য pcap এর তুলনায় দ্বিগুণ পদ্ধতি উপলব্ধ রয়েছে
ট্রেসিং এর কারণ, pcap-শৈলী মডেল ছাড়াও যেখানে প্রতিটি থেকে ট্রেস পাওয়া যায়
অনন্য প্রোটোকল/ইন্টারফেস জোড়া একটি অনন্য ফাইলে লেখা হয়, আমরা এমন একটি মডেলকে সমর্থন করি যেখানে
অনেক প্রোটোকল/ইন্টারফেস জোড়ার জন্য তথ্য ট্রেস একটি সাধারণ ফাইলে লেখা হয়। এই
মানে যে -n - ফাইলের নাম জেনারেশন মেকানিজম প্রতিস্থাপিত হয়
একটি সাধারণ ফাইল উল্লেখ করার জন্য একটি প্রক্রিয়া দ্বারা; এবং API পদ্ধতির সংখ্যা দ্বিগুণ করা হয়
সমস্ত সংমিশ্রণের অনুমতি দিন।
ঠিক যেমন pcap ট্রেসিং এর ক্ষেত্রে, আপনি একটি নির্দিষ্ট প্রোটোকল/ইন্টারফেসে ascii ট্রেসিং সক্ষম করতে পারেন
একটি প্রদান করে জোড়া Ptr এবং একটি ইন্টারফেস একটিতে সক্রিয় করুন পদ্ধতি উদাহরণ স্বরূপ,:
Ptr ipv4;
...
helper.EnableAsciiIpv4 ("উপসর্গ", ipv4, 1);
এই ক্ষেত্রে, কোনো ট্রেস প্রসঙ্গ ascii ট্রেস ফাইলে লেখা হয় না যেহেতু সেগুলি হবে
অপ্রয়োজনীয় সিস্টেম একই নিয়ম ব্যবহার করে তৈরি করা ফাইলের নাম বাছাই করবে
pcap বিভাগে বর্ণিত, ফাইলের পরিবর্তে ".tr" প্রত্যয় থাকবে
".pcap"।
আপনি যদি একাধিক ইন্টারফেসে ascii ট্রেসিং সক্ষম করতে চান এবং সমস্ত ট্রেস পাঠাতে চান
একটি একক ফাইল, আপনি একটি একক ফাইল উল্লেখ করার জন্য একটি বস্তু ব্যবহার করে এটি করতে পারেন। আমরা
উপরের "cwnd" উদাহরণে ইতিমধ্যেই এর মতো কিছু আছে:
Ptr protocol4 = node1->GetObject ();
Ptr protocol4 = node2->GetObject ();
...
Ptr stream = asciiTraceHelper.CreateFileStream ("trace-file-name.tr");
...
helper.EnableAsciiIpv4 (স্ট্রিম, প্রোটোকল1, 1);
helper.EnableAsciiIpv4 (স্ট্রিম, প্রোটোকল2, 1);
এই ক্ষেত্রে, ট্রেস প্রসঙ্গগুলি ascii ট্রেস ফাইলে লেখা হয় যেহেতু তাদের প্রয়োজন হয়
দুটি ইন্টারফেস থেকে ট্রেস দ্ব্যর্থহীন করতে। উল্লেখ্য যে যেহেতু ব্যবহারকারী সম্পূর্ণরূপে
ফাইলের নাম উল্লেখ করে, স্ট্রিংটিতে ধারাবাহিকতার জন্য ".tr" অন্তর্ভুক্ত করা উচিত।
আপনি একটি প্রদান করে একটি নির্দিষ্ট প্রোটোকল এ ascii ট্রেসিং সক্ষম করতে পারেন std::স্ট্রিং
একটি বস্তুর নাম পরিষেবা স্ট্রিং একটি প্রতিনিধিত্ব করে পিক্যাপ সক্ষম করুন পদ্ধতি দ্য Ptr is
নাম স্ট্রিং থেকে দেখা. দ্য ফলাফল ফাইলের নাম থেকে নিহিত আছে
প্রোটোকল দৃষ্টান্ত এবং নোডের মধ্যে এক-এক চিঠিপত্র আছে, উদাহরণস্বরূপ,:
নাম::যোগ করুন ("node1Ipv4"...);
নাম::যোগ করুন ("node2Ipv4"...);
...
helper.EnableAsciiIpv4 ("উপসর্গ", "node1Ipv4", 1);
helper.EnableAsciiIpv4 ("উপসর্গ", "node2Ipv4", 1);
এর ফলে "prefix-nnode1Ipv4-i1.tr" নামে দুটি ফাইল আসবে এবং
সংশ্লিষ্ট ট্রেস ফাইলে প্রতিটি ইন্টারফেসের জন্য ট্রেস সহ "prefix-nnode2Ipv4-i1.tr"।
যেহেতু সমস্ত EnableAscii ফাংশন একটি স্ট্রিম র্যাপার নেওয়ার জন্য ওভারলোড করা হয়েছে, আপনি করতে পারেন
সেই ফর্মটিও ব্যবহার করুন:
নাম::যোগ করুন ("node1Ipv4"...);
নাম::যোগ করুন ("node2Ipv4"...);
...
Ptr stream = asciiTraceHelper.CreateFileStream ("trace-file-name.tr");
...
helper.EnableAsciiIpv4 (স্ট্রিম, "node1Ipv4", 1);
helper.EnableAsciiIpv4 (স্ট্রিম, "node2Ipv4", 1);
এর ফলে "trace-file-name.tr" নামক একটি একক ট্রেস ফাইল তৈরি হবে যাতে সবগুলো থাকে
উভয় ইন্টারফেসের জন্য ঘটনা ট্রেস. ঘটনা ট্রেস প্রসঙ্গ দ্বারা দ্ব্যর্থিত হবে
স্ট্রিং।
আপনি একটি প্রদান করে প্রোটোকল/ইন্টারফেস জোড়ার সংগ্রহে ascii ট্রেসিং সক্ষম করতে পারেন
আইপিভি 4 ইন্টারফেস কন্টেইনার. সঠিক প্রকারের প্রতিটি প্রোটোকলের জন্য (পরিচালিত একই প্রকার
ডিভাইস হেল্পার দ্বারা), সংশ্লিষ্ট ইন্টারফেসের জন্য ট্রেসিং সক্ষম করা হয়েছে। আবার,
অন্তর্নিহিত কারণ প্রতিটি প্রোটোকল এবং এর মধ্যে এক-এক চিঠিপত্র রয়েছে
এর নোড উদাহরণ স্বরূপ,:
নোডকন্টেইনার নোড;
...
NetDeviceContainer ডিভাইস = deviceHelper.Install (nodes);
...
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer ইন্টারফেস = ipv4.অ্যাসাইন (ডিভাইস);
...
...
helper.EnableAsciiIpv4 ("উপসর্গ", ইন্টারফেস);
এর ফলে অনেকগুলি ascii ট্রেস ফাইল তৈরি হবে, যার প্রতিটি অনুসরণ করা হয়েছে
দ্য -n -i .tr কনভেনশন। একটি মধ্যে ট্রেস সব একত্রিত করা
একক ফাইল উপরের উদাহরণের অনুরূপভাবে সম্পন্ন হয়:
নোডকন্টেইনার নোড;
...
NetDeviceContainer ডিভাইস = deviceHelper.Install (nodes);
...
Ipv4AddressHelper ipv4;
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer ইন্টারফেস = ipv4.অ্যাসাইন (ডিভাইস);
...
Ptr stream = asciiTraceHelper.CreateFileStream ("trace-file-name.tr");
...
helper.EnableAsciiIpv4 (স্ট্রিম, ইন্টারফেস);
আপনি একটি প্রদান করে প্রোটোকল/ইন্টারফেস জোড়ার সংগ্রহে ascii ট্রেসিং সক্ষম করতে পারেন
নোডকন্টেইনার। প্রতিটির জন্য, প্রত্যেকটির জন্য নোড মধ্যে নোডকন্টেইনার উপযুক্ত প্রোটোকল পাওয়া যায়। জন্য
প্রতিটি প্রোটোকল, এর ইন্টারফেসগুলি গণনা করা হয় এবং ফলাফলে ট্রেসিং সক্ষম করা হয়
জোড়া উদাহরণ স্বরূপ,:
নোডকন্টেইনার n;
...
helper.EnableAsciiIpv4 ("উপসর্গ", n);
এর ফলে অনেকগুলি ascii ট্রেস ফাইল তৈরি হবে, যার প্রতিটি অনুসরণ করা হয়েছে
দ্য - - .tr কনভেনশন। একটি মধ্যে ট্রেস সব একত্রিত করা
একক ফাইল উপরের উদাহরণের অনুরূপভাবে সম্পন্ন হয়:
আপনি নোড আইডি এবং ডিভাইস আইডির ভিত্তিতেও pcap ট্রেসিং সক্ষম করতে পারেন। এক্ষেত্রে,
নোড-আইডি একটি অনুবাদ করা হয় Ptr এবং উপযুক্ত প্রোটোকল মধ্যে দেখা হয়
নোড ফলাফল প্রটোকল এবং ইন্টারফেস ফলাফল ট্রেস নির্দিষ্ট করতে ব্যবহৃত হয়
সূত্র.:
helper.EnableAsciiIpv4 ("উপসর্গ", 21, 1);
অবশ্যই, উপরে দেখানো হিসাবে ট্রেসগুলি একটি একক ফাইলে একত্রিত করা যেতে পারে।
অবশেষে, আপনি সংশ্লিষ্ট সহ সিস্টেমের সমস্ত ইন্টারফেসের জন্য ascii ট্রেসিং সক্ষম করতে পারেন
ডিভাইস হেল্পার দ্বারা পরিচালিত প্রোটোকলটি একই ধরণের।:
helper.EnableAsciiIpv4All ("উপসর্গ");
এর ফলে অনেকগুলি ascii ট্রেস ফাইল তৈরি হবে, প্রতিটি ইন্টারফেসের জন্য একটি
সাহায্যকারী দ্বারা পরিচালিত টাইপের একটি প্রোটোকল সম্পর্কিত সিস্টেমে। এই ফাইল সব
অনুসরণ করবে -n -i
একটি একক ফাইলে উপরের উদাহরণগুলির অনুরূপভাবে সম্পন্ন করা হয়।
ASCII রচনা যন্ত্র সাহায্যকারী ফাইলের নাম নির্বাচন
উপরের উপসর্গ-শৈলী পদ্ধতির বর্ণনার মধ্যে নিহিত হল সম্পূর্ণ নির্মাণ
বাস্তবায়ন পদ্ধতি দ্বারা ফাইলের নাম। নিয়ম অনুযায়ী, ascii মধ্যে ট্রেস ns-3 সিস্টেম হয়
ফর্মের " - - .tr"
পূর্বে উল্লিখিত হিসাবে, সিস্টেমের প্রতিটি নোডের একটি সিস্টেম-নিযুক্ত নোড আইডি থাকবে।
যেহেতু প্রোটোকল এবং নোডের মধ্যে এক থেকে এক চিঠিপত্র রয়েছে আমরা নোড-আইডি ব্যবহার করি
প্রোটোকল পরিচয় সনাক্ত করতে। প্রদত্ত প্রোটোকলের প্রতিটি ইন্টারফেসে একটি থাকবে
ইন্টারফেস ইনডেক্স (যাকে শুধু একটি ইন্টারফেসও বলা হয়) এর প্রোটোকলের সাপেক্ষে। গতানুগতিক,
তারপর, প্রথম ডিভাইসে ট্রেসিং সক্ষম করার ফলে একটি ascii ট্রেস ফাইল তৈরি হয়
নোড 21, উপসর্গ "উপসর্গ" ব্যবহার করে, "প্রিফিক্স-n21-i1.tr" হবে। উপসর্গ ব্যবহার করুন
নোড প্রতি একাধিক প্রোটোকল দ্ব্যর্থহীন করুন।
আপনি সবসময় ব্যবহার করতে পারেন ns-3 এটি আরও স্পষ্ট করতে বস্তুর নাম পরিষেবা। উদাহরণস্বরূপ, যদি
আপনি নোডের প্রোটোকলে "serverIpv4" নাম বরাদ্দ করতে অবজেক্ট নাম পরিষেবা ব্যবহার করেন
21, এবং একটি ইন্টারফেস নির্দিষ্ট করুন, ফলে ascii ট্রেস ফাইলের নাম স্বয়ংক্রিয়ভাবে হয়ে যাবে
হয়ে উঠুন, "prefix-nserverIpv4-1.tr"।
রচনা বাস্তবায়ন বিস্তারিত
উপাত্ত সংগ্রহ
এই অধ্যায়ে ns-3 ডেটা কালেকশন ফ্রেমওয়ার্ক (DCF) বর্ণনা করা হয়েছে, যা প্রদান করে
সিমুলেটরে মডেল দ্বারা উত্পন্ন ডেটা প্রাপ্ত করার ক্ষমতা, অন-লাইনে সঞ্চালন করার জন্য
হ্রাস এবং তথ্য প্রক্রিয়াকরণ, এবং মার্শাল কাঁচা বা রূপান্তরিত ডেটা বিভিন্ন আউটপুটে
ফরম্যাটের।
ফ্রেমওয়ার্কটি বর্তমানে স্বতন্ত্র NS-3 রান সমর্থন করে যা কোনো বাহ্যিকের উপর নির্ভর করে না
প্রোগ্রাম নির্বাহ নিয়ন্ত্রণ। DCF দ্বারা প্রদত্ত বস্তুগুলিকে হুক করা হতে পারে৷ ns-3 চিহ্ন
তথ্য প্রক্রিয়াকরণ সক্ষম করার জন্য উৎস।
ক্লাসের সোর্স কোড ডিরেক্টরিতে থাকে src/পরিসংখ্যান.
এই অধ্যায় নিম্নরূপ সংগঠিত হয়. প্রথমত, স্থাপত্যের একটি ওভারভিউ হল
উপস্থাপিত পরবর্তী, এই শ্রেণীর জন্য সাহায্যকারী উপস্থাপন করা হয়; এই প্রাথমিক চিকিৎসা
অনেক ব্যবহারের ক্ষেত্রে ডেটা সংগ্রহের কাঠামোর মৌলিক ব্যবহারের অনুমতি দেওয়া উচিত। ব্যবহারকারী যারা
বর্তমান সাহায্যকারীদের সুযোগের বাইরে আউটপুট তৈরি করতে চান, বা যারা তৈরি করতে চান
তাদের নিজস্ব তথ্য সংগ্রহ বস্তু, অধ্যায়ের বাকি পড়া উচিত, যা যায়
সমস্ত মৌলিক DCF অবজেক্টের ধরন সম্পর্কে বিশদভাবে এবং নিম্ন-স্তরের কোডিং প্রদান করে
উদাহরণ।
নকশা
DCF তিনটি মৌলিক শ্রেণী নিয়ে গঠিত:
· প্রোব সিমুলেশন ডেটার আউটপুট যন্ত্র এবং নিয়ন্ত্রণ করার একটি প্রক্রিয়া
আকর্ষণীয় ঘটনা নিরীক্ষণ করতে ব্যবহৃত। এটি এক বা একাধিক আকারে আউটপুট উত্পাদন করে ns-3
উত্স ট্রেস প্রোব বস্তু এক বা একাধিক ট্রেস আপ হুক আপ করা হয় কুন্ড (যাকে বলা হয়
সংগ্রাহক), যা অনলাইনে নমুনা প্রক্রিয়া করে এবং আউটপুটের জন্য প্রস্তুত করে।
· সংগ্রাহক এক বা একাধিক প্রোব অবজেক্ট দ্বারা উত্পন্ন ডেটা ব্যবহার করে। এটি সম্পাদন করে
ডেটাতে রূপান্তর, যেমন স্বাভাবিককরণ, হ্রাস এবং গণনা
মৌলিক পরিসংখ্যান। সংগ্রাহক বস্তু সরাসরি দ্বারা আউটপুট যে তথ্য উত্পাদন করে না
ns-3 রান; পরিবর্তে, তারা ডাটা ডাউনস্ট্রিম অন্য ধরনের অবজেক্টে আউটপুট করে, যাকে বলা হয়
সমষ্টিবিদ, যা সেই ফাংশন সঞ্চালন করে। সাধারণত, সংগ্রাহকরা তাদের ডেটা আউটপুট করে
পাশাপাশি ট্রেস উত্সের ফর্ম, সংগ্রাহকদের সিরিজে শৃঙ্খলিত করার অনুমতি দেয়।
· সমষ্টিবিদ প্রোব এবং সংগ্রাহকদের একটি নেটওয়ার্ক দ্বারা সংগৃহীত ডেটার শেষ বিন্দু।
অ্যাগ্রিগেটরের প্রধান দায়িত্ব হ'ল মার্শাল ডেটা এবং তাদের সম্পর্কিত
মেটাডেটা, বিভিন্ন আউটপুট ফরম্যাটে যেমন প্লেইন টেক্সট ফাইল, স্প্রেডশীট ফাইল, বা
ডাটাবেস।
এই তিনটি ক্লাসই গতিশীলভাবে নিজেদের চালু বা বন্ধ করার ক্ষমতা প্রদান করে
একটি সিমুলেশন জুড়ে।
যেকোন স্বতন্ত্র ns-3 সিমুলেশন রান যা DCF ব্যবহার করে তা সাধারণত অন্তত একটি তৈরি করবে
উপরের তিনটি শ্রেণীর প্রতিটির উদাহরণ।
[ছবি] ডেটা কালেকশন ফ্রেমওয়ার্ক ওভারভিউ।UNINDENT
তথ্য প্রক্রিয়াকরণের সামগ্রিক প্রবাহ চিত্রিত করা হয়েছে উপাত্ত সংগ্রহ ফ্রেমওয়ার্ক ওভারভিউ.
বাম দিকে, একটি চলমান ns-3 সিমুলেশন চিত্রিত করা হয়। চলাকালীন সময়ে
সিমুলেশন, ডেটা ট্রেস সোর্স বা অন্যান্য উপায়ে মডেল দ্বারা উপলব্ধ করা হয়।
ডায়াগ্রামে দেখানো হয়েছে যে প্রোবগুলি ডেটা প্রাপ্ত করার জন্য এই ট্রেস উত্সগুলির সাথে সংযুক্ত করা যেতে পারে
অ্যাসিঙ্ক্রোনাসভাবে, অথবা প্রোব ডেটার জন্য পোল করতে পারে। ডেটা তারপর একটি সংগ্রাহক বস্তুতে প্রেরণ করা হয়
যে তথ্য রূপান্তরিত. অবশেষে, একটি সংযোজনকারীকে এর আউটপুটগুলির সাথে সংযুক্ত করা যেতে পারে
সংগ্রাহক, প্লট, ফাইল বা ডাটাবেস তৈরি করতে।
[ছবি] ডেটা কালেকশন ফ্রেমওয়ার্ক এগ্রিগেশন।UNINDENT
উপরের চিত্রে একটি বৈচিত্র দেওয়া হয়েছে উপাত্ত সংগ্রহ ফ্রেমওয়ার্ক মোট পরিমাণ.
এই দ্বিতীয় চিত্রটি ব্যাখ্যা করে যে ডিসিএফ বস্তুগুলিকে একটি পদ্ধতিতে একত্রে শৃঙ্খলিত করা যেতে পারে
যে ডাউনস্ট্রিম অবজেক্টগুলি একাধিক আপস্ট্রিম অবজেক্ট থেকে ইনপুট নেয়। অবকাঠামো
ধারণাগতভাবে দেখায় যে একাধিক প্রোব আউটপুট তৈরি করতে পারে যা একটি সিঙ্গেলের মধ্যে দেওয়া হয়
সংগ্রাহক একটি উদাহরণ হিসাবে, একটি সংগ্রাহক যে দুটি কাউন্টারের একটি অনুপাত আউটপুট করবে
সাধারণত পৃথক প্রোব থেকে প্রতিটি কাউন্টার ডেটা অর্জন করে। একাধিক সংগ্রাহকও করতে পারেন
একটি একক এগ্রিগেটরে ফিড, যা (এর নাম থেকে বোঝা যায়) অনেকগুলি ডেটা সংগ্রহ করতে পারে
একটি একক প্লট, ফাইল বা ডাটাবেসে অন্তর্ভুক্তির জন্য স্ট্রীম।
উপাত্ত সংগ্রহ সাহায্যকারী
ডেটা সংগ্রহের কাঠামোর সম্পূর্ণ নমনীয়তা আন্তঃসংযোগ দ্বারা প্রদান করা হয়
প্রোব, সংগ্রাহক এবং সমষ্টির। এই আন্তঃসংযোগ সব সঞ্চালন বাড়ে
ইউজার প্রোগ্রামে অনেক কনফিগারেশন স্টেটমেন্ট। ব্যবহারের সুবিধার জন্য, সবচেয়ে সাধারণ কিছু
অপারেশন একত্রিত করা যেতে পারে এবং সাহায্যকারী ফাংশন মধ্যে encapsulated করা যেতে পারে. উপরন্তু, কিছু
জড়িত বিবৃতি ns-3 সীমাবদ্ধতার কারণে ট্রেস উত্সগুলিতে পাইথন বাইন্ডিং নেই৷
বাঁধাই
উপাত্ত সংগ্রহ সাহায্যকারী সংক্ষিপ্ত বিবরণ
এই বিভাগে, আমরা কিছু সাহায্যকারী ক্লাসের একটি ওভারভিউ প্রদান করি যা তৈরি করা হয়েছে
কিছু সাধারণ ব্যবহারের ক্ষেত্রে ডেটা সংগ্রহের কাঠামোর কনফিগারেশন সহজ করুন। দ্য
সাহায্যকারীরা ব্যবহারকারীদের তাদের C++ বা এ শুধুমাত্র কয়েকটি বিবৃতি দিয়ে সাধারণ ক্রিয়াকলাপ গঠন করতে দেয়
পাইথন প্রোগ্রাম। কিন্তু, ব্যবহারের এই সহজলভ্যতা উল্লেখযোগ্যভাবে কম খরচে আসে
নিম্ন-স্তরের কনফিগারেশনের তুলনায় নমনীয়তা প্রদান করতে পারে, এবং স্পষ্টভাবে কোড করার প্রয়োজন
সাহায্যকারীদের মধ্যে নতুন প্রোবের প্রকারের জন্য সমর্থন (নীচে বর্ণিত একটি সমস্যা সমাধানের জন্য)।
বর্তমান সাহায্যকারীদের উপর জোর দেওয়া হয় মার্শাল তথ্য আউট ns-3 মধ্যে উত্স ট্রেস
gnuplot প্লট বা টেক্সট ফাইল, উচ্চ মাত্রার আউটপুট কাস্টমাইজেশন বা পরিসংখ্যান ছাড়াই
প্রক্রিয়াকরণ (প্রাথমিকভাবে)। এছাড়াও, উপলভ্য প্রোবের প্রকারের জন্য ব্যবহার সীমাবদ্ধ
ns-3. এই ডকুমেন্টেশনের পরবর্তী বিভাগগুলি নতুন তৈরি করার বিষয়ে আরও বিশদে যাবে
প্রোবের ধরন, সেইসাথে প্রোব, কালেক্টর এবং অ্যাগ্রিগেটর একসাথে হুক করার বিষয়ে বিশদ বিবরণ
কাস্টম ব্যবস্থায়।
আজ অবধি, দুটি ডেটা সংগ্রহ সহায়ক কার্যকর করা হয়েছে:
· GnuplotHelper
· ফাইল হেল্পার
GnuplotHelper
GnuplotHelper হল gnuplots তৈরি করতে ব্যবহৃত আউটপুট ফাইল তৈরি করার জন্য একটি সহায়ক শ্রেণী। দ্য
সামগ্রিক লক্ষ্য হল ব্যবহারকারীদের রপ্তানিকৃত ডেটা থেকে দ্রুত প্লট তৈরি করার ক্ষমতা প্রদান করা
in ns-3 উত্স ট্রেস ডিফল্টরূপে, একটি ন্যূনতম পরিমাণ তথ্য রূপান্তর সঞ্চালিত হয়;
উদ্দেশ্য হল যত কম (ডিফল্ট) কনফিগারেশন স্টেটমেন্ট সহ প্লট তৈরি করা
সম্ভব.
GnuplotHelper সংক্ষিপ্ত বিবরণ
GnuplotHelper সিমুলেশন শেষে 3টি ভিন্ন ফাইল তৈরি করবে:
একটি স্পেস বিভক্ত gnuplot ডেটা ফাইল
একটি gnuplot কন্ট্রোল ফাইল
gnuplot তৈরি করার জন্য একটি শেল স্ক্রিপ্ট
দুটি কনফিগারেশন স্টেটমেন্ট আছে যা প্লট তৈরি করতে প্রয়োজন। প্রথম
বিবৃতি প্লট কনফিগার করে (ফাইলের নাম, শিরোনাম, কিংবদন্তি, এবং আউটপুট প্রকার, যেখানে আউটপুট
অনির্দিষ্ট থাকলে PNG তে ডিফল্ট টাইপ করুন):
void ConfigurePlot (const std::string &outputFileName WithoutExtension,
const std::string &title,
const std::string &xLegend,
const std::string &yLegend,
const std::string &terminalType = ".png");
দ্বিতীয় বিবৃতিটি আগ্রহের ট্রেস উত্সকে হুক করে:
void PlotProbe (const std::string &typeId,
const std::string &path,
const std::string &probeTraceSource,
const std::string &title);
যুক্তিগুলি নিম্নরূপ:
· টাইপআইডি: The ns-3 প্রোবের টাইপআইডি
· পথ: পথ ns-3 এক বা একাধিক ট্রেস উৎসে কনফিগারেশন নামস্থান
প্রোবট্রেসসোর্স: প্রোবের কোন আউটপুট (নিজেই একটি ট্রেস সোর্স) প্লট করা উচিত
শিরোনাম: ডেটাসেট(গুলি) এর সাথে যুক্ত করার শিরোনাম (গ্নুপ্লট কিংবদন্তিতে)
উপরের প্লটপ্রোবের একটি বৈকল্পিক হল একটি পঞ্চম ঐচ্ছিক যুক্তি নির্দিষ্ট করা যা নিয়ন্ত্রণ করে
যেখানে প্লটে কী (কিংবদন্তি) স্থাপন করা হয়েছে।
একটি সম্পূর্ণরূপে কাজ করা উদাহরণ (থেকে সপ্তম.সিসি) নীচে দেখানো হয়েছে:
// gnuplot সহায়ক তৈরি করুন।
GnuplotHelper plotHelper;
// প্লট কনফিগার করুন।
// প্লট কনফিগার করুন। প্রথম যুক্তি হল ফাইলের নাম উপসর্গ
// উৎপন্ন আউটপুট ফাইলের জন্য। দ্বিতীয়, তৃতীয় এবং চতুর্থ
// আর্গুমেন্ট হল, যথাক্রমে, প্লট শিরোনাম, x-অক্ষ, এবং y-অক্ষ লেবেল
plotHelper.ConfigurePlot ("সপ্তম-প্যাকেট-বাইট-গণনা",
"প্যাকেট বাইট কাউন্ট বনাম সময়",
"সময় (সেকেন্ড)",
"প্যাকেট বাইট কাউন্ট",
"png");
// প্রোবের ধরন, ট্রেস সোর্স পাথ (কনফিগারেশন নামস্থানে) উল্লেখ করুন, এবং
প্লট করার জন্য // প্রোব আউটপুট ট্রেস সোর্স ("আউটপুটবাইটস")। চতুর্থ যুক্তি
// প্লটে ডেটা সিরিজ লেবেলের নাম উল্লেখ করে। গত
// আর্গুমেন্ট কীটি কোথায় স্থাপন করা উচিত তা উল্লেখ করে প্লট ফর্ম্যাট করে।
plotHelper.PlotProbe (probeType,
ট্রেসপথ,
"আউটপুটবাইটস",
"প্যাকেট বাইট কাউন্ট",
GnuplotAggregator::KEY_BELOW);
এই উদাহরণে, প্রোব টাইপ এবং ট্রেসপথ নিম্নরূপ (IPv4 এর জন্য):
probeType = "ns3::Ipv4PacketProbe";
tracePath = "/NodeList/*/$ns3::Ipv4L3Protocol/Tx";
এই সাহায্যকারীর কাজ করার জন্য probeType হল একটি মূল পরামিতি। এই TypeId নিবন্ধিত করা আবশ্যক
সিস্টেমে, এবং প্রোবের ট্রেস সিঙ্কের স্বাক্ষর অবশ্যই ট্রেসের সাথে মেলে
উত্স এটি আবদ্ধ করা হচ্ছে. প্রোবের প্রকারগুলি অনেকগুলি ডেটা প্রকারের জন্য পূর্ব-নির্ধারিত
সংশ্লিষ্ট ns-3 ট্রেস করা মান, এবং আরও কয়েকটি ট্রেস সোর্স স্বাক্ষরের জন্য যেমন
'Tx' এর ট্রেস উৎস ns3::Ipv4L3 প্রোটোকল বর্গ.
উল্লেখ্য যে ট্রেস সোর্স পাথে ওয়াইল্ডকার্ড থাকতে পারে। এই ক্ষেত্রে, একাধিক
ডেটাসেটগুলি একটি প্লটে প্লট করা হয়; প্রতিটি মিলে যাওয়া পথের জন্য একটি।
উত্পাদিত প্রধান আউটপুট তিনটি ফাইল হবে:
সপ্তম-প্যাকেট-বাইট-কাউন্ট.ড্যাট
সপ্তম-প্যাকেট-বাইট-কাউন্ট.plt
সপ্তম-প্যাকেট-বাইট-কাউন্ট.শ
এই মুহুর্তে, ব্যবহারকারীরা আরও কাস্টমাইজেশনের জন্য .plt ফাইলটি সম্পাদনা করতে পারেন, অথবা
শুধু gnuplot এর মাধ্যমে এটি চালান। চলমান sh সপ্তম-প্যাকেট-বাইট-কাউন্ট.শ সহজভাবে চক্রান্ত চালায়
gnuplot এর মাধ্যমে, যেমন নীচে দেখানো হয়েছে।
[ছবি] 2-ডি গ্নুপ্লট সপ্তম.সিসি উদাহরণ দ্বারা তৈরি করা হয়েছে..UNINDENT
এটি দেখা যায় যে মূল উপাদানগুলি (লেজেন্ড, শিরোনাম, কিংবদন্তি বসানো, xlabel, ylabel,
এবং ডেটার জন্য পাথ) সমস্ত প্লটে স্থাপন করা হয়। যেহেতু সেখানে দুটি ম্যাচ ছিল
প্রদত্ত কনফিগারেশন পাথ, দুটি ডেটা সিরিজ দেখানো হয়েছে:
· প্যাকেট বাইট কাউন্ট-0 /NodeList/0/$ns3::Ipv4L3Protocol/Tx এর সাথে মিলে যায়
· প্যাকেট বাইট কাউন্ট-1 /NodeList/1/$ns3::Ipv4L3Protocol/Tx এর সাথে মিলে যায়
GnuplotHelper কনফিগারপ্লট
GnuplotHelper এর কনফিগারপ্লট() ফাংশন প্লট কনফিগার করতে ব্যবহার করা যেতে পারে।
এটির নিম্নলিখিত প্রোটোটাইপ রয়েছে:
void ConfigurePlot (const std::string &outputFileName WithoutExtension,
const std::string &title,
const std::string &xLegend,
const std::string &yLegend,
const std::string &terminalType = ".png");
এটিতে নিম্নলিখিত যুক্তি রয়েছে:
┌───────────────────────────────┬───────────────── ─────────────────┐
│যুক্তি │ বর্ণনা │
├───────────────────────────────┼───────────────── ─────────────────┤
│outputFileNameWithoutExtension │ gnuplot সম্পর্কিত ফাইলের নাম │
│ │ কোনো এক্সটেনশন ছাড়াই লিখুন। │
├───────────────────────────────┼───────────────── ─────────────────┤
│title │ প্লট শিরোনাম স্ট্রিং │ এর জন্য ব্যবহার করতে হবে
│ │ এই চক্রান্ত. │
├───────────────────────────────┼───────────────── ─────────────────┤
│xLegend │ x অনুভূমিক │ জন্য কিংবদন্তি
│ │ অক্ষ। │
├───────────────────────────────┼───────────────── ─────────────────┤
│yLegend │ y উল্লম্ব │ এর জন্য কিংবদন্তি
│ │ অক্ষ। │
└───────────────────────────────┴───────────────── ─────────────────┘
│টার্মিনাল টাইপ │ টার্মিনাল টাইপ সেটিং স্ট্রিং │ এর জন্য
│ │ আউটপুট। ডিফল্ট টার্মিনাল │
│ │ প্রকার "png"। │
└───────────────────────────────┴───────────────── ─────────────────┘
GnuplotHelper এর কনফিগারপ্লট() ফাংশন এর জন্য প্লট সম্পর্কিত পরামিতি কনফিগার করে
gnuplot helper যাতে এটি একটি স্পেস বিভক্ত gnuplot নামে ডেটা ফাইল তৈরি করবে
outputFileNameWithoutExtension + ".dat", নামের একটি gnuplot কন্ট্রোল ফাইল
outputFileNameWithoutExtension + ".plt", এবং gnuplot নামের একটি শেল স্ক্রিপ্ট তৈরি করুন
outputFileNameWithoutExtension + ".sh"।
এই ফাংশনটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ তে দেখা যাবে সপ্তম.সিসি উপরে বর্ণিত কোড
যেখানে এটি নিম্নরূপ ব্যবহার করা হয়েছিল:
plotHelper.ConfigurePlot ("সপ্তম-প্যাকেট-বাইট-গণনা",
"প্যাকেট বাইট কাউন্ট বনাম সময়",
"সময় (সেকেন্ড)",
"প্যাকেট বাইট কাউন্ট",
"png");
GnuplotHelper প্লটপ্রোব
GnuplotHelper এর প্লটপ্রোব() ফাংশন প্রোব দ্বারা উত্পন্ন মান প্লট করতে ব্যবহার করা যেতে পারে।
এটির নিম্নলিখিত প্রোটোটাইপ রয়েছে:
void PlotProbe (const std::string &typeId,
const std::string &path,
const std::string &probeTraceSource,
const std::string &title,
enum GnuplotAggregator::KeyLocation keyLocation = GnuplotAggregator::KEY_INSIDE);
এটিতে নিম্নলিখিত যুক্তি রয়েছে:
┌─────────────────┬─────────────────────────────── ───┐
│যুক্তি │ বর্ণনা │
├─────────────────┼─────────────────────────────── ───┤
│typeId │ প্রোবের জন্য টাইপ ID │
│ │ এই সাহায্যকারী দ্বারা তৈরি. │
├─────────────────┼─────────────────────────────── ───┤
│পাথ │ ট্রেস অ্যাক্সেস করার জন্য পাথ কনফিগার করুন │
│ │ উৎস। │
├─────────────────┼─────────────────────────────── ───┤
│probeTraceSource │ প্রোবের ট্রেস সোর্স │ এ
│ │ অ্যাক্সেস। │
├─────────────────┼─────────────────────────────── ───┤
│শিরোনাম │ শিরোনামটি │ এর সাথে যুক্ত করা হবে৷
│ │ এই ডেটাসেট │
├─────────────────┼─────────────────────────────── ───┤
│কী অবস্থান │ │-এ কীটির অবস্থান
│ │ প্লট। ডিফল্ট অবস্থান হল │৷
│ │ ভিতরে। │
└─────────────────┴─────────────────────────────── ───┘
GnuplotHelper এর প্লটপ্রোব() ফাংশন হুকিং দ্বারা উত্পন্ন একটি ডেটাসেট প্লট করে ns-3
হেল্পার দ্বারা তৈরি একটি প্রোবের সাহায্যে উত্স ট্রেস করুন এবং তারপর থেকে মানগুলি প্লট করুন৷
probeTraceSource. ডেটাসেটের প্রদত্ত শিরোনাম থাকবে এবং এতে থাকবে
প্রতিটি টাইমস্ট্যাম্পে 'newValue'।
যদি কনফিগার পাথ সিস্টেমে একাধিক মিল থাকে কারণ একটি ওয়াইল্ডকার্ড আছে, তাহলে
প্রতিটি ম্যাচের জন্য একটি ডেটাসেট প্লট করা হবে। ডেটাসেট শিরোনাম এর সাথে প্রত্যয়িত হবে
কনফিগার পথের প্রতিটি ওয়াইল্ডকার্ডের জন্য মিলিত অক্ষর, স্পেস দ্বারা পৃথক করা হয়েছে। জন্য
উদাহরণস্বরূপ, যদি প্রস্তাবিত ডেটাসেট শিরোনামটি স্ট্রিং "বাইট" হয় এবং দুটি ওয়াইল্ডকার্ড থাকে
পাথে, তারপর "বাইট-০ ০" বা "বাইটস-১২ 0" এর মতো ডেটাসেট শিরোনামগুলি সম্ভব হবে
প্লট করা ডেটাসেটের জন্য লেবেল।
এই ফাংশনটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ তে দেখা যাবে সপ্তম.সিসি উপরে বর্ণিত কোড
যেখানে এটি ব্যবহার করা হয়েছিল (ভেরিয়েবল প্রতিস্থাপন সহ) নিম্নরূপ:
plotHelper.PlotProbe ("ns3::Ipv4PacketProbe",
"/NodeList/*/$ns3::Ipv4L3Protocol/Tx",
"আউটপুটবাইটস",
"প্যাকেট বাইট কাউন্ট",
GnuplotAggregator::KEY_BELOW);
অন্যান্য উদাহরণ
জ্ঞানপ্লট সাহায্যকারী উদাহরণ
তুলনায় একটি সামান্য সহজ উদাহরণ সপ্তম.সিসি উদাহরণ পাওয়া যাবে
src/stats/examples/gnuplot-helper-example.cc. নিম্নলিখিত 2-D gnuplot ব্যবহার করে তৈরি করা হয়েছিল
উদাহরণ.
[ছবি] 2-ডি গ্নুপ্লট gnuplot-helper-example.cc দ্বারা নির্মিত উদাহরণ..UNINDENT
এই উদাহরণে, একটি ইমিটার অবজেক্ট আছে যা a অনুযায়ী তার কাউন্টার বৃদ্ধি করে
পয়সন প্রক্রিয়া এবং তারপর একটি ট্রেস উৎস হিসাবে কাউন্টারের মান নির্গত করে।
Ptr emitter = CreateObject ();
নাম::অ্যাড ("/নাম/ইমিটার", ইমিটার);
উল্লেখ্য যে নীচে ব্যবহৃত পথে কোনো ওয়াইল্ডকার্ড না থাকায় শুধুমাত্র ১টি ডেটাস্ট্রিম ছিল
প্লটে আঁকা। প্লটে এই একক ডাটাস্ট্রিমটি কেবল "ইমিটার কাউন্ট" লেবেলযুক্ত।
পথের মধ্যে ওয়াইল্ডকার্ড আছে কিনা তা দেখতে পাবে এমন কোনো অতিরিক্ত প্রত্যয় ছাড়াই।
// gnuplot সহায়ক তৈরি করুন।
GnuplotHelper plotHelper;
// প্লট কনফিগার করুন।
plotHelper.ConfigurePlot ("gnuplot-helper-example",
"ইমিটার কাউন্টস বনাম সময়",
"সময় (সেকেন্ড)",
"ইমিটার কাউন্ট",
"png");
// প্রোবের দ্বারা উত্পন্ন মানগুলি প্লট করুন। পথ যে আমরা প্রদান
// ট্রেসের উৎসকে দ্ব্যর্থহীন করতে সাহায্য করে।
plotHelper.PlotProbe ("ns3::Uinteger32Probe",
"/নাম/ইমিটার/কাউন্টার",
"আউটপুট",
"ইমিটার কাউন্ট",
GnuplotAggregator::KEY_INSIDE);
ফাইল হেল্পার
FileHelper হল একটি সহায়ক শ্রেণী যা একটি ফাইলে ডেটা মান রাখতে ব্যবহৃত হয়। সার্বিক লক্ষ্য হল
রপ্তানি করা ডেটা থেকে ব্যবহারকারীদের দ্রুত ফর্ম্যাট করা টেক্সট ফাইল তৈরি করার ক্ষমতা প্রদান করতে
in ns-3 উত্স ট্রেস ডিফল্টরূপে, একটি ন্যূনতম পরিমাণ তথ্য রূপান্তর সঞ্চালিত হয়;
উদ্দেশ্য হল কয়েকটি (ডিফল্ট) কনফিগারেশন স্টেটমেন্ট সহ ফাইল তৈরি করা
সম্ভব.
ফাইল হেল্পার সংক্ষিপ্ত বিবরণ
ফাইলহেল্পার সিমুলেশনের শেষে 1 বা তার বেশি টেক্সট ফাইল তৈরি করবে।
FileHelper 4টি বিভিন্ন ধরনের টেক্সট ফাইল তৈরি করতে পারে:
· বিন্যাসিত
· স্থান পৃথক করা হয়েছে (ডিফল্ট)
· কমা পৃথক করা হয়েছে
· ট্যাব আলাদা করা হয়েছে
ফর্ম্যাট করা ফাইলগুলি তাদের মুদ্রণের জন্য C-স্টাইল ফর্ম্যাট স্ট্রিং এবং sprintf() ফাংশন ব্যবহার করে
ফাইলের মান লেখা হচ্ছে।
নিম্নলিখিত টেক্সট ফাইল 2 কলাম ফরম্যাট মান নাম দিয়ে
সপ্তম-প্যাকেট-বাইট-কাউন্ট-0.txt আরও নতুন কোড ব্যবহার করে তৈরি করা হয়েছিল যা যোগ করা হয়েছিল
মূল ns-3 টিউটোরিয়াল উদাহরণ এর কোড. এই ফাইলের শুধুমাত্র প্রথম 10 লাইন দেখানো হয়
এখানে সংক্ষিপ্ততার জন্য।
সময় (সেকেন্ড) = 1.000e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.004e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.004e+00 প্যাকেট বাইট সংখ্যা = 576
সময় (সেকেন্ড) = 1.009e+00 প্যাকেট বাইট সংখ্যা = 576
সময় (সেকেন্ড) = 1.009e+00 প্যাকেট বাইট সংখ্যা = 576
সময় (সেকেন্ড) = 1.015e+00 প্যাকেট বাইট সংখ্যা = 512
সময় (সেকেন্ড) = 1.017e+00 প্যাকেট বাইট সংখ্যা = 576
সময় (সেকেন্ড) = 1.017e+00 প্যাকেট বাইট সংখ্যা = 544
সময় (সেকেন্ড) = 1.025e+00 প্যাকেট বাইট সংখ্যা = 576
সময় (সেকেন্ড) = 1.025e+00 প্যাকেট বাইট সংখ্যা = 544
...
নিম্নলিখিত বিভিন্ন টেক্সট ফাইল 2 কলাম ফরম্যাট মান নাম দিয়ে
সপ্তম-প্যাকেট-বাইট-কাউন্ট-1.txt একই নতুন কোড ব্যবহার করে তৈরি করা হয়েছিল যা যোগ করা হয়েছিল
মূল ns-3 টিউটোরিয়াল উদাহরণ এর কোড. এই ফাইলের শুধুমাত্র প্রথম 10 লাইন দেখানো হয়
এখানে সংক্ষিপ্ততার জন্য।
সময় (সেকেন্ড) = 1.002e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.007e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.013e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.020e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.028e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.036e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.045e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.053e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.061e+00 প্যাকেট বাইট সংখ্যা = 40
সময় (সেকেন্ড) = 1.069e+00 প্যাকেট বাইট সংখ্যা = 40
...
দুটি পাঠ্য ফাইল তৈরি করতে যে নতুন কোডটি যুক্ত করা হয়েছিল তা নীচে রয়েছে। সম্পর্কে আরো বিস্তারিত
এই API পরবর্তী বিভাগে কভার করা হবে।
মনে রাখবেন যে পথটিতে ওয়াইল্ডকার্ডের জন্য 2টি মিল ছিল, 2টি পৃথক পাঠ্য ফাইল
সৃষ্টি করেছিল. প্রথম টেক্সট ফাইল, যার নাম "seventh-packet-byte-count-0.txt",
ওয়াইল্ডকার্ড ম্যাচের সাথে মিলে যায় "*" এর পরিবর্তে "0" এর সাথে। দ্বিতীয় টেক্সট ফাইল,
যার নাম "seventh-packet-byte-count-1.txt", এর সাথে ওয়াইল্ডকার্ড মিলের সাথে মিলে যায়
"*" "1" দিয়ে প্রতিস্থাপিত হয়েছে। এছাড়াও, ফাংশন কল যে নোট WriteProbe() একটি দেবে
ওয়াইল্ডকার্ড ধারণ করে এমন একটি পথের জন্য কোনো মিল না থাকলে ত্রুটি বার্তা।
// ফাইল হেল্পার তৈরি করুন।
ফাইলহেল্পার ফাইলহেল্পার;
// লেখার জন্য ফাইল কনফিগার করুন।
fileHelper.ConfigureFile ("সপ্তম-প্যাকেট-বাইট-গণনা",
ফাইল অ্যাগ্রিগেটর::ফরম্যাটেড);
// এই ফর্ম্যাট করা আউটপুট ফাইলের জন্য লেবেল সেট করুন।
fileHelper.Set2dFormat ("সময় (সেকেন্ড) = %.3e\tপ্যাকেট বাইট কাউন্ট = %.0f");
// প্রোবের দ্বারা উত্পন্ন মানগুলি লিখুন।
fileHelper.WriteProbe ("ns3::Ipv4PacketProbe",
"/NodeList/*/$ns3::Ipv4L3Protocol/Tx",
"আউটপুটবাইটস");
ফাইল হেল্পার কনফিগার ফাইল
ফাইল হেল্পার কনফিগার ফাইল() ফাংশনটি টেক্সট ফাইল কনফিগার করতে ব্যবহার করা যেতে পারে।
এটির নিম্নলিখিত প্রোটোটাইপ রয়েছে:
void ConfigureFile (const std::string &outputFileNameWithoutExtension,
enum FileAggregator::FileType fileType = FileAggregator::SPACE_SEPARATED);
এটিতে নিম্নলিখিত যুক্তি রয়েছে:
┌───────────────────────────────┬───────────────── ─────────────────┐
│যুক্তি │ বর্ণনা │
├───────────────────────────────┼───────────────── ─────────────────┤
│outputFileNameWithoutExtension │ লেখার জন্য আউটপুট ফাইলের নাম │
│ │ কোনো এক্সটেনশন ছাড়াই। │
├───────────────────────────────┼───────────────── ─────────────────┤
│fileType │ ফাইলের প্রকার লিখতে হবে। │
│ │ ফাইলের ডিফল্ট প্রকার হল স্থান │
│ │ পৃথক করা হয়েছে। │
└───────────────────────────────┴───────────────── ─────────────────┘
ফাইল হেল্পার কনফিগার ফাইল() ফাংশন এর জন্য টেক্সট ফাইল সম্পর্কিত পরামিতি কনফিগার করে
ফাইল হেল্পার যাতে এটি outputFileNameWithoutExtension plus নামে একটি ফাইল তৈরি করবে
ওয়াইল্ডকার্ড ম্যাচ প্লাস ".txt" থেকে সম্ভাব্য অতিরিক্ত তথ্য মুদ্রিত মান সহ
ফাইল টাইপ দ্বারা নির্দিষ্ট করা হয়েছে। ডিফল্ট ফাইলের ধরন স্থান-বিচ্ছিন্ন।
এই ফাংশনটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ তে দেখা যাবে সপ্তম.সিসি উপরে বর্ণিত কোড
যেখানে এটি নিম্নরূপ ব্যবহার করা হয়েছিল:
fileHelper.ConfigureFile ("সপ্তম-প্যাকেট-বাইট-গণনা",
ফাইল অ্যাগ্রিগেটর::ফরম্যাটেড);
ফাইল হেল্পার WriteProbe
ফাইল হেল্পার WriteProbe() ফাংশন প্রোব দ্বারা উত্পন্ন মান লিখতে ব্যবহার করা যেতে পারে
টেক্সট ফাইল।
এটির নিম্নলিখিত প্রোটোটাইপ রয়েছে:
void WriteProbe (const std::string &typeId,
const std::string &path,
const std::string &probeTraceSource);
এটিতে নিম্নলিখিত যুক্তি রয়েছে:
┌─────────────────┬─────────────────────────────── ───┐
│যুক্তি │ বর্ণনা │
├─────────────────┼─────────────────────────────── ───┤
│typeId │ প্রোবের জন্য টাইপ ID │ হতে হবে
│ │ তৈরি করা হয়েছে। │
├─────────────────┼─────────────────────────────── ───┤
│পাথ │ ট্রেস অ্যাক্সেস করার জন্য পাথ কনফিগার করুন │
│ │ উৎস। │
├─────────────────┼─────────────────────────────── ───┤
│probeTraceSource │ প্রোবের ট্রেস সোর্স │ এ
│ │ অ্যাক্সেস। │
└─────────────────┴─────────────────────────────── ───┘
ফাইল হেল্পার WriteProbe() ফাংশন হুকিং দ্বারা উত্পন্ন আউটপুট টেক্সট ফাইল তৈরি করে
সাহায্যকারীর দ্বারা তৈরি একটি প্রোবের সাহায্যে ns-3 ট্রেস সোর্স, এবং তারপর থেকে মানগুলি লেখা
probeTraceSource. আউটপুট ফাইলের নামের পাঠ্য সদস্য ভেরিয়েবলে সংরক্ষিত থাকবে
m_outputFileNameWithoutExtension প্লাস ".txt", এবং প্রতিটিতে 'newValue' থাকবে
টাইমস্ট্যাম্প
যদি কনফিগার পাথ সিস্টেমে একাধিক মিল থাকে কারণ একটি ওয়াইল্ডকার্ড আছে, তাহলে
প্রতিটি ম্যাচের জন্য একটি আউটপুট ফাইল তৈরি করা হবে। আউটপুট ফাইলের নাম ধারণ করবে
m_outputFileNameWithoutExtension-এ পাঠ্য এবং প্রতিটির জন্য মিলে যাওয়া অক্ষর
কনফিগার পাথে ওয়াইল্ডকার্ড, ড্যাশ দ্বারা পৃথক করা, প্লাস ".txt"। উদাহরণস্বরূপ, যদি মান
m_outputFileNameWithoutExtension-এ স্ট্রিং হল "প্যাকেট-বাইট-কাউন্ট", এবং দুটি আছে
পথের মধ্যে ওয়াইল্ডকার্ড, তারপর আউটপুট ফাইলের নাম যেমন "packet-byte-count-0-0.txt" বা
তৈরি করা ফাইলগুলির নাম হিসাবে "packet-byte-count-12-9.txt" সম্ভব হবে।
এই ফাংশনটি কীভাবে ব্যবহার করবেন তার একটি উদাহরণ তে দেখা যাবে সপ্তম.সিসি উপরে বর্ণিত কোড
যেখানে এটি নিম্নরূপ ব্যবহার করা হয়েছিল:
fileHelper.WriteProbe ("ns3::Ipv4PacketProbe",
"/NodeList/*/$ns3::Ipv4L3Protocol/Tx",
"আউটপুটবাইটস");
অন্যান্য উদাহরণ
ফাইল সাহায্যকারী উদাহরণ
তুলনায় একটি সামান্য সহজ উদাহরণ সপ্তম.সিসি উদাহরণ পাওয়া যাবে
src/stats/examples/file-helper-example.cc. এই উদাহরণটি শুধুমাত্র FileHelper ব্যবহার করে।
নিম্নলিখিত টেক্সট ফাইল 2 কলাম ফরম্যাট মান নাম দিয়ে file-helper-example.txt
উদাহরণ ব্যবহার করে তৈরি করা হয়েছিল। এই ফাইলটির শুধুমাত্র প্রথম 10টি লাইন এখানে দেখানো হয়েছে
সংক্ষিপ্ততা
সময় (সেকেন্ড) = 0.203 গণনা = 1
সময় (সেকেন্ড) = 0.702 গণনা = 2
সময় (সেকেন্ড) = 1.404 গণনা = 3
সময় (সেকেন্ড) = 2.368 গণনা = 4
সময় (সেকেন্ড) = 3.364 গণনা = 5
সময় (সেকেন্ড) = 3.579 গণনা = 6
সময় (সেকেন্ড) = 5.873 গণনা = 7
সময় (সেকেন্ড) = 6.410 গণনা = 8
সময় (সেকেন্ড) = 6.472 গণনা = 9
...
এই উদাহরণে, একটি ইমিটার অবজেক্ট আছে যা a অনুযায়ী তার কাউন্টার বৃদ্ধি করে
পয়সন প্রক্রিয়া এবং তারপর একটি ট্রেস উৎস হিসাবে কাউন্টারের মান নির্গত করে।
Ptr emitter = CreateObject ();
নাম::অ্যাড ("/নাম/ইমিটার", ইমিটার);
উল্লেখ্য যে নিচের ব্যবহৃত পাথে কোনো ওয়াইল্ডকার্ড না থাকায় শুধুমাত্র 1টি টেক্সট ফাইল ছিল
তৈরি এই একক টেক্সট ফাইলটিকে সহজভাবে "file-helper-example.txt" নাম দেওয়া হয়েছে, কোনো অতিরিক্ত ছাড়াই
আপনার মতো প্রত্যয়গুলি দেখতে পাবে যে পথে ওয়াইল্ডকার্ড আছে কিনা।
// ফাইল হেল্পার তৈরি করুন।
ফাইলহেল্পার ফাইলহেল্পার;
// লেখার জন্য ফাইল কনফিগার করুন।
fileHelper.ConfigureFile ("ফাইল-হেল্পার-উদাহরণ",
ফাইল অ্যাগ্রিগেটর::ফরম্যাটেড);
// এই ফর্ম্যাট করা আউটপুট ফাইলের জন্য লেবেল সেট করুন।
fileHelper.Set2dFormat ("সময় (সেকেন্ড) = %.3e\tCount = %.0f");
// প্রোবের দ্বারা উত্পন্ন মানগুলি লিখুন। যে পথে আমরা
// প্রদান ট্রেসের উৎসকে দ্ব্যর্থহীন করতে সাহায্য করে।
fileHelper.WriteProbe ("ns3::Uinteger32Probe",
"/নাম/ইমিটার/কাউন্টার",
"আউটপুট");
ব্যাপ্তি এবং সীমাবদ্ধতা
বর্তমানে, শুধুমাত্র এই প্রোবগুলি প্রয়োগ করা হয়েছে এবং GnuplotHelper-এর সাথে সংযুক্ত করা হয়েছে
ফাইল হেল্পারের কাছে:
বুলিয়ানপ্রোব
· ডাবলপ্রোব
· Uinteger8Probe
· Uinteger16Probe
· Uinteger32Probe
· টাইমপ্রোব
· প্যাকেটপ্রোব
· ApplicationPacketProbe
· Ipv4PacketProbe
তাই এই প্রোবগুলিই শুধুমাত্র TypeIds ব্যবহার করার জন্য উপলব্ধ প্লটপ্রোব() এবং
WriteProbe().
পরবর্তী কয়েকটি বিভাগে, আমরা প্রতিটি মৌলিক বস্তুর ধরনকে কভার করব (প্রোব, কালেক্টর,
এবং এগ্রিগেটর) আরো বিস্তারিতভাবে দেখান এবং দেখান কিভাবে তারা একসাথে সংযুক্ত হতে পারে
নিম্ন-স্তরের API।
প্রোব
এই বিভাগে প্রোব ক্লাস দ্বারা একটিকে প্রদত্ত কার্যকারিতার বিবরণ দেওয়া হয়েছে ns-3
সিমুলেশন, এবং একটি প্রোগ্রামে তাদের কোড করার উদাহরণ দেয়। এই বিভাগে জন্য বোঝানো হয়
এর সাথে সিমুলেশন তৈরি করতে আগ্রহী ব্যবহারকারীরা ns-3 টুলস এবং ডেটা ব্যবহার করে
সংগ্রহের ফ্রেমওয়ার্ক, যার মধ্যে প্রোব ক্লাস একটি অংশ, এর সাথে ডেটা আউটপুট তৈরি করা হয়
তাদের সিমুলেশন এর ফলাফল।
প্রোব সংক্ষিপ্ত বিবরণ
একটি প্রোব অবজেক্ট সিমুলেশন থেকে একটি ভেরিয়েবলের সাথে সংযুক্ত থাকার কথা যার মান
পুরো পরীক্ষা জুড়ে ব্যবহারকারীর জন্য প্রাসঙ্গিক। তদন্ত কি ছিল রেকর্ড করবে
সিমুলেশন জুড়ে ভেরিয়েবল দ্বারা অনুমান করা মান এবং এই জাতীয় ডেটা অন্যকে প্রেরণ করে
ডেটা সংগ্রহের ফ্রেমওয়ার্কের সদস্য। যদিও এটি এই বিভাগের সুযোগের বাইরে
প্রোব তার আউটপুট তৈরি করার পরে কী ঘটবে তা নিয়ে আলোচনা করুন, এটি বলাই যথেষ্ট
সিমুলেশনের শেষে, ব্যবহারকারীর কাছে কী মানগুলি ছিল সে সম্পর্কে বিস্তারিত তথ্য থাকবে
সিমুলেশনের সময় অনুসন্ধান করা ভেরিয়েবলের ভিতরে সংরক্ষণ করা হয়।
সাধারণত, একটি প্রোব একটি এর সাথে সংযুক্ত থাকে ns-3 উৎস ট্রেস. এই পদ্ধতিতে, যখনই
ট্রেস সোর্স একটি নতুন মান রপ্তানি করে, প্রোব মানটি গ্রাস করে (এবং নিচের দিকে রপ্তানি করে
অন্য বস্তুর নিজস্ব ট্রেস উৎসের মাধ্যমে)।
অনুসন্ধানটিকে ট্রেস উত্সের একটি ফিল্টার হিসাবে বিবেচনা করা যেতে পারে। এর প্রধান কারণ
সম্ভবত সরাসরি একটি ট্রেস উত্সের পরিবর্তে একটি প্রোবের সাথে সংযুক্ত করা নিম্নরূপ:
· কলের সাথে সিমুলেশনের সময় প্রোবগুলি গতিশীলভাবে চালু এবং বন্ধ হতে পারে সক্ষম()
এবং নিষ্ক্রিয়(). উদাহরণস্বরূপ, ডেটা আউটপুট করার সময় বন্ধ করা যেতে পারে
সিমুলেশন ওয়ার্মআপ ফেজ।
· প্রোবগুলি আরও জটিল থেকে মান বের করার জন্য ডেটার উপর অপারেশন করতে পারে
কাঠামো; উদাহরণস্বরূপ, প্রাপ্ত ns3::প্যাকেট থেকে প্যাকেট আকারের মান আউটপুট করা।
প্রোবগুলি ns3::Config নামস্থানে একটি নাম নিবন্ধন করে (ব্যবহার করে নাম::যোগ করুন ()) যাতে অন্য
বস্তু তাদের উল্লেখ করতে পারে.
প্রোবগুলি একটি স্থির পদ্ধতি প্রদান করে যা একজনকে নাম অনুসারে একটি প্রোব পরিচালনা করতে দেয়, যেমন
ns2measure এ কি করা হয় [Cic06]
Stat::put ("my_metric", ID, নমুনা);
উপরের ns3measure কোডের ns-2 সমতুল্য, যেমন
DoubleProbe::SetValueByPath ("/path/to/probe", নমুনা);
সৃষ্টি
মনে রাখবেন যে প্রোব বেস ক্লাস অবজেক্ট তৈরি করা যাবে না কারণ এটি একটি বিমূর্ত বেস
ক্লাস, অর্থাৎ এটিতে বিশুদ্ধ ভার্চুয়াল ফাংশন রয়েছে যা বাস্তবায়িত হয়নি। একটি বস্তু
DoubleProbe টাইপ করুন, যা প্রোব ক্লাসের একটি সাবক্লাস, দেখানোর জন্য এখানে তৈরি করা হবে
কি করা প্রয়োজন.
একজন স্মার্ট পয়েন্টার ক্লাস ব্যবহার করে ডাইনামিক মেমরিতে একটি ডাবলপ্রোব ঘোষণা করে (Ptr ) প্রতি
স্মার্ট পয়েন্টার দিয়ে ডাইনামিক মেমরিতে একটি DoubleProbe তৈরি করুন, একজনকে শুধু কল করতে হবে
ns-3 পদ্ধতি CreateObject():
Ptr myprobe = CreateObject ();
উপরের ঘোষণাটি তার বৈশিষ্ট্যগুলির জন্য ডিফল্ট মান ব্যবহার করে DoubleProbes তৈরি করে।
DoubleProbe ক্লাসে চারটি বৈশিষ্ট্য রয়েছে; বেস ক্লাস অবজেক্টে দুটি
DataCollectionObject, এবং দুটি প্রোব বেস ক্লাসে:
· "নাম" (ডেটা কালেকশন অবজেক্ট), একটি স্ট্রিং ভ্যালু
· "সক্ষম" (DataCollectionObject), একটি বুলিয়ান ভ্যালু
· "স্টার্ট" (প্রোব), একটি টাইম ভ্যালু
· "স্টপ" (প্রোব), একটি টাইম ভ্যালু
নিম্নলিখিত পদ্ধতি ব্যবহার করে কেউ অবজেক্ট তৈরিতে এই জাতীয় বৈশিষ্ট্যগুলি সেট করতে পারে:
Ptr myprobe = CreateObjectWithAttributes (
"নাম", স্ট্রিং ভ্যালু ("মাইপ্রোব"),
"সক্ষম", বুলিয়ান ভ্যালু (মিথ্যা),
"স্টার্ট", টাইম ভ্যালু (সেকেন্ড (100.0)),
"স্টপ", টাইম ভ্যালু (সেকেন্ড (1000.0)));
স্টার্ট এবং স্টপ হল টাইম ভেরিয়েবল যা প্রোবের কর্মের ব্যবধান নির্ধারণ করে। দ্য
সিমুলেশনের বর্তমান সময় যদি এর ভিতরে থাকে তবেই প্রোব ডেটা আউটপুট করবে
অন্তর. স্টপের জন্য 0 সেকেন্ডের বিশেষ সময়ের মান এই বৈশিষ্ট্যটিকে নিষ্ক্রিয় করবে (যেমন
পুরো সিমুলেশনের জন্য প্রোব চালু রাখুন)। Enabled হল একটি পতাকা যা প্রোবকে বা চালু করে
বন্ধ, এবং তথ্য রপ্তানির জন্য প্রোবের জন্য সত্যে সেট করা আবশ্যক। নাম হল বস্তুর নাম
DCF কাঠামোর মধ্যে।
আমদানি হচ্ছে এবং রপ্তানি উপাত্ত
ns-3 ট্রেস উত্স দৃঢ়ভাবে টাইপ করা হয়, তাই একটি ট্রেসে প্রোবকে হুক করার প্রক্রিয়া
উৎস এবং ডেটা রপ্তানির জন্য এর উপশ্রেণীর অন্তর্গত। উদাহরণস্বরূপ, ডিফল্ট
বিতরণ ns-3 একটি শ্রেণী DoubleProbe প্রদান করে যা একটি ট্রেস হুক করার জন্য ডিজাইন করা হয়েছে
একটি ডবল মান রপ্তানি উৎস. আমরা পরবর্তীতে DoubleProbe-এর অপারেশন সম্পর্কে বিস্তারিত জানাব, এবং
তারপর আলোচনা করুন কিভাবে অন্যান্য প্রোব ক্লাস ব্যবহারকারী দ্বারা সংজ্ঞায়িত করা যেতে পারে।
ডাবলপ্রোব সংক্ষিপ্ত বিবরণ
DoubleProbe একটি দ্বিগুণ-মূল্যের সাথে সংযোগ করে ns-3 ট্রেস সোর্স, এবং নিজেই রপ্তানি করে
বিভিন্ন দ্বি-মূল্যবান ns-3 উৎস ট্রেস.
নিম্নলিখিত কোড, থেকে আঁকা src/stats/examples/double-probe-example.cc, মৌলিক দেখায়
ডাবলপ্রোবকে একটি সিমুলেশনে প্লাম্বিং করার অপারেশন, যেখানে এটি একটি কাউন্টার অনুসন্ধান করছে
একটি ইমিটার বস্তু (শ্রেণি ইমিটার) দ্বারা রপ্তানি করা হয়।
Ptr emitter = CreateObject ();
নাম::অ্যাড ("/নাম/ইমিটার", ইমিটার);
...
Ptr probe1 = CreateObject ();
// প্রোবটিকে ইমিটারের কাউন্টারের সাথে সংযুক্ত করুন
bool connected = probe1->ConnectByObject ("কাউন্টার", emitter);
নিম্নলিখিত কোড একই বিকিরণকারী বস্তু দ্বারা রপ্তানি করা একই কাউন্টার অনুসন্ধান করছে। এই
DoubleProbe, যাইহোক, কনফিগারেশন নেমস্পেসে একটি পাথ ব্যবহার করছে
সংযোগ মনে রাখবেন যে নির্গমনকারী কনফিগারেশন নামস্থানে নিজেকে নিবন্ধিত করেছে
এটা তৈরি করা হয়েছিল; অন্যথায়, ConnectByPath কাজ করবে না।
Ptr probe2 = CreateObject ();
// নোট করুন, এখানে কোনো রিটার্ন মান চেক করা হয় না
probe2->ConnectByPath ("/Names/Emitter/Counter");
নিচে দেখানো পরবর্তী DoubleProbe-এ এর পাথ ব্যবহার করে এর মান সেট করা হবে
কনফিগারেশন নামস্থান। উল্লেখ্য, এবার DoubleProbe তে নিবন্ধিত হয়েছে
কনফিগারেশন নেমস্পেস তৈরি হওয়ার পর।
Ptr probe3 = CreateObject ();
probe3->SetName ("Statically AccessedProbe");
// আমাদের এটি কনফিগার ডাটাবেসে যোগ করতে হবে
নাম::অ্যাড ("/নাম/প্রোব", প্রোব3->গেটনাম (), প্রোব3);
এমিটারের Count() ফাংশনটি এখন এই DoubleProbe-এর জন্য মান সেট করতে সক্ষম
অনুসরণ:
অকার্যকর
বিকিরণকারী::গণনা (অকার্যকর)
{
...
m_counter += 1.0;
DoubleProbe::SetValueByPath ("/Names/StaticallyAccessedProbe", m_counter);
...
}
উপরের উদাহরণটি দেখায় যে কীভাবে প্রোবকে কল করা কোডটির একটি সুস্পষ্ট থাকতে হবে না
প্রোবের রেফারেন্স, কিন্তু কনফিগার নামস্থানের মাধ্যমে মান নির্ধারণের নির্দেশ দিতে পারে।
এই কার্যকারিতা অনুরূপ স্ট্যাটাস::পুট পদ্ধতি ns2measure কাগজ দ্বারা প্রবর্তিত
[Cic06], এবং ব্যবহারকারীদের সাময়িকভাবে Probe স্টেটমেন্ট সন্নিবেশ করার অনুমতি দেয় printf, বিবৃতি
বিদ্যমান মধ্যে ns-3 মডেল উল্লেখ্য যে এটিতে DoubleProbe ব্যবহার করতে সক্ষম হওয়ার জন্য
এই মত উদাহরণ, 2 জিনিস প্রয়োজনীয় ছিল:
1. পরিসংখ্যান মডিউল হেডার ফাইলটি উদাহরণ .cc ফাইলে অন্তর্ভুক্ত ছিল
2. উদাহরণটি তার wscript ফাইলের পরিসংখ্যান মডিউলের উপর নির্ভরশীল করা হয়েছিল।
অন্যান্য স্থানে অন্যান্য প্রোব যোগ করার জন্য সাদৃশ্যপূর্ণ জিনিসগুলি করা প্রয়োজন ns-3
কোড বেস।
DoubleProbe এর মানগুলি DoubleProbe::SetValue(), ফাংশন ব্যবহার করেও সেট করা যেতে পারে।
যখন DoubleProbe-এর মান ফাংশন ব্যবহার করে অর্জিত হতে পারে
DoubleProbe::GetValue()।
DoubleProbe তার "আউটপুট" ট্রেস উৎসে দ্বিগুণ মান রপ্তানি করে; একটি নিম্নধারার বস্তু
নিম্নলিখিত হিসাবে এটি একটি ট্রেস সিঙ্ক (NotifyViaProbe) হুক করতে পারেন:
connected = probe1->TraceConnect ("আউটপুট", probe1->GetName (), MakeCallback (&NotifyViaProbe));
অন্যান্য প্রোব
DoubleProbe ছাড়াও, নিম্নলিখিত প্রোবগুলিও উপলব্ধ:
Uinteger8Probe একটির সাথে সংযোগ করে ns-3 ট্রেস উৎস একটি uint8_t রপ্তানি করছে।
Uinteger16Probe একটির সাথে সংযোগ করে ns-3 ট্রেস উৎস একটি uint16_t রপ্তানি করছে।
Uinteger32Probe একটির সাথে সংযোগ করে ns-3 ট্রেস উৎস একটি uint32_t রপ্তানি করছে।
প্যাকেটপ্রোব একটির সাথে সংযোগ করে ns-3 ট্রেস সোর্স একটি প্যাকেট রপ্তানি করছে।
· ApplicationPacketProbe একটি এর সাথে সংযোগ করে ns-3 ট্রেস সোর্স একটি প্যাকেট এবং একটি সকেট রপ্তানি করছে
ঠিকানা।
· Ipv4PacketProbe একটির সাথে সংযোগ করে ns-3 ট্রেস সোর্স একটি প্যাকেট, একটি IPv4 অবজেক্ট এবং রপ্তানি করে
একটি ইন্টারফেস।
তৈরি করা হচ্ছে নতুন প্রোব ধরনের
একটি নতুন প্রোব প্রকার তৈরি করতে, আপনাকে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করতে হবে:
নিশ্চিত করুন যে আপনার নতুন প্রোব ক্লাসটি প্রোব বেস ক্লাস থেকে নেওয়া হয়েছে।
· আপনার নতুন প্রোব ক্লাস থেকে পাওয়া বিশুদ্ধ ভার্চুয়াল ফাংশনগুলি নিশ্চিত করুন
প্রোব বেস ক্লাস বাস্তবায়িত হয়।
একটি বিদ্যমান প্রোব ক্লাস খুঁজুন যা একটি ট্রেস উৎস ব্যবহার করে যা টাইপের সবচেয়ে কাছাকাছি
আপনার প্রোব যে ধরনের ট্রেস সোর্স ব্যবহার করবে।
বিদ্যমান প্রোব ক্লাসের হেডার ফাইল (.h) এবং বাস্তবায়ন ফাইল (.cc) দুটিতে অনুলিপি করুন
আপনার নতুন প্রোবের সাথে মিলে যাওয়া নামের সাথে নতুন ফাইল।
· অনুলিপি করা ফাইলের প্রকার, আর্গুমেন্ট এবং ভেরিয়েবলগুলিকে উপযুক্ত দিয়ে প্রতিস্থাপন করুন
আপনার প্রোবের জন্য টাইপ করুন।
· কোড কম্পাইল করতে এবং এটিকে আপনার মত আচরণ করতে প্রয়োজনীয় পরিবর্তন করুন
মত।
উদাহরণ
দুটি উদাহরণ এখানে বিস্তারিত আলোচনা করা হবে:
· ডাবল প্রোবের উদাহরণ
· IPv4 প্যাকেট প্লট উদাহরণ
ডবল প্রোব উদাহরণ
ডবল প্রোবের উদাহরণ আগে আলোচনা করা হয়েছে। উদাহরণ প্রোগ্রাম পাওয়া যাবে
in src/stats/examples/double-probe-example.cc. এই প্রোগ্রামে যা ঘটে তা সংক্ষিপ্ত করতে,
একটি বিকিরণকারী রয়েছে যা একটি কাউন্টার রপ্তানি করে যা একটি পয়সন প্রক্রিয়া অনুসারে বৃদ্ধি পায়।
বিশেষ করে, ডেটা নির্গত করার দুটি উপায় দেখানো হয়েছে:
1. একটি প্রোবের সাথে সংযুক্ত একটি ট্রেসড ভেরিয়েবলের মাধ্যমে:
ট্রেসড ভ্যালু m_কাউন্টার; // সাধারণত এই পূর্ণসংখ্যা টাইপ হবে
2. একটি কাউন্টারের মাধ্যমে যার মান একটি দ্বিতীয় প্রোবে পোস্ট করা হয়েছে, এর নাম দ্বারা উল্লেখ করা হয়েছে
কনফিগারেশন সিস্টেম:
অকার্যকর
বিকিরণকারী::গণনা (অকার্যকর)
{
NS_LOG_FUNCTION (এটি);
NS_LOG_DEBUG ("এতে গণনা করা হচ্ছে " << সিমুলেটর::এখন ().গেট সেকেন্ড ());
m_counter += 1.0;
DoubleProbe::SetValueByPath ("/Names/StaticallyAccessedProbe", m_counter);
সিমুলেটর::শিডিউল (সেকেন্ড (m_var->GetValue ()), &Emitter::count, this);
}
আসুন আরও মনোযোগ সহকারে প্রোবটি দেখি। প্রোবগুলি তাদের মান একাধিকতে গ্রহণ করতে পারে
উপায়:
1. প্রোবের মাধ্যমে সরাসরি ট্রেস সোর্স অ্যাক্সেস করা এবং এটির সাথে একটি ট্রেস সিঙ্ক সংযোগ করা
2. প্রোবের দ্বারা কনফিগার নেমস্পেসের মাধ্যমে ট্রেস সোর্স অ্যাক্সেস করা এবং a সংযোগ করা
এটা ট্রেস ডুবা
3. কলিং কোড দ্বারা স্পষ্টভাবে প্রোবের কলিং সেট ভ্যালু() পদ্ধতি
4. কলিং কোড দ্বারা স্পষ্টভাবে কল করা SetValueByPath
("/পাথ/থ্রু/কনফিগ/নেমস্পেস", ...)
প্রথম দুটি কৌশল সবচেয়ে সাধারণ বলে আশা করা হচ্ছে। এছাড়াও উদাহরণে,
একটি সাধারণ কলব্যাক ফাংশনের হুকিং দেখানো হয়, যেমনটি সাধারণত করা হয় ns-3. এই
কলব্যাক ফাংশন একটি প্রোব বস্তুর সাথে যুক্ত নয়। আমরা এই ক্ষেত্রে 0) নীচে কল করব।
// এটি একটি ফাংশন যা ট্রেস উত্সে একটি কাঁচা ফাংশন হুক করা পরীক্ষা করার জন্য
অকার্যকর
NotifyViaTraceSource (std::string context, double oldVal, double newVal)
{
NS_LOG_DEBUG ("প্রসঙ্গ: " << প্রসঙ্গ << " পুরানো " << পুরানো ভ্যাল << " নতুন " << নতুন ভ্যাল);
}
প্রথমত, ইমিটার সেটআপ করা দরকার:
Ptr emitter = CreateObject ();
নাম::অ্যাড ("/নাম/ইমিটার", ইমিটার);
// Emitter অবজেক্ট একটি ns-3 নোডের সাথে যুক্ত নয়, তাই
// এটি স্বয়ংক্রিয়ভাবে শুরু হবে না, তাই আমাদের নিজেরাই এটি করতে হবে
সিমুলেটর::শিডিউল (সেকেন্ড (0.0), &ইমিটার::স্টার্ট, ইমিটার);
নিচে দেখানো উদাহরণে বিভিন্ন DoubleProbes ইমিটারের সাথে ইন্টারঅ্যাক্ট করে।
কেস 0):
// নীচের একটি প্রোব ছাড়া সাধারণ কার্যকারিতা দেখায়
// (একটি ট্রেস উৎসে একটি সিঙ্ক ফাংশন সংযোগ করুন)
//
connected = emitter->TraceConnect ("কাউন্টার", "নমুনা প্রসঙ্গ", MakeCallback (&NotifyViaTraceSource));
NS_ASSERT_MSG (সংযুক্ত, "ট্রেস উত্স সংযুক্ত নয়");
মামলা 1):
//
// Probe1 সরাসরি ইমিটার ট্রেস সোর্স অবজেক্টে হুক করা হবে
//
// probe1 এমিটার ট্রেস উৎসের সাথে সংযুক্ত করা হবে
Ptr probe1 = CreateObject ();
// প্রোবের নাম ট্রেসিং এর প্রসঙ্গ হিসাবে কাজ করতে পারে
probe1->SetName ("ObjectProbe");
// প্রোবটিকে ইমিটারের কাউন্টারের সাথে সংযুক্ত করুন
connected = probe1->ConnectByObject ("কাউন্টার", emitter);
NS_ASSERT_MSG (সংযুক্ত, "ট্রেস সোর্স প্রোবের সাথে সংযুক্ত নয়");
মামলা 2):
//
// Probe2 দ্বারা ইমিটার ট্রেস সোর্স অবজেক্টের সাথে হুক করা হবে
// কনফিগার ডাটাবেসে পাথ নামের দ্বারা এটি অ্যাক্সেস করা
//
// আরেকটি অনুরূপ প্রোব তৈরি করুন; এটি একটি কনফিগার পাথের মাধ্যমে হুক আপ হবে
Ptr probe2 = CreateObject ();
probe2->SetName ("PathProbe");
// নোট করুন, এখানে কোনো রিটার্ন মান চেক করা হয় না
probe2->ConnectByPath ("/Names/Emitter/Counter");
কেস 4) (কেস 3 এই উদাহরণে দেখানো হয়নি):
//
// Probe3 এমিটারের মাধ্যমে সরাসরি কল করা হবে
// স্ট্যাটিক পদ্ধতি SetValueByPath()।
//
Ptr probe3 = CreateObject ();
probe3->SetName ("Statically AccessedProbe");
// আমাদের এটি কনফিগার ডাটাবেসে যোগ করতে হবে
নাম::অ্যাড ("/নাম/প্রোব", প্রোব3->গেটনাম (), প্রোব3);
এবং অবশেষে, উদাহরণটি দেখায় কিভাবে প্রোবগুলিকে আউটপুট তৈরি করতে হুক করা যেতে পারে:
// প্রোবের নিজেই আউটপুট তৈরি করা উচিত। প্রসঙ্গ যে আমরা প্রদান
// এই প্রোবের জন্য (এই ক্ষেত্রে, প্রোবের নাম) দ্ব্যর্থতা নিরসন করতে সাহায্য করবে
// ট্রেসের উৎস
connected = probe3->TraceConnect ("আউটপুট",
"/Names/Probes/Statically AccessedProbe/Output",
মেককলব্যাক (&NotifyViaProbe));
NS_ASSERT_MSG (সংযুক্ত, "ট্রেস সোর্স নয় .. probe3 আউটপুটের সাথে সংযুক্ত");
নিম্নলিখিত কলব্যাকটি ব্যাখ্যামূলক উদ্দেশ্যে এই উদাহরণে প্রোবের সাথে সংযুক্ত করা হয়েছে;
সাধারণত, প্রোব একটি সংগ্রাহক বস্তুর সাথে সংযুক্ত করা হবে।
// এটি একটি ফাংশন যা প্রোবের আউটপুটে হুক করে পরীক্ষা করার জন্য
অকার্যকর
NotifyViaProbe (std::স্ট্রিং প্রসঙ্গ, ডবল OldVal, ডবল newVal)
{
NS_LOG_DEBUG ("প্রসঙ্গ: " << প্রসঙ্গ << " পুরানো " << পুরানো ভ্যাল << " নতুন " << নতুন ভ্যাল);
}
IPv4 মোড়ক চক্রান্ত উদাহরণ
IPv4 প্যাকেট প্লট উদাহরণ থেকে পঞ্চম.cc উদাহরণের উপর ভিত্তি করে ns-3 টিউটোরিয়াল। এটা
পাওয়া যাবে src/stats/examples/ipv4-packet-plot-example.cc.
নোড 0 নোড 1
+----------------+ +----------------+
| ns-3 TCP | | ns-3 TCP |
+----------------+ +----------------+
| 10.1.1.1 | | 10.1.1.2 |
+----------------+ +----------------+
| পয়েন্ট টু পয়েন্ট | | পয়েন্ট টু পয়েন্ট |
+----------------+ +----------------+
| |
+------------
আমরা কেবল প্রোবের দিকে তাকাব, কারণ এটি ব্যাখ্যা করে যে প্রোবগুলি থেকে মানগুলিও আনপ্যাক করতে পারে
কাঠামো (এই ক্ষেত্রে, প্যাকেট) এবং সেই মানগুলিকে ট্রেস সোর্স আউটপুট হিসাবে রিপোর্ট করুন
শুধু একই ধরনের ডেটার মধ্য দিয়ে যাওয়ার চেয়ে।
এই উদাহরণের অন্যান্য দিক রয়েছে যা পরে ডকুমেন্টেশনে ব্যাখ্যা করা হবে।
রপ্তানি করা হয় যে দুই ধরনের ডেটা প্যাকেট নিজেই (আউটপুট) এবং একটি গণনা
প্যাকেটে বাইটের সংখ্যা (আউটপুটবাইট).
টাইপআইডি
Ipv4PacketProbe::GetTypeId ()
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::Ipv4PacketProbe")
.SetParent ()
.AddConstructor ()
.AddTraceSource ( "আউটপুট",
"প্যাকেট এবং এর IPv4 অবজেক্ট এবং ইন্টারফেস যা এই প্রোবের আউটপুট হিসাবে কাজ করে",
MakeTraceSourceAccessor (&Ipv4PacketProbe::m_output))
.TraceSource যোগ করুন ( "আউটপুটবাইটস",
"প্যাকেটে বাইটের সংখ্যা",
MakeTraceSourceAccessor (&Ipv4PacketProbe::m_outputBytes))
;
রিটার্ন tid;
}
যখন প্রোবের ট্রেস সিঙ্ক একটি প্যাকেট পায়, যদি প্রোব সক্রিয় থাকে, তাহলে এটি আউটপুট করবে
তার উপর প্যাকেট আউটপুট ট্রেস সোর্স, কিন্তু এটি বাইটের সংখ্যাও আউটপুট করবে
আউটপুটবাইট উৎস ট্রেস.
অকার্যকর
Ipv4PacketProbe::TraceSink (Ptr প্যাকেট, Ptr ipv4, uint4_t ইন্টারফেস)
{
NS_LOG_FUNCTION (এই << প্যাকেট << ipv4 << ইন্টারফেস);
যদি (সক্ষম ())
{
m_packet = প্যাকেট;
m_ipv4 = ipv4;
m_interface = ইন্টারফেস;
m_output (প্যাকেট, ipv4, ইন্টারফেস);
uint32_t packetSizeNew = প্যাকেট->GetSize ();
m_outputBytes (m_packetSizeOld, packetSizeNew);
m_packetSizeOld = packetSizeNew;
}
}
তথ্যসূত্র
[Cic06]
Claudio Cicconetti, Enzo Mingozzi, Giovanni Stea, "এর জন্য একটি সমন্বিত কাঠামো
কার্যকরী তথ্য সংগ্রহ এবং পরিসংখ্যান বিশ্লেষণ সক্ষম করা ns2, কর্মশালা
ns-2 (WNS2), পিসা, ইতালি, অক্টোবর 2006।
সংগ্রাহক
এই বিভাগটি কালেক্টর দ্বারা প্রদত্ত কার্যকারিতাগুলির বিশদ বিবরণের জন্য একটি স্থানধারক৷
একটি থেকে ক্লাস ns-3 সিমুলেশন, এবং একটি প্রোগ্রামে তাদের কোড করার উদাহরণ দেয়।
বিঃদ্রঃ: ns-3.18 অনুযায়ী, সংগ্রাহক এখনও বিকাশের অধীনে রয়েছে এবং এখনও অংশ হিসাবে সরবরাহ করা হয়নি
কাঠামোর।
সংযোগকারীগণ
এই বিভাগে অ্যাগ্রিগেটর শ্রেণী দ্বারা একটিকে প্রদত্ত কার্যকারিতার বিবরণ রয়েছে ns-3
সিমুলেশন এই বিভাগটির সাথে সিমুলেশন তৈরি করতে আগ্রহী ব্যবহারকারীদের জন্য বোঝানো হয়েছে৷
ns-3 টুলস এবং ডেটা কালেকশন ফ্রেমওয়ার্ক ব্যবহার করে, যার মধ্যে অ্যাগ্রিগেটর ক্লাস হল a
অংশ, তাদের সিমুলেশনের ফলাফলের সাথে ডেটা আউটপুট তৈরি করতে।
সমষ্টিবিদ সংক্ষিপ্ত বিবরণ
একটি অ্যাগ্রিগেটর অবজেক্টকে এক বা একাধিক ট্রেস উত্সের সাথে হুক করার কথা
ইনপুট গ্রহণ করুন। অ্যাগ্রিগেটর হল নেটওয়ার্ক দ্বারা সংগৃহীত ডেটার শেষ বিন্দু
সিমুলেশনের সময় প্রোব এবং কালেক্টর। এগুলো নেওয়া অ্যাগ্রিগেটরের কাজ
মান এবং তাদের চূড়ান্ত আউটপুট বিন্যাসে রূপান্তর করুন যেমন প্লেইন টেক্সট ফাইল,
স্প্রেডশীট ফাইল, প্লট, বা ডাটাবেস।
সাধারণত, একটি সমষ্টিকারী এক বা একাধিক সংগ্রাহকের সাথে সংযুক্ত থাকে। এই পদ্ধতিতে, যখনই
সংগ্রাহকদের ট্রেস সোর্স নতুন মান রপ্তানি করে, অ্যাগ্রিগেটর মানটি প্রক্রিয়া করতে পারে
এটি চূড়ান্ত আউটপুট বিন্যাসে ব্যবহার করা যেতে পারে যেখানে ডেটা মানগুলি এর পরে থাকবে
সিমুলেশন।
Aggregators সম্পর্কে নিম্নলিখিত নোট করুন:
· কলের সাথে সিমুলেশনের সময় অ্যাগ্রিগেটরগুলি গতিশীলভাবে চালু এবং বন্ধ হতে পারে
সক্ষম() এবং নিষ্ক্রিয়(). উদাহরণস্বরূপ, ডেটা একত্রিত করার সময় বন্ধ করা যেতে পারে
সিমুলেশন ওয়ার্মআপ ফেজ, যার মানে সেই মানগুলি ফাইনালে অন্তর্ভুক্ত করা হবে না
আউটপুট মাধ্যম।
· সমষ্টিকারীরা কলব্যাকের মাধ্যমে সংগ্রাহকদের কাছ থেকে ডেটা গ্রহণ করে। যখন একজন কালেক্টর যুক্ত থাকে
একটি এগ্রিগেটরকে, Aggregator এর ট্রেস স্থাপন করতে TraceConnect-এ একটি কল করা হয়
কলব্যাক হিসাবে সিঙ্ক পদ্ধতি।
আজ পর্যন্ত, দুটি সমষ্টিকারী বাস্তবায়িত হয়েছে:
· GnuplotAggregator
· ফাইল অ্যাগ্রিগেটর
GnuplotAggregator
GnuplotAggregator gnuplots তৈরি করতে ব্যবহৃত আউটপুট ফাইল তৈরি করে।
GnuplotAggregator সিমুলেশনের শেষে 3টি ভিন্ন ফাইল তৈরি করবে:
একটি স্পেস বিভক্ত gnuplot ডেটা ফাইল
একটি gnuplot কন্ট্রোল ফাইল
gnuplot তৈরি করার জন্য একটি শেল স্ক্রিপ্ট
সৃষ্টি
কী করা দরকার তা দেখানোর জন্য এখানে GnuplotAggregator ধরনের একটি অবজেক্ট তৈরি করা হবে।
একজন স্মার্ট পয়েন্টার ক্লাস ব্যবহার করে গতিশীল মেমরিতে একটি GnuplotAggregator ঘোষণা করে
(Ptr ) স্মার্ট পয়েন্টার সহ ডায়নামিক মেমরিতে একটি GnuplotAggregator তৈরি করতে, একটি মাত্র
কল করতে হবে ns-3 পদ্ধতি CreateObject(). থেকে নিম্নলিখিত কোড
src/stats/examples/gnuplot-aggregator-example.cc এটি কিভাবে করতে হয় তা দেখায়:
string fileNameWithoutExtension = "gnuplot-এগ্রিগেটর";
// একটি এগ্রিগেটর তৈরি করুন।
Ptr aggregator =
অবজেক্ট তৈরি করুন (fileNameWithoutExtension);
কনস্ট্রাক্টরের জন্য প্রথম আর্গুমেন্ট, fileNameWithoutExtension, এর নাম
gnuplot সম্পর্কিত ফাইল কোন এক্সটেনশন ছাড়া লিখতে. এই GnuplotAggregator একটি তৈরি করবে
"gnuplot-aggregator.dat" নামে স্পেস বিভক্ত gnuplot ডেটা ফাইল, একটি gnuplot কন্ট্রোল ফাইল
"gnuplot-aggregator.plt" নামে, এবং + নামের gnuplot তৈরি করার জন্য একটি শেল স্ক্রিপ্ট
"gnuplot-aggregator.sh"।
তৈরি করা gnuplot এর কী 4টি ভিন্ন স্থানে থাকতে পারে:
· চাবি নেই
· প্লটের ভিতরে কী (ডিফল্ট)
· প্লটের উপরে কী
· প্লটের নীচে কী
নিম্নলিখিত gnuplot কী অবস্থান enum মানগুলি কীটির অবস্থান নির্দিষ্ট করতে অনুমোদিত:
enum কী অবস্থান {
চাবি নেই,
KEY_INSIDE,
KEY_ABOVE,
KEY_BELOW
};
যদি এটি ভিতরের ডিফল্ট অবস্থানের চেয়ে নীচের চাবিটি থাকতে চায় তবে
আপনি নিম্নলিখিত করতে পারেন.
aggregator->SetKeyLocation(GnuplotAggregator::KEY_BELOW);
উদাহরণ
একটি উদাহরণ এখানে বিস্তারিত আলোচনা করা হবে:
গ্নুপ্লট অ্যাগ্রিগেটর উদাহরণ
জ্ঞানপ্লট সমষ্টিবিদ উদাহরণ
GnuplotAggregator অনুশীলন করে এমন একটি উদাহরণ পাওয়া যাবে
src/stats/examples/gnuplot-aggregator-example.cc.
নিম্নলিখিত 2-D gnuplot উদাহরণ ব্যবহার করে তৈরি করা হয়েছিল।
[ছবি] 2-ডি গ্নুপ্লট gnuplot-aggregator-example.cc দ্বারা নির্মিত উদাহরণ..UNINDENT
উদাহরণ থেকে এই কোডটি দেখায় কিভাবে GnuplotAggregator তৈরি করতে হয় যেমন আলোচনা করা হয়েছিল
উপরে।
অকার্যকর Create2dPlot ()
{
নেমস্পেস স্ট্যান্ড ব্যবহার করে;
string fileNameWithoutExtension = "gnuplot-এগ্রিগেটর";
string plotTitle = "গ্নুপ্লট অ্যাগ্রিগেটর প্লট";
string plotXAxisHeading = "সময় (সেকেন্ড)";
string plotYAxisHeading = "দ্বৈত মান";
string plotDatasetLabel = "ডেটা মান";
string datasetContext = "ডেটাসেট/প্রসঙ্গ/স্ট্রিং";
// একটি এগ্রিগেটর তৈরি করুন।
Ptr aggregator =
অবজেক্ট তৈরি করুন (fileNameWithoutExtension);
বিভিন্ন GnuplotAggregator অ্যাট্রিবিউট সেট করা আছে যার মধ্যে থাকবে 2-D ডেটাসেট
চক্রান্ত করা
// সমষ্টিগত বৈশিষ্ট্য সেট করুন।
aggregator->SetTerminal ("png");
aggregator->SetTitle (plotTitle);
aggregator->SetLegend (plotXAxisHeading, plotYAxisHeading);
// এগ্রিগেটরে একটি ডেটা সেট যোগ করুন।
aggregator->Add2dDataset (dataset Context, plotDatasetLabel);
// অ্যাগ্রিগেটর চালু করতে হবে
aggregator->সক্ষম ();
এর পরে, 2-ডি মানগুলি গণনা করা হয় এবং প্রতিটিতে পৃথকভাবে লেখা হয়৷
GnuplotAggregator ব্যবহার করে লিখুন2d() ফাংশন.
দ্বিগুণ সময়;
দ্বিগুণ মান;
// 2-ডি ডেটাসেট তৈরি করুন।
জন্য (সময় = -5.0; সময় <= +5.0; সময় += 1.0)
{
// 2-ডি বক্ররেখা গণনা করুন
//
// 2/XNUMX/XNUMX
// মান = সময়।
//
মান = সময় * সময়;
// প্লটে এই পয়েন্টটি যোগ করুন।
aggregator->Write2d (ডেটাসেট কনটেক্সট, সময়, মান);
}
// সমষ্টিকারীর জন্য ডেটা লগিং অক্ষম করুন।
aggregator->অক্ষম ();
}
ফাইল এগ্রিগেটর
FileAggregator একটি ফাইলে প্রাপ্ত মানগুলি পাঠায়।
FileAggregator 4টি বিভিন্ন ধরনের ফাইল তৈরি করতে পারে:
· বিন্যাসিত
· স্থান পৃথক করা হয়েছে (ডিফল্ট)
· কমা পৃথক করা হয়েছে
· ট্যাব আলাদা করা হয়েছে
ফর্ম্যাট করা ফাইলগুলি তাদের মুদ্রণের জন্য C-স্টাইল ফর্ম্যাট স্ট্রিং এবং sprintf() ফাংশন ব্যবহার করে
ফাইলের মান লেখা হচ্ছে।
সৃষ্টি
কী করা দরকার তা দেখানোর জন্য এখানে FileAggregator ধরনের একটি বস্তু তৈরি করা হবে।
স্মার্ট পয়েন্টার ক্লাস ব্যবহার করে ডাইনামিক মেমরিতে একটি ফাইল অ্যাগ্রিগেটর ঘোষণা করে (Ptr )
স্মার্ট পয়েন্টার সহ গতিশীল মেমরিতে একটি ফাইল অ্যাগ্রিগেটর তৈরি করতে, একজনকে কেবল কল করতে হবে
দ্য ns-3 পদ্ধতি CreateObject. থেকে নিম্নলিখিত কোড
src/stats/examples/file-aggregator-example.cc এটি কিভাবে করতে হয় তা দেখায়:
string fileName = "file-agregator-formatted-values.txt";
// একটি এগ্রিগেটর তৈরি করুন যাতে ফরম্যাট করা মান থাকবে।
Ptr aggregator =
অবজেক্ট তৈরি করুন (ফাইলের নাম, ফাইল অ্যাগ্রিগেটর::ফরম্যাটেড);
কনস্ট্রাক্টরের জন্য প্রথম আর্গুমেন্ট, ফাইলের নাম, লেখার জন্য ফাইলের নাম; দ্য
দ্বিতীয় যুক্তি, ফাইল টাইপ, লেখার জন্য ফাইলের প্রকার। এই FileAggregator একটি তৈরি করবে
"file-agregator-formatted-values.txt" নামের ফাইলটির মানগুলি দ্বারা নির্দিষ্ট করা মুদ্রিত
ফাইল টাইপ, অর্থাৎ, এই ক্ষেত্রে ফরম্যাট করা হয়েছে।
নিম্নলিখিত ফাইল প্রকার enum মান অনুমোদিত:
enum ফাইল টাইপ {
ফর্ম্যাটেড,
SPACE_SEPARATED,
COMMA_SEPARATED,
TAB_SEPARATED
};
উদাহরণ
একটি উদাহরণ এখানে বিস্তারিত আলোচনা করা হবে:
ফাইল অ্যাগ্রিগেটর উদাহরণ
ফাইল সমষ্টিবিদ উদাহরণ
ফাইল অ্যাগ্রিগেটর অনুশীলন করে এমন একটি উদাহরণ পাওয়া যাবে
src/stats/examples/file-aggregator-example.cc.
কমা দ্বারা পৃথক করা মানগুলির 2 কলাম সহ নিম্নলিখিত পাঠ্য ফাইলটি ব্যবহার করে তৈরি করা হয়েছিল
উদাহরণ
-5,25
-4,16
-3,9
-2,4
-1,1
0,0
1,1
2,4
3,9
4,16
5,25
উদাহরণ থেকে এই কোডটি দেখায় যে কীভাবে ফাইল অ্যাগ্রিগেটর তৈরি করা যায় যেমন আলোচনা করা হয়েছিল
উপরে।
অকার্যকর তৈরি করুন কমা বিভাজিত ফাইল ()
{
নেমস্পেস স্ট্যান্ড ব্যবহার করে;
string fileName = "ফাইল-এগ্রিগেটর-কমা-বিভাজিত.txt";
string datasetContext = "ডেটাসেট/প্রসঙ্গ/স্ট্রিং";
// একটি এগ্রিগেটর তৈরি করুন।
Ptr aggregator =
অবজেক্ট তৈরি করুন (ফাইলের নাম, ফাইল অ্যাগ্রিগেটর::COMMA_SEPARATED);
FileAggregator বৈশিষ্ট্য সেট করা হয়.
// অ্যাগ্রিগেটর চালু করতে হবে
aggregator->সক্ষম ();
এর পরে, 2-ডি মানগুলি গণনা করা হয় এবং প্রতিটিতে পৃথকভাবে লেখা হয়৷
FileAggregator ব্যবহার করে লিখুন2d() ফাংশন.
দ্বিগুণ সময়;
দ্বিগুণ মান;
// 2-ডি ডেটাসেট তৈরি করুন।
জন্য (সময় = -5.0; সময় <= +5.0; সময় += 1.0)
{
// 2-ডি বক্ররেখা গণনা করুন
//
// 2/XNUMX/XNUMX
// মান = সময়।
//
মান = সময় * সময়;
// প্লটে এই পয়েন্টটি যোগ করুন।
aggregator->Write2d (ডেটাসেট কনটেক্সট, সময়, মান);
}
// সমষ্টিকারীর জন্য ডেটা লগিং অক্ষম করুন।
aggregator->অক্ষম ();
}
ফর্ম্যাট করা মানগুলির 2 কলাম সহ নিম্নলিখিত পাঠ্য ফাইলটিও ব্যবহার করে তৈরি করা হয়েছিল
উদাহরণ
সময় = -5.000e+00 মান = 25
সময় = -4.000e+00 মান = 16
সময় = -3.000e+00 মান = 9
সময় = -2.000e+00 মান = 4
সময় = -1.000e+00 মান = 1
সময় = 0.000e+00 মান = 0
সময় = 1.000e+00 মান = 1
সময় = 2.000e+00 মান = 4
সময় = 3.000e+00 মান = 9
সময় = 4.000e+00 মান = 16
সময় = 5.000e+00 মান = 25
উদাহরণ থেকে এই কোডটি দেখায় যে কীভাবে ফাইল অ্যাগ্রিগেটর তৈরি করা যায় যেমন আলোচনা করা হয়েছিল
উপরে।
অকার্যকর CreateFormattedFile ()
{
নেমস্পেস স্ট্যান্ড ব্যবহার করে;
string fileName = "file-agregator-formatted-values.txt";
string datasetContext = "ডেটাসেট/প্রসঙ্গ/স্ট্রিং";
// একটি এগ্রিগেটর তৈরি করুন যাতে ফরম্যাট করা মান থাকবে।
Ptr aggregator =
অবজেক্ট তৈরি করুন (ফাইলের নাম, ফাইল অ্যাগ্রিগেটর::ফরম্যাটেড);
ফাইল অ্যাগ্রিগেটর অ্যাট্রিবিউট সেট করা আছে, সি-স্টাইল ফর্ম্যাট স্ট্রিং ব্যবহার করার জন্য।
// মানগুলির জন্য বিন্যাস সেট করুন।
aggregator->Set2dFormat ("Time = %.3e\tValue = %.0f");
// অ্যাগ্রিগেটর চালু করতে হবে
aggregator->সক্ষম ();
এর পরে, 2-ডি মানগুলি গণনা করা হয় এবং প্রতিটিতে পৃথকভাবে লেখা হয়৷
FileAggregator ব্যবহার করে লিখুন2d() ফাংশন.
দ্বিগুণ সময়;
দ্বিগুণ মান;
// 2-ডি ডেটাসেট তৈরি করুন।
জন্য (সময় = -5.0; সময় <= +5.0; সময় += 1.0)
{
// 2-ডি বক্ররেখা গণনা করুন
//
// 2/XNUMX/XNUMX
// মান = সময়।
//
মান = সময় * সময়;
// প্লটে এই পয়েন্টটি যোগ করুন।
aggregator->Write2d (ডেটাসেট কনটেক্সট, সময়, মান);
}
// সমষ্টিকারীর জন্য ডেটা লগিং অক্ষম করুন।
aggregator->অক্ষম ();
}
অ্যাডাপ্টার
এই বিভাগে অ্যাডাপ্টার ক্লাস দ্বারা একটিকে প্রদত্ত কার্যকারিতাগুলির বিবরণ রয়েছে৷ ns-3
সিমুলেশন এই বিভাগটির সাথে সিমুলেশন তৈরি করতে আগ্রহী ব্যবহারকারীদের জন্য বোঝানো হয়েছে৷
ns-3 টুলস এবং ডেটা কালেকশন ফ্রেমওয়ার্ক ব্যবহার করে, যার মধ্যে অ্যাডাপ্টার ক্লাস একটি অংশ,
তাদের সিমুলেশনের ফলাফলের সাথে ডেটা আউটপুট তৈরি করতে।
দ্রষ্টব্য: 'অ্যাডাপ্টর' শব্দটিও 'অ্যাডাপ্টার' বানান হতে পারে; আমরা সারিবদ্ধ বানান বেছে নিয়েছি
C++ স্ট্যান্ডার্ড সহ।
এডাপটার সংক্ষিপ্ত বিবরণ
একটি অ্যাডাপ্টার বিভিন্ন ধরনের DCF বস্তুর মধ্যে সংযোগ করতে ব্যবহৃত হয়।
আজ অবধি, একটি অ্যাডাপ্টার প্রয়োগ করা হয়েছে:
· টাইম সিরিজ অ্যাডাপ্টর
সময় ক্রম এডাপটার
TimeSeriesAdaptor প্রোবকে কোনো প্রয়োজন ছাড়াই সরাসরি অ্যাগ্রিগেটরদের সাথে সংযোগ করতে দেয়
এর মধ্যে কালেক্টর।
উভয় বাস্তবায়িত DCF সাহায্যকারীরা তদন্ত করার জন্য TimeSeriesAdaptors ব্যবহার করে
বিভিন্ন ধরনের মান এবং বর্তমান সময়ের আউটপুট এবং উভয় রূপান্তর সহ মান
দ্বিগুণ করতে
TimeSeriesAdaptor ক্লাসের ভূমিকা হল একটি অ্যাডাপ্টরের ভূমিকা, যা কাঁচা-মূল্য গ্রহণ করে
বিভিন্ন ধরণের প্রোব ডেটা এবং দুটি দ্বিগুণ মানের একটি টিপল আউটপুট করে। প্রথমটি হল ক
টাইমস্ট্যাম্প, যা বিভিন্ন রেজোলিউশনে সেট করা হতে পারে (যেমন সেকেন্ড, মিলিসেকেন্ড, ইত্যাদি)
ভবিষ্যত কিন্তু যা বর্তমানে সেকেন্ডে হার্ডকোড করা হয়েছে। দ্বিতীয়টি হল a এর রূপান্তর
নন-ডবল মান থেকে দ্বিগুণ মান (সম্ভবত নির্ভুলতা হারানোর সাথে)।
সুযোগ/সীমাবদ্ধতা
এই বিভাগে তথ্য সংগ্রহের ফ্রেমওয়ার্কের সুযোগ এবং সীমাবদ্ধতা নিয়ে আলোচনা করা হয়েছে।
বর্তমানে, শুধুমাত্র এই প্রোবগুলি DCF এ প্রয়োগ করা হয়েছে:
বুলিয়ানপ্রোব
· ডাবলপ্রোব
· Uinteger8Probe
· Uinteger16Probe
· Uinteger32Probe
· টাইমপ্রোব
· প্যাকেটপ্রোব
· ApplicationPacketProbe
· Ipv4PacketProbe
বর্তমানে, DCF-এ কোন কালেক্টর পাওয়া যায় না, যদিও একজন BasicStatsCollector এর অধীনে
উন্নয়ন।
বর্তমানে, শুধুমাত্র এই Aggregators DCF-তে প্রয়োগ করা হয়েছে:
· GnuplotAggregator
· ফাইল অ্যাগ্রিগেটর
বর্তমানে, শুধুমাত্র এই অ্যাডাপ্টারটি DCF এ প্রয়োগ করা হয়েছে:
টাইম-সিরিজ অ্যাডাপ্টর।
ভবিষ্যৎ হয়া যাই ?
এই বিভাগে ডেটা সংগ্রহের ফ্রেমওয়ার্কের ভবিষ্যতের কাজগুলি নিয়ে আলোচনা করা হয়েছে।
এখানে কিছু জিনিস যা এখনও করা দরকার:
· আরও ট্রেস উত্সকে সংযুক্ত করুন ns-3 সিমুলেটর থেকে আরও মান পেতে কোড।
বর্তমানে যত ধরনের প্রোব আছে তার চেয়ে বেশি ধরনের প্রোব প্রয়োগ করুন।
শুধুমাত্র একক বর্তমান 2-ডি কালেক্টর, বেসিকস্ট্যাটসকলেক্টরের চেয়ে আরও বেশি কিছু প্রয়োগ করুন।
· আরও অ্যাগ্রিগেটর প্রয়োগ করুন।
· শুধু অ্যাডাপ্টরের চেয়ে বেশি কিছু প্রয়োগ করুন।
পরিসংখ্যানসংক্রান্ত ফ্রেমওয়ার্ক
এই অধ্যায়ে সিমুলেশন ডেটা সংগ্রহ এবং পরিসংখ্যানগত কাঠামোর কাজের রূপরেখা দেওয়া হয়েছে
ns-3.
পরিসংখ্যান কাঠামোর জন্য উৎস কোড ডিরেক্টরিতে থাকে src/পরিসংখ্যান.
গোল
এই প্রচেষ্টার প্রাথমিক উদ্দেশ্যগুলি নিম্নরূপ:
· বিশ্লেষণের জন্য ডেটা এবং পরিসংখ্যান রেকর্ড, গণনা এবং উপস্থাপনের কার্যকারিতা প্রদান করুন
নেটওয়ার্ক সিমুলেশনের।
· ব্যাপক ট্রেস লগ ইন তৈরি করার প্রয়োজনীয়তা হ্রাস করে সিমুলেশন কর্মক্ষমতা বৃদ্ধি করুন
তথ্য সংগ্রহ করার জন্য।
· অনলাইন পরিসংখ্যানের মাধ্যমে সিমুলেশন নিয়ন্ত্রণ সক্ষম করুন, যেমন সিমুলেশন বন্ধ করা বা
পুনরাবৃত্তি ট্রায়াল
প্রাপ্ত উপ-লক্ষ্য এবং অন্যান্য লক্ষ্য বৈশিষ্ট্যগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
বেসিক ইন্সট্রুমেন্টেশন ফ্রেমওয়ার্ক হিসাবে বিদ্যমান ns-3 ট্রেসিং সিস্টেমের সাথে একীকরণ
অভ্যন্তরীণ সিমুলেশন ইঞ্জিনের, যেমন নেটওয়ার্ক স্ট্যাক, নেট ডিভাইস এবং চ্যানেল।
· ব্যবহারকারীদের ট্রেসিং ব্যবহারের প্রয়োজন ছাড়াই পরিসংখ্যান কাঠামো ব্যবহার করতে সক্ষম করা
পদ্ধতি.
· ব্যবহারকারীদের একাধিক পরীক্ষায় ডেটা তৈরি, একত্রিত এবং বিশ্লেষণে সহায়তা করা।
· ব্যবহারকারীর তৈরি ইন্সট্রুমেন্টেশনের জন্য সমর্থন, যেমন অ্যাপ্লিকেশন নির্দিষ্ট ইভেন্ট এবং
পরিমাপ করে।
· কম মেমরি এবং CPU ওভারহেড যখন প্যাকেজ ব্যবহার করা হয় না।
· বিদ্যমান বিশ্লেষণ এবং আউটপুট সরঞ্জামগুলি যতটা সম্ভব ব্যবহার করা। ফ্রেমওয়ার্ক হতে পারে
কিছু মৌলিক পরিসংখ্যান প্রদান, কিন্তু ফোকাস তথ্য সংগ্রহ এবং এটি তৈরি করা হয়
প্রতিষ্ঠিত সরঞ্জামগুলিতে ম্যানিপুলেশনের জন্য অ্যাক্সেসযোগ্য।
· স্বাধীন প্রতিলিপি বিতরণের জন্য চূড়ান্ত সমর্থন গুরুত্বপূর্ণ কিন্তু অন্তর্ভুক্ত নয়
বৈশিষ্ট্যের প্রথম রাউন্ডে।
সংক্ষিপ্ত বিবরণ
পরিসংখ্যান কাঠামোতে নিম্নলিখিত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে:
· মূল কাঠামো এবং দুটি মৌলিক তথ্য সংগ্রাহক: একটি কাউন্টার, এবং একটি সর্বনিম্ন/সর্বোচ্চ/গড়/মোট
পর্যবেক্ষক
সময় এবং প্যাকেটের সাথে সহজে কাজ করার জন্য এগুলোর এক্সটেনশন।
· প্লেইনটেক্সট আউটপুট ফরম্যাট করা হয়েছে OMNet++.
· ডাটাবেস আউটপুট ব্যবহার করে SQLite, একটি স্বতন্ত্র, লাইটওয়েট, উচ্চ কার্যক্ষমতা সম্পন্ন SQL ইঞ্জিন।
· বর্ণনা এবং রানের সাথে কাজ করার জন্য বাধ্যতামূলক এবং খোলা শেষ মেটাডেটা।
NS-3 এর বৈশিষ্ট্য পরীক্ষা করার ধারণাগত পরীক্ষার উপর ভিত্তি করে একটি উদাহরণ
ডিফল্ট অ্যাডহক ওয়াইফাই কর্মক্ষমতা। এটি নিম্নলিখিত অন্তর্ভুক্ত করে:
· একটি দুটি নোড অ্যাডহক ওয়াইফাই নেটওয়ার্ক তৈরি করে, নোডগুলি একটি প্যারামিটারাইজড দূরত্ব সহ
পৃথক্.
· UDP ট্রাফিক সোর্স এবং সিঙ্ক অ্যাপ্লিকেশনগুলি সামান্য ভিন্ন আচরণের সাথে এবং
স্টক ক্লাসের চেয়ে পরিমাপের হুক।
· বিদ্যমান ট্রেস সংকেতের মাধ্যমে NS-3 কোর থেকে ডেটা সংগ্রহ, বিশেষ করে ডেটা
ফ্রেম প্রেরিত এবং ওয়াইফাই MAC অবজেক্ট দ্বারা প্রাপ্ত.
· স্ট্যাটে নতুন ট্রেস সংকেত সংযুক্ত করে কাস্টম অ্যাপ্লিকেশনের উপকরণ
ফ্রেমওয়ার্ক, সেইসাথে সরাসরি আপডেটের মাধ্যমে। তথ্য মোট প্যাকেট সম্পর্কে রেকর্ড করা হয়
পাঠানো এবং গৃহীত, বাইট প্রেরণ, এবং শেষ থেকে শেষ বিলম্ব।
· এন্ড-টু-এন্ড বিলম্ব ট্র্যাক করতে প্যাকেট ট্যাগ ব্যবহারের একটি উদাহরণ।
· একটি সাধারণ কন্ট্রোল স্ক্রিপ্ট যা বিভিন্ন সময়ে পরীক্ষা-নিরীক্ষার একটি সংখ্যা চালায়
দূরত্ব এবং জিএনইউপ্লট ব্যবহার করে একটি গ্রাফ তৈরি করতে ফলাফল ডাটাবেসকে জিজ্ঞাসা করে।
করতে
উচ্চ অগ্রাধিকার আইটেম অন্তর্ভুক্ত:
· অনলাইন পরিসংখ্যান কোড অন্তর্ভুক্তি, যেমন মেমরি দক্ষ আত্মবিশ্বাসের ব্যবধানের জন্য।
· রান সমাপ্ত করার জন্য তথ্য সংগ্রাহক মধ্যে বিধান, অর্থাত যখন একটি থ্রেশহোল্ড বা
আত্মবিশ্বাস পূরণ হয়।
· সময়ের সাথে নমুনা লগ করার জন্য ডেটা সংগ্রাহক, এবং বিভিন্ন ফর্ম্যাটে আউটপুট।
· নিয়মিত কিছু মান পোল করার জন্য সাধারণ চক্রীয় ঘটনা আঠালো লেখা প্রদর্শন করুন।
বর্তমান কাঠামোতে অন্তর্ভুক্ত করার জন্য তাদের প্রত্যেককে সহজবোধ্য প্রমাণ করা উচিত।
অভিগমন
কাঠামোটি নিম্নলিখিত মূল নীতিগুলির উপর ভিত্তি করে তৈরি করা হয়েছে:
· একটি পরীক্ষামূলক ট্রায়াল একটি সিমুলেশন প্রোগ্রামের একটি উদাহরণ দ্বারা পরিচালিত হয়, তা হোক না কেন
সমান্তরাল বা ধারাবাহিকভাবে।
· একটি কন্ট্রোল স্ক্রিপ্ট সিমুলেশনের দৃষ্টান্তগুলি সম্পাদন করে, প্রয়োজন অনুসারে বিভিন্ন পরামিতি।
· বহিরাগত স্ক্রিপ্ট ব্যবহার করে প্লট এবং বিশ্লেষণের জন্য ডেটা সংগ্রহ এবং সংরক্ষণ করা হয়
বিদ্যমান সরঞ্জাম।
NS-3 কোরের মধ্যে পরিমাপ করা হয় স্ট্যাট ফ্রেমওয়ার্ককে বিদ্যমান সাথে সংযুক্ত করে
সংকেত ট্রেস।
· ট্রেস সিগন্যাল বা ফ্রেমওয়ার্কের সরাসরি ম্যানিপুলেশন যন্ত্র কাস্টম ব্যবহার করা যেতে পারে
সিমুলেশন কোড।
ফ্রেমওয়ার্কের সেই মৌলিক উপাদানগুলি এবং তাদের মিথস্ক্রিয়া তে চিত্রিত করা হয়েছে
নিম্নলিখিত চিত্র। [ছবি]
উদাহরণ
এই বিভাগটি কাঠামোর মধ্যে একটি পরীক্ষা নির্মাণের প্রক্রিয়ার মধ্য দিয়ে যায় এবং
এটি থেকে বিশ্লেষণের (গ্রাফ) জন্য ডেটা তৈরি করা, কাঠামো এবং API বরাবর প্রদর্শন করা
রাস্তা.
প্রশ্ন
''এনএস-৩ এর ওয়াইফাই নেটডিভাইসের (ডিফল্ট ব্যবহার করে) কার্যকারিতা কী?
সেটিংস)? ওয়্যারলেস নোডগুলি না করার আগে একটি সিমুলেশনে কত দূরে থাকতে পারে
নির্ভরযোগ্যভাবে যোগাযোগ করবেন?''
হাইপোথিসিস: বাস্তব জীবনের কর্মক্ষমতা জ্ঞানের উপর ভিত্তি করে, নোডগুলি যোগাযোগ করা উচিত
যুক্তিসঙ্গতভাবে অন্তত 100 মি দূরে। 200 মিটারের বেশি যোগাযোগ করা উচিত নয়
সম্ভাব্য.
যদিও সিমুলেশন প্রসঙ্গে খুব সাধারণ প্রশ্ন নয়, এটি একটি গুরুত্বপূর্ণ সম্পত্তি
যার মধ্যে সিমুলেশন ডেভেলপারদের একটি মৌলিক বোঝাপড়া থাকা উচিত। এটিও একটি সাধারণ
লাইভ হার্ডওয়্যার উপর করা অধ্যয়ন.
ব্যাজ কার্যক্রম
এই পরীক্ষাটি বাস্তবায়নের প্রথম জিনিসটি হল সিমুলেশন তৈরি করা
কার্যক্রম. এই উদাহরণের জন্য কোড পাওয়া যাবে example/stats/wifi-example-sim.cc.
এটি নিম্নলিখিত প্রধান পদক্ষেপগুলি করে।
· প্যারামিটার ঘোষণা করা এবং কমান্ড লাইন ব্যবহার করে পার্স করা ns3::কমান্ডলাইন.
দ্বিগুণ দূরত্ব = ৫০.০;
স্ট্রিং বিন্যাস ("OMNet++");
স্ট্রিং পরীক্ষা ("ওয়াইফাই-দূরত্ব-পরীক্ষা");
স্ট্রিং কৌশল ("ওয়াইফাই-ডিফল্ট");
স্ট্রিং রানআইডি;
কমান্ডলাইন cmd;
cmd.AddValue("দূরত্ব", "নোড স্থাপনের দূরত্ব (মিটারে)।", দূরত্ব);
cmd.AddValue("ফরম্যাট", "ডেটা আউটপুট ব্যবহারের জন্য ফরম্যাট।", ফরম্যাট);
cmd.AddValue("পরীক্ষা", "পরীক্ষার জন্য শনাক্তকারী।", পরীক্ষা);
cmd.AddValue("কৌশল", "কৌশলের জন্য শনাক্তকারী।", কৌশল);
cmd.AddValue("রান", "রানের জন্য শনাক্তকারী।", runID);
cmd.Parse (argc, argv);
· ব্যবহার করে নোড এবং নেটওয়ার্ক স্ট্যাক তৈরি করা ns3::NodeContainer, ns3::ওয়াইফাই হেল্পার, এবং
ns3::InternetStackHelper.
নোডকন্টেইনার নোড;
নোডস তৈরি করুন(২০১১);
ওয়াইফাই হেল্পার ওয়াইফাই;
wifi.SetMac("ns3::AdhocWifiMac");
wifi.SetPhy("ns3::WifiPhy");
NetDeviceContainer nodeDevices = wifi.Install(nodes);
InternetStackHelper ইন্টারনেট;
internet.Install(nodes);
Ipv4AddressHelper ipAddrs;
ipAddrs.SetBase("192.168.0.0", "255.255.255.0");
ipAddrs. Assign(nodeDevices);
· ব্যবহার করে নোডের অবস্থান নির্ধারণ করা ns3::মোবিলিটি হেল্পার. ডিফল্টরূপে নোড স্ট্যাটিক আছে
গতিশীলতা এবং নড়াচড়া করবে না, তবে প্রদত্ত দূরত্বকে আলাদা করে রাখতে হবে। সেখানে
এটি করার বিভিন্ন উপায়; এটা ব্যবহার করে এখানে করা হয় ns3::ListPositionAllocator, যা আঁকে
একটি প্রদত্ত তালিকা থেকে অবস্থান।
গতিশীলতা সাহায্যকারী গতিশীলতা;
Ptr positionAlloc =
অবজেক্ট তৈরি করুন ();
positionAlloc->যোগ করুন(ভেক্টর(0.0, 0.0, 0.0));
positionAlloc->যোগ করুন(ভেক্টর(0.0, দূরত্ব, 0.0));
mobility.SetPositionAllocator(positionAlloc);
গতিশীলতা.ইনস্টল(নোড);
· একটি ট্রাফিক জেনারেটর এবং একটি ট্রাফিক সিঙ্ক ইনস্টল করা। মজুদ অ্যাপ্লিকেশন হতে পারে
ব্যবহৃত, কিন্তু উদাহরণে কাস্টম অবজেক্ট অন্তর্ভুক্ত রয়েছে src/test/test02-apps.(cc|h). এইগুলো
একটি সাধারণ আচরণ আছে, একটি নির্দিষ্ট ব্যবধানে ব্যবধানে একটি নির্দিষ্ট সংখ্যক প্যাকেট তৈরি করে।
যেহেতু প্রতিটির মধ্যে শুধুমাত্র একটি আছে তারা ম্যানুয়ালি ইনস্টল করা হয়; একটি বড় সেট জন্য
ns3::অ্যাপ্লিকেশন হেল্পার ক্লাস ব্যবহার করা যেতে পারে। মন্তব্য-আউট কনফিগার::সেট লাইন পরিবর্তন
প্যাকেটের গন্তব্য, এই উদাহরণে ডিফল্টরূপে সম্প্রচারের জন্য সেট করা হয়েছে। মনে রাখবেন যে
সাধারণভাবে WiFi এর কারণে ব্রডকাস্ট এবং ইউনিকাস্ট ফ্রেমের জন্য ভিন্ন কর্মক্ষমতা থাকতে পারে
বিভিন্ন রেট কন্ট্রোল এবং MAC রিট্রান্সমিশন পলিসি।
Ptr অ্যাপসোর্স = নোডলিস্ট::GetNode(২০১১);
Ptr প্রেরক = CreateObject ();
appSource->AddApplication(প্রেরক);
প্রেরক->শুরু(সেকেন্ড(1));
Ptr appSink = নোডলিস্ট::GetNode(২০১১);
Ptr গ্রহণকারী = CreateObject ();
appSink->AddApplication(রিসিভার);
রিসিভার->স্টার্ট(সেকেন্ড(0));
// কনফিগার:: সেট("/নোডলিস্ট/*/অ্যাপ্লিকেশনলিস্ট/*/$প্রেরক/গন্তব্য",
// Ipv4AddressValue("192.168.0.2"));
· সংগৃহীত তথ্য এবং পরিসংখ্যান কনফিগার করা। মৌলিক দৃষ্টান্ত হল যে একটি
ns3::ডেটা কালেক্টর অবজেক্ট এই নির্দিষ্ট রান সম্পর্কে তথ্য রাখা তৈরি করা হয়, থেকে
যা পর্যবেক্ষক এবং ক্যালকুলেটর আসলে ডেটা জেনারেট করতে সংযুক্ত থাকে। গুরুত্বপূর্ণভাবে,
চালানোর তথ্যে ''পরীক্ষা'', ''কৌশল'', ''ইনপুট'' এবং
''রান''। এগুলি পরবর্তীতে একাধিক ট্রায়াল থেকে ডেটা সনাক্ত করতে এবং সহজেই গোষ্ঠীভুক্ত করতে ব্যবহৃত হয়।
· পরীক্ষা হল সেই অধ্যয়ন যার এই ট্রায়ালটি সদস্য। এখানে এটি WiFi-এ রয়েছে
কর্মক্ষমতা এবং দূরত্ব।
কৌশল হল এই ট্রায়ালে পরীক্ষা করা কোড বা প্যারামিটার। এই উদাহরণে
এটি স্থির, তবে একটি সুস্পষ্ট এক্সটেনশন হবে বিভিন্ন ওয়াইফাই বিট তদন্ত করা
হার, যার প্রতিটি একটি ভিন্ন কৌশল হবে।
· ইনপুট হল এই ট্রায়ালে দেওয়া বিশেষ সমস্যা। এখানে এটা সহজভাবে
দুটি নোডের মধ্যে দূরত্ব।
· রানআইডি এই ট্রায়ালের জন্য একটি অনন্য শনাক্তকারী যার সাথে এটির তথ্য ট্যাগ করা হয়
পরবর্তী বিশ্লেষণে সনাক্তকরণের জন্য। যদি কোন রান আইডি দেওয়া না হয় উদাহরণ প্রোগ্রাম তৈরি করে
বর্তমান সময় ব্যবহার করে একটি (দুর্বল) রান আইডি।
মেটাডেটা এই চার টুকরা প্রয়োজন, কিন্তু আরো কাঙ্ক্ষিত হতে পারে. তারা যোগ করা যেতে পারে
ব্যবহার করে রেকর্ড করতে ns3::Data Collector::AddMetadata() পদ্ধতি।
ডেটা কালেক্টর ডেটা;
data.DescribeRun(পরীক্ষা, কৌশল, ইনপুট, রানআইডি);
ডেটা।মেটাডাটা যোগ করুন("লেখক", "তজকোপেনা");
প্রকৃত পর্যবেক্ষণ এবং গণনা দ্বারা সম্পন্ন করা হয় ns3::ডেটা ক্যালকুলেটর বস্তু, যা
বিভিন্ন ধরনের বিদ্যমান। এই সিমুলেশন প্রোগ্রাম দ্বারা তৈরি করা হয়, সংযুক্ত
রিপোর্টিং বা নমুনা কোড, এবং তারপর নিবন্ধিত ns3::ডেটা কালেক্টর তাই তারা করবে
তাদের আউটপুট জন্য পরে জিজ্ঞাসা করা হবে. একটি সহজ পর্যবেক্ষণ প্রক্রিয়া বিদ্যমান ব্যবহার করা হয়
ট্রেস সোর্স, উদাহরণ স্বরূপ ns-3 কোরে বস্তুগুলিকে পরিবর্তন না করেই ইনস্ট্রুমেন্ট করা
কোড এখানে একটি কাউন্টার সরাসরি ওয়াইফাই MAC স্তরে একটি ট্রেস সিগন্যালের সাথে সংযুক্ত থাকে
লক্ষ্য নোড।
Ptr totalRx = CreateObject ();
totalRx->SetKey("wifi-rx-frames");
কনফিগার::কানেক্ট("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Rx",
MakeCallback(&PacketCounterCalculator::FrameUpdate, totalRx));
data.AddDataCalculator(totalRx);
ক্যালকুলেটর সরাসরি ম্যানিপুলেট হতে পারে। এই উদাহরণে, একটি কাউন্টার তৈরি করা হয় এবং
প্যাকেট প্রাপ্ত হলে আপডেট করার জন্য ট্র্যাফিক সিঙ্ক অ্যাপ্লিকেশনে পাস করা হয়।
Ptr > appRx = CreateObject >();
appRx->SetKey("রিসিভার-আরএক্স-প্যাকেট");
রিসিভার->সেট কাউন্টার(অ্যাপআরএক্স);
data.AddDataCalculator(appRx);
গণনা বাড়ানোর জন্য, সিঙ্কের প্যাকেট প্রসেসিং কোডটি তারপর একটিকে কল করে
ক্যালকুলেটরের আপডেট পদ্ধতি।
m_calc->আপডেট();
প্রোগ্রামটিতে আদিম উভয় ব্যবহার করে আরও কয়েকটি উদাহরণ রয়েছে
ক্যালকুলেটর যেমন ns3::কাউন্টার ক্যালকুলেটর এবং যারা প্যাকেট এবং পর্যবেক্ষণের জন্য অভিযোজিত
বার ভিতরে src/test/test02-apps.(cc|h) এটি একটি সাধারণ কাস্টম ট্যাগ তৈরি করে যা এটি ব্যবহার করে
উত্পন্ন প্যাকেটের জন্য শেষ থেকে শেষ বিলম্ব ট্র্যাক করতে, একটি ফলাফল রিপোর্টিং
ns3::TimeMinMaxAvgTotalCalculator ডেটা ক্যালকুলেটর।
· সিমুলেশন চালানো, যা একবার তৈরি করা হলে খুব সোজা।
সিমুলেটর::রান();
· হয় উৎপন্ন করা হচ্ছে OMNet++ or SQLite কমান্ড লাইন আর্গুমেন্টের উপর নির্ভর করে আউটপুট। প্রতি
এটা কর a ns3::ডেটাআউটপুট ইন্টারফেস অবজেক্ট তৈরি এবং কনফিগার করা হয়। নির্দিষ্ট প্রকার
এর থেকে আউটপুট বিন্যাস নির্ধারণ করা হবে। এই বস্তু তারপর দেওয়া হয়
ns3::ডেটা কালেক্টর বস্তু যা এটি আউটপুট উত্পাদন জিজ্ঞাসা.
Ptr আউটপুট
যদি (ফরম্যাট == "OMNet++") {
NS_LOG_INFO("OMNet++ ফর্ম্যাটেড ডেটা আউটপুট তৈরি করা হচ্ছে।");
output = CreateObject ();
} অন্য {
# ifdef STAT_USE_DB
NS_LOG_INFO("SQLite ফরম্যাটেড ডেটা আউটপুট তৈরি করা হচ্ছে।");
output = CreateObject ();
# যদি শেষ
}
আউটপুট->আউটপুট(ডেটা);
· সিমুলেশন দ্বারা ব্যবহৃত কোনো মেমরি মুক্ত করা। এটি প্রধান শেষে আসা উচিত
উদাহরণের জন্য ফাংশন।
সিমুলেটর::ধ্বংস();
লগিং
উদাহরণ প্রোগ্রাম, অ্যাপ্লিকেশন, এবং স্ট্যাট ফ্রেমওয়ার্ক বিস্তারিতভাবে কি করছে তা দেখতে, সেট করুন
দ্য NS_LOG সঠিকভাবে পরিবর্তনশীল। নিম্নলিখিত সব থেকে প্রচুর আউটপুট প্রদান করবে
তিন.
$export NS_LOG=WiFiDistanceExperiment:WiFiDistanceApps
মনে রাখবেন যে এটি সিমুলেশনটিকে অসাধারণভাবে ধীর করে দেয়।
নমুনা আউটপুট
কম্পাইল করা এবং সহজভাবে পরীক্ষা প্রোগ্রাম চালানো যোগ করা হবে OMNet++ ফরম্যাট করা আউটপুট যেমন
নিম্নলিখিত থেকে data.sca.
রান রান-1212239121
attr পরীক্ষা "ওয়াইফাই-দূরত্ব-পরীক্ষা"
attr কৌশল "ওয়াইফাই-ডিফল্ট"
attr ইনপুট "50"
attr বর্ণনা ""
attr "লেখক" "tjkopena"
স্কেলার ওয়াইফাই-টিএক্স-ফ্রেম সংখ্যা 30
স্কেলার ওয়াইফাই-আরএক্স-ফ্রেম গণনা 30
স্কেলার সেন্ডার-টিএক্স-প্যাকেট সংখ্যা 30
স্কেলার রিসিভার-আরএক্স-প্যাকেট সংখ্যা 30
স্কেলার tx-pkt-আকার গণনা 30
স্কেলার tx-pkt-আকার মোট 1920
স্কেলার tx-pkt-আকার গড় 64
স্কেলার tx-pkt-আকার সর্বোচ্চ 64
স্কেলার tx-pkt-আকার মিন 64
স্কেলার বিলম্ব গণনা 30
স্কেলার বিলম্ব মোট 5884980ns
স্কেলার বিলম্ব গড় 196166ns
স্কেলার বিলম্ব সর্বোচ্চ 196166ns
স্কেলার বিলম্ব মিনিট 196166ns
নিয়ন্ত্রণ লিপি
বিভিন্ন ইনপুট (দূরত্ব) এ তথ্য সংগ্রহ স্বয়ংক্রিয় করার জন্য, একটি সাধারণ ব্যাশ
স্ক্রিপ্ট সিমুলেশনের একটি সিরিজ চালানোর জন্য ব্যবহৃত হয়। এটা পাওয়া যাবে
example/stats/wifi-example-db.sh. স্ক্রিপ্ট থেকে চালানোর বোঝানো হয় উদাহরণ/পরিসংখ্যান/
ডিরেক্টরি.
স্ক্রিপ্ট দূরত্ব একটি সেট মাধ্যমে সঞ্চালিত হয়, একটি ফলাফল সংগ্রহ SQLite
তথ্যশালা. প্রতিটি দূরত্বে প্রত্যাশিত একটি ভাল ছবি দেওয়ার জন্য পাঁচটি ট্রায়াল পরিচালিত হয়
কর্মক্ষমতা. সম্পূর্ণ পরীক্ষাটি নিম্ন প্রান্তে চলতে মাত্র কয়েক ডজন সেকেন্ড সময় নেয়
মেশিন যেহেতু সিমুলেশনের সময় কোন আউটপুট নেই এবং সামান্য ট্রাফিক তৈরি হয়।
#!/ বিন / SH
DISTANCES="25 50 75 100 125 145 147 150 152 155 157 160 162 165 167 170 172 175 177 180"
ট্রায়ালস="1 2 3 4 5"
ইকো ওয়াইফাই পরীক্ষার উদাহরণ
যদি [-e data.db]
তারপর
echo Kill data.db?
ANS পড়ুন
যদি [ "$ANS" = "হ্যাঁ" -o "$ANS" = "y" ]
তারপর
ইকো ডাটাবেস মুছে ফেলা হচ্ছে
rm data.db
fi
fi
$TRIALS-এ ট্রায়ালের জন্য
do
দূরত্বের জন্য $DISTANCES
do
ইকো ট্রায়াল $ট্রায়াল, দূরত্ব $দূরত্ব
./bin/test02 --format=db --distance=$distance --run=run-$distance-$trial
সম্পন্ন
সম্পন্ন
বিশ্লেষণ এবং উপসংহার
একবার সমস্ত ট্রায়াল পরিচালিত হয়ে গেলে, স্ক্রিপ্টটি একটি সাধারণ SQL কোয়েরি চালায়
ডাটাবেস ব্যবহার করে SQLite কমান্ড লাইন প্রোগ্রাম। ক্যোয়ারী গড় প্যাকেট ক্ষতির হিসাব করে
প্রতিটি দূরত্বের সাথে সম্পর্কিত পরীক্ষার প্রতিটি সেট। এটা ভিন্ন একাউন্টে নিতে না
কৌশল, কিন্তু তথ্য কিছু সহজ এক্সটেনশন করতে ডাটাবেসে উপস্থিত হয়
এবং তাই করুন সংগৃহীত ডেটা গ্রাফিংয়ের জন্য GNUPlot-এ পাঠানো হয়।
CMD="select exp.input,avg(100-((rx.value*100)/tx.value)) \
Singletons rx, Singleton tx, Experiments exp \ থেকে
যেখানে rx.run = tx.run AND \
rx.run = exp.run এবং \
rx.name='receiver-rx-packets' এবং \
tx.name='sender-tx-packets' \
exp.input দ্বারা গ্রুপ
abs(exp.input) ASC দ্বারা অর্ডার করুন;"
sqlite3 -noheader data.db "$CMD" > wifi-default.data
sed -i "s/|//" wifi-default.data
gnuplot wifi-example.gnuplot
GNUPlot স্ক্রিপ্ট এখানে পাওয়া গেছে example/stats/wifi-example.gnuplot সহজভাবে আউটপুট সংজ্ঞায়িত করে
বিন্যাস এবং গ্রাফের জন্য কিছু মৌলিক বিন্যাস।
সেট টার্মিনাল পোস্টস্ক্রিপ্ট প্রতিকৃতি উন্নত lw 2 "Helvetica" 14
সেট আকার 1.0, 0.66
#------------------------------------------------ ------
"wifi-default.eps" সেট আউট
# সেট শিরোনাম "দূরত্বের উপর প্যাকেট লস"
x লেবেল সেট করুন "দূরত্ব (মি) --- প্রতি পয়েন্টে 5 ট্রায়ালের গড়"
সেট x রেঞ্জ [0:200]
ইলেবেল সেট করুন "% প্যাকেট লস"
সেট ইরেঞ্জ [0:110]
লাইন শিরোনাম "ওয়াইফাই ডিফল্টস" সহ প্লট "wifi-default.data"
শেষ ফল
ফলস্বরূপ গ্রাফটি ডিফল্ট ওয়াইফাই মডেলের কর্মক্ষমতার কোন প্রমাণ প্রদান করে না
অগত্যা অযৌক্তিক এবং অন্তত একটি টোকেন বিশ্বস্ততা কিছু আস্থা ধার দেয়
বাস্তবতা আরও গুরুত্বপূর্ণ, এই সাধারণ তদন্তটি সর্বত্র পরিচালিত হয়েছে
পরিসংখ্যান কাঠামো ব্যবহার করে। সফলতার ! [ছবি]
প্রকৃত সময়
ns-3 টেস্টবেড এবং ভার্চুয়াল মেশিন পরিবেশে একীকরণের জন্য ডিজাইন করা হয়েছে। প্রতি
বাস্তব নেটওয়ার্ক স্ট্যাকের সাথে একীভূত করুন এবং প্যাকেট নির্গত/ব্যবহার করুন, একটি রিয়েল-টাইম শিডিউলার
হার্ডওয়্যার ঘড়ির সাথে সিমুলেশন ঘড়িটি লক করার চেষ্টা করা দরকার। আমরা এখানে বর্ণনা করি ক
এর উপাদান: রিয়েলটাইম সময়সূচী।
রিয়েলটাইম শিডিউলারের উদ্দেশ্য হল সিমুলেশন ঘড়ির অগ্রগতি ঘটানো
কিছু বাহ্যিক সময় বেস সাপেক্ষে সিঙ্ক্রোনাসভাবে ঘটতে. উপস্থিতি ছাড়া
একটি বহিরাগত টাইম বেস (ওয়াল ঘড়ি), সিমুলেশন টাইম তাৎক্ষণিকভাবে একটি সিমুলেটেড থেকে লাফ দেয়
পরের সময়।
আচরণ
একটি নন-রিয়েলটাইম সময়সূচী ব্যবহার করার সময় (এ ডিফল্ট ns-3), সিমুলেটর অগ্রসর হয়
পরবর্তী নির্ধারিত ইভেন্টে সিমুলেশন সময়। ইভেন্ট নির্বাহের সময়, সিমুলেশন সময় হয়
হিমায়িত রিয়েলটাইম শিডিউলারের সাথে, আচরণটি দৃষ্টিকোণ থেকে অনুরূপ
সিমুলেশন মডেল (অর্থাৎ, ইভেন্ট সম্পাদনের সময় সিমুলেশন সময় হিমায়িত হয়), কিন্তু এর মধ্যে
ঘটনা, সিমুলেটর মেশিনের সাথে সারিবদ্ধ সিমুলেশন ঘড়ি রাখার চেষ্টা করবে
ঘড়ি
যখন একটি ইভেন্ট কার্যকর করা শেষ হয়, এবং সময়সূচী পরবর্তী ইভেন্টে চলে যায়,
শিডিউলার মেশিন ঘড়ির সাথে পরবর্তী ইভেন্ট কার্যকর করার সময় তুলনা করে। পরেরটা হলে
ইভেন্টটি ভবিষ্যত সময়ের জন্য নির্ধারিত হয়, সেই রিয়েলটাইমে না পৌঁছানো পর্যন্ত সিমুলেটর ঘুমায়
এবং তারপর পরবর্তী ঘটনা নির্বাহ করে।
এটি ঘটতে পারে যে, সিমুলেশন ইভেন্টগুলি সম্পাদনের অন্তর্নিহিত প্রক্রিয়াকরণের কারণে,
যে সিমুলেটর রিয়েলটাইমের সাথে তাল মিলিয়ে চলতে পারে না। এই ক্ষেত্রে, এটি ব্যবহারকারীর উপর নির্ভর করে
কনফিগারেশন কি করতে হবে। দুই আছে ns-3 বৈশিষ্ট্য যা আচরণ নিয়ন্ত্রণ করে। দ্য
প্রথম হয় ns3::RealTimeSimulatorImpl::SynchronizationMode. দুটি এন্ট্রি জন্য সম্ভব
এই বৈশিষ্ট্য হয় সেরা প্রচেষ্টা (ডিফল্ট) বা হার্ডলিমিট. "BestEffort" মোডে,
সিমুলেটর ইভেন্টগুলি সম্পাদন করে রিয়েলটাইমে ধরার চেষ্টা করবে যতক্ষণ না এটি a এ পৌঁছায়
বিন্দু যেখানে পরবর্তী ইভেন্টটি (রিয়েলটাইম) ভবিষ্যতে হয়, অন্যথায় সিমুলেশন শেষ হয়। ভিতরে
BestEffort মোড, তারপর, সিমুলেশনের চেয়ে বেশি সময় ব্যয় করা সম্ভব
প্রাচীর ঘড়ি সময়। অন্য বিকল্প "হার্ডলিমিট" সিমুলেশনটি বাতিল করে দেবে যদি
সহনশীলতা থ্রেশহোল্ড অতিক্রম করা হয়. এই বৈশিষ্ট্য হল ns3::RealTimeSimulatorImpl::Hard Limit
এবং ডিফল্ট 0.1 সেকেন্ড।
অপারেশনের একটি ভিন্ন মোড হল একটি যার মধ্যে সিমুলেটেড সময় না একটি ইভেন্টের সময় হিমায়িত
মৃত্যুদন্ড রিয়েলটাইম সিমুলেশনের এই মোডটি বাস্তবায়িত হয়েছিল কিন্তু থেকে সরানো হয়েছে৷ ns-3 বৃক্ষ
এটা দরকারী হবে কিনা প্রশ্নের কারণে. ব্যবহারকারীরা যদি রিয়েলটাইমে আগ্রহী হন
সিমুলেটর যার জন্য ইভেন্ট এক্সিকিউশনের সময় সিমুলেশন সময় জমা হয় না (যেমন, প্রতিটি
ডেকে আনো সিমুলেটর::এখন() বর্তমান প্রাচীর ঘড়ির সময় ফেরত দেয়, যে সময়ে নয়
ইভেন্ট চালানো শুরু হয়েছে), অনুগ্রহ করে ns-developers মেইলিং তালিকার সাথে যোগাযোগ করুন।
ব্যবহার
রিয়েলটাইম সিমুলেটরের ব্যবহার স্ক্রিপ্টিং দৃষ্টিকোণ থেকে সোজা।
ব্যবহারকারীদের শুধু বৈশিষ্ট্য সেট করতে হবে সিমুলেটর ইমপ্লিমেন্টেশন টাইপ রিয়েলটাইমে
সিমুলেটর, যেমন নিম্নরূপ:
GlobalValue::Bind ("সিমুলেটর ইমপ্লিমেন্টেশন টাইপ",
StringValue ("ns3::RealtimeSimulatorImpl"));
মধ্যে একটি স্ক্রিপ্ট আছে উদাহরণ/realtime/realtime-udp-echo.cc যে কিভাবে একটি উদাহরণ আছে
রিয়েলটাইম আচরণ কনফিগার করুন। চেষ্টা করুন:
$ ./waf --run রিয়েলটাইম-উডিপি-ইকো
সিমুলেটর একটি সর্বোত্তম প্রচেষ্টা বা কঠোর সীমা নীতি ফ্যাশনে কাজ করবে কিনা তা নিয়ন্ত্রিত হয়৷
পূর্ববর্তী বিভাগে ব্যাখ্যা করা বৈশিষ্ট্য দ্বারা.
বাস্তবায়ন
বাস্তবায়ন নিম্নলিখিত ফাইলগুলিতে রয়েছে:
· src/core/model/realtime-simulator-impl৷cc,h}
· src/core/model/wall-clock-synchronizer৷cc,h}
একটি রিয়েলটাইম সময়সূচী তৈরি করার জন্য, একটি প্রথম আনুমানিক জন্য আপনি শুধুমাত্র কারণ করতে চান
রিয়েল টাইম গ্রাস করতে সিমুলেশন টাইম জাম্প করে। আমরা একটি সমন্বয় ব্যবহার করে এটি করার প্রস্তাব
ঘুম- এবং ব্যস্ত- অপেক্ষা করে। ঘুম-অপেক্ষা কলিং প্রক্রিয়া (থ্রেড) ফলন কারণ
কিছু সময়ের জন্য প্রসেসর। যদিও এই নির্দিষ্ট পরিমাণ সময় পার করা যায়
ন্যানোসেকেন্ড রেজোলিউশনে, এটি আসলে একটি OS-নির্দিষ্ট গ্রানুলারিটিতে রূপান্তরিত হয়। ভিতরে
লিনাক্স, গ্রানুলারিটি একটি জিফি বলা হয়। সাধারণত এই রেজোলিউশন এর জন্য অপর্যাপ্ত
আমাদের চাহিদা (দশ মিলিসেকেন্ডের ক্রমানুসারে), তাই আমরা বৃত্তাকার নিচে এবং কিছু জন্য ঘুম
জিফির ছোট সংখ্যা। তারপর নির্দিষ্ট সংখ্যার পরে প্রক্রিয়াটি জাগ্রত হয়
জিফিস কেটে গেছে। এই সময়ে, আমাদের অপেক্ষা করার জন্য কিছু অবশিষ্ট সময় আছে। এই সময় হয়
ন্যূনতম ঘুমের সময় থেকে সাধারণত ছোট, তাই আমরা ব্যস্ত-অপেক্ষা করি বাকি ঘুমের জন্য
সময় এর মানে হল যে থ্রেডটি শুধুমাত্র একটি লুপ গ্রাসকারী চক্রের মধ্যে থাকে যতক্ষণ না পর্যন্ত
কাঙ্ক্ষিত সময় আসে। ঘুম- এবং ব্যস্ত-অপেক্ষার সংমিশ্রণের পরে, অতিবাহিত রিয়েলটাইম
(ওয়াল) ঘড়িটি পরবর্তী ইভেন্টের সিমুলেশন সময় এবং সিমুলেশনের সাথে একমত হওয়া উচিত
এগিয়ে।
সাহায্যকারী
উপরের অধ্যায়গুলি আপনাকে বিভিন্ন সাথে পরিচয় করিয়ে দিয়েছে ns-3 প্রোগ্রামিং ধারণা যেমন স্মার্ট
রেফারেন্স-গণনা করা মেমরি ম্যানেজমেন্ট, অ্যাট্রিবিউট, নেমস্পেস, কলব্যাক ইত্যাদির জন্য পয়েন্টার।
এই নিম্ন-স্তরের API এ কাজ করা ব্যবহারকারীরা আন্তঃসংযোগ করতে পারেন ns-3 সূক্ষ্ম দানাদার বস্তু।
যাইহোক, নিম্ন-স্তরের API ব্যবহার করে সম্পূর্ণভাবে লেখা একটি সিমুলেশন প্রোগ্রাম বেশ দীর্ঘ হবে
এবং কোড করতে ক্লান্তিকর। এই কারণে, একটি পৃথক তথাকথিত "হেল্পার API" ওভারলেড করা হয়েছে৷
মূলে ns-3 API আপনি যদি পড়েছেন ns-3 টিউটোরিয়াল, আপনি ইতিমধ্যে পরিচিত হবে
সহায়ক API এর সাথে, যেহেতু এটি এমন API যা সাধারণত নতুন ব্যবহারকারীদের সাথে প্রথম পরিচিত হয়।
এই অধ্যায়ে, আমরা হেল্পার এপিআই-এর ডিজাইন দর্শনের সাথে পরিচয় করিয়ে দিই এবং এর সাথে বৈপরীত্য
নিম্ন-স্তরের API। আপনি একটি ভারী ব্যবহারকারী হয়ে গেলে ns-3, আপনি সম্ভবত সামনে এবং পিছনে সরানো হবে
এমনকি একই প্রোগ্রামে এই APIগুলির মধ্যে।
সহায়ক API এর কয়েকটি লক্ষ্য রয়েছে:
1. বাকি src / সহায়ক API-এর উপর কোন নির্ভরতা নেই; যা দিয়ে করা যেতে পারে
সহায়ক API নিম্ন-স্তরের API এও কোড করা যেতে পারে
2. কন্টেনারগুলি: প্রায়শই সিমুলেশনের জন্য গোষ্ঠীর জন্য বেশ কয়েকটি অভিন্ন ক্রিয়া করতে হবে
বস্তুর সহায়ক API অনুরূপ বস্তুর পাত্রে ভারী ব্যবহার করে যার সাথে
অনুরূপ বা অভিন্ন অপারেশন সঞ্চালিত করা যেতে পারে.
3. হেল্পার API জেনেরিক নয়; এটি কোড পুনঃব্যবহার সর্বাধিক করার চেষ্টা করে না। তাই,
প্রোগ্রামিং কনস্ট্রাক্ট যেমন পলিমরফিজম এবং টেমপ্লেট যা অর্জন করে কোড পুনঃব্যবহার
প্রচলিত হিসাবে নয়। উদাহরণস্বরূপ, আলাদা CsmaNetDevice সাহায্যকারী আছে এবং
PointToPointNetDevice সহায়ক কিন্তু তারা একটি সাধারণ NetDevice বেস থেকে প্রাপ্ত হয় না
বর্গ.
4. হেল্পার API সাধারণত স্ট্যাক-অ্যালোকেটেড (বনাম হিপ-অ্যালোকেটেড) অবজেক্টের সাথে কাজ করে। জন্য
কিছু প্রোগ্রাম, ns-3 ব্যবহারকারীদের কোন নিম্ন স্তরের বস্তু তৈরি বা সম্পর্কে চিন্তা করতে হবে না
পিটিআর হ্যান্ডলিং; তারা বস্তুর পাত্রে এবং স্ট্যাক-বরাদ্দ সাহায্যকারীর সাথে কাজ করতে পারে
যে তাদের উপর কাজ করে।
হেল্পার এপিআই আসলেই তৈরি করা ns-3 প্রোগ্রাম লিখতে এবং পড়া সহজ, ছাড়া
নিম্ন-স্তরের ইন্টারফেসের শক্তি কেড়ে নেওয়া। এই অধ্যায়ের বাকি কিছু প্রদান করে
সহায়ক API এর প্রোগ্রামিং কনভেনশনের উদাহরণ।
মেকিং হঠাৎ ব্যবহার দ্য জ্ঞানপ্লট শ্রেণী
ব্যবহার করে একটি প্লট তৈরি করার জন্য 2টি সাধারণ পদ্ধতি রয়েছে ns-3 এবং gnuplot (-
http://www.gnuplot.info):
1. ব্যবহার করে একটি gnuplot কন্ট্রোল ফাইল তৈরি করুন ns-3এর Gnuplot ক্লাস।
2. দ্বারা উত্পন্ন মান ব্যবহার করে একটি gnuplot ডেটা ফাইল তৈরি করুন ns-3.
এই বিভাগটি পদ্ধতি 1 সম্পর্কে, অর্থাৎ এটি কীভাবে ব্যবহার করে একটি প্লট তৈরি করা যায় সে সম্পর্কে ns-3এর Gnuplot
ক্লাস আপনি যদি পদ্ধতি 2 এ আগ্রহী হন, তাহলে এর অধীনে "একটি বাস্তব উদাহরণ" উপধারাটি দেখুন
"ট্রেসিং" বিভাগে ns-3 অভিভাবকসংবঁধীয়.
তৈরি করা হচ্ছে হঠাৎ ব্যবহার দ্য জ্ঞানপ্লট শ্রেণী
ব্যবহার করে একটি প্লট তৈরি করার জন্য নিম্নলিখিত পদক্ষেপগুলি গ্রহণ করতে হবে ns-3এর Gnuplot ক্লাস:
1. আপনার কোড পরিবর্তন করুন যাতে এটি Gnuplot ক্লাস এবং এর ফাংশন ব্যবহার করে।
2. আপনার কোড চালান যাতে এটি একটি gnuplot কন্ট্রোল ফাইল তৈরি করে।
3. gnuplot কন্ট্রোল ফাইলের নাম দিয়ে gnuplot কে কল করুন।
4. আপনার প্রিয় গ্রাফিক্স ভিউয়ারে তৈরি করা গ্রাফিক্স ফাইলটি দেখুন।
ধাপ 1-এ বিশদ বিবরণের জন্য নীচে আলোচনা করা উদাহরণ প্লট থেকে কোডটি দেখুন।
An উদাহরণ কার্যক্রম যে ব্যবহারসমূহ দ্য জ্ঞানপ্লট শ্রেণী
একটি উদাহরণ প্রোগ্রাম যা ব্যবহার করে ns-3এর Gnuplot ক্লাস এখানে পাওয়া যাবে:
src/stats/examples/gnuplot-example.cc
এই উদাহরণটি চালানোর জন্য, নিম্নলিখিতগুলি করুন:
$ ./waf শেল
$ cd build/debug/src/stats/examples
$ ./gnuplot-উদাহরণ
এই ডিরেক্টরিতে নিম্নলিখিত gnuplot কন্ট্রোল ফাইল তৈরি করা উচিত যেখানে উদাহরণ
অবস্থিত:
প্লট-2d.plt
plot-2d-with-error-bars.plt
প্লট-3d.plt
এই gnuplot কন্ট্রোল ফাইলগুলি প্রক্রিয়া করার জন্য, নিম্নলিখিতগুলি করুন:
$gnuplot plot-2d.plt
$gnuplot plot-2d-with-error-bars.plt
$gnuplot plot-3d.plt
এই ডিরেক্টরিতে নিম্নলিখিত গ্রাফিক্স ফাইলগুলি তৈরি করা উচিত যেখানে উদাহরণটি রয়েছে
অবস্থিত:
প্লট-2d.png
plot-2d-with-error-bars.png
প্লট-3d.png
আপনি আপনার প্রিয় গ্রাফিক্স ভিউয়ারে এই গ্রাফিক্স ফাইলগুলি দেখতে পারেন। আপনার যদি জিম্প থাকে
আপনার মেশিনে ইনস্টল করা, উদাহরণস্বরূপ, আপনি এটি করতে পারেন:
$gimp plot-2d.png
$gimp plot-2d-with-error-bars.png
$gimp plot-3d.png
An উদাহরণ ত্রিমাত্রিক 2 চক্রান্ত
নিম্নলিখিত 2-মাত্রিক প্লট
[ছবি]
gnuplot-example.cc থেকে নিম্নলিখিত কোড ব্যবহার করে তৈরি করা হয়েছে:
নেমস্পেস স্ট্যান্ড ব্যবহার করে;
string fileNameWithNoExtension = "প্লট-2d";
string graphicsFileName = fileNameWithNoExtension + ".png";
string plotFileName = fileNameWithNoExtension + ".plt";
string plotTitle = "2-ডি প্লট";
string dataTitle = "2-D ডেটা";
// প্লটটি ইনস্ট্যান্টিয়েট করুন এবং এর শিরোনাম সেট করুন।
Gnuplot প্লট (গ্রাফিক্স ফাইলের নাম);
plot.SetTitle (plotTitle);
// গ্রাফিক্স ফাইল তৈরি করুন, যেটি যখন প্লট ফাইল তৈরি করবে
// Gnuplot এর সাথে ব্যবহার করা হয়, একটি PNG ফাইল হোন।
plot.SetTerminal ("png");
// প্রতিটি অক্ষের জন্য লেবেল সেট করুন।
plot.SetLegend ("X মান", "Y মান");
// x অক্ষের জন্য পরিসীমা সেট করুন।
plot.AppendExtra ("সেট xrange [-6:+6]");
// ডেটাসেটটি ইনস্ট্যান্টিয়েট করুন, এর শিরোনাম সেট করুন এবং পয়েন্টগুলি তৈরি করুন
// সংযোগ লাইন সহ প্লট করা হয়েছে।
Gnuplot2dDataset ডেটাসেট;
dataset.SetTitle (dataTitle);
dataset.SetStyle (Gnuplot2dDataset::LINES_POINTS);
ডবল এক্স;
ডবল y;
// 2-ডি ডেটাসেট তৈরি করুন।
জন্য (x = -5.0; x <= +5.0; x += 1.0)
{
// 2-ডি বক্ররেখা গণনা করুন
//
// 2/XNUMX/XNUMX
// y = x।
//
y = x * x;
// এই পয়েন্ট যোগ করুন।
ডেটাসেট যোগ করুন (x, y);
}
// প্লটে ডেটাসেট যোগ করুন।
plot.AddDataset (ডেটাসেট);
// প্লট ফাইল খুলুন।
অফস্ট্রিম প্লটফাইল (plotFileName.c_str());
// প্লট ফাইলটি লিখুন।
plot.GenerateOutput (plotFile);
// প্লট ফাইল বন্ধ করুন।
plotFile.close ();
An উদাহরণ ত্রিমাত্রিক 2 চক্রান্ত সঙ্গে ভুল পানশালা
x এবং y দিকনির্দেশে ত্রুটি বার সহ নিম্নলিখিত 2-মাত্রিক প্লট
[ছবি]
gnuplot-example.cc থেকে নিম্নলিখিত কোড ব্যবহার করে তৈরি করা হয়েছে:
নেমস্পেস স্ট্যান্ড ব্যবহার করে;
string fileNameWithNoExtension = "plot-2d-with-error-bars";
string graphicsFileName = fileNameWithNoExtension + ".png";
string plotFileName = fileNameWithNoExtension + ".plt";
string plotTitle = "ত্রুটি বার সহ 2-ডি প্লট";
string dataTitle = "এরর বার সহ 2-D ডেটা";
// প্লটটি ইনস্ট্যান্টিয়েট করুন এবং এর শিরোনাম সেট করুন।
Gnuplot প্লট (গ্রাফিক্স ফাইলের নাম);
plot.SetTitle (plotTitle);
// গ্রাফিক্স ফাইল তৈরি করুন, যেটি যখন প্লট ফাইল তৈরি করবে
// Gnuplot এর সাথে ব্যবহার করা হয়, একটি PNG ফাইল হোন।
plot.SetTerminal ("png");
// প্রতিটি অক্ষের জন্য লেবেল সেট করুন।
plot.SetLegend ("X মান", "Y মান");
// x অক্ষের জন্য পরিসীমা সেট করুন।
plot.AppendExtra ("সেট xrange [-6:+6]");
// ডেটাসেটটি ইনস্ট্যান্টিয়েট করুন, এর শিরোনাম সেট করুন এবং পয়েন্টগুলি তৈরি করুন
// কোন সংযোগ লাইন ছাড়া প্লট করা.
Gnuplot2dDataset ডেটাসেট;
dataset.SetTitle (dataTitle);
dataset.SetStyle (Gnuplot2dDataset::POINTS);
// ডেটাসেটের x এবং y উভয় দিকনির্দেশে ত্রুটি বার রাখুন।
dataset.SetErrorBars (Gnuplot2dDataset::XY);
ডবল এক্স;
ডবল xErrorDelta;
ডবল y;
ডবল yErrorDelta;
// 2-ডি ডেটাসেট তৈরি করুন।
জন্য (x = -5.0; x <= +5.0; x += 1.0)
{
// 2-ডি বক্ররেখা গণনা করুন
//
// 2/XNUMX/XNUMX
// y = x।
//
y = x * x;
// x দিকের অনিশ্চয়তাকে স্থির করে তুলুন
// y দিকের অনিশ্চয়তা একটি ধ্রুবক ভগ্নাংশ হতে হবে
// y এর মান।
xErrorDelta = 0.25;
yErrorDelta = 0.1 * y;
// x এবং y উভয় ক্ষেত্রেই অনিশ্চয়তার সাথে এই বিন্দুটি যোগ করুন
// অভিমুখ.
ডেটাসেট যোগ করুন (x, y, xErrorDelta, yErrorDelta);
}
// প্লটে ডেটাসেট যোগ করুন।
plot.AddDataset (ডেটাসেট);
// প্লট ফাইল খুলুন।
অফস্ট্রিম প্লটফাইল (plotFileName.c_str());
// প্লট ফাইলটি লিখুন।
plot.GenerateOutput (plotFile);
// প্লট ফাইল বন্ধ করুন।
plotFile.close ();
An উদাহরণ ত্রিমাত্রিক 3 চক্রান্ত
নিম্নলিখিত 3-মাত্রিক প্লট
[ছবি]
gnuplot-example.cc থেকে নিম্নলিখিত কোড ব্যবহার করে তৈরি করা হয়েছে:
নেমস্পেস স্ট্যান্ড ব্যবহার করে;
string fileNameWithNoExtension = "প্লট-3d";
string graphicsFileName = fileNameWithNoExtension + ".png";
string plotFileName = fileNameWithNoExtension + ".plt";
string plotTitle = "3-ডি প্লট";
string dataTitle = "3-D ডেটা";
// প্লটটি ইনস্ট্যান্টিয়েট করুন এবং এর শিরোনাম সেট করুন।
Gnuplot প্লট (গ্রাফিক্স ফাইলের নাম);
plot.SetTitle (plotTitle);
// গ্রাফিক্স ফাইল তৈরি করুন, যেটি যখন প্লট ফাইল তৈরি করবে
// Gnuplot এর সাথে ব্যবহার করা হয়, একটি PNG ফাইল হোন।
plot.SetTerminal ("png");
// প্লটটিকে x অক্ষের চারপাশে 30 ডিগ্রি ঘোরান এবং তারপরে ঘোরান
// নতুন z অক্ষের চারপাশে 120 ডিগ্রি প্লট।
প্লট।অ্যাপেন্ডএক্সট্রা ("সেট ভিউ 30, 120, 1.0, 1.0");
// z-অক্ষের জন্য শূন্য করুন x-অক্ষ এবং y-অক্ষ সমতলে।
প্লট।অ্যাপেন্ডএক্সট্রা ("সেট টিক্সলেভেল 0");
// প্রতিটি অক্ষের জন্য লেবেল সেট করুন।
plot.AppendExtra ("এক্স লেবেল 'এক্স মান' সেট করুন");
প্লট।অ্যাপেন্ডএক্সট্রা ("ইলেবেল 'ওয়াই মান' সেট করুন");
plot.AppendExtra ("সেট zlabel 'Z Values'");
// x এবং y অক্ষের জন্য রেঞ্জ সেট করুন।
plot.AppendExtra ("সেট xrange [-5:+5]");
plot.AppendExtra ("সেট yrange [-5:+5]");
// ডেটাসেটটি ইনস্ট্যান্টিয়েট করুন, এর শিরোনাম সেট করুন এবং পয়েন্টগুলি তৈরি করুন
// লাইন দ্বারা সংযুক্ত।
Gnuplot3dDataset ডেটাসেট;
dataset.SetTitle (dataTitle);
dataset.SetStyle ("লাইন সহ");
ডবল এক্স;
ডবল y;
ডবল z;
// 3-ডি ডেটাসেট তৈরি করুন।
জন্য (x = -5.0; x <= +5.0; x += 1.0)
{
জন্য (y = -5.0; y <= +5.0; y += 1.0)
{
// 3-ডি পৃষ্ঠ গণনা করুন
//
// 2 2
// z = x * y।
//
z = x * x * y * y;
// এই পয়েন্ট যোগ করুন।
ডেটাসেট যোগ করুন (x, y, z);
}
// প্রতিটি x মানের ডেটার শেষে ফাঁকা লাইনটি প্রয়োজনীয়
// 3-D পৃষ্ঠ গ্রিড কাজ করার জন্য পয়েন্ট।
dataset.AddEmptyLine ();
}
// প্লটে ডেটাসেট যোগ করুন।
plot.AddDataset (ডেটাসেট);
// প্লট ফাইল খুলুন।
অফস্ট্রিম প্লটফাইল (plotFileName.c_str());
// প্লট ফাইলটি লিখুন।
plot.GenerateOutput (plotFile);
// প্লট ফাইল বন্ধ করুন।
plotFile.close ();
ব্যবহার পাইথন থেকে চালান ns-3
পাইথন বাইন্ডিং C++ কোড প্রবেশের অনুমতি দেয় ns-3 পাইথন থেকে কল করা হবে।
এই অধ্যায়টি আপনাকে দেখায় কিভাবে একটি পাইথন স্ক্রিপ্ট তৈরি করতে হয় যা চলতে পারে ns-3 এবং
একটি C++ এর জন্য পাইথন বাইন্ডিং তৈরি করার প্রক্রিয়া ns-3 মডিউল।
ভূমিকা
পাইথন বাইন্ডিংয়ের লক্ষ্য ns-3 দুই ভাঁজ হয়:
1. প্রোগ্রামারকে পাইথনে সম্পূর্ণ সিমুলেশন স্ক্রিপ্ট লেখার অনুমতি দিন (-
http://www.python.org);
2. প্রোটোটাইপ নতুন মডেল (যেমন রাউটিং প্রোটোকল)।
আপাতত, বাইন্ডিংয়ের প্রাথমিক ফোকাস প্রথম লক্ষ্য, তবে দ্বিতীয়টি
লক্ষ্য অবশেষে পাশাপাশি সমর্থিত হবে. এর জন্য পাইথন বাইন্ডিং ns-3 বিকশিত হচ্ছে
PyBindGen নামে একটি নতুন টুল ব্যবহার করে (http://code.google.com/p/pybindgen).
An উদাহরণ পাইথন লিপি যে রান ns-3
এখানে কিছু উদাহরণ কোড রয়েছে যা পাইথনে লেখা আছে এবং এটি চলে ns-3, যা লেখা আছে
C++ এ। এই পাইথন উদাহরণ পাওয়া যাবে example/tutorial/first.py:
ns.applications আমদানি করুন
ns.core আমদানি করুন
ns.internet আমদানি করুন
ns.network আমদানি করুন
ns.point_to_point আমদানি করুন
ns.core.LogComponentEnable("UdpEchoClientApplication", ns.core.LOG_LEVEL_INFO)
ns.core.LogComponentEnable("UdpEchoServerApplication", ns.core.LOG_LEVEL_INFO)
নোড = ns.network.NodeContainer()
নোডস তৈরি করুন(2)
pointToPoint = ns.point_to_point.PointToPointHelper()
pointToPoint.SetDeviceAttribute("DataRate", ns.core.StringValue("5Mbps"))
pointToPoint.SetChannelAttribute("বিলম্ব", ns.core.StringValue("2ms"))
ডিভাইস = pointToPoint.Install(নোড)
স্ট্যাক = ns.internet.InternetStackHelper()
stack.Install(নোড)
ঠিকানা = ns.internet.Ipv4AddressHelper()
ঠিকানা.SetBase(ns.network.Ipv4Address("10.1.1.0"), ns.network.Ipv4Mask("255.255.255.0"))
ইন্টারফেস = ঠিকানা। বরাদ্দ (ডিভাইস);
ইকো সার্ভার = ns.applications.UdpEchoServerHelper(9)
serverApps = echoServer.Install(নোড। পান(1))
serverApps.Start(ns.core.Seconds(1.0))
serverApps.Stop(ns.core.Seconds(10.0))
echoClient = ns.applications.UdpEchoClientHelper(ইন্টারফেস। ঠিকানা পান(1), 9)
echoClient.SetAttribute("MaxPackets", ns.core.UintegerValue(1))
echoClient.SetAttribute("Interval", ns.core.TimeValue(ns.core.Seconds (1.0)))
echoClient.SetAttribute("প্যাকেট সাইজ", ns.core.UintegerValue(1024))
clientApps = echoClient.Install(নোড। পান(0))
clientApps.Start(ns.core.Seconds(2.0))
clientApps.Stop(ns.core.Seconds(10.0))
ns.core.Simulator.Run()
ns.core.Simulator.Destroy()
চলমান পাইথন স্ক্রিপ্ট
waf-এ কিছু বিকল্প রয়েছে যা স্বয়ংক্রিয়ভাবে ns3 খুঁজে পেতে পাইথন পাথ আপডেট করে
মডিউল উদাহরণ প্রোগ্রামগুলি চালানোর জন্য, এটির যত্ন নেওয়ার জন্য waf ব্যবহার করার দুটি উপায় রয়েছে। এক
একটি waf শেল চালানো হয়; যেমন:
$./waf --shell
$ python উদাহরণ/wireless/mixed-wireless.py
এবং অন্যটি হল waf করার জন্য --pyrun বিকল্পটি ব্যবহার করা:
$ ./waf --pyrun উদাহরণ/wireless/mixed-wireless.py
সি ডিবাগারের অধীনে একটি পাইথন স্ক্রিপ্ট চালানোর জন্য:
$./waf --shell
$ gdb --args পাইথন উদাহরণ/wireless/mixed-wireless.py
কল করে আপনার নিজস্ব পাইথন স্ক্রিপ্ট চালানোর জন্য ns-3 এবং যে এই পথ আছে,
/path/to/your/example/my-script.py, নিম্নলিখিত কাজ করুন:
$./waf --shell
$ python /path/to/your/example/my-script.py
আদেশ সহকারে
এর জন্য পাইথন বাইন্ডিং ns-3 একটি কাজ চলছে, এবং কিছু সীমাবদ্ধতা দ্বারা পরিচিত
বিকাশকারী এই সীমাবদ্ধতার কিছু (সব নয়) এখানে তালিকাভুক্ত করা হয়েছে।
অসম্পূর্ণ কভারেজ
প্রথমত, মনে রাখবেন যে পাইথনে 100% API সমর্থিত নয়। কিছু
কারণগুলি হল:
1. কিছু এপিআই পয়েন্টার জড়িত, যার জন্য কোন ধরনের মেমরির জ্ঞান প্রয়োজন
পাসিং শব্দার্থবিদ্যা (কে কী স্মৃতির মালিক)। এই ধরনের জ্ঞান ফাংশনের অংশ নয়
স্বাক্ষর, এবং হয় নথিভুক্ত বা কখনও কখনও এমনকি নথিভুক্ত করা হয় না। টীকা হয়
এই ফাংশন আবদ্ধ করার জন্য প্রয়োজন;
2. কখনও কখনও একটি অস্বাভাবিক মৌলিক ডেটা টাইপ বা C++ গঠন ব্যবহার করা হয় যা এখনও হয়নি
PyBindGen দ্বারা সমর্থিত;
3. জিসিসি-এক্সএমএল টেমপ্লেট ভিত্তিক ক্লাস রিপোর্ট করে না যদি না সেগুলি ইনস্ট্যান্টিয়েট করা হয়।
অনুপস্থিত APIs অধিকাংশ মোড়ানো যেতে পারে, যথেষ্ট সময়, ধৈর্য, এবং দক্ষতা দেওয়া, এবং
বাগ রিপোর্ট জমা দিলে সম্ভবত মোড়ানো হবে। যাইহোক, একটি বাগ রিপোর্ট ফাইল করবেন না
"বাইন্ডিংগুলি অসম্পূর্ণ", কারণ আমাদের কাছে 100% সম্পূর্ণ করার জন্য জনবল নেই
বাঁধাই
পরিবর্তন নির্মাতারা
পরিবর্তন কনস্ট্রাক্টর PyBindGen দ্বারা এখনও সম্পূর্ণরূপে সমর্থিত নয়, এবং তারা সর্বদা কাজ করে
Python এ API অনুবাদ করার সময় স্পষ্ট কনস্ট্রাক্টর। উদাহরণস্বরূপ, C++ এ আপনি করতে পারেন
এই:
Ipv4AddressHelper ipAddrs;
ipAddrs.SetBase ("192.168.0.0", "255.255.255.0");
ipAddrs.Assign (backboneDevices);
পাইথনে, আপাতত আপনাকে করতে হবে:
ipAddrs = ns3.Ipv4AddressHelper()
ipAddrs.SetBase(ns3.Ipv4Address("192.168.0.0"), ns3.Ipv4Mask("255.255.255.0"))
ipAddrs. Assign (ব্যাকবোন ডিভাইস)
কমান্ডলাইন
কমান্ডলাইন::অ্যাডভ্যালু() পাইথনে এর চেয়ে ভিন্নভাবে কাজ করে ns-3. পাইথনে, দ
প্রথম প্যারামিটার হল একটি স্ট্রিং যা কমান্ড-লাইন বিকল্পের নাম উপস্থাপন করে। যখন বিকল্প
সেট করা হয়, বিকল্পের নামের মতো একই নামের একটি অ্যাট্রিবিউট সেট করা হয় কমান্ডলাইন()
বস্তু উদাহরণ:
NUM_NODES_SIDE_DEFAULT = 3
cmd = ns3.CommandLine()
cmd.NumNodesSide = কোনটি নয়
cmd.AddValue("NumNodesSide", "নোডের গ্রিড সাইড নম্বর (নোডের মোট সংখ্যা এই সংখ্যাটি বর্গ করা হবে)")
cmd.Parse(argv)
[...]
যদি cmd.NumNodesSide কোনটি না হয়:
num_nodes_side = NUM_NODES_SIDE_DEFAULT
অন্য:
num_nodes_side = int(cmd.NumNodesSide)
রচনা
কলব্যাক ভিত্তিক ট্রেসিং এখনও পাইথনের জন্য নতুন হিসাবে সঠিকভাবে সমর্থিত নয় ns-3 API প্রয়োজন
এই সমর্থন করা জন্য প্রদান করা হবে.
Pcap ফাইল লেখা সাধারণ API এর মাধ্যমে সমর্থিত।
Ascii ট্রেসিং এর পর থেকে সমর্থিত ns-3.4 সাধারণ C++ API এর মাধ্যমে পাইথনে অনুবাদ করা হয়েছে।
যাইহোক, ascii ট্রেসিংয়ের জন্য ascii-তে যাওয়ার জন্য একটি ওস্ট্রিম অবজেক্ট তৈরি করতে হবে
ট্রেসিং পদ্ধতি। পাইথনে, অনুমতি দেওয়ার জন্য C++ std::ofstream ন্যূনতমভাবে মোড়ানো হয়েছে
এই. উদাহরণ স্বরূপ:
ascii = ns3.ofstream("wifi-ap.tr") # ফাইলটি তৈরি করুন
ns3.YansWifiPhyHelper.EnableAsciiAll(ascii)
ns3.Simulator.Run()
ns3.Simulator.Destroy()
ascii.close() # ফাইলটি বন্ধ করুন
একটি সতর্কতা আছে: আপনি ফাইল অবজেক্টকে আবর্জনা সংগ্রহ করার সময় অনুমতি দেবেন না ns-3
এখনও এটি ব্যবহার করছে। এর মানে হল যে উপরের 'ascii' ভেরিয়েবলটিকে যেতে দেওয়া উচিত নয়
সুযোগের বাইরে না হলে প্রোগ্রামটি ক্র্যাশ হবে।
Cygwin সীমাবদ্ধতা
সাইগউইনে পাইথন বাইন্ডিং কাজ করে না। এটি একটি gccxml বাগ এর কারণে।
আপনি সাইগউইনের মধ্যে থেকে API সংজ্ঞাগুলি পুনরায় স্ক্যান করে এটি থেকে দূরে যেতে পারেন
পরিবেশ (./waf --python-scan)। তবে সবচেয়ে সম্ভাব্য সমাধান সম্ভবত হবে
আমরা সাইগউইনে পাইথন বাইন্ডিং অক্ষম করি।
আপনি যদি সত্যিই উইন্ডোজে পাইথন বাইন্ডিং সম্পর্কে যত্নশীল হন তবে mingw এবং নেটিভ দিয়ে তৈরি করার চেষ্টা করুন
পরিবর্তে পাইথন। অন্যথায়, পাইথন বাইন্ডিং ছাড়া তৈরি করতে, পাইথন বাইন্ডিং অক্ষম করুন
কনফিগারেশন পর্যায়:
$ ./waf কনফিগার --disable-python
ওয়ার্কিং সঙ্গে পাইথন বাঁধাই
বর্তমানে দুটি ধরণের পাইথন বাইন্ডিং রয়েছে ns-3:
1. মনোলিথিক বাইন্ডিংগুলিতে সমস্ত মডিউলগুলির জন্য API সংজ্ঞা রয়েছে এবং এটি পাওয়া যেতে পারে৷
একটি একক ডিরেক্টরি, বাঁধাই/পাইথন.
2. মডুলার বাইন্ডিংগুলিতে একটি একক মডিউলের জন্য API সংজ্ঞা রয়েছে এবং প্রতিটিতে পাওয়া যেতে পারে
মডিউল এর বাইন্ডিং ডিরেক্টরি.
পাইথন বাঁধাই কর্মপ্রবাহ
যে প্রক্রিয়ার মাধ্যমে পাইথন বাইন্ডিং পরিচালনা করা হয় তা হল:
1. পর্যায়ক্রমে একজন বিকাশকারী একটি GCC-XML ব্যবহার করে (http://www.gccxml.org) ভিত্তিক API স্ক্যানিং
স্ক্রিপ্ট, যা স্ক্যান করা API সংজ্ঞা হিসাবে সংরক্ষণ করে bindings/python/ns3_module__*.py নথি পত্র
অথবা প্রতিটি মডিউলে পাইথন ফাইল হিসাবে বাইন্ডিং ডিরেক্টরি এই ফাইলগুলো নিচে রাখা হয়
প্রধান সংস্করণ নিয়ন্ত্রণ ns-3 সংগ্রহস্থল;
2. অন্যান্য বিকাশকারীরা সংগ্রহস্থল ক্লোন করে এবং ইতিমধ্যে স্ক্যান করা API সংজ্ঞা ব্যবহার করে;
3. কনফিগার করার সময় ns-3, pybindgen স্বয়ংক্রিয়ভাবে ডাউনলোড করা হবে যদি ইতিমধ্যে না থাকে
ইনস্টল করা মুক্তি পেয়েছে ns-3 টারবলগুলি পাইবিন্ডজেনের একটি অনুলিপি প্রেরণ করবে।
যদি পাইথন বাইন্ডিং কম্পাইল করার সাথে কিছু ভুল হয় এবং আপনি কেবল সেগুলি উপেক্ষা করতে চান
এবং C++ এর সাথে এগিয়ে যান, আপনি এর সাথে পাইথন নিষ্ক্রিয় করতে পারেন:
$./waf --disable-python
নির্দেশনা উন্নত হ্যান্ডলিং নতুন নথি পত্র or পরিবর্তিত API গুলি
তাই আপনি বিদ্যমান পরিবর্তন করা হয়েছে ns-3 এপিআই এবং পাইথন বাইন্ডিং আর কম্পাইল হয় না? করবেন
হতাশা নয়, আপনি পরিবর্তনগুলিকে প্রতিফলিত করে এমন নতুন বাইন্ডিং তৈরি করতে বাইন্ডিংগুলি পুনরায় স্ক্যান করতে পারেন৷
থেকে ns-3 API- টি।
আপনি মনোলিথিক বা মডুলার বাইন্ডিং ব্যবহার করছেন কিনা তার উপর নির্ভর করে, নীচের আলোচনাগুলি দেখুন
আপনার পাইথন বাইন্ডিংগুলি কীভাবে পুনরায় স্ক্যান করবেন তা শিখুন।
একশিলা পাইথন বাঁধাই
স্ক্যান করা হচ্ছে দ্য একশিলা পাইথন বাঁধাই
মনোলিথিক পাইথন বাইন্ডিংগুলি স্ক্যান করতে নিম্নলিখিতগুলি করুন:
$./waf --python-scan
সংগঠন of দ্য একশিলা পাইথন বাঁধাই
মনোলিথিক পাইথন এপিআই সংজ্ঞাগুলি নিম্নরূপ সংগঠিত। প্রতিটির জন্য ns-3 মডিউল
, ফাইল bindings/python/ns3_module_ .py এর API বর্ণনা করে। যারা প্রতিটি
ফাইলের 3টি শীর্ষ স্তরের ফাংশন রয়েছে:
1. Def register_types(মডিউল)(): এই ফাংশনটি নতুন ধরনের নিবন্ধনের যত্ন নেয় (যেমন
C++ ক্লাস, enums) যা tha মডিউলে সংজ্ঞায়িত করা হয়েছে;
2. Def রেজিস্টার_পদ্ধতি(মডিউল)(): এই ফাংশনটি প্রতিটি ক্লাসের জন্য কল করে , অন্য
ফাংশন register_methods_Ns3 (মডিউল)। এই পরের ফাংশন পদ্ধতি যোগ
প্রতিটি শ্রেণীর জন্য সংজ্ঞা;
3. Def রেজিস্টার_ফাংশন(মডিউল)(): এই ফাংশন নিবন্ধন ns-3 এর অন্তর্গত ফাংশন
যে মডিউল.
মডুলার পাইথন বাঁধাই
সংক্ষিপ্ত বিবরণ
ns 3.11 থেকে, মডুলার বাইন্ডিং যোগ করা হচ্ছে, পুরানো একশিলাটির সমান্তরালে
বাঁধাই
নতুন পাইথন বাইন্ডিংগুলি পুরানোটির জন্য 'ns3' এর পরিবর্তে একটি 'ns' নামস্থানে তৈরি করা হয়েছে
বাঁধাই উদাহরণ:
ns.network আমদানি নোড থেকে
n1 = নোড()
মডুলার পাইথন বাইন্ডিং সহ:
1. প্রতিটির জন্য একটি পৃথক পাইথন এক্সটেনশন মডিউল রয়েছে৷ ns-3 মডিউল
2. স্ক্যানিং API সংজ্ঞা (apidefs) প্রতি ns- মডিউল ভিত্তিতে করা হয়;
3. প্রতিটি মডিউলের অ্যাপিডেফ ফাইল মডিউলের একটি 'বাইন্ডিং' সাবডিরেক্টরিতে সংরক্ষণ করা হয়
ডিরেক্টরি;
স্ক্যান করা হচ্ছে দ্য মডুলার পাইথন বাঁধাই
মূল মডিউলের জন্য মডুলার পাইথন বাইন্ডিং স্ক্যান করতে, উদাহরণস্বরূপ, নিম্নলিখিতগুলি করুন:
$./waf --apiscan=core
সমস্ত মডিউলগুলির জন্য মডুলার পাইথন বাইন্ডিংগুলি স্ক্যান করতে, নিম্নলিখিতগুলি করুন:
$./waf --apiscan=সমস্ত
তৈরি করা হচ্ছে a নতুন মডিউল
আপনি যদি একটি নতুন মডিউল যোগ করেন, পাইথন বাইন্ডিংগুলি কম্পাইল হতে থাকবে কিন্তু হবে না
নতুন মডিউল কভার করুন।
একটি নতুন মডিউল কভার করতে, আপনাকে একটি তৈরি করতে হবে bindings/python/ns3_module_ .py ফাইল,
পূর্ববর্তী বিভাগে যা বর্ণনা করা হয়েছে তার অনুরূপ এবং এটি পরিবর্তনশীলে নিবন্ধন করুন
LOCAL_MODULES() in bindings/python/ns3modulegen.py
যোগ করার পদ্ধতি মডুলার বাঁধাই থেকে A বর্তমান মডিউল
বিদ্যমান মডুলার বাইন্ডিংয়ের জন্য সমর্থন যোগ করতে ns-3 মডিউল, কেবল নিম্নলিখিত যোগ করুন
এর wscript build() ফাংশনের লাইন:
bld.ns3_python_bindings()
সংগঠন of দ্য মডুলার পাইথন বাঁধাই
সার্জারির src/ / বাঁধাই ডিরেক্টরিতে নিম্নলিখিত ফাইল থাকতে পারে, তাদের মধ্যে কয়েকটি
ঐচ্ছিক:
· callbacks_list.py: এটি একটি স্ক্যান করা ফাইল, স্পর্শ করবেন না। এর একটি তালিকা রয়েছে
কলব্যাক<...> স্ক্যান করা হেডারে পাওয়া টেমপ্লেট উদাহরণ;
· modulegen__gcc_LP64.py: এটি একটি স্ক্যান করা ফাইল, স্পর্শ করবেন না। স্ক্যান করা API সংজ্ঞা
GCC, LP64 আর্কিটেকচারের জন্য (64-বিট)
· modulegen__gcc_ILP32.py: এটি একটি স্ক্যান করা ফাইল, স্পর্শ করবেন না। স্ক্যান করা API সংজ্ঞা
GCC, ILP32 আর্কিটেকচারের জন্য (32-বিট)
· modulegen_customizations.py: কাস্টমাইজ করার জন্য আপনি ঐচ্ছিকভাবে এই ফাইলটি যোগ করতে পারেন
পাইবিন্ডজেন কোড জেনারেশন
· scan-header.h: কোন হেডার ফাইল স্ক্যান করা হয়েছে তা কাস্টমাইজ করতে আপনি ঐচ্ছিকভাবে এই ফাইলটি যোগ করতে পারেন
মডিউল জন্য. মূলত এই ফাইলটি ns3/ এর পরিবর্তে স্ক্যান করা হয় -module.h.
সাধারণত, প্রথম বিবৃতিটি হল #include "ns3/ -module.h", আরও কিছু
টেমপ্লেট ইনস্ট্যান্টিয়েশন জোর করার জন্য স্টাফ;
· module_helpers.cc: আপনি পাইথনের সাথে লিঙ্ক করার জন্য অতিরিক্ত ফাইল যোগ করতে পারেন, যেমন এটি
এক্সটেনশন মডিউল, তবে তাদের wscript এ নিবন্ধিত হতে হবে। তাকানো
কিভাবে তা করতে হয় তার একটি উদাহরণের জন্য src/core/wscript;
· .py: যদি এই ফাইলটি বিদ্যমান থাকে তবে এটি ns3 এর জন্য "ফ্রন্টএন্ড" পাইথন মডিউল হয়ে যায়
মডিউল, এবং এক্সটেনশন মডিউল (. তাই ফাইল) হয়ে যায় _ তাই পরিবর্তে তাই
দ্য .py ফাইলটিকে মডিউল থেকে সমস্ত চিহ্ন আমদানি করতে হবে _ (এটি আরও
এটি শোনার চেয়ে কঠিন, একটি উদাহরণের জন্য src/core/bindings/core.py দেখুন), এবং তারপর যোগ করতে পারেন
কিছু অতিরিক্ত বিশুদ্ধ-পাইথন সংজ্ঞা।
অধিক তথ্য উন্নত ডেভেলপারগণ
আপনি যদি একজন বিকাশকারী হন এবং আরও তথ্যের প্রয়োজন হয় ns-3এর পাইথন বাইন্ডিং, অনুগ্রহ করে দেখুন
পাইথন বাঁধাই উইকি পৃষ্ঠা.
টেস্ট
সংক্ষিপ্ত বিবরণ
এই নথিটি পরীক্ষা এবং বৈধতার সাথে সম্পর্কিত ns-3 সফটওয়্যার.
এই নথি প্রদান করে
· পরিভাষা এবং সফ্টওয়্যার পরীক্ষার পটভূমি (অধ্যায় 2);
· ns-3 পরীক্ষার কাঠামোর একটি বিবরণ (অধ্যায় 3);
মডেল ডেভেলপার বা নতুন মডেল অবদানকারীদের জন্য একটি নির্দেশিকা কিভাবে পরীক্ষা লিখতে হয় (অধ্যায়
4);
সংক্ষেপে, প্রথম তিনটি অধ্যায় ns ডেভেলপার এবং অবদানকারীদের পড়া উচিত যারা
পরীক্ষার কোড এবং বৈধ প্রোগ্রামগুলি এবং অবশিষ্টগুলি কীভাবে অবদান রাখতে হয় তা বুঝতে হবে
নথির লোকেদের জন্য নির্বাচিত মডেলগুলির কোন দিকগুলি সম্পর্কে রিপোর্ট করার জন্য স্থান প্রদান করে৷
বৈধ করা হয়েছে।
পটভূমি
এই অধ্যায় may be এড়িয়ে গেছে by পাঠকদের পরিচিত সঙ্গে দ্য মূলসূত্র of সফটওয়্যার পরীক্ষামূলক.
ত্রুটি-মুক্ত সফ্টওয়্যার লেখা একটি কঠিন প্রস্তাব। অনেক মাত্রা আছে
সমস্যা এবং বিভিন্ন পদ দ্বারা কি বোঝানো হয় সে সম্পর্কে অনেক বিভ্রান্তি রয়েছে
বিভিন্ন প্রসঙ্গ আমরা পর্যালোচনা করার জন্য একটু সময় ব্যয় করা সার্থক বলে মনে করেছি
বিষয় এবং কিছু পদ সংজ্ঞায়িত করা।
সফ্টওয়্যার পরীক্ষার সাথে একটি প্রোগ্রাম কার্যকর করার প্রক্রিয়া হিসাবে আলগাভাবে সংজ্ঞায়িত করা যেতে পারে
ত্রুটি খুঁজে বের করার অভিপ্রায়। যখন কেউ সফ্টওয়্যার পরীক্ষার বিষয়ে আলোচনায় প্রবেশ করে, তখন এটি
দ্রুত স্পষ্ট হয়ে ওঠে যে অনেকগুলি স্বতন্ত্র মন-সেট রয়েছে যার সাহায্যে কেউ পারে
বিষয়ের কাছে যান।
উদাহরণস্বরূপ, কেউ প্রক্রিয়াটিকে বিস্তৃত কার্যকরী বিভাগে বিভক্ত করতে পারে যেমন
''সঠিকতা পরীক্ষা,''''কর্মক্ষমতা পরীক্ষা,''''দৃঢ়তা পরীক্ষা'' এবং ''নিরাপত্তা
পরীক্ষা।'' সমস্যাটি দেখার আরেকটি উপায় হল জীবনচক্র: ''প্রয়োজনীয়তা পরীক্ষা,''
''ডিজাইন টেস্টিং,''''গ্রহণযোগ্যতা পরীক্ষা,''এবং ''রক্ষণাবেক্ষণ পরীক্ষা।'' অন্য একটি দৃশ্য।
পরীক্ষিত সিস্টেমের সুযোগ দ্বারা হয়. এই ক্ষেত্রে কেউ ''ইউনিট টেস্টিং'' এর কথা বলতে পারে।
''কম্পোনেন্ট টেস্টিং,'''' ইন্টিগ্রেশন টেস্টিং'' এবং ''সিস্টেম টেস্টিং'' এই পদগুলি হল
এছাড়াও কোনোভাবেই মানসম্মত নয়, এবং তাই ''রক্ষণাবেক্ষণ পরীক্ষা'' এবং ''রিগ্রেশন
টেস্টিং'' বিনিময়যোগ্যভাবে শোনা যেতে পারে। উপরন্তু, এই শর্তাবলী প্রায়ই অপব্যবহার করা হয়.
সফ্টওয়্যার পরীক্ষার জন্য বিভিন্ন দার্শনিক পন্থাও রয়েছে। জন্য
উদাহরণস্বরূপ, কিছু সংস্থা বাস্তবে বাস্তবায়নের আগে পরীক্ষামূলক প্রোগ্রাম লেখার পক্ষে
পছন্দসই সফ্টওয়্যার, ফলন ''পরীক্ষা-চালিত উন্নয়ন।'' কিছু সংস্থা সমর্থন করে
যত তাড়াতাড়ি সম্ভব একটি গ্রাহকের দৃষ্টিকোণ থেকে পরীক্ষা, সঙ্গে একটি সমান্তরাল অনুসরণ
চটপটে বিকাশ প্রক্রিয়া: ''প্রথম দিকে পরীক্ষা করুন এবং প্রায়শই পরীক্ষা করুন।'' এটিকে কখনও কখনও বলা হয়
''চটপট পরীক্ষা।'' মনে হচ্ছে প্রত্যেকের জন্য পরীক্ষা করার জন্য অন্তত একটি পদ্ধতি আছে
উন্নয়ন পদ্ধতি।
সার্জারির ns-3 প্রকল্পটি এই প্রক্রিয়াগুলির যে কোনও একটির পক্ষে ওকালতি করার ব্যবসার মধ্যে নয়, তবে
পুরো প্রকল্পের প্রয়োজনীয়তা রয়েছে যা পরীক্ষার প্রক্রিয়া জানাতে সাহায্য করে।
সমস্ত প্রধান সফ্টওয়্যার পণ্যের মত, ns-3 এর জন্য উপস্থিত থাকা আবশ্যক গুণাবলী আছে
পণ্যটি সফল হবে। একটি পরীক্ষার দৃষ্টিকোণ থেকে, এই গুণাবলী যে কিছু হতে হবে
সম্বোধন করা হয় যে ns-3 হতে হবে ''সঠিক,''''শক্তিশালী,''''পারফরম্যান্স'' এবং
''রক্ষণাবেক্ষণযোগ্য।'' আদর্শভাবে এই প্রতিটি মাত্রার জন্য মেট্রিক্স থাকা উচিত
পণ্যটি কখন তার প্রত্যাশা পূরণ করতে ব্যর্থ হয় তা সনাক্ত করতে পরীক্ষা দ্বারা পরীক্ষা করা হয় /
প্রয়োজনীয়তা।
সঠিকতা
পরীক্ষার অপরিহার্য উদ্দেশ্য হল সফ্টওয়্যারের একটি অংশ আচরণ করে তা নির্ধারণ করা
''সঠিকভাবে।'' জন্য ns-3 এর মানে হল যে যদি আমরা কিছু অনুকরণ করি, সিমুলেশন করা উচিত
বিশ্বস্তভাবে একটি নির্দিষ্ট নির্ভুলতা কিছু শারীরিক সত্তা বা প্রক্রিয়া প্রতিনিধিত্ব করে এবং
স্পষ্টতা।
দেখা যাচ্ছে যে দুটি দৃষ্টিকোণ রয়েছে যা থেকে একজন সঠিকতা দেখতে পারে।
একটি নির্দিষ্ট মডেল তার স্পেসিফিকেশন অনুযায়ী বাস্তবায়িত হয় তা যাচাই করা হয়
সাধারণভাবে বলা হয় প্রতিপাদন. মডেলের জন্য সঠিক যে সিদ্ধান্ত নেওয়ার প্রক্রিয়া
এর উদ্দিষ্ট ব্যবহারকে সাধারণভাবে বলা হয় বৈধতা.
ভ্যালিডেশন এবং প্রতিপাদন
একটি কম্পিউটার মডেল হল কোনো কিছুর গাণিতিক বা যৌক্তিক উপস্থাপনা। এটা হতে পারে
একটি যানবাহন, একটি হাতি প্রতিনিধিত্ব করুন (দেখুন ডেভিড হারেলের আলাপ সম্বন্ধে মূর্তিনির্মাণ an হাতি at
সিমুটুল 2009, অথবা একটি নেটওয়ার্কিং কার্ড। মডেলগুলি বিশ্বব্যাপী প্রক্রিয়াগুলিকেও উপস্থাপন করতে পারে
উষ্ণায়ন, ফ্রিওয়ে ট্রাফিক প্রবাহ বা নেটওয়ার্কিং প্রোটোকলের একটি স্পেসিফিকেশন। মডেল হতে পারে
একটি যৌক্তিক প্রক্রিয়া স্পেসিফিকেশন সম্পূর্ণরূপে বিশ্বস্ত উপস্থাপনা, কিন্তু তারা
অগত্যা সম্পূর্ণরূপে একটি ভৌত বস্তু বা প্রক্রিয়া অনুকরণ করতে পারে না. বেশিরভাগ ক্ষেত্রে, ক
কম্পিউটেশনালভাবে সিমুলেশন তৈরি করার জন্য মডেলটিতে সংখ্যক সরলীকরণ করা হয়
ট্র্যাক্টেবল
প্রতিটি মডেল একটি আছে লক্ষ্য পদ্ধতি এটা অনুকরণ করার চেষ্টা করা হয়. প্রথম ধাপ
একটি সিমুলেশন মডেল তৈরি করা হল এই টার্গেট সিস্টেম এবং বিস্তারিত স্তর সনাক্ত করা এবং
নির্ভুলতা যে সিমুলেশনটি পুনরুত্পাদন করতে চায়। যৌক্তিক প্রক্রিয়ার ক্ষেত্রে,
লক্ষ্য সিস্টেমটিকে "RFC 793 দ্বারা সংজ্ঞায়িত TCP" হিসাবে চিহ্নিত করা যেতে পারে। এই ক্ষেত্রে, এটি
সম্ভবত একটি মডেল তৈরি করা বাঞ্ছনীয় হবে যা সম্পূর্ণ এবং বিশ্বস্তভাবে RFC পুনরুত্পাদন করে
793. শারীরিক প্রক্রিয়ার ক্ষেত্রে এটি সম্ভব হবে না। যদি, উদাহরণস্বরূপ, আপনি
একটি ওয়্যারলেস নেটওয়ার্কিং কার্ড অনুকরণ করতে চান, আপনি নির্ধারণ করতে পারেন যে আপনার প্রয়োজন, ''একটি
802.11 স্পেসিফিকেশনের সঠিক MAC-স্তরের বাস্তবায়ন এবং [...] খুব ধীর নয়
802.11a স্পেসিফিকেশনের PHY-স্তরের মডেল৷''
একবার এটি সম্পন্ন হলে, কেউ লক্ষ্য সিস্টেমের একটি বিমূর্ত মডেল বিকাশ করতে পারে। এই
সাধারণত জটিলতা, সম্পদের প্রয়োজনীয়তার মধ্যে ট্রেডঅফ পরিচালনা করার একটি অনুশীলন
এবং নির্ভুলতা। একটি বিমূর্ত মডেল তৈরির প্রক্রিয়া বলা হয়েছে মডেল
যোগ্যতা সাহিত্যে. একটি TCP প্রোটোকলের ক্ষেত্রে, এই প্রক্রিয়াটির ফলাফল a
বস্তু, মিথস্ক্রিয়া এবং আচরণের একটি সংগ্রহের জন্য ডিজাইন যা সম্পূর্ণরূপে বাস্তবায়ন করবে
RFC 793 in ns-3. ওয়্যারলেস কার্ডের ক্ষেত্রে, এই প্রক্রিয়াটির ফলাফল অনেকগুলি
ট্রেডঅফ ফিজিক্যাল লেয়ারকে সিমুলেট করা এবং একটি নেটওয়ার্ক ডিভাইসের ডিজাইন করার অনুমতি দেয়
এবং কাঙ্ক্ষিত বস্তু, মিথস্ক্রিয়া এবং আচরণ সহ ns-3 এর জন্য চ্যানেল।
এই বিমূর্ত মডেল তারপর একটি বিকশিত হয় ns-3 মডেল যা বিমূর্ত বাস্তবায়ন করে
একটি কম্পিউটার প্রোগ্রাম হিসাবে মডেল। বাস্তবায়ন প্রক্রিয়ার সঙ্গে একমত পোষণ করে
বিমূর্ত মডেল বলা হয় মডেল প্রতিপাদন সাহিত্যে.
প্রক্রিয়া এখন পর্যন্ত খোলা লুপ. কি অবশেষ একটি সংকল্প করা যে একটি প্রদত্ত ns-3
মডেলের কিছু বাস্তবতার সাথে কিছু সংযোগ আছে -- যে একটি মডেল এর সঠিক উপস্থাপনা
একটি বাস্তব সিস্টেম, একটি যৌক্তিক প্রক্রিয়া বা একটি শারীরিক সত্তা কিনা.
যদি কেউ একটি সিমুলেশন মডেল ব্যবহার করে চেষ্টা করে এবং ভবিষ্যদ্বাণী করে যে কীভাবে কিছু বাস্তব ব্যবস্থা চলছে
আচরণ করার জন্য, আপনার ফলাফল বিশ্বাস করার কিছু কারণ থাকতে হবে -- অর্থাৎ, কেউ কি এটা বিশ্বাস করতে পারে
মডেল থেকে তৈরি একটি অনুমান বাস্তব সিস্টেমের জন্য একটি সঠিক ভবিষ্যদ্বাণীতে অনুবাদ করে।
কাঙ্ক্ষিত লক্ষ্য সিস্টেমের সাথে একমত হওয়ার জন্য ns-3 মডেলের আচরণ পাওয়ার প্রক্রিয়া
মডেল যোগ্যতা প্রক্রিয়া দ্বারা সংজ্ঞায়িত আচরণ বলা হয় মডেল বৈধতা মধ্যে
সাহিত্য একটি TCP বাস্তবায়নের ক্ষেত্রে, আপনি এর আচরণ তুলনা করতে চাইতে পারেন
আপনার মডেল যাচাই করার জন্য কিছু রেফারেন্স বাস্তবায়নের জন্য আপনার ns-3 TCP মডেল। ভিতরে
একটি বেতার শারীরিক স্তর সিমুলেশন ক্ষেত্রে, আপনি আচরণ তুলনা করতে চাইতে পারেন
একটি নিয়ন্ত্রিত সেটিংসে আপনার মডেলটি আসল হার্ডওয়্যারের সাথে,
সার্জারির ns-3 পরীক্ষার পরিবেশ মডেলের বৈধতা এবং
পরীক্ষা করে, এবং যাচাইকরণের ফলাফল প্রকাশে উৎসাহিত করে।
বলিষ্ঠতা
দৃঢ়তা হল চাপ, বা পরিবেশের পরিবর্তন সহ্য করতে সক্ষম হওয়ার গুণ,
ইনপুট বা গণনা, ইত্যাদি। একটি সিস্টেম বা নকশা "শক্তিশালী" যদি এটি এই ধরনের মোকাবেলা করতে পারে
কার্যকারিতা ন্যূনতম ক্ষতি সঙ্গে পরিবর্তন.
এই ধরনের পরীক্ষা সাধারণত একটি নির্দিষ্ট ফোকাস দিয়ে করা হয়। উদাহরণস্বরূপ, সিস্টেম হিসাবে
একটি সম্পূর্ণ বিভিন্ন সিস্টেম কনফিগারেশনে চালানো যেতে পারে তা দেখাতে পারে
বিপুল সংখ্যক পরিবেশে সঠিকভাবে সঞ্চালন করুন।
সিস্টেমটি জেনারেট করে ধারণক্ষমতার কাছাকাছি বা তার বেশি কাজ করেও চাপ দেওয়া যেতে পারে
বা বিভিন্ন ধরণের সম্পদ নিঃসরণ অনুকরণ। পরীক্ষার এই ধারা বলা হয়
''চাপ পরীক্ষা.''
সিস্টেম এবং এর উপাদানগুলি তথাকথিত ''ক্লিন টেস্ট'' এর সংস্পর্শে আসতে পারে যা প্রদর্শন করে
একটি ইতিবাচক ফলাফল -- যে সিস্টেম একটি বড় প্রতিক্রিয়া সঠিকভাবে কাজ করে
প্রত্যাশিত কনফিগারেশনের ভিন্নতা।
সিস্টেম এবং এর উপাদানগুলি "নোংরা পরীক্ষা" এর সংস্পর্শে আসতে পারে যা ইনপুট প্রদান করে
প্রত্যাশিত সীমার বাইরে। উদাহরণস্বরূপ, যদি একটি মডিউল একটি শূন্য-সমাপ্ত স্ট্রিং আশা করে
একটি পূর্ণসংখ্যার প্রতিনিধিত্ব, একটি নোংরা পরীক্ষা র্যান্ডম একটি অনির্বাচিত স্ট্রিং প্রদান করতে পারে
এই অপ্রত্যাশিত ইনপুটের ফলে সিস্টেম ক্র্যাশ না হয় তা যাচাই করার জন্য অক্ষর।
দুর্ভাগ্যবশত, এই ধরনের ''নোংরা'' ইনপুট সনাক্ত করা এবং নিশ্চিত করার জন্য প্রতিরোধমূলক ব্যবস্থা নেওয়া
সিস্টেম বিপর্যয়মূলকভাবে ব্যর্থ হয় না উন্নয়ন ওভারহেড একটি বিশাল পরিমাণ প্রয়োজন হতে পারে.
উন্নয়নের সময় কমানোর জন্য, প্রকল্পের প্রথম দিকে একটি সিদ্ধান্ত নেওয়া হয়েছিল
মধ্যে পরামিতি যাচাইকরণ এবং ত্রুটি পরিচালনার পরিমাণ কমিয়ে দিন ns-3 কোডবেস জন্য
এই কারণে, আমরা নোংরা পরীক্ষার জন্য বেশি সময় ব্যয় করি না -- এটি কেবল উন্মোচিত করবে
নকশা সিদ্ধান্তের ফলাফল আমরা জানি আমরা নিয়েছি।
আমরা তা প্রদর্শন করতে চাই ns-3 সফ্টওয়্যার কিছু শর্ত জুড়ে কাজ করে। আমরা
এটিকে কিছুটা সংকুচিত করার জন্য কয়েকটি সংজ্ঞা ধার নিন। দ্য ডোমেইন of প্রয়োগযোগ্যতা is
নির্ধারিত শর্তগুলির একটি সেট যার জন্য মডেলটি পরীক্ষা করা হয়েছে, তুলনায়
বাস্তবতা যতটা সম্ভব, এবং ব্যবহারের জন্য উপযুক্ত বিচার করা। দ্য পরিসর of সঠিকতা একটি
প্রযোজ্যতার একটি ডোমেনের মধ্যে কম্পিউটারাইজড মডেল এবং বাস্তবতার মধ্যে চুক্তি।
সার্জারির ns-3 টেস্টিং এনভায়রনমেন্ট পরীক্ষা সেট আপ এবং চালানোর অনুমতি দেওয়ার জন্য সরঞ্জাম সরবরাহ করে
একাধিক সিস্টেমের উপর পরিবেশ (বিল্ডবট) এবং পরিষ্কারকে উৎসাহিত করার জন্য ক্লাস প্রদান করে
প্রত্যাশিত ''প্রযোজ্যতার ডোমেন'' এর উপর সিস্টেমের অপারেশন যাচাই করার জন্য পরীক্ষা
এবং ''নির্ভুলতার পরিসর''।
পারফরম্যান্ট
ঠিক আছে, ''পারফরম্যান্স'' একটি আসল ইংরেজি শব্দ নয়। তবে এটি একটি খুব সংক্ষিপ্ত নিওলজিজম
এটি প্রায়শই আমরা যা চাই তা বর্ণনা করতে ব্যবহৃত হয় ns-3 হতে: শক্তিশালী এবং যথেষ্ট দ্রুত
কাজটি সম্পন্ন কর.
এটি সত্যিই সফ্টওয়্যার কর্মক্ষমতা পরীক্ষার বিস্তৃত বিষয় সম্পর্কে। এক
যে জিনিসগুলি করা হয় তা হল দুটি সিস্টেমের তুলনা করা যা ভাল পারফর্ম করে তা খুঁজে বের করা (cf
বেঞ্চমার্ক)। এটি প্রদর্শন করতে ব্যবহৃত হয়, উদাহরণস্বরূপ, ns-3 একটি মৌলিক ধরনের সঞ্চালন করতে পারেন
সিমুলেশন অন্তত একটি প্রতিযোগী টুল হিসাবে দ্রুত, বা অংশ সনাক্ত করতে ব্যবহার করা যেতে পারে
সিস্টেম যে খারাপভাবে কাজ করে.
মধ্যে ns-3 পরীক্ষার ফ্রেমওয়ার্ক, আমরা বিভিন্ন ধরণের পরীক্ষার সময় নির্ধারণের জন্য সহায়তা প্রদান করি।
Maintainability
একটি সফ্টওয়্যার পণ্য রক্ষণাবেক্ষণযোগ্য হতে হবে। এটি, আবার, একটি খুব বিস্তৃত বিবৃতি, কিন্তু একটি
টেস্টিং ফ্রেমওয়ার্ক টাস্কে সাহায্য করতে পারে। একবার একটি মডেল তৈরি করা হয়েছে, যাচাই করা হয়েছে এবং
যাচাই করা হয়েছে, আমরা নিশ্চিত করার জন্য পুরো সিস্টেমের জন্য পরীক্ষার স্যুট বারবার চালাতে পারি
যে এটি তার জীবদ্দশায় বৈধ এবং যাচাই করা থাকে।
যখন একটি বৈশিষ্ট্য সিস্টেমে কিছু ধরণের পরিবর্তনের পরে উদ্দেশ্য হিসাবে কাজ করা বন্ধ করে
সমন্বিত, এটিকে সাধারণভাবে বলা হয় প্রত্যাগতি. মূলত রিগ্রেশন শব্দটি
এমন একটি পরিবর্তনকে উল্লেখ করা হয়েছে যার কারণে পূর্বে স্থির করা একটি বাগ পুনরায় আবির্ভূত হয়েছে, কিন্তু শব্দটি আছে
বিদ্যমান কার্যকারিতা ভেঙে যে কোনো ধরনের পরিবর্তন বর্ণনা করতে বিকশিত হয়েছে। এখানে অনেক
অনুশীলনে ঘটতে পারে এমন ধরণের রিগ্রেশন।
A স্থানীয় প্রত্যাগতি এমন একটি যেখানে একটি পরিবর্তন পরিবর্তিত উপাদানকে সরাসরি প্রভাবিত করে। জন্য
উদাহরণস্বরূপ, যদি একটি উপাদান বরাদ্দ এবং বিনামূল্যে মেমরি পরিবর্তন করা হয় কিন্তু বাসি পয়েন্টার হয়
ব্যবহৃত, উপাদান নিজেই ব্যর্থ হয়.
A দূরবর্তী প্রত্যাগতি এমন একটি যেখানে একটি উপাদানের পরিবর্তন কার্যকারিতা ভেঙে দেয়
আরেকটি উপাদান। এটি একটি অন্তর্নিহিত কিন্তু সম্ভবত অস্বীকৃত লঙ্ঘন প্রতিফলিত করে৷
উপাদানগুলির মধ্যে চুক্তি।
An মুখোশহীন প্রত্যাগতি এটি এমন একটি পরিস্থিতি তৈরি করে যেখানে পূর্বে বিদ্যমান একটি বাগ
যে কোন প্রভাব ছিল হঠাৎ সিস্টেমের মধ্যে উদ্ভাসিত হয়. এটি ব্যায়াম হিসাবে সহজ হতে পারে
প্রথমবারের জন্য একটি কোড পথ।
A কর্মক্ষমতা প্রত্যাগতি সিস্টেমের কর্মক্ষমতা প্রয়োজনীয়তা কারণ একটি
লঙ্ঘন করা উদাহরণস্বরূপ, একটি নিম্ন স্তরের ফাংশনে কিছু কাজ করা যা পুনরাবৃত্তি হতে পারে
অনেক সময় হঠাৎ করে সিস্টেমটিকে নির্দিষ্ট দৃষ্টিকোণ থেকে অব্যবহারযোগ্য করে তুলতে পারে।
সার্জারির ns-3 টেস্টিং ফ্রেমওয়ার্ক যাচাই করার জন্য ব্যবহৃত প্রক্রিয়াটিকে স্বয়ংক্রিয় করার জন্য সরঞ্জাম সরবরাহ করে এবং
সম্ভাব্য রিগ্রেশন দ্রুত সনাক্ত করতে সাহায্য করার জন্য রাতের পরীক্ষা স্যুটগুলিতে কোডটি যাচাই করুন।
পরীক্ষামূলক ফ্রেমওয়ার্ক
ns-3 একটি সিমুলেশন কোর ইঞ্জিন, মডেলের একটি সেট, উদাহরণ প্রোগ্রাম এবং পরীক্ষা নিয়ে গঠিত।
সময়ের সাথে সাথে, নতুন অবদানকারীরা মডেল, পরীক্ষা এবং উদাহরণ প্রদান করে। একটি পাইথন পরীক্ষা প্রোগ্রাম
test.py টেস্ট এক্সিকিউশন ম্যানেজার হিসেবে কাজ করে; test.py পরীক্ষা কোড এবং উদাহরণ চালাতে পারেন
রিগ্রেশনের সন্ধান করুন, ফলাফলগুলিকে বেশ কয়েকটি ফর্মে আউটপুট করতে পারে এবং কোড পরিচালনা করতে পারে
কভারেজ বিশ্লেষণ সরঞ্জাম। এই উপরে, আমরা স্তর বিল্ডবট যেগুলো স্বয়ংক্রিয় বিল্ড
রোবট যেগুলি বিভিন্ন সিস্টেমে পরীক্ষার কাঠামো চালিয়ে দৃঢ়তা পরীক্ষা করে
এবং বিভিন্ন কনফিগারেশন অপশন সহ।
বিল্ডবটস
NS-3 পরীক্ষার সর্বোচ্চ স্তরে বিল্ডবট (বিল্ড রোবট) রয়েছে। যদি তুমি হও
এই সিস্টেম তাকান সঙ্গে অপরিচিত http://djmitche.github.com/buildbot/docs/0.7.11/.
এটি একটি ওপেন সোর্স স্বয়ংক্রিয় সিস্টেম যা অনুমতি দেয় ns-3 প্রতিটি পুনর্নির্মাণ এবং পরীক্ষা করা হবে
সময় কিছু পরিবর্তন হয়েছে. বিভিন্ন সিস্টেমে বিল্ডবট চালানোর মাধ্যমে আমরা
নিশ্চিত করতে পারেন ns-3 এর সমস্ত সমর্থিত সিস্টেমে সঠিকভাবে তৈরি করে এবং চালায়।
ব্যবহারকারীরা (এবং বিকাশকারীরা) সাধারণত বিল্ডবট সিস্টেমের সাথে অন্যের সাথে যোগাযোগ করবে না
পরীক্ষার ফলাফল সম্পর্কিত তার বার্তা পড়ুন। যদি কোন একটিতে ব্যর্থতা ধরা পড়ে
স্বয়ংক্রিয় বিল্ড এবং পরীক্ষার কাজ, বিল্ডবট একটি ইমেল পাঠাবে ns-ডেভেলপাররা
মেইলিং তালিকা। এই ইমেল মত কিছু দেখাবে
ইমেলে দেখানো সম্পূর্ণ বিবরণ URL-এ, কেউ কীওয়ার্ডটি অনুসন্ধান করতে পারে ব্যর্থ এবং
নির্বাচন করুন stdio ব্যর্থতার কারণ দেখতে সংশ্লিষ্ট ধাপের লিঙ্ক।
বিল্ডবট নিঃশব্দে তার কাজ করবে যদি কোন ত্রুটি না থাকে এবং সিস্টেমটি অতিক্রম করবে
সবকিছু ঠিক আছে কিনা তা যাচাই করতে প্রতিদিন চক্র তৈরি করুন এবং পরীক্ষা করুন।
Test.py
বিল্ডবট একটি পাইথন প্রোগ্রাম ব্যবহার করে, test.py, যে সব চালানোর জন্য দায়ী
পরীক্ষা করা এবং ফলাফলগুলি মানব-পাঠযোগ্য আকারে সংগ্রহ করা। এই প্রোগ্রাম হল
এছাড়াও ব্যবহারকারী এবং ডেভেলপারদের দ্বারা ব্যবহারের জন্য উপলব্ধ।
test.py ব্যবহারকারীকে পরীক্ষার সংখ্যা এবং ধরনের নির্দিষ্ট করার অনুমতি দেওয়ার ক্ষেত্রে খুবই নমনীয়
চালান এবং উৎপন্ন আউটপুট পরিমাণ এবং ধরনের.
দৌড়ানোর আগে test.py, নিশ্চিত করুন যে ns3 এর উদাহরণ এবং পরীক্ষাগুলি করে তৈরি করা হয়েছে
অনুসরণ
$ ./waf কনফিগার --enable-examples --enable-tests
$./waf
গতানুগতিক, test.py সমস্ত উপলব্ধ পরীক্ষা চালানো হবে এবং খুব সংক্ষিপ্তভাবে স্থিতি প্রতিবেদন করবে
ফর্ম কমান্ড চালাচ্ছেন
$ ./test.py
একটি সংখ্যা ফলাফল হবে পাস, ব্যর্থ, ক্রাশ or এড়িয় ধরনের দ্বারা অনুসরণ ইঙ্গিত
যে পরীক্ষা চালানো হয়েছিল এবং তার প্রদর্শনের নাম।
Waf: '/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
ওয়াফ: ডিরেক্টরি ছেড়ে যাচ্ছে `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
'বিল্ড' সফলভাবে শেষ হয়েছে (0.939s)
ব্যর্থ: TestSuite ns3-ওয়াইফাই-প্রচার-ক্ষতি-মডেল
পাস: TestSuite অবজেক্ট-নাম-পরিষেবা
পাস: TestSuite pcap-file-object
পাস: TestSuite ns3-tcp-cwnd
...
পাস: TestSuite ns3-tcp-ইন্টারঅপারেবিলিটি
PASS: উদাহরণ csma-সম্প্রচার
PASS: উদাহরণ csma-multicast
এই মোডটি ব্যবহারকারীদের দ্বারা ব্যবহার করার উদ্দেশ্যে করা হয়েছে যারা তাদের কিনা তা নির্ধারণ করতে আগ্রহী
ডিস্ট্রিবিউশন সঠিকভাবে কাজ করছে এবং ডেভেলপারদের দ্বারা যারা তা নির্ধারণ করতে আগ্রহী
তারা যে পরিবর্তন করেছে তা কোনো রিগ্রেশন সৃষ্টি করেছে।
এর আচরণ নিয়ন্ত্রণ করার জন্য বেশ কয়েকটি বিকল্প উপলব্ধ রয়েছে test.py. যদি আপনি চালান
test.py --help আপনি একটি কমান্ড সারাংশ দেখতে হবে যেমন:
ব্যবহার: test.py [বিকল্প]
বিকল্প:
-h, --help এই সাহায্য বার্তাটি দেখান এবং প্রস্থান করুন
-বি বিল্ডপথ, --বিল্ডপথ=বিল্ডপথ
যেখানে ns-3 নির্মিত হয়েছিল সেই পথটি নির্দিষ্ট করুন (ডিফল্ট
বর্তমান বৈকল্পিক জন্য ডিরেক্টরি তৈরি করুন)
-c KIND, --constrain=KIND
পরীক্ষার ধরনের দ্বারা পরীক্ষা-রানারকে সীমাবদ্ধ করুন
-e উদাহরণ, --example=example
চালানোর জন্য একটি একক উদাহরণ নির্দিষ্ট করুন (কোন আপেক্ষিক পথ নেই
প্রয়োজন)
-g, --grind ভ্যালগ্রিন্ড ব্যবহার করে টেস্ট স্যুট এবং উদাহরণ চালান
-k, --kinds উপলব্ধ পরীক্ষার ধরনের প্রিন্ট করে
-l, --list পরিচিত পরীক্ষার তালিকা প্রিন্ট করুন
-m, --মাল্টিপল টেস্ট স্যুট এবং পরীক্ষা থেকে একাধিক ব্যর্থতার রিপোর্ট করে
মামলা
-n, --nowaf পরীক্ষা শুরু করার আগে waf চালাবেন না
-p PYEXAMPLE, --pyexample=PYEXAMPLE
চালানোর জন্য একটি একক পাইথন উদাহরণ নির্দিষ্ট করুন (সম্পর্কিত
পথ)
-r, --retain সমস্ত অস্থায়ী ফাইল ধরে রাখুন (যা সাধারণত হয়
মুছে ফেলা হয়েছে)
-s TEST-SUITE, --suite=TEST-SUITE
চালানোর জন্য একটি একক পরীক্ষা স্যুট নির্দিষ্ট করুন
-t TEXT-FILE, --text=TEXT-FILE৷
বিস্তারিত পরীক্ষার ফলাফল TEXT-FILE.txt এ লিখুন
-v, --ভারবোস মুদ্রণ অগ্রগতি এবং তথ্যমূলক বার্তা
-w HTML-FILE, --web=HTML-FILE, --html=HTML-FILE
HTML-FILE.html এ বিস্তারিত পরীক্ষার ফলাফল লিখুন
-x XML-FILE, --xml=XML-FILE
XML-FILE.xml-এ বিস্তারিত পরীক্ষার ফলাফল লিখুন
যদি কেউ একটি ঐচ্ছিক আউটপুট শৈলী নির্দিষ্ট করে, কেউ এর বিস্তারিত বিবরণ তৈরি করতে পারে
পরীক্ষা এবং অবস্থা। উপলব্ধ শৈলী হয় পাঠ এবং এইচটিএমএল. বিল্ডবট এইচটিএমএল নির্বাচন করবে
ব্যবহার করে রাতের বিল্ডগুলির জন্য এইচটিএমএল পরীক্ষার রিপোর্ট তৈরি করার বিকল্প
$ ./test.py --html=nightly.html
এই ক্ষেত্রে, ''nightly.html'' নামের একটি HTML ফাইল একটি সুন্দর সারাংশ সহ তৈরি করা হবে
সম্পন্ন পরীক্ষা. একটি ''মানব পাঠযোগ্য'' বিন্যাসে আগ্রহী ব্যবহারকারীদের জন্য উপলব্ধ
বিবরণ।
$ ./test.py --text=results.txt
উপরের উদাহরণে, টেস্ট স্যুট চেক করছে ns-3 বেতার ডিভাইসের প্রচার ক্ষতি
মডেল ব্যর্থ হয়েছে। ডিফল্টরূপে আর কোন তথ্য প্রদান করা হয় না.
ব্যর্থতা আরও অন্বেষণ করতে, test.py একটি একক পরীক্ষা স্যুট নির্দিষ্ট করার অনুমতি দেয়।
কমান্ড চালাচ্ছেন
$ ./test.py --suite=ns3-wifi-propagation-loss-models
বা সমতুল্যভাবে
$ ./test.py -s ns3-wifi-propagation-loss-models
যে একক পরীক্ষা স্যুট চালানো হচ্ছে ফলাফল.
ব্যর্থ: TestSuite ns3-ওয়াইফাই-প্রচার-ক্ষতি-মডেল
ব্যর্থতা সংক্রান্ত বিশদ তথ্য খুঁজে পেতে, একজনকে অবশ্যই আউটপুটের ধরণের উল্লেখ করতে হবে
আকাঙ্ক্ষিত. উদাহরণস্বরূপ, বেশিরভাগ লোক সম্ভবত একটি পাঠ্য ফাইলে আগ্রহী হবে:
$ ./test.py --suite=ns3-wifi-propagation-loss-models --text=results.txt
এর ফলে সেই একক টেস্ট স্যুট চালানো হবে পরীক্ষা স্ট্যাটাসে লেখা
ফাইল ''results.txt''।
আপনি সেই ফাইলে নিম্নলিখিত অনুরূপ কিছু খুঁজে পাওয়া উচিত
ব্যর্থ: টেস্ট স্যুট ''ns3-ওয়াইফাই-প্রচার-ক্ষতি-মডেল'' (আসল 0.02 ব্যবহারকারী 0.01 সিস্টেম 0.00)
পাস: টেস্ট কেস "চেক... ফ্রিস... মডেল..." (আসল 0.01 ব্যবহারকারী 0.00 সিস্টেম 0.00)
FAIL: টেস্ট কেস "চেক... লগ ডিস্ট্যান্স... মডেল" (আসল 0.01 ব্যবহারকারী 0.01 সিস্টেম 0.00)
বিবরণ:
বার্তা: অপ্রত্যাশিত SNR মান পেয়েছি
শর্ত: [আসলে কী ব্যর্থ হয়েছে তার দীর্ঘ বর্ণনা]
প্রকৃত: 176.395
সীমা: 176.407 +- 0.0005
ফাইল: ../src/test/ns3wifi/propagation-loss-models-test-suite.cc
লাইন: 360
লক্ষ্য করুন যে টেস্ট স্যুট দুটি টেস্ট কেস নিয়ে গঠিত। প্রথম টেস্ট কেস চেক করে
Friis প্রচার ক্ষতি মডেল এবং পাস. দ্বিতীয় পরীক্ষার ক্ষেত্রে লগ চেক করতে ব্যর্থ হয়েছে
দূরত্ব প্রচার মডেল। এই ক্ষেত্রে, 176.395 এর একটি SNR পাওয়া গেছে, এবং পরীক্ষা
তিন দশমিক স্থানে 176.407 সঠিক মান প্রত্যাশিত। ফাইল যা বাস্তবায়িত
ব্যর্থ পরীক্ষা তালিকার পাশাপাশি কোডের লাইন যা ব্যর্থতাকে ট্রিগার করেছে।
যদি আপনি চান, আপনি ঠিক সহজে ব্যবহার করে একটি HTML ফাইল লিখতে পারেন --html পছন্দ
উপরে বর্ণিত.
সাধারণত একজন ব্যবহারকারী ডাউনলোড করার পর অন্তত একবার সমস্ত পরীক্ষা চালাবেন ns-3 সেটা নিশ্চিত করতে
তার পরিবেশ সঠিকভাবে তৈরি করা হয়েছে এবং সঠিক ফলাফল তৈরি করছে
টেস্ট স্যুট অনুযায়ী। বিকাশকারীরা সাধারণত আগে এবং পরীক্ষা স্যুট চালাবে
একটি পরিবর্তন করার পরে নিশ্চিত করার জন্য যে তারা তাদের সাথে একটি রিগ্রেশন চালু করেনি
পরিবর্তন এই ক্ষেত্রে, বিকাশকারীরা সমস্ত পরীক্ষা চালাতে নাও চাইতে পারে, তবে শুধুমাত্র একটি উপসেট। জন্য
উদাহরণস্বরূপ, বিকাশকারী শুধুমাত্র তৈরি করার সময় পর্যায়ক্রমে ইউনিট পরীক্ষা চালাতে চাইতে পারেন
একটি সংগ্রহস্থল পরিবর্তন. এক্ষেত্রে, test.py এর প্রকারগুলিকে সীমাবদ্ধ করতে বলা যেতে পারে
পরীক্ষা একটি নির্দিষ্ট শ্রেণীর পরীক্ষার জন্য চালানো হচ্ছে। নিম্নলিখিত কমান্ড শুধুমাত্র ফলাফল হবে
ইউনিট পরীক্ষা চালানো হচ্ছে:
$ ./test.py --constrain=unit
একইভাবে, নিম্নলিখিত কমান্ডের ফলে শুধুমাত্র উদাহরণের ধোঁয়া পরীক্ষা চালানো হবে:
$ ./test.py --constrain=unit
আইনি ধরনের সীমাবদ্ধতার একটি দ্রুত তালিকা দেখতে, আপনি তাদের তালিকাভুক্ত করার জন্য বলতে পারেন।
নিম্নলিখিত কমান্ড
$ ./test.py --kinds
নিম্নলিখিত তালিকা প্রদর্শিত হবে ফলাফল:
Waf: '/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
ওয়াফ: ডিরেক্টরি ছেড়ে যাচ্ছে `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
'বিল্ড' সফলভাবে শেষ হয়েছে (0.939s)Waf: এন্টারিং ডিরেক্টরি `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
bvt: বিল্ড যাচাইকরণ পরীক্ষা (বিল্ড সফলভাবে সম্পন্ন হয়েছে কিনা তা দেখতে)
মূল: সমস্ত TestSuite-ভিত্তিক পরীক্ষা চালান (উদাহরণগুলি বাদ দিন)
উদাহরণ: উদাহরণ (উদাহরণ প্রোগ্রাম সফলভাবে চালানো হয় কিনা তা দেখতে)
পারফরম্যান্স: পারফরম্যান্স টেস্ট (সিস্টেমটি প্রত্যাশিত হিসাবে দ্রুত কিনা তা পরীক্ষা করে দেখুন)
সিস্টেম: সিস্টেম টেস্ট (মডিউলের ইন্টিগ্রেশন চেক করার জন্য মডিউল স্প্যান করে)
ইউনিট: ইউনিট পরীক্ষা (মডিউলের মধ্যে মৌলিক কার্যকারিতা পরীক্ষা করতে)
এই ধরনের পরীক্ষার যেকোন একটি সীমাবদ্ধতা হিসাবে প্রদান করা যেতে পারে ব্যবহার করে --সীমাবদ্ধতা বিকল্প।
উপলব্ধ সমস্ত টেস্ট স্যুটগুলির একটি দ্রুত তালিকা দেখতে, আপনি সেগুলি হতে চাইতে পারেন৷
তালিকাভুক্ত নিম্নলিখিত কমান্ড,
$ ./test.py --list
পরীক্ষার স্যুটের একটি তালিকা প্রদর্শিত হবে, অনুরূপ
Waf: '/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
ওয়াফ: ডিরেক্টরি ছেড়ে যাচ্ছে `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
'বিল্ড' সফলভাবে শেষ হয়েছে (0.939s)
বারলেখ
ns3-ওয়াইফাই-হস্তক্ষেপ
ns3-tcp-cwnd
ns3-tcp-ইন্টারঅপারেবিলিটি
প্রসঙ্গ
ডিভাইস-জাল-শিখা
devices-mesh-dot11s
ডিভাইস-জাল
...
বস্তু-নাম-পরিষেবা
কলব্যাক
বৈশিষ্ট্যাবলী
কনফিগ
বিশ্ব-মান
কম্যান্ড-লাইন
মৌলিক-এলোমেলো-সংখ্যা
লক্ষ্য
এই তালিকাভুক্ত স্যুটগুলির যেকোনটি ব্যবহার করে নিজেই চালানোর জন্য নির্বাচন করা যেতে পারে --সুইট বিকল্প হিসাবে
উপরে দেখানো হয়েছে।
একইভাবে স্যুট পরীক্ষা করার জন্য, কেউ ব্যবহার করে একটি একক C++ উদাহরণ প্রোগ্রাম চালাতে পারে -- উদাহরণ
বিকল্প উল্লেখ্য যে উদাহরণের জন্য আপেক্ষিক পথটি অন্তর্ভুক্ত করার প্রয়োজন নেই এবং সেটি
C++ উদাহরণের জন্য নির্মিত এক্সিকিউটেবলের এক্সটেনশন নেই। প্রবেশন
$ ./test.py --example=udp-echo
যে একক উদাহরণ চালানো হচ্ছে ফলাফল.
PASS: উদাহরণ উদাহরণ/udp/udp-echo
আপনি ডিরেক্টরিটি নির্দিষ্ট করতে পারেন যেখানে ns-3 ব্যবহার করে নির্মিত হয়েছিল --বিল্ডপথ বিকল্প হিসাবে
অনুসরণ
$ ./test.py --buildpath=/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build/debug --example=wifi-simple-adhoc
কেউ ব্যবহার করে একটি একক পাইথন উদাহরণ প্রোগ্রাম চালাতে পারে --py উদাহরণ বিকল্প উল্লেখ্য যে
উদাহরণের জন্য আপেক্ষিক পথ অবশ্যই অন্তর্ভুক্ত করতে হবে এবং পাইথন উদাহরণগুলির প্রয়োজন হবে
এক্সটেনশন প্রবেশন
$ ./test.py --pyexample=examples/tutorial/first.py
যে একক উদাহরণ চালানো হচ্ছে ফলাফল.
পাস: উদাহরণ উদাহরণ/টিউটোরিয়াল/first.py
যেহেতু পাইথন উদাহরণ তৈরি করা হয়নি, তাই আপনাকে ns-3 নির্দেশিকা নির্দিষ্ট করতে হবে না
তাদের চালানোর জন্য নির্মিত হয়েছিল।
সাধারণত যখন উদাহরণ প্রোগ্রামগুলি চালানো হয়, তখন তারা প্রচুর পরিমাণে ট্রেস ফাইল ডেটা লেখে।
এটি সাধারণত বিতরণের বেস ডিরেক্টরিতে সংরক্ষিত হয় (যেমন,
/home/user/ns-3-dev)। কখন test.py একটি উদাহরণ চালায়, এটা সত্যিই সম্পূর্ণরূপে উদ্বিগ্ন
ট্রেস ফাইল সহ। এটি কেবল নির্ধারণ করতে চায় যে উদাহরণটি তৈরি করা যায় এবং চালানো যায় কিনা
ত্রুটিহীন. যেহেতু এই ক্ষেত্রে, ট্রেস ফাইলগুলি a এ লেখা হয়
/tmp/unchecked-traces ডিরেক্টরি আপনি যদি উপরের উদাহরণটি চালান তবে আপনি খুঁজে পেতে সক্ষম হবেন
সংশ্লিষ্ট udp-echo.tr এবং udp-echo-n-1.pcap সেখানে ফাইল।
উপলব্ধ উদাহরণের তালিকা "উদাহরণ" ডিরেক্টরির বিষয়বস্তু দ্বারা সংজ্ঞায়িত করা হয়েছে
বণ্টন. যদি আপনি ব্যবহার করে মৃত্যুদন্ড কার্যকর করার জন্য একটি উদাহরণ নির্বাচন করুন -- উদাহরণ বিকল্প,
test.py উদাহরণটি কনফিগার করা হয়েছে কিনা তা সিদ্ধান্ত নেওয়ার কোনো চেষ্টা করবে না, এটি
শুধু এটি চালানোর চেষ্টা করবে এবং প্রচেষ্টার ফলাফল রিপোর্ট করবে।
কখন test.py চলে, ডিফল্টরূপে এটি প্রথমে নিশ্চিত করবে যে সিস্টেমটি সম্পূর্ণ হয়েছে
নির্মিত এই নির্বাচন করে পরাজিত করা যেতে পারে --নোফ বিকল্প।
$ ./test.py --list --nowaf
এর ফলে বর্তমানে নির্মিত টেস্ট স্যুটগুলির একটি তালিকা প্রদর্শিত হবে, অনুরূপ:
ns3-ওয়াইফাই-প্রচার-ক্ষতি-মডেল
ns3-tcp-cwnd
ns3-tcp-ইন্টারঅপারেবিলিটি
pcap-ফাইল-অবজেক্ট
বস্তু-নাম-পরিষেবা
এলোমেলো-সংখ্যা-জেনারেটর
এর অনুপস্থিতি লক্ষ্য করুন Waf বার্তা তৈরি করুন।
test.py এছাড়াও ভ্যালগ্রিন্ডের অধীনে টেস্ট স্যুট এবং উদাহরণ চালানো সমর্থন করে। Valgrind হল a
লিনাক্স এক্সিকিউটেবল ডিবাগিং এবং প্রোফাইলিংয়ের জন্য নমনীয় প্রোগ্রাম। ডিফল্টরূপে, ভ্যালগ্রিন্ড চলে
মেমচেক নামক একটি টুল, যা মেমরি-চেকিং ফাংশনগুলির একটি পরিসীমা সম্পাদন করে, সহ
শুরু না করা মেমরিতে অ্যাক্সেস সনাক্ত করা, বরাদ্দ করা মেমরির অপব্যবহার (ডবল ফ্রি,
বিনামূল্যের পরে অ্যাক্সেস, ইত্যাদি) এবং মেমরি লিক সনাক্ত করা। এটি ব্যবহার করে নির্বাচন করা যেতে পারে
-- পিষে ফেলা বিকল্প।
$ ./test.py --গ্রিন্ড
এটি যেমন চলছে, test.py এবং যে প্রোগ্রামগুলি এটি পরোক্ষভাবে চালায়, প্রচুর পরিমাণে উৎপন্ন করে
অস্থায়ী ফাইল. সাধারণত, এই ফাইলগুলির বিষয়বস্তু আকর্ষণীয় নয়, তবে কিছুতে
ক্ষেত্রে এই ফাইলগুলি দেখতে এটি দরকারী (ডিবাগিং উদ্দেশ্যে) হতে পারে। test.py একটি প্রদান করে
-- ধরে রাখা বিকল্প যা এই অস্থায়ী ফাইলগুলিকে রান করার পরে রাখা হবে
সম্পন্ন নামের একটি ডিরেক্টরিতে ফাইল সংরক্ষণ করা হয় testpy-আউটপুট একটি সাবডিরেক্টরির অধীনে
বর্তমান সমন্বিত ইউনিভার্সাল টাইম অনুসারে নামকরণ করা হয়েছে (এছাড়াও গ্রিনিচ মিন নামে পরিচিত
সময়)।
$ ./test.py -- ধরে রাখুন
অবশেষে, test.py একটি প্রদান করে -- ভারবোস বিকল্প যা প্রচুর পরিমাণে তথ্য মুদ্রণ করবে
এর অগ্রগতি সম্পর্কে। এটা প্রত্যাশিত নয় যে এটি না থাকলে এটি ভয়ঙ্করভাবে কার্যকর হবে
একটি ভুল. এই ক্ষেত্রে, আপনি স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি অ্যাক্সেস পেতে পারেন
টেস্ট স্যুট এবং উদাহরণ চালানোর মাধ্যমে রিপোর্ট করা হয়েছে। নিম্নলিখিত উপায়ে verbose নির্বাচন করুন:
$ ./test.py --verbose
এই সমস্ত বিকল্পগুলি মিশ্রিত এবং মিলিত হতে পারে। উদাহরণস্বরূপ, ns-3 কোর সব চালানোর জন্য
একটি HTML আউটপুট ফাইল তৈরি করার সময়, ভ্যালগ্রিন্ডের অধীনে, ভার্বোস মোডে টেস্ট স্যুটগুলি
করতে হবে:
$ ./test.py --verbose --grind --constrain=core --html=results.html
টেস্ট ট্যাক্সোনমি
উপরে উল্লিখিত হিসাবে, পরীক্ষাগুলিকে বিস্তৃতভাবে সংজ্ঞায়িত শ্রেণীবিভাগের একটি সংখ্যায় বিভক্ত করা হয়েছে
ব্যবহারকারীদের বিভিন্ন ধরণের পরীক্ষার প্রয়োজন মেটাতে বেছে বেছে পরীক্ষা চালানোর অনুমতি দেয়
করতে হবে.
· যাচাইকরণ পরীক্ষা তৈরি করুন
· ইউনিট পরীক্ষা
· সিস্টেম টেস্ট
· উদাহরণ
· কর্মক্ষমতা পরীক্ষা
বিল্ড ভেরিফিকেশন টেস্ট
এগুলি তুলনামূলকভাবে সহজ পরীক্ষা যা বিতরণের সাথে তৈরি করা হয় এবং ব্যবহার করা হয়
বিল্ডটি বেশ কাজ করছে তা নিশ্চিত করতে। আমাদের বর্তমান ইউনিট পরীক্ষা বাস
তারা যে কোড পরীক্ষা করে তার সোর্স ফাইলগুলি ns-3 মডিউলে তৈরি করা হয়; এবং তাই মাপসই
BVT-এর বিবরণ। BVT গুলি একই সোর্স কোডে বাস করে যা ns-3 কোডের মধ্যে তৈরি।
আমাদের বর্তমান পরীক্ষাগুলি এই ধরণের পরীক্ষার উদাহরণ।
একক টেস্ট
ইউনিট পরীক্ষাগুলি আরও জড়িত পরীক্ষা যা কোডের একটি অংশ নিশ্চিত করতে বিস্তারিতভাবে যায়
বিচ্ছিন্নভাবে বিজ্ঞাপন হিসাবে কাজ করে। এই ধরনের পরীক্ষার জন্য সত্যিই কোন কারণ নেই
একটি ns-3 মডিউলে নির্মিত। এটি দেখা যাচ্ছে, উদাহরণস্বরূপ, ইউনিটটি বস্তুর জন্য পরীক্ষা করে
নাম পরিষেবা বস্তুর নাম পরিষেবা কোড নিজেই হিসাবে একই আকারের হয়. ইউনিট পরীক্ষা
এমন পরীক্ষা যা ns-3 কোডের মধ্যে বিল্ট নয় এমন কার্যকারিতা পরীক্ষা করে,
কিন্তু কোড এটি পরীক্ষা করে একই ডিরেক্টরিতে বাস করুন। এটা সম্ভব যে এই পরীক্ষা
পাশাপাশি একটি মডিউলে একাধিক বাস্তবায়ন ফাইলের ইন্টিগ্রেশন পরীক্ষা করুন। ফাইল
src/core/test/names-test-suite.cc এই ধরনের পরীক্ষার একটি উদাহরণ। ফাইল
src/network/test/pcap-file-test-suite.cc আরেকটি উদাহরণ যা একটি পরিচিত ভাল pcap ব্যবহার করে
একটি পরীক্ষা ভেক্টর ফাইল হিসাবে ফাইল। এই ফাইলটি স্থানীয়ভাবে src/network ডিরেক্টরিতে সংরক্ষণ করা হয়।
পদ্ধতি টেস্ট
সিস্টেম পরীক্ষা হল যেগুলি সিস্টেমে একাধিক মডিউল জড়িত। আমরা অনেক আছে
আমাদের বর্তমান রিগ্রেশন ফ্রেমওয়ার্কে এই ধরনের পরীক্ষা চলছে, কিন্তু সেগুলো সাধারণত
ওভারলোড উদাহরণ। আমরা ডিরেক্টরিতে এই ধরনের পরীক্ষার জন্য একটি নতুন জায়গা প্রদান করি
src/পরীক্ষা. ফাইল src/test/ns3tcp/ns3-interop-test-suite.cc এই ধরনের একটি উদাহরণ
পরীক্ষার এটি ns-3 TCP বাস্তবায়ন পরীক্ষা করতে NSC TCP ব্যবহার করে। প্রায়ই পরীক্ষা হবে
এই ধরনের পরীক্ষার জন্য প্রয়োজনীয় ভেক্টর, এবং সেগুলি ডিরেক্টরিতে সংরক্ষণ করা হয় যেখানে
পরীক্ষা জীবন উদাহরণস্বরূপ, ns3tcp-interop-response-vectors.pcap হল একটি ফাইল যার মধ্যে রয়েছে
TCP হেডারের সংখ্যা যা পরীক্ষার অধীনে ns-3 TCP-এর প্রত্যাশিত প্রতিক্রিয়া হিসাবে ব্যবহৃত হয়
NSC TCP দ্বারা উত্পাদিত একটি উদ্দীপনা যা একটি ''পরিচিত ভাল'' বাস্তবায়ন হিসাবে ব্যবহৃত হয়।
উদাহরণ
উদাহরণগুলি ফ্রেমওয়ার্ক দ্বারা পরীক্ষা করা হয় তা নিশ্চিত করতে যে তারা তৈরি করেছে এবং চলবে। কিছুই না
চেক করা হয়েছে, এবং বর্তমানে pcap ফাইলগুলি শুধু লেখা হয়েছে / tmp -র পরিবর্তে বাতিল করা যদি
উদাহরণগুলি সঞ্চালিত হয় (ক্র্যাশ হয় না) তারা এই ধোঁয়া পরীক্ষায় উত্তীর্ণ হয়।
সম্পাদন টেস্ট
পারফরম্যান্স পরীক্ষা হল সেইগুলি যা সিস্টেমের একটি নির্দিষ্ট অংশ অনুশীলন করে এবং নির্ধারণ করে
যদি পরীক্ষাগুলি যুক্তিসঙ্গত সময়ের মধ্যে সম্পন্ন হয়।
চলমান টেস্ট
পরীক্ষাগুলি সাধারণত উচ্চ স্তর ব্যবহার করে চালানো হয় test.py কার্যক্রম. একটি তালিকা পেতে
উপলব্ধ কমান্ড লাইন বিকল্প, চালান test.py --help
পরীক্ষার প্রোগ্রাম test.py উভয় পরীক্ষা এবং যে উদাহরণ যোগ করা হয়েছে চালানো হবে
তালিকা চেক করতে. পরীক্ষা এবং উদাহরণের মধ্যে পার্থক্য নিম্নরূপ। টেস্ট
সাধারণত পরীক্ষা করুন যে নির্দিষ্ট সিমুলেশন আউটপুট বা ঘটনাগুলি প্রত্যাশিত আচরণের সাথে সামঞ্জস্যপূর্ণ।
বিপরীতে, উদাহরণের আউটপুট চেক করা হয় না, এবং পরীক্ষা প্রোগ্রাম শুধুমাত্র পরীক্ষা করে
উদাহরণ প্রোগ্রামের প্রস্থান অবস্থা নিশ্চিত করুন যে এটি ত্রুটি ছাড়াই চলে।
সংক্ষেপে, সমস্ত পরীক্ষা চালানোর জন্য, প্রথমে কনফিগারেশন পর্যায়ে পরীক্ষাগুলি কনফিগার করতে হবে, এবং
এছাড়াও (ঐচ্ছিকভাবে) উদাহরণ যদি পরীক্ষা করা হয়:
$ ./waf --configure --enable-examples --enable-tests
তারপর, ns-3 তৈরি করুন, এবং এটি তৈরি হওয়ার পরে, শুধু চালান test.py. test.py -h একটি সংখ্যা দেখাবে
কনফিগারেশন বিকল্পগুলির যা test.py-এর আচরণ পরিবর্তন করে।
কার্যক্রম test.py C++ পরীক্ষা এবং উদাহরণের জন্য, একটি নিম্ন-স্তরের C++ প্রোগ্রাম বলা হয়
পরীক্ষা-রানার আসলে পরীক্ষা চালানোর জন্য। নীচে আলোচনা করা হয়েছে, এই পরীক্ষা-রানার হতে পারে একটি
পরীক্ষা ডিবাগ করার সহায়ক উপায়।
ডিবাগ করা টেস্ট
নিম্ন-স্তরের পরীক্ষা-রানার চালানোর মাধ্যমে পরীক্ষা প্রোগ্রামগুলির ডিবাগিং সর্বোত্তমভাবে করা হয়
কার্যক্রম. পরীক্ষা-রানার হল জেনেরিক পাইথন কোড থেকে ব্রিজ ns-3 কোড এটাই
C++ এ লেখা এবং স্বয়ংক্রিয় পরীক্ষা আবিষ্কার প্রক্রিয়া ব্যবহার করে ns-3 খুঁজে পেতে কোড এবং
বিভিন্ন পরীক্ষার সব সম্পাদনের অনুমতি দিন।
এর মূল কারণ test.py ডিবাগিংয়ের জন্য উপযুক্ত নয় যে এটি অনুমোদিত নয়
লগিং ব্যবহার করে চালু করতে হবে NS_LOG পরিবেশগত পরিবর্তনশীল যখন test.py চলে। এই
পরীক্ষা-রানার এক্সিকিউটেবলের ক্ষেত্রে সীমাবদ্ধতা প্রযোজ্য নয়। অতএব, আপনি লগিং দেখতে চান
আপনার পরীক্ষা থেকে আউটপুট, আপনাকে সরাসরি পরীক্ষা-রানার ব্যবহার করে সেগুলি চালাতে হবে।
টেস্ট-রানার চালানোর জন্য, আপনি এটিকে অন্য যেকোনো ns-3 এক্সিকিউটেবলের মতো চালান -- ব্যবহার করে
ওয়াফ. উপলব্ধ বিকল্পগুলির একটি তালিকা পেতে, আপনি টাইপ করতে পারেন:
$ ./waf --run "test-runner --help"
আপনি নিম্নলিখিত মত কিছু দেখতে হবে
Waf: '/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
ওয়াফ: ডিরেক্টরি ছেড়ে যাচ্ছে `/home/craigdo/repos/ns-3-allinone-test/ns-3-dev/build'
'বিল্ড' সফলভাবে শেষ হয়েছে (0.353s)
--assert: কোনো ত্রুটি শনাক্ত হলে পরীক্ষাগুলোকে সেগফল্টে বলুন (যেমন assert)
--basedir=dir: বেস ডিরেক্টরি (কোথায় src খুঁজে পাবেন) ''dir''-এ সেট করুন
--tempdir=dir: অস্থায়ী ডিরেক্টরি (কোথায় ডেটা ফাইল খুঁজতে হবে) ''dir''-এ সেট করুন
--constrain=test-type: ''টেস্ট-টাইপ'' টাইপের স্যুট পরীক্ষা করতে চেকগুলিকে সীমাবদ্ধ করুন
--help: এই বার্তাটি প্রিন্ট করুন
-- প্রকার: উপলব্ধ সমস্ত ধরণের পরীক্ষার তালিকা করুন
--তালিকা: সমস্ত পরীক্ষা স্যুট তালিকাভুক্ত করুন (ঐচ্ছিকভাবে পরীক্ষা-প্রকার দ্বারা সীমাবদ্ধ)
--out=file-name: পরীক্ষার স্ট্যাটাস আউটপুট ফাইলকে ''file-name''-এ সেট করুন
--suite=suite-name: ''suite-name'' নামে টেস্ট স্যুট চালান
--ভারবোস: রান টেস্ট স্যুটগুলিতে বার্তাগুলি চালু করুন
আপনার কাছে উপলব্ধ অনেকগুলি জিনিস রয়েছে যা আপনার কাছে থাকলে আপনার পরিচিত হবে
দিকে তাকিয়ে test.py. এটি প্রত্যাশিত হওয়া উচিত যেহেতু টেস্ট-রানার শুধুমাত্র একটি ইন্টারফেস
মধ্যে test.py এবং ns-3. আপনি লক্ষ্য করতে পারেন যে উদাহরণ-সম্পর্কিত কমান্ড এখানে অনুপস্থিত।
যে কারণ উদাহরণ সত্যিই না ns-3 পরীক্ষা। test.py তাদের চালানোর মত যদি তারা ছিল
একটি একীভূত পরীক্ষার পরিবেশ উপস্থাপন করতে, কিন্তু তারা সত্যিই সম্পূর্ণ ভিন্ন এবং নয়
এখানে পাওয়া যাবে।
প্রথম নতুন বিকল্প যা এখানে প্রদর্শিত হবে, কিন্তু test.py-এ নয় --জাহির করা বিকল্প। এই
একটি পরীক্ষা ক্ষেত্রে ডিবাগ করার সময় বিকল্পটি কার্যকর যখন একটি ডিবাগারের অধীনে চলছে জিডিবি। কখন
নির্বাচিত, এই বিকল্পটি অন্তর্নিহিত পরীক্ষার ক্ষেত্রে একটি বিভাজন লঙ্ঘন ঘটাতে বলে
একটি ত্রুটি সনাক্ত করা হয়। এটি প্রোগ্রাম এক্সিকিউশন বন্ধ করার চমৎকার পার্শ্ব-প্রতিক্রিয়া আছে
(ডিবাগারে বিরতি) যখন একটি ত্রুটি সনাক্ত করা হয়। আপনি যদি জিডিবি ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন
এই বিকল্পটি এমন কিছু,
$ ./waf শেল
$ cd বিল্ড/ডিবাগ/ইউটিলস
$ gdb পরীক্ষা-রানার
$ run --suite=global-value --asssert
যদি গ্লোবাল-ভ্যালু টেস্ট স্যুটে একটি ত্রুটি পাওয়া যায়, একটি সেগফল্ট তৈরি করা হবে
এবং (উৎস স্তর) ডিবাগার থেমে যাবে NS_TEST_ASSERT_MSG যে সনাক্ত
ত্রুটি।
এখানে প্রদর্শিত আরেকটি নতুন বিকল্প হল --ভিত্তিক বিকল্প দেখা যাচ্ছে যে কিছু
পরীক্ষার উৎস ডিরেক্টরি উল্লেখ করতে হতে পারে ns-3 বিতরণ স্থানীয় খুঁজে পেতে
ডেটা, তাই একটি পরীক্ষা চালানোর জন্য সর্বদা একটি বেস ডিরেক্টরি প্রয়োজন।
আপনি test.py থেকে একটি পরীক্ষা চালালে, পাইথন প্রোগ্রামটি এর জন্য বেসিডিয়ার বিকল্প প্রদান করবে
আপনি. একটি পরীক্ষা চালানোর জন্য সরাসরি টেস্ট-রানার ব্যবহার করে ওয়াফ, তোমার দরকার হবে
বেস ডিরেক্টরির সাথে চালানোর জন্য টেস্ট স্যুট নির্দিষ্ট করুন। তাই আপনি শেল ব্যবহার করতে পারে
এবং কর:
$ ./waf --run "test-runner --basedir=`pwd` --suite=pcap-file-object"
এর উপর ''অগ্রসর'' উদ্ধৃতি চিহ্নগুলি নোট করুন PWD কমান্ড।
আপনি যদি একটি ডিবাগার থেকে পরীক্ষা স্যুট চালাচ্ছেন, তবে এটি মনে রাখা বেশ বেদনাদায়ক হতে পারে
এবং ক্রমাগত ডিস্ট্রিবিউশন বেস ডিরেক্টরির পরম পথ টাইপ করুন। কারণে
এটি, আপনি যদি বেসডির বাদ দেন তবে টেস্ট-রানার আপনার জন্য একটি বের করার চেষ্টা করবে। এটা
বর্তমান ওয়ার্কিং ডাইরেক্টরিতে শুরু হয় এবং ডাইরেক্টরি ট্রিতে চলে যায় a খুঁজছেন
নামের ফাইল সহ ডিরেক্টরি ফাইল সংস্করণ এবং লাইসেন্স. যদি এটি একটি খুঁজে পায়, এটি অনুমান করে যে
ভিত্তিক হতে হবে এবং আপনার জন্য এটি প্রদান করে।
পরীক্ষা আউটপুট
অনেক টেস্ট স্যুটকে অস্থায়ী ফাইল (যেমন pcap ফাইল) লিখতে হয়
পরীক্ষা চলমান। পরীক্ষার জন্য লিখতে একটি অস্থায়ী ডিরেক্টরি প্রয়োজন। পাইথন
টেস্ট ইউটিলিটি (test.py) স্বয়ংক্রিয়ভাবে একটি অস্থায়ী ফাইল প্রদান করবে, কিন্তু যদি একা চালানো হয়
এই অস্থায়ী ডিরেক্টরি প্রদান করা আবশ্যক. ভিত্তিকর ক্ষেত্রে যেমন, এটি হতে পারে
ক্রমাগত একটি প্রদান করতে হবে বিরক্তিকর --টেম্পডির, তাই পরীক্ষা রানার এক অঙ্ক করবে
আপনি একটি প্রদান না হলে আপনার জন্য আউট. এটি প্রথমে নামের পরিবেশ ভেরিয়েবলের জন্য দেখায় টিএমপি
এবং টেম্প এবং সেগুলি ব্যবহার করে। যদি না হয় টিএমপি না টেম্প এটা বাছাই সংজ্ঞায়িত করা হয় / tmp -র পরিবর্তে। কোড
তারপর একটি শনাক্তকারীর উপর ট্যাক করে নির্দেশ করে যে নির্দেশিকা (ns-3) তৈরি করেছে তারপর সময়
(hh.mm.ss) এর পরে একটি বড় র্যান্ডম সংখ্যা। পরীক্ষার রানার এটির একটি ডিরেক্টরি তৈরি করে
অস্থায়ী ডিরেক্টরি হিসাবে ব্যবহার করা নাম। অস্থায়ী ফাইল তারপর একটি ডিরেক্টরিতে যান যে
এরকম কিছু নাম দেওয়া হবে
/tmp/ns-3.10.25.37.61537845
সময় একটি ইঙ্গিত হিসাবে প্রদান করা হয় যাতে আপনি তুলনামূলকভাবে সহজে কি পুনর্গঠন করতে পারেন
আপনি ফিরে যেতে এবং যে স্থাপন করা হয়েছে যে ফাইল তাকান প্রয়োজন হলে ডিরেক্টরি ব্যবহার করা হয়
ডিরেক্টরি.
আউটপুটের আরেকটি ক্লাস হল টেস্ট আউটপুট যেমন pcap ট্রেস যা তুলনা করার জন্য তৈরি করা হয়
রেফারেন্স আউটপুট। পরীক্ষার প্রোগ্রামটি সাধারণত পরীক্ষার স্যুটগুলির পরে এগুলি মুছে ফেলবে
চালান পরীক্ষার আউটপুট মুছে ফেলা অক্ষম করতে, চালান test.py "রিটেন" বিকল্পের সাথে:
$ ./test.py -r
এবং পরীক্ষা আউটপুট পাওয়া যাবে টেস্টপি-আউটপুট/ ডিরেক্টরি.
প্রতিবেদন of পরীক্ষা ব্যর্থতা
আপনি যখন টেস্ট-রানার ব্যবহার করে একটি টেস্ট স্যুট চালান তখন এটি ডিফল্টরূপে শান্তভাবে পরীক্ষা চালাবে।
আপনি যে পরীক্ষায় উত্তীর্ণ হবেন সেটাই একমাত্র ইঙ্গিত অনুপস্থিতি একটি বার্তা
থেকে ওয়াফ বলছে যে প্রোগ্রামটি শূন্য প্রস্থান কোড ছাড়া অন্য কিছু ফিরিয়ে দিয়েছে। পেতে
পরীক্ষা থেকে কিছু আউটপুট, আপনাকে একটি আউটপুট ফাইল নির্দিষ্ট করতে হবে যেখানে পরীক্ষা হবে
ব্যবহার করে তাদের XML স্থিতি লিখুন --আউট বিকল্প আপনি সাবধানে ব্যাখ্যা করতে হবে
ফলাফল কারণ পরীক্ষা স্যুট হবে সংযোজন এই ফাইলের উপর ফলাফল. চেষ্টা করুন,
$ ./waf --run "test-runner --basedir=`pwd` --suite=pcap-file-object --out=myfile.xml"
আপনি যদি ফাইলটি দেখেন myfile.xml আপনার এমন কিছু দেখতে হবে,
pcap-ফাইল-অবজেক্ট
PcapFile::Open মোডে ''w'' কাজ করে তা দেখতে পরীক্ষা করুন
পাস
বাস্তব 0.00 ব্যবহারকারী 0.00 সিস্টেম 0.00
PcapFile::Open মোডে ''r'' কাজ করে তা দেখতে পরীক্ষা করুন
পাস
বাস্তব 0.00 ব্যবহারকারী 0.00 সিস্টেম 0.00
PcapFile::Open মোডে ''a'' কাজ করে তা দেখতে পরীক্ষা করুন
পাস
বাস্তব 0.00 ব্যবহারকারী 0.00 সিস্টেম 0.00
PcapFileHeader সঠিকভাবে পরিচালিত হয়েছে তা দেখতে পরীক্ষা করুন
পাস
বাস্তব 0.00 ব্যবহারকারী 0.00 সিস্টেম 0.00
PcapRecordHeader সঠিকভাবে পরিচালিত হয়েছে তা দেখতে পরীক্ষা করুন
পাস
বাস্তব 0.00 ব্যবহারকারী 0.00 সিস্টেম 0.00
PcapFile একটি পরিচিত ভাল pcap ফাইল পড়তে পারে তা দেখতে পরীক্ষা করুন
পাস
বাস্তব 0.00 ব্যবহারকারী 0.00 সিস্টেম 0.00
পাস
বাস্তব 0.00 ব্যবহারকারী 0.00 সিস্টেম 0.00
আপনি যদি XML এর সাথে পরিচিত হন তবে এটি মোটামুটি স্ব-ব্যাখ্যামূলক হওয়া উচিত। এটিও একটি নয়
XML ফাইল সম্পূর্ণ করুন যেহেতু টেস্ট স্যুটগুলি তাদের আউটপুট একটি মাস্টারের সাথে যুক্ত করার জন্য ডিজাইন করা হয়েছে
XML স্ট্যাটাস ফাইলে বর্ণিত test.py অধ্যায়.
ডিবাগ করা পরীক্ষা অনুসরণ ব্যর্থতা
পরীক্ষা ক্র্যাশ ডিবাগ করতে, যেমন
ক্র্যাশ: TestSuite ns3-ওয়াইফাই-হস্তক্ষেপ
আপনি নিম্নোক্তভাবে gdb এর মাধ্যমে অন্তর্নিহিত পরীক্ষা-রানার প্রোগ্রাম অ্যাক্সেস করতে পারেন এবং তারপরে পাস করতে পারেন
"-basedir=`pwd`" আর্গুমেন্ট চালানোর জন্য (আপনি প্রয়োজন অনুযায়ী অন্যান্য আর্গুমেন্টও পাস করতে পারেন, কিন্তু
baseir হল সর্বনিম্ন প্রয়োজনীয়):
$ ./waf --command-template="gdb %s" --run "পরীক্ষা-রানার"
Waf: '/home/tomh/hg/sep09/ns-3-allinone/ns-3-dev-678/build' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
ওয়াফ: ডিরেক্টরি ছেড়ে যাচ্ছে `/home/tomh/hg/sep09/ns-3-allinone/ns-3-dev-678/build'
'বিল্ড' সফলভাবে শেষ হয়েছে (0.380s)
GNU gdb 6.8-ডেবিয়ান
কপিরাইট (C) 2008 Free Software Foundation, Inc.
L সেন্স GPLv3+: GNU GPL সংস্করণ 3 বা তার পরেhttp://gnu.org/licenses/gpl.html>
এটি বিনামূল্যের সফ্টওয়্যার: আপনি এটি পরিবর্তন করতে এবং পুনরায় বিতরণ করতে পারেন৷
আইন দ্বারা অনুমোদিত পরিমাণে কোন ওয়্যারেন্টি নেই। টাইপ করুন "কপি করা দেখান"
এবং বিস্তারিত জানার জন্য "ওয়ারেন্টি দেখান"।
এই GDB "x86_64-linux-gnu" হিসাবে কনফিগার করা হয়েছিল...
(gdb) r --basedir=`pwd`
প্রোগ্রাম শুরু হচ্ছে: <..>/build/debug/utils/test-runner --basedir=`pwd`
[libthread_db ব্যবহার করে থ্রেড ডিবাগিং সক্ষম]
জাহির করা ব্যর্থ হয়েছে. file=../src/core/model/type-id.cc, line=138, cond="uid <= m_information.size () && uid != 0"
...
এখানে একটি মেমরি সমস্যা ডিবাগ করার জন্য ভ্যালগ্রিন্ড ব্যবহার করার আরেকটি উদাহরণ রয়েছে যেমন:
VALGR: TestSuite ডিভাইস-মেশ-ডট11-রিগ্রেশন
$ ./waf --command-template="valgrind %s --basedir=`pwd` --suite=devices-mesh-dot11s-regression" --রান টেস্ট-রানার
শ্রেণী টেস্টরানার
যে এক্সিকিউটেবলগুলি ডেডিকেটেড টেস্ট প্রোগ্রাম চালায় তারা একটি TestRunner ক্লাস ব্যবহার করে। এই বর্গ
স্বয়ংক্রিয় পরীক্ষা নিবন্ধন এবং তালিকা প্রদান করে, সেইসাথে কার্যকর করার একটি উপায়
স্বতন্ত্র পরীক্ষা। স্বতন্ত্র পরীক্ষা স্যুটগুলি নিজেদের যুক্ত করতে C++ গ্লোবাল কনস্ট্রাক্টর ব্যবহার করে
টেস্ট রানার দ্বারা পরিচালিত টেস্ট স্যুটগুলির একটি সংগ্রহ। পরীক্ষা রানার তালিকা ব্যবহার করা হয়
সমস্ত উপলব্ধ পরীক্ষা এবং চালানোর জন্য একটি পরীক্ষা নির্বাচন করতে। এটি একটি বেশ সহজ ক্লাস
যে তিনটি স্ট্যাটিক পদ্ধতি প্রদান করে অথবা পরীক্ষা স্যুট যোগ করা এবং পাওয়া a
পরীক্ষার সংগ্রহ। ক্লাসের জন্য ডক্সিজেন দেখুন ns3::TestRunner বিস্তারিত জানার জন্য.
পরীক্ষা সুইট
সব ns-3 পরীক্ষাগুলিকে টেস্ট স্যুট এবং টেস্ট কেসে শ্রেণীবদ্ধ করা হয়। একটি পরীক্ষা স্যুট একটি
পরীক্ষার কেসগুলির সংগ্রহ যা সম্পূর্ণরূপে একটি নির্দিষ্ট ধরণের কার্যকারিতা অনুশীলন করে। হিসাবে
উপরে বর্ণিত, টেস্ট স্যুটগুলিকে শ্রেণীবদ্ধ করা যেতে পারে,
· যাচাইকরণ পরীক্ষা তৈরি করুন
· ইউনিট পরীক্ষা
· সিস্টেম টেস্ট
· উদাহরণ
· কর্মক্ষমতা পরীক্ষা
এই শ্রেণীবিভাগটি TestSuite ক্লাস থেকে রপ্তানি করা হয়। এই ক্লাসটি বেশ সহজ,
এই ধরনের রপ্তানি এবং পরীক্ষার ক্ষেত্রে জমা করার জায়গা হিসাবে বিদ্যমান। একজন ব্যবহারকারীর কাছ থেকে
দৃষ্টিকোণ, সিস্টেমে একটি নতুন TestSuite তৈরি করার জন্য একজনকে শুধুমাত্র একটি নতুন সংজ্ঞায়িত করতে হবে
ক্লাস যে ক্লাস থেকে উত্তরাধিকারসূত্রে পাওয়া যায় পরীক্ষা স্যুট এবং এই দুটি দায়িত্ব পালন করুন।
নিম্নলিখিত কোড একটি নতুন ক্লাস সংজ্ঞায়িত করবে যা দ্বারা চালানো যেতে পারে test.py একটি ''ইউনিট'' পরীক্ষা হিসাবে
প্রদর্শনের নাম সহ, আমার-পরীক্ষা-স্যুট-নাম.
ক্লাস MySuite: পাবলিক TestSuite
{
প্রকাশ্য:
MyTestSuite ();
};
MyTestSuite::MyTestSuite ()
: TestSuite ("my-test-suite-name", UNIT)
{
AddTestCase (নতুন MyTestCase);
}
MyTestSuite myTestSuite;
বেস ক্লাস একটি ভাল হতে প্রয়োজনীয় নিবন্ধন এবং রিপোর্টিং সব যত্ন নেয়
পরীক্ষার কাঠামোতে নাগরিক।
পরীক্ষা কেস
একটি TestCase ক্লাস ব্যবহার করে পৃথক পরীক্ষা তৈরি করা হয়। একটি পরীক্ষা ব্যবহারের জন্য সাধারণ মডেল
কেস "ফিচার প্রতি একটি টেস্ট কেস" এবং "প্রতি পদ্ধতিতে একটি টেস্ট কেস" অন্তর্ভুক্ত৷ এর মিশ্রণ
এই মডেল ব্যবহার করা যেতে পারে.
সিস্টেমে একটি নতুন টেস্ট কেস তৈরি করার জন্য, যা করতে হবে তা হল থেকে উত্তরাধিকারী হওয়া
পরীক্ষা ক্ষেত্রে বেস ক্লাস, পরীক্ষার ক্ষেত্রে একটি নাম দিতে কনস্ট্রাক্টরকে ওভাররাইড করুন এবং ওভাররাইড করুন
দ্য DoRun পরীক্ষা চালানোর পদ্ধতি।
ক্লাস মাইটেস্টকেস: পাবলিক টেস্টকেস
{
MyTestCase ();
ভার্চুয়াল অকার্যকর DoRun (অকার্যকর);
};
MyTestCase ::MyTestCase ()
: টেস্টকেস ("কিছু কার্যকারিতা পরীক্ষা করুন")
{
}
অকার্যকর
MyTestCase::DoRun (অকার্যকর)
{
NS_TEST_ASSERT_MSG_EQ (সত্য, সত্য, "কিছু ব্যর্থতার বার্তা");
}
ইউটিলিটিস
বিভিন্ন ধরণের ইউটিলিটি রয়েছে যা পরীক্ষার অংশ
কাঠামো উদাহরণগুলির মধ্যে রয়েছে একটি সাধারণীকৃত pcap ফাইল যা পরীক্ষা ভেক্টর সংরক্ষণের জন্য দরকারী; ক
পরীক্ষা সম্পাদনের সময় পরীক্ষা ভেক্টরের ক্ষণস্থায়ী সঞ্চয়ের জন্য দরকারী জেনেরিক ধারক; এবং
বৈধতা এবং যাচাই পরীক্ষার ফলাফলের উপর ভিত্তি করে উপস্থাপনা তৈরির জন্য সরঞ্জাম।
এই ইউটিলিটিগুলি এখানে নথিভুক্ত করা হয়নি, কিন্তু উদাহরণস্বরূপ, দেখুন কিভাবে TCP পরীক্ষা করে
পাওয়া src/test/ns3tcp/ pcap ফাইল এবং রেফারেন্স আউটপুট ব্যবহার করুন।
কিভাবে থেকে লেখা পরীক্ষা
ns-3 প্রকল্পের একটি প্রাথমিক লক্ষ্য হল ব্যবহারকারীদের বৈধতা উন্নত করতে সাহায্য করা এবং
তাদের ফলাফলের বিশ্বাসযোগ্যতা। বৈধ মডেল পাওয়ার জন্য অনেক উপাদান আছে এবং
সিমুলেশন, এবং টেস্টিং একটি প্রধান উপাদান। যদি আপনি মডেল বা উদাহরণ অবদান
ns-3, আপনাকে পরীক্ষার কোড দিতে বলা হতে পারে। আপনার অবদান যে মডেল ব্যবহার করা হবে
অনেক বছর ধরে অন্যান্য লোকেদের দ্বারা, যারা সম্ভবত প্রথম নজরে কোন ধারণা নেই কিনা
মডেল সঠিক। আপনি আপনার মডেলের জন্য যে পরীক্ষার কোড লিখবেন তা ভবিষ্যতে এড়াতে সাহায্য করবে
আউটপুটে রিগ্রেশন এবং ভবিষ্যত ব্যবহারকারীদের যাচাইকরণ বুঝতে সাহায্য করবে এবং
আপনার মডেলের প্রযোজ্যতার সীমানা।
একটি মডেলের বাস্তবায়নের সঠিকতা যাচাই করার অনেক উপায় আছে। এই
বিভাগে, আমরা কিছু সাধারণ ক্ষেত্রে কভার করার আশা করি যেগুলি নতুন লেখার জন্য একটি গাইড হিসাবে ব্যবহার করা যেতে পারে
পরীক্ষা।
নমুনা পরীক্ষা স্যুট কঙ্কাল
স্ক্র্যাচ থেকে শুরু করার সময় (যেমন একটি বিদ্যমান TestSuite-এ একটি TestCase যোগ না করা), এইগুলি
বিষয়গুলি সামনে সিদ্ধান্ত নেওয়া দরকার:
· টেস্ট স্যুটকে কী বলা হবে
· এটি কি ধরনের পরীক্ষা হবে (বিল্ড ভেরিফিকেশন টেস্ট, ইউনিট টেস্ট, সিস্টেম টেস্ট, বা
কর্মক্ষমতা পরীক্ষা)
· যেখানে পরীক্ষার কোড থাকবে (হয় একটি বিদ্যমান ns-3 মডিউলে বা আলাদাভাবে
src/test/ ডিরেক্টরি)। আপনাকে সেই ডিরেক্টরিতে wscript ফাইলটি সম্পাদনা করতে হবে
আপনার নতুন কোড কম্পাইল করুন, যদি এটি একটি নতুন ফাইল হয়।
একটি প্রোগ্রাম বলা হয় src/create-module.py একটি ভাল শুরু বিন্দু. এই প্রোগ্রাম হতে পারে
যেমন আহ্বান করা হয়েছে create-module.py রাউটার একটি অনুমানমূলক নতুন মডিউল নামক জন্য রাউটার। একদা
আপনি এটি করুন, আপনি একটি দেখতে পাবেন রাউটার ডিরেক্টরি, এবং ক test/router-test-suite.cc পরীক্ষা স্যুট.
এই ফাইলটি আপনার প্রাথমিক পরীক্ষার জন্য একটি সূচনা পয়েন্ট হতে পারে। এটি একটি ওয়ার্কিং টেস্ট স্যুট,
যদিও সঞ্চালিত প্রকৃত পরীক্ষা তুচ্ছ। এটি আপনার মডিউলের পরীক্ষায় অনুলিপি করুন
ডিরেক্টরি, এবং সম্পর্কিত কিছুর জন্য সেই ফাইলে "রাউটার" এর একটি বিশ্বব্যাপী প্রতিস্থাপন করুন
আপনি পরীক্ষা করতে চান যে মডেল. আপনি আরও বর্ণনামূলক যেমন জিনিসগুলি সম্পাদনা করতে পারেন
পরীক্ষার ক্ষেত্রে নাম।
এই পরীক্ষাটি কম্পাইল করার জন্য আপনাকে আপনার wscript এ একটি ব্লক যোগ করতে হবে:
module_test.source = [
'test/router-test-suite.cc',
]
আপনি আসলে এটি দরকারী জিনিসগুলি করা শুরু করার আগে, এটি চালানোর চেষ্টা করতে সাহায্য করতে পারে
কঙ্কাল নিশ্চিত করুন যে ns-3 "--enable-tests" বিকল্পের সাথে কনফিগার করা হয়েছে।
ধরা যাক আপনার নতুন টেস্ট স্যুটটিকে "রাউটার" বলা হয় যেমন এখানে:
RouterTestSuite::RouterTestSuite ()
: TestSuite ("রাউটার", UNIT)
এই কমান্ড চেষ্টা করুন:
$ ./test.py -s রাউটার
নীচের মত আউটপুট উত্পাদিত করা উচিত:
পাস: টেস্টসুইট রাউটার
1টি পরীক্ষায় 1টি পাস হয়েছে (1টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
একটি কাজের উদাহরণের জন্য src/lte/test/test-lte-antenna.cc দেখুন।
পরীক্ষা ম্যাক্রো
প্রত্যাশিত পরীক্ষা প্রোগ্রাম আউটপুট চেক করার জন্য উপলব্ধ ম্যাক্রো একটি সংখ্যা
আউটপুট এই ম্যাক্রো সংজ্ঞায়িত করা হয় src/core/model/test.h.
ব্যবহৃত ম্যাক্রোগুলির প্রধান সেটগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
NS_TEST_ASSERT_MSG_EQ(প্রকৃত, সীমা, বার্তা)
NS_TEST_ASSERT_MSG_NE(প্রকৃত, সীমা, বার্তা)
NS_TEST_ASSERT_MSG_LT(প্রকৃত, সীমা, বার্তা)
NS_TEST_ASSERT_MSG_GT(প্রকৃত, সীমা, বার্তা)
NS_TEST_ASSERT_MSG_EQ_TOL(প্রকৃত, সীমা, টোল, বার্তা)
প্রথম যুক্তি আসল পরীক্ষার অধীনে মান, দ্বিতীয় মান সীমা প্রত্যাশিত
মান (অথবা এর বিরুদ্ধে পরীক্ষা করার মান), এবং শেষ আর্গুমেন্ট বার্তা এর জন্য ত্রুটি বার্তা
পরীক্ষা ব্যর্থ হলে প্রিন্ট আউট.
উপরের প্রথম চারটি ম্যাক্রো সমতা, অসমতা, এর চেয়ে কম বা তার চেয়ে বেশি পরীক্ষা
যথাক্রমে উপরের পঞ্চম ম্যাক্রো সমতার জন্য পরীক্ষা করে, কিন্তু একটি নির্দিষ্ট সহনশীলতার মধ্যে।
একটি সীমার বিপরীতে সমতার জন্য ফ্লোটিং পয়েন্ট নম্বর পরীক্ষা করার সময় এই বৈকল্পিকটি কার্যকর,
যেখানে আপনি রাউন্ডিং ত্রুটির কারণে একটি পরীক্ষা ব্যর্থতা এড়াতে চান।
সবশেষে, উপরের ভ্যারিয়েন্ট আছে যেখানে কিওয়ার্ড আছে জাহির করা দ্বারা প্রতিস্থাপিত হয় প্রত্যাশা করুন.
এই ভেরিয়েন্টগুলি বিশেষভাবে পদ্ধতিতে (বিশেষ করে কলব্যাক) রিটার্নিং ব্যবহারের জন্য ডিজাইন করা হয়েছে
অকার্যকর আপনি আপনার পরীক্ষার প্রোগ্রামগুলিতে যে কলব্যাকগুলি ব্যবহার করেন তার জন্য তাদের ব্যবহার সংরক্ষণ করুন; অন্যথায়, ব্যবহার করুন
দ্য জাহির করা রূপগুলো।
কিভাবে থেকে যোগ an উদাহরণ কার্যক্রম থেকে দ্য পরীক্ষা অনুসরণ
কেউ "ধূমপান পরীক্ষা" করতে পারে যে উদাহরণগুলি সংকলন করে এবং সফলভাবে সমাপ্তির জন্য চালানো হয় (বিনা
মেমরি ফাঁস) ব্যবহার করে উদাহরণ-to-run.py আপনার মডিউলের পরীক্ষা ডিরেক্টরিতে অবস্থিত স্ক্রিপ্ট।
সংক্ষেপে, আপনার পরীক্ষা ডিরেক্টরিতে এই ফাইলের একটি উদাহরণ অন্তর্ভুক্ত করে, আপনি ঘটাতে পারেন
তালিকাভুক্ত উদাহরণগুলি চালানোর জন্য পরীক্ষা রানার। এটা সাধারণত আপনি নিশ্চিত করা ভাল
এমন উদাহরণগুলি নির্বাচন করুন যেগুলির চলার সময় যুক্তিসঙ্গতভাবে সংক্ষিপ্ত হয় যাতে পরীক্ষাগুলি বিভ্রান্ত না হয়। দেখা
মধ্যে উদাহরণ src/lte/পরীক্ষা/ ডিরেক্টরি.
পরীক্ষামূলক উন্নত বুলিয়ান ফলাফল
পরীক্ষামূলক ফলাফল কখন যদৃচ্ছতা is জড়িত
পরীক্ষামূলক আউটপুট উপাত্ত বিরুদ্ধে a পরিচিত বিতরণ
প্রদান অ তুচ্ছ ইনপুট ভেক্টর of উপাত্ত
সংরক্ষণ এবং উল্লেখ অ তুচ্ছ আউটপুট উপাত্ত
উপস্থাপনা তোমার আউটপুট পরীক্ষা উপাত্ত
সহায়তা
তৈরি করা হচ্ছে a নতুন ns-3 মডেল
এই অধ্যায় একটি নকশা প্রক্রিয়া মাধ্যমে পদচারণা ns-3 মডেল. অনেক গবেষণার ক্ষেত্রে,
ব্যবহারকারীরা কেবল বিদ্যমান মডেলগুলিকে খাপ খাইয়ে সন্তুষ্ট হবেন না, তবে প্রসারিত করতে চাইতে পারেন৷
একটি অভিনব উপায়ে সিমুলেটরের মূল। আমরা a এর সাথে একটি ErrorModel যোগ করার উদাহরণ ব্যবহার করব
সহজ ns-3 একটি অনুপ্রেরণামূলক উদাহরণ হিসাবে লিঙ্ক কিভাবে কেউ এই সমস্যা এবং যোগাযোগ করতে পারে
একটি নকশা এবং বাস্তবায়নের মাধ্যমে এগিয়ে যান।
লক্ষ্য করুন:
ডকুমেন্টেশন
এখানে আমরা নতুন মডেল এবং নতুন মডিউল তৈরির প্রক্রিয়ার উপর ফোকাস করি এবং কিছু
নকশা পছন্দ জড়িত. স্বচ্ছতার জন্য, আমরা আলোচনা পিছিয়ে দিচ্ছি বলবিজ্ঞান
নথিভুক্ত মডেল এবং উত্স কোড ডকুমেন্টেশন অধ্যায়.
নকশা অভিগমন
আপনি এটি কিভাবে কাজ করতে চান তা বিবেচনা করুন; এটা কি করা উচিত. এই জিনিসগুলি সম্পর্কে চিন্তা করুন:
· কার্যকারিতা: এটা কি কার্যকারিতা থাকা উচিত? বৈশিষ্ট্য বা কনফিগারেশন কি
ব্যবহারকারীর কাছে উন্মুক্ত?
· পুনরায় ব্যবহারযোগ্যতা: অন্যদের কতটা আমার নকশা পুনরায় ব্যবহার করতে সক্ষম হওয়া উচিত? আমি থেকে কোড পুনরায় ব্যবহার করতে পারি?
ns-2 শুরু করতে? একজন ব্যবহারকারী কিভাবে অন্যের সাথে মডেলটিকে সংহত করে
অনুকরণ?
· নির্ভরতা: আমি কিভাবে আমার নতুন কোডে বাইরের নির্ভরতার প্রবর্তন কমাতে পারি
যতটা সম্ভব (এটি আরও মডুলার করতে)? উদাহরণস্বরূপ, আমি কোন এড়াতে হবে
আইপিভি 4 এর উপর নির্ভরতা যদি আমি এটি আইপিভি 6 দ্বারা ব্যবহার করতে চাই? আমি কোন নির্ভরতা এড়াতে হবে
আদৌ আইপিতে?
সাথে যোগাযোগ করতে দ্বিধা করবেন না ns-3-ব্যবহারকারীরা or ns-ডেভেলপাররা আপনার প্রশ্ন থাকলে তালিকা করুন।
বিশেষ করে, আপনার নতুন মডেলের সর্বজনীন API সম্পর্কে চিন্তা করা এবং জিজ্ঞাসা করা গুরুত্বপূর্ণ
প্রতিক্রিয়া আপনি আগ্রহী হলে এটি আপনার কাজ সম্পর্কে অন্যদের জানাতেও সাহায্য করে
সহযোগীদের
উদাহরণ: ত্রুটি মডেল
একটি ত্রুটি মডেল বিদ্যমান ns-2. এটি প্যাকেটগুলিকে একটি রাষ্ট্রীয় বস্তুতে প্রেরণ করার অনুমতি দেয় যা
নির্ধারণ করে, একটি র্যান্ডম ভেরিয়েবলের উপর ভিত্তি করে, প্যাকেটটি দূষিত কিনা। কলকারী পারে
তারপর প্যাকেটের সাথে কী করবেন তা সিদ্ধান্ত নিন (এটি ফেলে দিন, ইত্যাদি)।
ত্রুটি মডেলের প্রধান API হল একটি প্যাকেট পাস করার জন্য একটি ফাংশন, এবং এর রিটার্ন মান
এই ফাংশনটি একটি বুলিয়ান যা কলকারীকে বলে যে কোনো দুর্নীতি হয়েছে কিনা। বিঃদ্রঃ
যে ত্রুটি মডেলের উপর নির্ভর করে, প্যাকেট ডেটা বাফারটি দূষিত হতে পারে বা নাও হতে পারে।
এই ফাংশনটিকে "IsCorrupt()" বলি।
এখন পর্যন্ত, আমাদের ডিজাইনে, আমাদের আছে:
ক্লাস ত্রুটি মডেল
{
প্রকাশ্য:
/ **
* যদি প্যাকেটটিকে ত্রুটিযুক্ত/দুষ্ট হিসাবে বিবেচনা করা হয় তবে সত্য ফেরত দেয়
* \param pkt প্যাকেট যাতে ত্রুটি মডেল প্রয়োগ করা যায়
*/
bool IsCorrupt (Ptr pkt);
};
মনে রাখবেন যে আমরা একটি কনস্ট পয়েন্টার পাস করি না, যার ফলে ফাংশনটিকে পরিবর্তন করার অনুমতি দেয়
প্যাকেট যদি IsCorrupt() true রিটার্ন করে। সমস্ত ত্রুটি মডেল আসলে প্যাকেট পরিবর্তন করবে না;
প্যাকেট ডেটা বাফার দূষিত কিনা তা নথিভুক্ত করা উচিত।
আমরা এর বিশেষ সংস্করণও চাই, যেমন ইন ns-2, তাই এটা না যদিও
পলিমারফিজমের জন্য শুধুমাত্র ডিজাইন পছন্দ, আমরা ধরে নিই যে আমরা একটি বেস ক্লাস সাবক্লাস করব
বিশেষায়িত ক্লাসের জন্য ErrorModel, যেমন RateErrorModel, ListErrorModel, ইত্যাদি, যেমন
ভিতরে করা হয় ns-2.
আপনি এই মুহুর্তে ভাবছেন, "কেন IsCorrupt() একটি ভার্চুয়াল পদ্ধতি তৈরি করবেন না?"। এটাই
এক পদ্ধতি; অন্যটি হল পাবলিক নন-ভার্চুয়াল ফাংশনকে একটি মাধ্যমে পরোক্ষ করা
প্রাইভেট ভার্চুয়াল ফাংশন (এটি C++ এ নন ভার্চুয়াল ইন্টারফেস ইডিয়ম হিসাবে পরিচিত এবং
গৃহীত ns-3 ত্রুটি মডেল ক্লাস)।
পরবর্তী, এই ডিভাইসের কি আইপি বা অন্যান্য প্রোটোকলের উপর কোন নির্ভরতা থাকা উচিত? আমরা চাই না
ইন্টারনেট প্রোটোকলের উপর নির্ভরতা তৈরি করতে (ত্রুটির মডেলটি প্রযোজ্য হওয়া উচিত
অ-ইন্টারনেট প্রোটোকলও), তাই আমরা পরে এটি মনে রাখব।
আরেকটি বিবেচনা হল কিভাবে বস্তু এই ত্রুটি মডেল অন্তর্ভুক্ত করবে। আমরা নির্বাণ কল্পনা
কিছু নির্দিষ্ট NetDevice বাস্তবায়নে একটি স্পষ্ট সেটার, উদাহরণস্বরূপ।:
/ **
* PointToPointNetDevice-এ একটি রিসিভ এররমডেল সংযুক্ত করুন।
*
* PointToPointNetDevice ঐচ্ছিকভাবে একটি ErrorModel অন্তর্ভুক্ত করতে পারে
* প্যাকেট রিসিভ চেইন।
*
* @ErrorModel দেখুন
* @param em Ptr এ ErrorModel.
*/
অকার্যকর PointToPointNetDevice::SetReceiveErrorModel(Ptr) em);
আবার, এটি আমাদের একমাত্র পছন্দ নয় (ত্রুটির মডেলগুলি প্রচুর পরিমাণে একত্রিত হতে পারে
অন্যান্য অবজেক্ট), কিন্তু এটি আমাদের প্রাথমিক ব্যবহারের ক্ষেত্রে সন্তুষ্ট করে, যা একজন ব্যবহারকারীকে বাধ্য করার অনুমতি দেয়
অন্যথায় সফল প্যাকেট ট্রান্সমিশনে ত্রুটি, NetDevice স্তরে।
কিছু চিন্তা করার পরে এবং বিদ্যমান তাকান ns-2 কোড, এখানে একটি বেসের একটি নমুনা API আছে
ক্লাস এবং প্রথম সাবক্লাস যা প্রাথমিক পর্যালোচনার জন্য পোস্ট করা যেতে পারে:
ক্লাস ত্রুটি মডেল
{
প্রকাশ্য:
ErrorModel ();
ভার্চুয়াল ~ErrorModel ();
bool IsCorrupt (Ptr pkt);
void রিসেট (অকার্যকর);
void সক্রিয় (অকার্যকর);
void নিষ্ক্রিয় (অকার্যকর);
bool IsEnabled (void) const;
ব্যক্তিগত:
ভার্চুয়াল বুল DoCorrupt (Ptr pkt) = 0;
ভার্চুয়াল void DoReset (void) = 0;
};
enum ErrorUnit
{
EU_BIT,
EU_BYTE,
EU_PKT
};
// কোন প্যাকেটগুলি অন্তর্নিহিতের সাথে সম্পর্কিত ত্রুটিযুক্ত তা নির্ধারণ করুন
// এলোমেলো পরিবর্তনশীল বিতরণ, একটি ত্রুটি হার, এবং হারের জন্য ইউনিট।
ক্লাস রেট এররমডেল: সর্বজনীন ত্রুটি মডেল
{
প্রকাশ্য:
RateErrorModel ();
ভার্চুয়াল ~ RateErrorModel ();
enum ErrorUnit GetUnit (void) const;
void SetUnit (enum ErrorUnit error_unit);
ডবল GetRate (অকার্যকর) const;
void SetRate (ডবল রেট);
void SetRandomVariable (const RandomVariable &ranvar);
ব্যক্তিগত:
ভার্চুয়াল বুল DoCorrupt (Ptr pkt);
ভার্চুয়াল অকার্যকর DoReset (অকার্যকর);
};
ভারা
ধরা যাক যে আপনি বাস্তবায়ন শুরু করতে প্রস্তুত; আপনি একটি মোটামুটি পরিষ্কার ছবি আছে
আপনি কি তৈরি করতে চান, এবং আপনি কিছু প্রাথমিক পর্যালোচনা বা পরামর্শ চেয়ে থাকতে পারেন
ক্রমতালিকা. পরবর্তী ধাপে যাওয়ার একটি উপায় (বাস্তবায়ন) হল ভারা তৈরি করা এবং
ডিজাইন পরিপক্ক হওয়ার সাথে সাথে বিশদটি পূরণ করুন।
এই বিভাগে আপনি ভারা সংজ্ঞায়িত করার জন্য বিবেচনা করা উচিত অনেক পদক্ষেপের মধ্য দিয়ে হেঁটে, বা
আপনার মডেল শেষ পর্যন্ত কি বাস্তবায়ন করবে তার একটি অ-কার্যকরী কঙ্কাল। এটা সাধারণত ভাল
শেষ পর্যন্ত এই বিশদগুলি একত্রিত করার জন্য অপেক্ষা না করার অভ্যাস করুন, বরং একটি প্লাম্ব করার জন্য
আপনার মডেলের কঙ্কাল সিস্টেমে প্রথম দিকে এবং তারপরে API এবং পরে ফাংশন যোগ করুন
ইন্টিগ্রেশন ঠিক প্রায় মনে হয়.
মনে রাখবেন যে আপনি আপনার মডেলের জন্য নীচের উপস্থাপনায় কয়েকটি জিনিস পরিবর্তন করতে চাইবেন
যেহেতু আপনি যদি এরর মডেলটি verbatim অনুসরণ করেন, তাহলে আপনি যে কোডটি তৈরি করেন সেটির সাথে সংঘর্ষ হবে
বিদ্যমান ত্রুটি মডেল। ErrorModel কিভাবে তৈরি করা হয়েছিল তার একটি রূপরেখা নিচে দেওয়া হল
অন্যান্য মডেলের সাথে মানিয়ে নিতে পারে।
পর্যালোচনা দ্য ns-3 কোডিং শৈলী দলিল
এই মুহুর্তে, আপনি বিরতি দিতে এবং পড়তে চাইতে পারেন ns-3 কোডিং শৈলী নথি, বিশেষ করে
আপনি যদি আপনার কোডটি প্রকল্পে ফেরত দেওয়ার কথা ভাবছেন। কোডিং শৈলী
নথিটি মূল প্রকল্পের পৃষ্ঠা থেকে লিঙ্ক করা হয়েছে: ns-3 আইনসংগ্রহ শৈলী.
সিদ্ধান্ত নিন কোথায় in দ্য উৎস গাছ দ্য মডেল উচিত বাস করা
সব ns-3 মডেল সোর্স কোড ডিরেক্টরিতে আছে src /. আপনি যা চয়ন করতে হবে
সাবডিরেক্টরীতে এটি থাকে। এটি যদি কোন ধরণের নতুন মডেল কোড হয়, তাহলে এটি রাখা বোধগম্য হয়
মধ্যে src / কোথাও ডিরেক্টরি, বিশেষ করে বিল্ডের সাথে একীভূত করার সুবিধার জন্য
পদ্ধতি.
ত্রুটি মডেলের ক্ষেত্রে, এটি প্যাকেট শ্রেণীর সাথে খুব সম্পর্কিত, তাই এটি অর্থপূর্ণ
এই বাস্তবায়ন করতে src/নেটওয়ার্ক/ মডিউল যেখানে ns-3 প্যাকেট বাস্তবায়িত হয়।
ওয়াফ এবং wscript
ns-3 ব্যবহার করে Waf সিস্টেম নির্মাণ। আপনি আপনার নতুন সংহত করতে চান ns-3 Waf ব্যবহার করে
সিস্টেম নির্মাণ। আপনি এই সিস্টেমে আপনার নতুন উৎস ফাইল একত্রিত করতে চান. এই
আপনি আপনার ফাইল যোগ করতে হবে wscript ফাইল প্রতিটি ডিরেক্টরিতে পাওয়া যায়।
চলুন শুরু করা যাক খালি ফাইল error-model.h এবং error-model.cc দিয়ে, এবং এটি যোগ করুন
src/network/wscript. এটা সত্যিই বাকি .cc ফাইল যোগ করার ব্যাপার
সোর্স ফাইল, এবং .h ফাইলটি হেডার ফাইলের তালিকায়।
এখন, শীর্ষ স্তরের ডিরেক্টরিতে পপ আপ করুন এবং "./test.py" টাইপ করুন। তোমার ভাঙ্গা উচিত হয়নি
এই অপারেশন দ্বারা কিছু।
অন্তর্ভুক্ত করা গার্ড
পরবর্তী, এর কিছু যোগ করা যাক অন্তর্ভুক্ত করা রক্ষিবাহিনী আমাদের হেডার ফাইলে।:
#ifndef ERROR_MODEL_H
#ERROR_MODEL_H সংজ্ঞায়িত করুন
...
#endif
নামস্থান ns3
ns-3 ব্যবহার করে ns-3 নামস্থান অন্যান্য নেমস্পেস থেকে এর চিহ্নগুলিকে বিচ্ছিন্ন করতে। সাধারণত, ক
ব্যবহারকারী পরবর্তীতে একটি লাগাবে ns-3 cc এবং h উভয় ফাইলেই নামস্থান ব্লক।:
নামস্থান ns3 {
...
}
এই মুহুর্তে, আমাদের কাছে কিছু কঙ্কাল ফাইল রয়েছে যাতে আমরা আমাদের নতুন ক্লাস সংজ্ঞায়িত করা শুরু করতে পারি।
হেডার ফাইল এই মত দেখায়:
#ifndef ERROR_MODEL_H
#ERROR_MODEL_H সংজ্ঞায়িত করুন
নামস্থান ns3 {
} // নামস্থান ns3
#endif
যখন error-model.cc ফাইল সহজভাবে এই মত দেখায়:
# "error-model.h" অন্তর্ভুক্ত করুন
নামস্থান ns3 {
} // নামস্থান ns3
এই ফাইলগুলি কম্পাইল করা উচিত কারণ তাদের আসলে কোন বিষয়বস্তু নেই। আমরা এখন প্রস্তুত
ক্লাস যোগ করা শুরু করুন।
প্রাথমিক বাস্তবায়ন
এই মুহুর্তে, আমরা এখনও কিছু ভারা নিয়ে কাজ করছি, তবে আমরা আমাদের সংজ্ঞায়িত করতে শুরু করতে পারি
ক্লাস, কার্যকারিতা সহ পরে যোগ করা হবে।
উত্তরাধিকারী থেকে দ্য উদ্দেশ্য ক্লাস?
এটি একটি গুরুত্বপূর্ণ নকশা পদক্ষেপ; ক্লাস ব্যবহার করবেন কিনা উদ্দেশ্য আপনার নতুন জন্য একটি বেস ক্লাস হিসাবে
ক্লাস।
অধ্যায়ে বর্ণিত হিসাবে ns-3 অবজেক্ট-মডেল, ক্লাস থেকে উত্তরাধিকারসূত্রে পাওয়া ক্লাস
উদ্দেশ্য বিশেষ বৈশিষ্ট্য পান:
· দ্য ns-3 টাইপ এবং অ্যাট্রিবিউট সিস্টেম (এট্রিবিউট দেখুন)
একটি বস্তু একত্রীকরণ সিস্টেম
একটি স্মার্ট-পয়েন্টার রেফারেন্স কাউন্টিং সিস্টেম (ক্লাস Ptr)
ক্লাস যে ক্লাস থেকে উদ্ভূত অবজেক্টবেস} উপরের প্রথম দুটি বৈশিষ্ট্য পান, কিন্তু না
স্মার্ট পয়েন্টার পান। ক্লাস যে ক্লাস থেকে উদ্ভূত RefCountBase শুধুমাত্র স্মার্ট-পয়েন্টার পান
রেফারেন্স গণনা সিস্টেম।
অনুশীলনে, ক্লাস উদ্দেশ্য উপরের তিনটির বৈকল্পিক ns-3 বিকাশকারী করবে
সবচেয়ে সাধারণ সম্মুখীন.
আমাদের ক্ষেত্রে, আমরা বৈশিষ্ট্য সিস্টেম ব্যবহার করতে চাই, এবং আমরা উদাহরণ পাস করা হবে
জুড়ে এই বস্তুর ns-3 পাবলিক API, তাই ক্লাস উদ্দেশ্য আমাদের জন্য উপযুক্ত।
প্রাথমিক ক্লাস
এগিয়ে যাওয়ার একটি উপায় হল বেয়ার ন্যূনতম ফাংশনগুলি সংজ্ঞায়িত করে শুরু করা এবং সেগুলি হবে কিনা তা দেখুন
কম্পাইল আমরা ক্লাস অবজেক্ট থেকে প্রাপ্ত করার সময় বাস্তবায়নের জন্য কী কী প্রয়োজন তা পর্যালোচনা করা যাক।
#ifndef ERROR_MODEL_H
#ERROR_MODEL_H সংজ্ঞায়িত করুন
# "ns3/object.h" অন্তর্ভুক্ত করুন
নামস্থান ns3 {
ক্লাস ত্রুটি মডেল: পাবলিক অবজেক্ট
{
প্রকাশ্য:
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর);
ErrorModel ();
ভার্চুয়াল ~ErrorModel ();
};
ক্লাস রেট এররমডেল: সর্বজনীন ত্রুটি মডেল
{
প্রকাশ্য:
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর);
RateErrorModel ();
ভার্চুয়াল ~ RateErrorModel ();
};
#endif
এখানে কয়েকটি বিষয় খেয়াল রাখতে হবে। আমরা অন্তর্ভুক্ত করা প্রয়োজন বস্তু. মধ্যে সম্মেলন ns-3 এটা যদি হয়
হেডার ফাইলটি একই ডিরেক্টরিতে সহ-অবস্থিত, এটি কোনো পাথ ছাড়াই অন্তর্ভুক্ত হতে পারে
উপসর্গ অতএব, যদি আমরা ErrorModel বাস্তবায়ন করছি src/core/model ডিরেক্টরি, আমরা
শুধু বলতে পারতাম"# অন্তর্ভুক্ত "object.h"কিন্তু আমরা আছি src/নেটওয়ার্ক/মডেল, তাই আমরা অবশ্যই
এটি হিসাবে অন্তর্ভুক্ত করুন "# অন্তর্ভুক্ত "ns3/object.h"". এছাড়াও মনে রাখবেন যে এটি নামস্থানের বাইরে যায়৷
ঘোষণা
দ্বিতীয়ত, প্রতিটি শ্রেণীকে অবশ্যই একটি স্ট্যাটিক পাবলিক মেম্বার ফাংশন বলা হবে GetTypeId (অকার্যকর).
তৃতীয়ত, কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরকে ইমপ্লিমেন্ট করা ভালো ধারণা
কম্পাইলার তাদের তৈরি করে এবং ধ্বংসকারীকে ভার্চুয়াল করে। C++ এ, সেই অনুলিপিটিও নোট করুন
অ্যাসাইনমেন্ট অপারেটর এবং কপি কনস্ট্রাক্টর স্বয়ংক্রিয়ভাবে তৈরি হয় যদি তারা সংজ্ঞায়িত না হয়, তাই
আপনি যদি সেগুলি না চান তবে আপনার ব্যক্তিগত সদস্য হিসাবে সেগুলি বাস্তবায়ন করা উচিত। এই দিক
C++ নিয়ে আলোচনা করা হয়েছে স্কট মেয়ার্সের কার্যকরী C++ বইতে। আইটেম 45।
আসুন এখন .cc ফাইলে কিছু সংশ্লিষ্ট কঙ্কাল বাস্তবায়ন কোড দেখি।:
# "error-model.h" অন্তর্ভুক্ত করুন
নামস্থান ns3 {
NS_OBJECT_ENSURE_REGISTERED (ErrorModel);
TypeId ErrorModel::GetTypeId (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::ErrorModel")
.SetParent ()
;
রিটার্ন tid;
}
ErrorModel ::ErrorModel ()
{
}
ErrorModel ::~ErrorModel ()
{
}
NS_OBJECT_ENSURE_REGISTERED (RateErrorModel);
TypeId RateErrorModel::GetTypeId (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::RateErrorModel")
.SetParent ()
.AddConstructor ()
;
রিটার্ন tid;
}
RateErrorModel::RateErrorModel ()
{
}
RateErrorModel::~RateErrorModel ()
{
}
কি GetTypeId (অকার্যকর) ফাংশন? এই ফাংশনটি কয়েকটি জিনিস করে। এটি একটি নিবন্ধন
TypeId সিস্টেমে অনন্য স্ট্রিং। এটি বস্তুর শ্রেণিবিন্যাস স্থাপন করে
অ্যাট্রিবিউট সিস্টেম (এর মাধ্যমে সেট প্যারেন্ট) এটি ঘোষণা করে যে নির্দিষ্ট বস্তুর মাধ্যমে তৈরি করা যেতে পারে
বস্তু তৈরির কাঠামো (অ্যাডকনস্ট্রাক্টর).
ম্যাক্রো NS_OBJECT_ENSURE_REGISTERED (শ্রেণির নাম) প্রতিটি ক্লাসের জন্যও একবার প্রয়োজন হয়
একটি নতুন GetTypeId পদ্ধতি সংজ্ঞায়িত করে এবং এটি ক্লাসের প্রকৃত নিবন্ধন করে
পদ্ধতি. অবজেক্ট-মডেল অধ্যায়ে এটি আরও বিশদে আলোচনা করা হয়েছে।
সুদ্ধ বহিরাগত নথি পত্র
লগিং সহায়তা
এখানে, লেখা a বিট সম্বন্ধে যোগ |ns3| লগিং ম্যাক্রো বিঃদ্রঃ যে LOG_COMPONENT_DEFINE is
সম্পন্ন বাহিরে দ্য নামস্থান ns3
নির্মাণকারী, খালি ক্রিয়া অনুকৃতি
চাবি ভেরিয়েবল (ডিফল্ট মূল্যবোধ, গুণাবলী)
পরীক্ষা কার্যক্রম 1
উদ্দেশ্য ফ্রেমওয়ার্ক
যোগ করার পদ্ধতি a নমুনা লিপি
এই মুহুর্তে, কেউ উপরে সংজ্ঞায়িত মৌলিক ভারা নিতে এবং এটি যোগ করার চেষ্টা করতে পারেন
সিস্টেমের মধ্যে এই ধাপটি সম্পাদন করা এখন প্লাম্বিং করার সময় একটি সহজ মডেল ব্যবহার করতে দেয়
সিস্টেমের মধ্যে এবং কোনো ডিজাইন বা API পরিবর্তন করা প্রয়োজন কিনা তাও প্রকাশ করতে পারে
তৈরি এটি হয়ে গেলে, আমরা এর কার্যকারিতা তৈরিতে ফিরে আসব
ErrorModels নিজেরাই।
বিজ্ঞাপন মৌলিক সহায়তা in দ্য শ্রেণী
/* point-to-point-net-device.h */
ক্লাস ত্রুটি মডেল;
/ **
* প্যাকেট ইভেন্ট গ্রহণের জন্য ত্রুটি মডেল
*/
Ptr m_receiveErrorModel;
বিজ্ঞাপন অ্যাকসেসর
অকার্যকর
PointToPointNetDevice::SetReceiveErrorModel (Ptr em)
{
NS_LOG_FUNCTION (এই << em);
m_receiveErrorModel = em;
}
.AddAttribute ("ReceiveErrorModel",
"প্যাকেট হারানোর অনুকরণ করতে ব্যবহৃত রিসিভার ত্রুটি মডেল",
পয়েন্টার ভ্যালু (),
MakePointerAccessor (&PointToPointNetDevice::m_receiveErrorModel),
MakePointerChecker ())
উল্লম্ব মধ্যে দ্য পদ্ধতি
void PointToPointNetDevice::রিসিভ (Ptr প্যাকেট)
{
NS_LOG_FUNCTION (এই << প্যাকেট);
uint16_t প্রোটোকল = 0;
যদি (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (প্যাকেট) )
{
//
// যদি আমাদের একটি ত্রুটি মডেল থাকে এবং এটি নির্দেশ করে যে এটি একটি হারানোর সময়
// দূষিত প্যাকেট, এই প্যাকেটটি ফরোয়ার্ড করবেন না, এটি যেতে দিন।
//
m_dropTrace (প্যাকেট);
}
আর
{
//
// রিসিভ ট্রেস হুক টিপুন, পয়েন্ট-টু-পয়েন্ট প্রোটোকল হেডার বন্ধ করুন
// এবং এই প্যাকেটটি প্রোটোকল স্ট্যাক আপ করুন।
//
m_rxTrace (প্যাকেট);
প্রসেসহেডার (প্যাকেট, প্রোটোকল);
m_rxCallback (এই, প্যাকেট, প্রোটোকল, GetRemote ());
যদি (!m_promiscCallback.IsNull ())
{ m_promiscCallback (এই, প্যাকেট, প্রোটোকল, GetRemote (),
GetAddress (), NetDevice::PACKET_HOST);
}
}
}
সৃষ্টি খালি কার্মিক লিপি
/* simple-error-model.cc */
// ত্রুটি মডেল
// আমরা নোড 3 এর NetDevice এ একটি ত্রুটি মডেল যোগ করতে চাই
// আমরা চ্যানেল এবং নোডের মাধ্যমে NetDevice-এ একটি হ্যান্ডেল পেতে পারি
// পয়েন্টার
Ptr nd3 = PointToPointTopology::GetNetDevice
(n3, চ্যানেল2);
Ptr em = তৈরি করুন ();
nd3->SetReceiveErrorModel (em);
bool,
ErrorModel ::DoCorrupt (প্যাকেট ও পি)
{
NS_LOG_FUNCTION;
NS_LOG_UNCOND("দুর্নীতিগ্রস্ত!");
মিথ্যা ফিরে;
}
এই মুহুর্তে, আমরা আমাদের তুচ্ছ ErrorModel প্রাপ্তিতে প্লাম্ব করে প্রোগ্রামটি চালাতে পারি
PointToPointNetDevice এর পথ। এটি স্ট্রিং প্রিন্ট করে "দুর্নীতিগ্রস্ত!" প্রতিটি প্যাকেটের জন্য
নোড n3 এ প্রাপ্ত। এরপরে, আমরা পারফর্ম করে এমন একটি সাবক্লাস যোগ করতে ত্রুটি মডেলে ফিরে আসি
আরো আকর্ষণীয় ত্রুটি মডেলিং.
বিজ্ঞাপন a সাবক্লাস
তুচ্ছ বেস ক্লাস ErrorModel আকর্ষণীয় কিছু করে না, কিন্তু এটি একটি প্রদান করে
দরকারী বেস ক্লাস ইন্টারফেস (দুর্নীতিগ্রস্ত () এবং রিসেট ()), ভার্চুয়াল ফাংশন ফরোয়ার্ড করা হয় যে
সাবক্লাস করা যেতে পারে। এর পরে বিবেচনা করা যাক যে আমরা একটি BasicErrorModel বলি যা ভিত্তি করে
দ্য ns-2 ErrorModel ক্লাস (in ns-2/queue/errmodel৷cc,h}).
কি বৈশিষ্ট্য আমরা একটি ব্যবহারকারী ইন্টারফেস দৃষ্টিকোণ থেকে এই আছে চাই? আমরা চাই
ব্যবহারকারী যাতে তুচ্ছভাবে ব্যবহৃত ErrorModel-এর ধরন পরিবর্তন করতে সক্ষম হন
নেটডিভাইস। আমরা কনফিগারযোগ্য পরামিতি সেট করার ক্ষমতাও চাই।
এখানে কয়েকটি সাধারণ প্রয়োজনীয়তা রয়েছে যা আমরা বিবেচনা করব:
· এলোমেলো ভেরিয়েবল সেট করার ক্ষমতা যা ক্ষতি পরিচালনা করে (ডিফল্ট ইউনিফর্ম ভ্যারিয়েবল)
· গ্রানুলারিটির ইউনিট (বিট, বাইট, প্যাকেট, সময়) সেট করার ক্ষমতা যার উপরে ত্রুটি রয়েছে
প্রয়োগ করা হয়েছে।
· উপরের ইউনিটের সাথে সম্পর্কিত ত্রুটির হার (যেমন 10^-3) সেট করার ক্ষমতা
কণিকা
· সক্ষম/অক্ষম করার ক্ষমতা (ডিফল্ট সক্ষম)
কিভাবে থেকে সাবক্লাস
আমরা বেসিক ইররমডেলকে নিম্নরূপ ত্রুটি মডেলের একটি সাবক্লাস হিসাবে ঘোষণা করি:
ক্লাস বেসিক এররমডেল: সর্বজনীন ত্রুটি মডেল
{
প্রকাশ্য:
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর);
...
ব্যক্তিগত:
// বেস ক্লাস বিশুদ্ধ ভার্চুয়াল ফাংশন প্রয়োগ করুন
ভার্চুয়াল বুল DoCorrupt (Ptr পি);
ভার্চুয়াল বুল DoReset (অকার্যকর);
...
}
এবং একটি অনন্য TypeId স্ট্রিং সেট করে সাবক্লাস GetTypeId ফাংশন কনফিগার করুন এবং
অভিভাবককে ত্রুটি মডেলে সেট করুন:
TypeId RateErrorModel::GetTypeId (অকার্যকর)
{
স্ট্যাটিক TypeId tid = TypeId ("ns3::RateErrorModel")
.SetParent ()
.AddConstructor ()
...
নির্মাণ করা মূল কার্যাবলী এবং একক টেস্ট
জাহির করা ম্যাক্রো
লেখা একক টেস্ট
যোগ করার পদ্ধতি a নতুন মডিউল থেকে ns-3
আপনি যখন সম্পর্কিত ক্লাস, উদাহরণ এবং পরীক্ষার একটি গ্রুপ তৈরি করেছেন, তখন সেগুলি হতে পারে
একটি মধ্যে একসঙ্গে মিলিত ns-3 মডিউল যাতে তারা বিদ্যমান সঙ্গে ব্যবহার করা যেতে পারে ns-3 মডিউল
এবং অন্যান্য গবেষকদের দ্বারা।
এই অধ্যায়টি আপনাকে একটি নতুন মডিউল যোগ করার জন্য প্রয়োজনীয় পদক্ষেপের মধ্য দিয়ে চলে ns-3.
ধাপ 0 - মডিউল বিন্যাস
সব মডিউল পাওয়া যাবে src ডিরেক্টরি প্রতিটি মডিউল একটি ডিরেক্টরিতে পাওয়া যাবে
যে মডিউল হিসাবে একই নাম আছে. উদাহরণস্বরূপ, দ বর্ণালী মডিউল এখানে পাওয়া যাবে:
src/স্পেকট্রাম. আমরা থেকে উদ্ধৃত করা হবে বর্ণালী দৃষ্টান্তের জন্য মডিউল।
একটি প্রোটোটাইপিকাল মডিউলে নিম্নলিখিত ডিরেক্টরি কাঠামো এবং প্রয়োজনীয় ফাইল রয়েছে:
src /
মডিউল-নাম/
বাঁধাই/
ডক/
উদাহরণ/
wscript
সাহায্যকারী/
মডেল/
পরীক্ষা /
উদাহরণ-to-run.py
wscript
প্রতিটি মডিউলে সমস্ত ডিরেক্টরি উপস্থিত থাকবে না।
ধাপ 1 - সৃষ্টি a মডিউল কঙ্কাল
একটি পাইথন প্রোগ্রাম উৎস ডিরেক্টরিতে প্রদান করা হয় যা একটি নতুনের জন্য একটি কঙ্কাল তৈরি করবে
মডিউল এই আলোচনার উদ্দেশ্যে আমরা ধরে নেব যে আপনার নতুন মডিউল বলা হয়েছে
নতুন মডিউল। থেকে src ডিরেক্টরি, নতুন মডিউল তৈরি করতে নিম্নলিখিতগুলি করুন:
$ ./create-module.py new-module
পরবর্তী, cd মধ্যে নতুন মডিউল; আপনি এই ডিরেক্টরি বিন্যাস পাবেন:
$cd new-module
s ls
ডক উদাহরণ সহকারী মডেল টেস্ট wscript
আরো বিস্তারিতভাবে, create-module.py স্ক্রিপ্ট ডিরেক্টরির পাশাপাশি প্রাথমিক তৈরি করবে
কঙ্কাল wscript, .h, .cc এবং .প্রথম নথি পত্র. কঙ্কাল ফাইলের সাথে সম্পূর্ণ মডিউল দেখায়
এটার মত:
src /
নতুন-মডিউল/
ডক/
new-module.rst
উদাহরণ/
new-module-example.cc
wscript
সাহায্যকারী/
new-module-helper.cc
new-module-helper.h
মডেল/
new-module.cc
new-module.h
পরীক্ষা /
new-module-test-suite.cc
wscript
(যদি প্রয়োজন হয় বাঁধাই/ ডিরেক্টরি তালিকাভুক্ত ধাপ 0 সময় স্বয়ংক্রিয়ভাবে তৈরি করা হবে
বিল্ড.)
আমরা পরবর্তীতে এই মডিউলটি কীভাবে কাস্টমাইজ করা যায় তা নিয়ে চলব। তথ্য দিচ্ছে ওয়াফ ফাইল সম্পর্কে যা
দুটি সম্পাদনা করে আপনার মডিউলটি তৈরি করুন wscript নথি পত্র. আমরা মাধ্যমে হাঁটা হবে
এই অধ্যায়ে প্রধান পদক্ষেপ.
সব ns-3 মডিউল নির্ভর করে কোর মডিউল এবং সাধারণত অন্যান্য মডিউলগুলিতে। এই নির্ভরতা
এ উল্লেখ করা হয়েছে wscript ফাইল (মডিউলের উপরের স্তরে, আলাদা নয় wscript
ফাইলের মধ্যে উদাহরণ ডিরেক্টরি!) কঙ্কালে wscript কল যে আপনার ঘোষণা করবে
নতুন মডিউল ওয়াফ এই মত দেখাবে (সম্পাদনা করার আগে):
def বিল্ড (বিএলডি):
মডিউল = bld.create_ns3_module('new-module', ['core'])
ধরা যাক যে নতুন মডিউল নির্ভর করে ইন্টারনেট, গতিশীলতা, এবং aodv মডিউল পরে
এটি সম্পাদনা করা wscript ফাইলের মত দেখতে হবে:
def বিল্ড (বিএলডি):
মডিউল = bld.create_ns3_module('নতুন-মডিউল', ['ইন্টারনেট', 'মোবিলিটি', 'aodv'])
মনে রাখবেন যে শুধুমাত্র প্রথম স্তরের মডিউল নির্ভরতা তালিকাভুক্ত করা উচিত, তাই আমরা সরিয়ে দিয়েছি
কোর; দ্য ইন্টারনেট পালাক্রমে মডিউল নির্ভর করে কোর.
আপনার মডিউলে সম্ভবত মডেল সোর্স ফাইল থাকবে। প্রাথমিক কঙ্কাল (যা হবে
সফলভাবে কম্পাইল) তৈরি করা হয় model/new-module.cc এবং model/new-module.h.
আপনার মডিউলে যদি হেল্পার সোর্স ফাইল থাকে, তাহলে সেগুলি তে যাবে সাহায্যকারী/
ডিরেক্টরি; আবার, সেই ডিরেক্টরিতে প্রাথমিক কঙ্কাল তৈরি করা হয়।
অবশেষে, পরীক্ষা এবং উদাহরণ লেখার জন্য এটি একটি ভাল অভ্যাস। এগুলি প্রায় অবশ্যই হবে
নতুন মডিউল অফিসিয়ালে গৃহীত হওয়ার জন্য প্রয়োজনীয় ns-3 উৎস গাছ। একটি কঙ্কাল
টেস্ট স্যুট এবং টেস্ট কেস তৈরি করা হয় পরীক্ষা / ডিরেক্টরি কঙ্কাল টেস্ট স্যুট হবে
নীচের কনস্ট্রাক্টর ধারণ করে, যা নামে একটি নতুন ইউনিট পরীক্ষা ঘোষণা করে নতুন মডিউল, সঙ্গে একটি
ক্লাস নিয়ে গঠিত একক টেস্ট কেস NewModuleTestCase1:
NewModuleTestSuite::NewModuleTestSuite ()
: TestSuite ("নতুন-মডিউল", UNIT)
{
AddTestCase (নতুন NewModuleTestCase1);
}
ধাপ 3 - ঘোষণা করা উৎস নথি পত্র
আপনার নতুন মডিউলের জন্য সর্বজনীন শিরোনাম এবং উত্স কোড ফাইলগুলি তে উল্লেখ করা উচিত
wscript ফাইলটি আপনার টেক্সট এডিটর দিয়ে পরিবর্তন করে।
একটি উদাহরণ হিসাবে, ঘোষণা করার পরে বর্ণালী মডিউল, src/স্পেকট্রাম/wscript নির্দিষ্ট করে
নিম্নলিখিত তালিকা সহ উত্স কোড ফাইল:
def বিল্ড (বিএলডি):
মডিউল = bld.create_ns3_module('স্পেকট্রাম', ['ইন্টারনেট', 'প্রচার', 'অ্যান্টেনা', 'অ্যাপ্লিকেশন'])
module.source = [
'model/spectrum-model.cc',
'model/spectrum-value.cc',
.
.
.
'model/microwave-oven-spectrum-value-helper.cc',
'helper/spectrum-helper.cc',
'helper/adhoc-aloha-noack-ideal-phy-helper.cc',
'helper/waveform-generator-helper.cc',
'helper/spectrum-analyzer-helper.cc',
]
এই উত্সগুলি কম্পাইল করার ফলে বস্তুগুলি একটি লিঙ্ক লাইব্রেরিতে একত্রিত হবে,
যা এই মডিউলের উপর নির্ভরশীল কোনো প্রোগ্রামের সাথে লিঙ্ক করা হবে।
কিন্তু এই ধরনের প্রোগ্রামগুলি কীভাবে আমাদের নতুন মডিউলের পাবলিক API শিখবে? পড়তে!
ধাপ 4 - ঘোষণা করা প্রকাশ্য শিরোলেখ নথি পত্র
আপনার মডেল এবং সাহায্যকারীর সর্বজনীন API সংজ্ঞায়িত হেডার ফাইলগুলিও হওয়া উচিত
এ উল্লেখ করা হয়েছে wscript ফাইল.
সাথে চালিয়ে যাচ্ছি বর্ণালী মডেল ইলাস্ট্রেশন, পাবলিক হেডার ফাইল নির্দিষ্ট করা হয়
নিম্নলিখিত স্তবক সঙ্গে. (উল্লেখ্য যে যুক্তি bld ফাংশন বলে ওয়াফ থেকে
অন্যটির সাথে এই মডিউলের হেডার ইনস্টল করুন ns-3 শিরোনাম):
হেডার = bld (বৈশিষ্ট্য='ns3header')
headers.module = 'স্পেকট্রাম'
headers.source = [
'model/spectrum-model.h',
'model/spectrum-value.h',
.
.
.
'model/microwave-oven-spectrum-value-helper.h',
'helper/spectrum-helper.h',
'helper/adhoc-aloha-noack-ideal-phy-helper.h',
'helper/waveform-generator-helper.h',
'helper/spectrum-analyzer-helper.h',
]
এইভাবে সর্বজনীন করা শিরোনামগুলি অন্তর্ভুক্ত সহ আপনার মডেলের ব্যবহারকারীদের কাছে অ্যাক্সেসযোগ্য হবে
মত বিবৃতি
# "ns3/spectrum-model.h" অন্তর্ভুক্ত করুন
আপনার বাস্তবায়নে অভ্যন্তরীণভাবে কঠোরভাবে ব্যবহৃত হেডারগুলি এখানে অন্তর্ভুক্ত করা উচিত নয়। তারা
অন্তর্ভুক্ত বিবৃতি দ্বারা এখনও আপনার বাস্তবায়ন অ্যাক্সেসযোগ্য
# "my-module-implementation.h" অন্তর্ভুক্ত করুন
ধাপ 5 - ঘোষণা করা টেস্ট
যদি আপনার নতুন মডিউলের পরীক্ষা থাকে, তবে সেগুলি অবশ্যই আপনার মধ্যে নির্দিষ্ট করা উচিত wscript দ্বারা ফাইল
আপনার টেক্সট এডিটর দিয়ে এটি পরিবর্তন করা হচ্ছে।
সার্জারির বর্ণালী মডেল পরীক্ষা নিম্নলিখিত স্তবক সঙ্গে নির্দিষ্ট করা হয়:
module_test = bld.create_ns3_module_test_library('স্পেকট্রাম')
module_test.source = [
'test/spectrum-interference-test.cc',
'test/spectrum-value-test.cc',
]
দেখ টেস্ট পরীক্ষার কেস কিভাবে লিখতে হয় সে সম্পর্কে আরও তথ্যের জন্য।
ধাপ 6 - ঘোষণা করা উদাহরণ
যদি আপনার নতুন মডিউলের উদাহরণ থাকে, তাহলে সেগুলি অবশ্যই আপনার মধ্যে নির্দিষ্ট করা উচিত উদাহরণ/wscript
ফাইল (কঙ্কাল টপ-লেভেল wscript recursively অন্তর্ভুক্ত করা হবে উদাহরণ/wscript শুধু যদি
উদাহরণগুলি কনফিগার করার সময় সক্ষম করা হয়েছিল।)
সার্জারির বর্ণালী মডেল সংজ্ঞায়িত করে এর প্রথম উদাহরণ src/spectrum/examples/wscript সঙ্গে
def বিল্ড (বিএলডি):
obj = bld.create_ns3_program('adhoc-aloha- ideal-phy',
['স্পেকট্রাম', 'মোবিলিটি'])
obj.source = 'adhoc-aloha-ideal-phy.cc'
লক্ষ্য করুন যে ফাংশনের দ্বিতীয় আর্গুমেন্ট create_ns3_program() হল মডিউলের তালিকা
যে প্রোগ্রাম তৈরি করা হচ্ছে তার উপর নির্ভর করে; আবার, অন্তর্ভুক্ত করতে ভুলবেন না নতুন মডিউল in
ক্রমতালিকা. শুধুমাত্র সরাসরি মডিউল নির্ভরতা তালিকাভুক্ত করা সর্বোত্তম অনুশীলন, এবং যাক ওয়াফ
সম্পূর্ণ নির্ভরতা গাছ অনুমান.
মাঝে মাঝে, স্পষ্টতার জন্য, আপনি আপনার উদাহরণের জন্য বাস্তবায়নকে বিভক্ত করতে চাইতে পারেন
বেশ কয়েকটি উৎস ফাইল। এই ক্ষেত্রে, শুধুমাত্র অতিরিক্ত স্পষ্ট হিসাবে সেই ফাইলগুলি অন্তর্ভুক্ত করুন
উদাহরণের উত্স:
obj = bld.create_ns3_program('নতুন-মডিউল-উদাহরণ', [নতুন-মডিউল])
obj.source = ['new-module-example.cc', 'new-module-example-part.cc']
পাইথন উদাহরণ নিম্নলিখিত ফাংশন কল ব্যবহার করে নির্দিষ্ট করা হয়. উল্লেখ্য যে দ্বিতীয়
ফাংশনের জন্য যুক্তি register_ns3_script() পাইথন মডিউলের তালিকা
উদাহরণ নির্ভর করে:
bld.register_ns3_script('new-module-example.py', ['new-module'])
ধাপ 7 - উদাহরণ চালান as টেস্ট
সুস্পষ্ট পরীক্ষার কোড চালানোর পাশাপাশি, পরীক্ষার ফ্রেমওয়ার্কটিও উপকরণ করা যেতে পারে
উদাহরণগুলিতে রিগ্রেশন ধরার চেষ্টা করতে সম্পূর্ণ উদাহরণ প্রোগ্রামগুলি চালান। যাইহোক, সব না
উদাহরণ রিগ্রেশন পরীক্ষার জন্য উপযুক্ত। ফাইল test/examples-to-run.py নিয়ন্ত্রণ করে
পরীক্ষার ফ্রেমওয়ার্ক সঞ্চালিত হলে উদাহরণের আমন্ত্রণ।
সার্জারির বর্ণালী দ্বারা চালিত মডেল উদাহরণ test.py মধ্যে নির্দিষ্ট করা হয়
src/spectrum/test/examples-to-run.py C++ এবং পাইথনের নিম্নলিখিত দুটি তালিকা ব্যবহার করে
উদাহরণ:
# C++ উদাহরণগুলির একটি তালিকা যাতে সেগুলি থাকে তা নিশ্চিত করতে চালানোর জন্য
# নির্মাণযোগ্য এবং সময়ের সাথে চালানো যায়। তালিকার প্রতিটি tuple ধারণ করে
#
# (উদাহরণ_নাম, do_run, do_valgrind_run)।
#
# আরও তথ্যের জন্য test.py দেখুন।
cpp_examples = [
("অ্যাডহক-আলোহা-আদর্শ-ফি", "সত্য", "সত্য"),
("অ্যাডহক-আলোহা-আদর্শ-ফাই-ওয়াইথ-মাইক্রোওয়েভ-ওভেন", "ট্রু", "ট্রু"),
("অ্যাডহক-আলোহা-আদর্শ-ফাই-ম্যাট্রিক্স-প্রচার-ক্ষতি-মডেল", "সত্য", "সত্য"),
]
# পাইথন উদাহরণগুলির একটি তালিকা যাতে সেগুলি থাকে তা নিশ্চিত করতে চালানোর জন্য
# সময়ের সাথে চালানো যায়। তালিকার প্রতিটি tuple ধারণ করে
#
# (উদাহরণ_নাম, করবেন_রান)।
#
# আরও তথ্যের জন্য test.py দেখুন।
python_examples = [
("sample-simulator.py", "True"),
]
মন্তব্যে নির্দেশিত হিসাবে, চালানোর উদাহরণগুলির C++ তালিকার প্রতিটি এন্ট্রিতে রয়েছে
টিপল (উদাহরণ_নাম, do_run, do_valgrind_run), কোথায়
· উদাহরণ_নাম চালানো হবে নির্বাহযোগ্য,
· do_run একটি শর্ত যার অধীনে উদাহরণ চালানোর জন্য, এবং
· do_valgrind_run ভ্যালগ্রিন্ডের অধীনে উদাহরণ চালানোর জন্য একটি শর্ত। (এই
প্রয়োজন কারণ NSC কিছু পরীক্ষার সাথে অবৈধ নির্দেশ ক্র্যাশ করে যখন তারা
ভালগ্রিন্ডের অধীনে চালানো হয়।)
মনে রাখবেন যে দুটি শর্ত হল পাইথন স্টেটমেন্ট যা নির্ভর করতে পারে ওয়াফ কনফিগারেশন
ভেরিয়েবল উদাহরণ স্বরূপ,
("tcp-nsc-lfn", "NSC_ENABLED == সত্য", "NSC_ENABLED == মিথ্যা"),
চালানোর জন্য পাইথন তালিকার প্রতিটি এন্ট্রিতে টিপল থাকে (উদাহরণ_নাম,
do_run), যেখানে, C++ উদাহরণের জন্য,
· উদাহরণ_নাম পাইথন স্ক্রিপ্ট চালানো হবে, এবং
· do_run একটি শর্ত যার অধীনে উদাহরণ চালানোর জন্য.
আবার, শর্তটি একটি পাইথন বিবৃতি যা নির্ভর করতে পারে ওয়াফ কনফিগারেশন ভেরিয়েবল।
উদাহরণ স্বরূপ,
("realtime-udp-echo.py", "ENABLE_REAL_TIME == মিথ্যা"),
ধাপ 8 - কনফিগার করুন এবং নির্মাণ করা
আপনি এখন স্বাভাবিক হিসাবে আপনার মডিউলটি কনফিগার করতে, তৈরি করতে এবং পরীক্ষা করতে পারেন। আপনাকে অবশ্যই পুনরায় কনফিগার করতে হবে
একটি প্রথম পদক্ষেপ হিসাবে প্রকল্প যাতে ওয়াফ আপনার নতুন তথ্য ক্যাশে wscript ফাইল, বা
অন্যথায় আপনার নতুন মডিউল বিল্ডে অন্তর্ভুক্ত করা হবে না।
$ ./waf কনফিগার --enable-examples --enable-tests
$ ./waf বিল্ড
$ ./test.py
আপনার নতুন মডিউলের পরীক্ষা স্যুট (এবং উদাহরণ প্রোগ্রাম, যদি আপনার মডিউলে থাকে) সন্ধান করুন
সক্ষম) পরীক্ষা আউটপুটে।
ধাপ 9 - পাইথন বাঁধাই
আপনার মডিউলে পাইথন বাইন্ডিং যোগ করা ঐচ্ছিক, এবং পদক্ষেপটি মন্তব্য করেছে
ডিফল্ট মধ্যে create-module.py লিপি.
# bld.ns3_python_bindings()
আপনি যদি পাইথন বাইন্ডিং অন্তর্ভুক্ত করতে চান (আপনি পাইথন ns-3 লিখতে চান তবেই প্রয়োজন
C++ ns-3 প্রোগ্রামের পরিবর্তে প্রোগ্রাম), আপনাকে উপরেরটি আনকমেন্ট করতে হবে এবং ইনস্টল করতে হবে
Python API স্ক্যানিং সিস্টেম (এই ম্যানুয়ালটিতে অন্যত্র কভার করা হয়েছে) এবং আপনার মডিউল স্ক্যান করুন
নতুন বাইন্ডিং তৈরি করুন।
তৈরি করা হচ্ছে ডকুমেন্টেশন
ns-3 দুই ধরনের ডকুমেন্টেশন সরবরাহ করে: এক্সপোজিটরি "ইউজার-গাইড"-স্টাইল অধ্যায়, এবং
সোর্স কোড API ডকুমেন্টেশন।
"ব্যবহারকারী-গাইড" অধ্যায়গুলি হাতে লেখা হয়৷ reStructuredText বিন্যাস (.প্রথম), যা হলো
পাইথন ডকুমেন্টেশন সিস্টেম দ্বারা প্রক্রিয়াকৃত স্পিংক্স ওয়েব পেজ এবং পিডিএফ ফাইল তৈরি করতে।
API ডকুমেন্টেশন সোর্স কোড থেকে তৈরি করা হয়, ব্যবহার করে অক্সিজেন, উৎপাদন করতে
ক্রস লিঙ্ক করা ওয়েব পেজ। এই দুটিই গুরুত্বপূর্ণ: স্ফিঙ্কস অধ্যায় ব্যাখ্যা করে কেন
এবং একটি মডেল ব্যবহার ওভারভিউ; API ডকুমেন্টেশন ব্যাখ্যা করে কিভাবে বিবরণ।
এই অধ্যায়টি এই সরঞ্জামগুলির একটি দ্রুত ওভারভিউ দেয়, পছন্দের ব্যবহারের উপর জোর দেয় এবং
জন্য কাস্টমাইজেশন ns-3.
সমস্ত স্ট্যান্ডার্ড ডকুমেন্টেশন তৈরি করতে:
$ ./waf ডক্স
আরো বিশেষ বিকল্পের জন্য, পড়ুন.
দলিল সঙ্গে স্পিংক্স
আমরা ব্যাবহার করি স্পিংক্স প্রতিটির নকশা এবং ব্যবহার বর্ণনা করে এক্সপোজিটরি অধ্যায় তৈরি করতে
মডিউল এই মুহূর্তে আপনি পড়ছেন ডকুমেন্টেশন অধ্যায়. দ্য প্রদর্শনী উৎস লিঙ্ক
সাইডবার আপনাকে এই অধ্যায়ের জন্য পুনর্গঠিত পাঠ্য উত্স দেখাবে।
যোগ করার পদ্ধতি নতুন অধ্যায়
একটি নতুন অধ্যায় যোগ করার জন্য তিনটি ধাপ লাগে (নীচে আরও বিশদে বর্ণনা করা হয়েছে):
1। চয়ন করুন কোথায়? ডকুমেন্টেশন ফাইল(গুলি) লাইভ হবে।
2. লিংক একটি বিদ্যমান পৃষ্ঠা থেকে নতুন ডকুমেন্টেশনে।
3. নতুন ফাইল যোগ করুন Makefile নামক.
কোথায়?
একটি নির্দিষ্ট মডিউলের জন্য ডকুমেন্টেশন, foo বিন্যাস, সাধারণত ভিতরে যেতে হবে src/foo/doc/। উদাহরণ স্বরূপ
src/foo/doc/foo.rst মডিউলের জন্য শীর্ষ-স্তরের নথি হবে। দ্য
src/create-module.py স্ক্রিপ্ট আপনার জন্য এই ফাইলটি তৈরি করবে।
কিছু মডেলের জন্য বেশ কয়েকটি প্রয়োজন .প্রথম ফাইল, এবং পরিসংখ্যান; এই সব যেতে হবে
src/foo/doc/ ডিরেক্টরি ডক্স আসলে একটি Sphinx Makefile দ্বারা নির্মিত হয়. বিশেষ করে জন্য
জড়িত ডকুমেন্টেশন, এটি একটি স্থানীয় আছে সহায়ক হতে পারে Makefile নামক মধ্যে src/foo/doc/
এই মডিউলটির জন্য ডকুমেন্টেশন নির্মাণ সহজ করার জন্য ডিরেক্টরি (শুঙ্গ একটি উদাহরণ)।
এটি সেট আপ করা বিশেষভাবে কঠিন নয়, তবে এই অধ্যায়ের সুযোগের বাইরে।
কিছু ক্ষেত্রে, ডকুমেন্টেশন একাধিক মডেল বিস্তৃত; দ্য নেটওয়ার্ক অধ্যায় একটি উদাহরণ. ভিতরে
এই মামলা যোগ .প্রথম ফাইল সরাসরি ডক/মডেল/উৎস/ উপযুক্ত হতে পারে।
লিংক
স্ফিংসকে জানতে হবে কোথায় আপনার নতুন অধ্যায় প্রদর্শিত হবে. বেশিরভাগ ক্ষেত্রে, একটি নতুন মডেল
অধ্যায় প্রদর্শিত হবে মডেল বই সেখানে আপনার অধ্যায় যোগ করতে, সম্পাদনা করুন
doc/models/source/index.rst
.. টকট্রি::
: সর্বোচ্চ গভীরতা: 1
সংগঠন
অ্যানিমেশন
শুঙ্গ
aodv
অ্যাপ্লিকেশন
...
আপনার নথির নাম যোগ করুন (ব্যতীত .প্রথম এক্সটেনশন) এই তালিকায়। রাখুন
নির্দিষ্ট অধ্যায়গুলির জন্য ভিজ্যুয়াল স্ক্যানিং সহজ করতে বর্ণানুক্রমিক ক্রমে অধ্যায়গুলির মডেল করুন৷
Makefile নামক
আপনাকে আপনার নথিটি উপযুক্তটিতে যুক্ত করতে হবে Makefile নামক, তাই করা এটা চেক করতে জানে
আপডেটের জন্য। মডেল বই মেকফাইল হয় ডক/মডেল/মেকফাইল, ম্যানুয়াল বই Makefile হয়
ডক/ম্যানুয়াল/মেকফাইল.
# সমস্ত মডেল লাইব্রেরি .rst ফাইলের তালিকা করুন যা $SOURCETEMP-এ কপি করতে হবে
সূত্র = \
source/conf.py \
উৎস/_স্ট্যাটিক \
source/index.rst \
source/replace.txt \
source/organization.rst \
...
$(SRC)/antenna/doc/source/antenna.rst \
...
আপনি আপনার যোগ করুন .প্রথম ফাইল উত্স পরিবর্তনশীল পরিসংখ্যান যোগ করতে, মন্তব্য পড়ুন
Makefile নামক কোন ভেরিয়েবলে আপনার ইমেজ ফাইল থাকা উচিত তা দেখতে। আবার, এই রাখুন
বর্নানুক্রমে.
ভবন স্পিংক্স ডক্স
স্ফিংস ডকুমেন্টেশন তৈরি করা বেশ সহজ। সমস্ত স্ফিংক্স তৈরি করতে
ডকুমেন্টেশন:
$ ./waf স্ফিংক্স
শুধু মডেল ডকুমেন্টেশন তৈরি করতে:
$ মেক -সি ডক/মডেল
উত্পন্ন ডকুমেন্টেশন দেখতে আপনার ব্রাউজার এ পয়েন্ট doc/models/build/html.
আপনি দেখতে পাচ্ছেন, স্ফিংস প্রক্রিয়াটি গাইড করতে মেক ব্যবহার করে। ডিফল্ট টার্গেট সব তৈরি করে
সক্রিয় আউটপুট ফর্ম, যা ns-3 মাল্টি পৃষ্ঠা হয় এইচটিএমএল, এক পাতা একক এইচটিএমএল, এবং
পিডিএফ (ক্ষীর) শুধুমাত্র মাল্টি-পৃষ্ঠা এইচটিএমএল তৈরি করতে, আপনি যোগ করুন এইচটিএমএল লক্ষ্য:
$ make -C doc/models html
এটি আপনার মতো বিল্ড টাইম (এবং বিল্ড চ্যাটারের আকার) কমাতে সহায়ক হতে পারে
তোমার অধ্যায় লিখছি।
রেপোতে আপনার ডকুমেন্টেশন দেওয়ার আগে, অনুগ্রহ করে চেক করুন যে এটি ছাড়া তৈরি হয়
ত্রুটি বা সতর্কতা। বিল্ড প্রক্রিয়াটি প্রচুর আউটপুট তৈরি করে (বেশিরভাগই স্বাভাবিক বকবক
LaTeX থেকে), যা কোন স্ফিঙ্কস সতর্কতা আছে কিনা তা দেখা কঠিন করে তুলতে পারে
ত্রুটি গুরুত্বপূর্ণ সতর্কতা এবং ত্রুটি খুঁজে পেতে শুধু বিল্ড এইচটিএমএল সংস্করণ, তারপর অনুসন্ধান করুন
জন্য বিল্ড লগ সতর্কবার্তা or ভুল.
ns-3 সুনির্দিষ্ট
স্পিংক্স ডকুমেন্টেশন এবং অভিভাবকসংবঁধীয় বেশ ভালো আমরা বেসিকগুলি নকল করব না
এখানে, পরিবর্তে পছন্দের ব্যবহারের উপর ফোকাস করা ns-3.
এই দুটি লাইন দিয়ে নথি শুরু করুন:
.. অন্তর্ভুক্ত:: replace.txt
.. হাইলাইট:: cpp
প্রথম লাইন কিছু সহজ প্রতিস্থাপন সক্ষম করে। উদাহরণস্বরূপ, টাইপিং |ns3| হিসাবে রেন্ডার করে
ns-3. দ্বিতীয়টি ডিফল্ট সোর্স কোড হাইলাইট করার ভাষাকে স্পষ্টভাবে সেট করে
ফাইল, যেহেতু পার্সার অনুমান সবসময় সঠিক হয় না। (এটি সেট করাও সম্ভব
একটি একক কোড ব্লকের জন্য স্পষ্টভাবে ভাষা, নীচে দেখুন।)
· বিভাগ:
স্ফিংস বিভাগ শিরোনাম চিহ্নিত করার বিষয়ে বেশ উদার। নিয়ম অনুসারে, আমরা এটি পছন্দ করি
অনুক্রম:
.. শিরোনাম অনুক্রম:
------------- অধ্যায়
************* অধ্যায় (#.#)
============= উপধারা (#.#.#)
############## উপ-উপধারা
সিনট্যাক্স হাইলাইটিং:
ডিফল্ট সিনট্যাক্স হাইলাইটার ব্যবহার করতে, কেবল একটি সোর্সকোড ব্লক শুরু করুন:
┌ ────────────────────────────────────
│Sphinx উত্স │ রেন্ডার করা আউটপুট │
├ ────────────────────────────────────
│ │ দ ফ্রবনিটজ দ্বারা অ্যাক্সেস করা হয়: │
│ ``Frobnitz`` অ্যাক্সেস করে:: │ │
│ │ Foo::Frobnitz frob; │
│ Foo::Frobnitz frob; │ frob.Set (...); │
│ frob.Set (...); │ │
└ ───────────────────────────────────
একটি নির্দিষ্ট সিনট্যাক্স হাইলাইটার ব্যবহার করতে, উদাহরণস্বরূপ, সজোরে আঘাত শেল কমান্ড:
┌ ───┐
│Sphinx উত্স │ রেন্ডার করা আউটপুট │
├ ───┤
│ │ │
│ .. সোর্সকোড:: bash │ $ls │
│ │ │
│ $ls │ │
└ ───┘
· সংক্ষিপ্ত স্বরলিপি:
এই শর্টহ্যান্ডগুলি সংজ্ঞায়িত করা হয়েছে:
┌────└───────────────────────────
│Sphinx উত্স │ রেন্ডার করা আউটপুট │
├────────────────────────────┼─────┼────
│ │ ns-3 │
│ |ns3| │ │
├────────────────────────────┼─────┼────
│ │ ns-2 │
│ |ns2| │ │
├────────────────────────────┼─────┼────
│ │ │
│ |চেক| │ │
├────────────────────────────┼─────┼────
│ │ জন্য RFC 6282 │
│ :rfc:`6282` │ │
└────────────────────────────┴┘
দলিল সঙ্গে অক্সিজেন
আমরা ব্যাবহার করি অক্সিজেন উৎপাদন করতে ব্রাউজযোগ্য API ডকুমেন্টেশন। ডক্সিজেন একটি সংখ্যা প্রদান করে
দরকারী বৈশিষ্ট্য:
· সমস্ত শ্রেণীর সদস্যদের সারসংক্ষেপ টেবিল।
সব শ্রেণীর জন্য উত্তরাধিকার এবং সহযোগিতার গ্রাফ।
সোর্স কোডের লিঙ্ক প্রতিটি ফাংশন বাস্তবায়ন করে।
· প্রতিটি জায়গার লিঙ্ক যেখানে একজন সদস্য ব্যবহার করা হয়।
একটি ফাংশন বাস্তবায়নে ব্যবহৃত প্রতিটি বস্তুর লিঙ্ক।
· সম্পর্কিত ক্লাসের গ্রুপিং, যেমন একটি নির্দিষ্ট প্রোটোকল সম্পর্কিত সমস্ত ক্লাস।
উপরন্তু, আমরা ব্যবহার টাইপআইডি প্রতিটি শ্রেণীর জন্য ডকুমেন্টেশন যোগ করার সিস্টেম
· দ্য কনফিগ পথ যা দ্বারা এই ধরনের বস্তু পৌঁছানো যেতে পারে।
· যে কোনো জন্য ডকুমেন্টেশন আরোপ করাসহ আরোপ করা অভিভাবক ক্লাসে সংজ্ঞায়িত।
· যে কোনো জন্য ডকুমেন্টেশন চিহ্ন শ্রেণী দ্বারা সংজ্ঞায়িত উত্স।
ডক্সিজেন সোর্স কোড স্ক্যান করে কাজ করে, বিশেষভাবে চিহ্নিত মন্তব্য খোঁজে। এটা
এছাড়াও একটি ক্রস রেফারেন্স তৈরি করে, নির্দেশ করে কোথায় প্রতিটি ফাইল, ক্লাস, পদ্ধতি, এবং পরিবর্তনশীল হয়
ব্যবহার করা হয়েছে।
পছন্দের শৈলী
ডক্সিজেন মন্তব্যের জন্য পছন্দের শৈলী হল JavaDoc শৈলী:
/ **
* এই ক্লাস বা পদ্ধতির সংক্ষিপ্ত বিবরণ।
* সংলগ্ন লাইনগুলি একক অনুচ্ছেদে পরিণত হয়।
*
* দীর্ঘ বিবরণ, প্রচুর বিবরণ সহ।
*
* ফাঁকা লাইন পৃথক অনুচ্ছেদ.
*
* ক্লাস বা পদ্ধতি কী করে, কী অ্যালগরিদম ব্যবহার করে তা ব্যাখ্যা করুন।
* আর্গুমেন্টের একক এবং রিটার্ন মানের ব্যাখ্যা কর।
*
* \note যেকোন সীমাবদ্ধতা বা গোছা নোট করুন।
*
* (আর্গুমেন্ট সহ ফাংশন বা রিটার্ন মূল্যবান:)
* \param foo সংক্ষিপ্ত বিশেষ্য বাক্যাংশ এই যুক্তি বর্ণনা করে।
* \param বার নোট বাক্যাংশ, এবং সমাপ্তি সময়কাল।
* \return সংক্ষিপ্ত বিশেষ্য বাক্যাংশ মান বর্ণনা করে।
*
* \ অভ্যন্তরীণ
*
* আপনি অভ্যন্তরীণ বাস্তবায়ন বিশদ আলোচনা করতে পারেন।
* এই উপাদান বুঝতে ব্যবহার করার প্রয়োজন হবে না
* ক্লাস বা পদ্ধতি।
*/
ক্লাসের উদাহরণ
এই শৈলীতে ডক্সিজেন মন্তব্য ব্লক দুটি `*' অক্ষর দিয়ে শুরু হয়: / **, এবং পূর্বে
আইটেম নথিভুক্ত করা হচ্ছে.
আইটেমগুলির জন্য শুধুমাত্র একটি সংক্ষিপ্ত বিবরণের প্রয়োজন, এই সংক্ষিপ্ত ফর্মগুলির মধ্যে একটি উপযুক্ত:
/** ধ্বংসকারী বাস্তবায়ন। */
void DoDispose ();
int m_count; //!< গণনা ...
লাইনের শেষ মন্তব্যের বিশেষ রূপটি লক্ষ্য করুন, //!, নির্দেশ করে যে এটি বোঝায়
পূর্ববর্তী আইটেম.
উল্লেখ্য কিছু আইটেম:
প্রাথমিক মূলধন সহ বাক্যের কেস ব্যবহার করুন।
· বিরাম চিহ্ন ব্যবহার করুন, বিশেষ করে বাক্য বা বাক্যাংশের শেষে `.'
· দ্য \সংক্ষিপ্ত ট্যাগ প্রয়োজন নেই; প্রথম বাক্যটি সংক্ষিপ্ত হিসাবে ব্যবহৃত হবে
বর্ণনা।
প্রতিটি ক্লাস, পদ্ধতি, টাইপডেফ, সদস্য ভেরিয়েবল, ফাংশন আর্গুমেন্ট এবং রিটার্ন মান উচিত
সমস্ত সোর্স কোড ফাইলে নথিভুক্ত করা হবে যা আনুষ্ঠানিক API গঠন করে এবং এর জন্য বাস্তবায়ন
ns-3, যেমন src/ /মডেল/*, src/ /সহায়ক/* এবং src/ /ইউটিলস/*.
আইটেম জন্য ডকুমেন্টেশন src/ /পরীক্ষা/* এবং src/ /উদাহরণ/* পছন্দ করা হয়,
কিন্তু প্রয়োজন হয় না।
দরকারী বৈশিষ্ট্য
উত্তরাধিকারসূত্রে প্রাপ্ত সদস্যরা স্বয়ংক্রিয়ভাবে পিতামাতার কাছ থেকে নথির উত্তরাধিকারী হবে, (কিন্তু প্রতিস্থাপন করা যেতে পারে
স্থানীয় ডকুমেন্টেশন দ্বারা)।
1. বেস ক্লাস নথিভুক্ত করুন।
2. সাব ক্লাস মার্ক ইনহেরিটেড ফাংশন একটি সাধারণ মন্তব্য সহ:
// উত্তরাধিকারসূত্রে প্রাপ্ত পদ্ধতি
ভার্চুয়াল শূন্য FooBar (অকার্যকর);
ভার্চুয়াল int BarFoo (ডাবল বাজ);
নোট করুন যে স্বাক্ষরগুলি হুবহু মিলতে হবে, তাই আনুষ্ঠানিক যুক্তি অন্তর্ভুক্ত করুন (অকার্যকর)
এটি স্ট্যাটিক ফাংশনের জন্য কাজ করে না; দেখা GetTypeId, নীচে, একটি উদাহরণের জন্য.
ভবন অক্সিজেন ডক্স
ডক্সিজেন ডকুমেন্টেশন তৈরি করা বেশ সহজ:
$./waf ডক্সিজেন
এটি ডিফল্ট কনফিগারেশন ব্যবহার করে তৈরি করে, যা এর জন্য ডকুমেন্টেশন বিভাগ তৈরি করে
সব আইটেম, এমনকি যদি তাদের স্পষ্ট মন্তব্য ডকুমেন্টেশন ব্লক না থাকে। এই আছে
অনথিভুক্ত আইটেমগুলির জন্য সতর্কতা দমন করার প্রভাব, কিন্তু নিশ্চিত করে যে সবকিছু প্রদর্শিত হবে
উৎপন্ন আউটপুটে।
ডকুমেন্টেশন লেখার সময়, কোন আইটেমগুলি তৈরি হচ্ছে তা দেখতে প্রায়ই এটি আরও কার্যকর
সতর্কতা, সাধারণত অনুপস্থিত ডকুমেন্টেশন সম্পর্কে। সম্পূর্ণ সতর্কতা তালিকা দেখতে, ব্যবহার করুন
doc/doxygen.warnings.report.sh লিপি:
$doc/doxygen.warnings.report.sh
ওয়াফ: 'বিল্ড' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
...
Waf: ডিরেক্টরি ছেড়ে যাওয়া 'বিল্ড'
'বিল্ড' সফলভাবে শেষ হয়েছে (3m24.094s)
সম্পূর্ণ ত্রুটি সহ ডক্সিজেন ডক্স পুনর্নির্মাণ... সম্পন্ন হয়েছে৷
ডক্সিজেন সতর্কতার প্রতিবেদন
----------------------------------------
(সমস্ত গণনা নিম্ন সীমা।)
মডিউল/ডিরেক্টরি দ্বারা সতর্কতা:
কাউন্ট ডিরেক্টরি
----------------------------------------
3844 src/lte/মডেল
1718 src/wimax/মডেল
1423 এসআরসি/কোর/মডেল
....
138 অতিরিক্ত অনথিভুক্ত প্যারামিটার।
----------------------------------------
15765 মোট সতর্কতা
সতর্কতা সহ 126টি ডিরেক্টরি
ফাইল দ্বারা সতর্কতা (বর্ণানুক্রমিক)
কাউন্ট ফাইল
----------------------------------------
17 ডক/ইনট্রোস্পেক্টেড-ডক্সিজেন.এইচ
15টি উদাহরণ/routing/manet-routing-compare.cc
26 উদাহরণ/পরিসংখ্যান/wifi-example-apps.h
....
----------------------------------------
সতর্কতা সহ 967 ফাইল
ফাইল দ্বারা সতর্কতা (সংখ্যাসূচক)
কাউন্ট ফাইল
----------------------------------------
374 src/lte/model/lte-asn1-header.h
280 src/lte/model/lte-rrc-sap.h
262 src/lte/model/lte-rrc-header.h
....
----------------------------------------
সতর্কতা সহ 967 ফাইল
ডক্সিজেন সতর্কতা সারাংশ
----------------------------------------
126টি ডিরেক্টরি
967 ফাইলগুলি
১টি সতর্কতা
স্ক্রিপ্টটি সমস্ত সতর্কতা দেখাতে এবং রান টাইম সংক্ষিপ্ত করতে কনফিগারেশন পরিবর্তন করে।
আপনি দেখতে পারেন, এই লেখায় আমরা আছে a অনেক অনথিভুক্ত আইটেম. প্রতিবেদনটি
মডিউল দ্বারা সতর্কতা সংক্ষিপ্ত করে src/*/*, এবং ফাইল দ্বারা, বর্ণানুক্রমিক এবং সংখ্যাগত ক্রমে।
স্ক্রিপ্টে জিনিসগুলি কমিয়ে আনার জন্য এবং এটিকে আরও পরিচালনাযোগ্য করার জন্য কয়েকটি বিকল্প রয়েছে। সাহায্যের জন্য,
ব্যবহার -h বিকল্প ডক্সিজেন তৈরি করতে এবং সম্পূর্ণ তৈরি করতে এটি একবার চালান
সতর্কতা লগ, আপনি কিছু না করেই বিভিন্ন "ফিল্টার" সহ লগ ফাইলটি পুনরায় প্রক্রিয়া করতে পারেন
সম্পূর্ণ ডক্সিজেন তৈরি করে, আবার ব্যবহার করে -s বিকল্প আপনি থেকে সতর্কতা বাদ দিতে পারেন
*/উদাহরণ/* নথি পত্র (-e বিকল্প), এবং/অথবা */পরীক্ষা/* নথি পত্র (-t).
ডকুমেন্টেশন মন্তব্য লেখার সময় সম্ভবত সবচেয়ে দরকারী বিকল্প -m , যা
রিপোর্টকে শুধু ফাইল মেলে সীমাবদ্ধ করবে src/ /*, এবং সঙ্গে রিপোর্ট অনুসরণ করুন
প্রকৃত সতর্কতা লাইন। সঙ্গে মেশা eth এবং আপনি যে সতর্কবাণী ফোকাস করতে পারেন
একটি একক মডিউলে সবচেয়ে জরুরি:
$doc/doxygen.warnings.report.sh -m mesh/helper
...
ডক্সিজেন সতর্কতা সারাংশ
----------------------------------------
1টি ডিরেক্টরি
3 ফাইলগুলি
১টি সতর্কতা
ফিল্টার করা সতর্কতা
========================================
src/mesh/helper/dot11s/dot11s-installer.h:72: সতর্কতা: ns3::Dot11sStack ক্লাসের সদস্য m_root (ভেরিয়েবল) নথিভুক্ত নয়।
src/mesh/helper/dot11s/dot11s-installer.h:35: সতর্কতা: সদস্যদের রিটার্ন টাইপ ns3::Dot11sStack::GetTypeId নথিভুক্ত নয়
src/mesh/helper/dot11s/dot11s-installer.h:56: সতর্কতা: সদস্যদের রিটার্ন টাইপ ns3::Dot11sStack::InstallStack নথিভুক্ত নয়
src/mesh/helper/flame/lfame-installer.h:40: সতর্কতা: ns3::FlameStack ক্লাসের সদস্য GetTypeId() (ফাংশন) নথিভুক্ত নয়।
src/mesh/helper/flame/flame-installer.h:60: সতর্কতা: সদস্যদের রিটার্ন টাইপ ns3::FlameStack::InstallStack নথিভুক্ত নয়
src/mesh/helper/mesh-helper.h:213: সতর্কতা: সদস্য m_nইন্টারফেস (ভেরিয়েবল) ক্লাস ns3::MeshHelper নথিভুক্ত নয়।
src/mesh/helper/mesh-helper.h:214: সতর্কতা: ns3::MeshHelper ক্লাসের সদস্য m_spreadChannelPolicy (ভেরিয়েবল) নথিভুক্ত নয়।
src/mesh/helper/mesh-helper.h:215: সতর্কতা: সদস্য m_stack (ভেরিয়েবল) ক্লাস ns3::MeshHelper নথিভুক্ত নয়।
src/mesh/helper/mesh-helper.h:216: সতর্কতা: সদস্য m_stackFactory (ভেরিয়েবল) ক্লাস ns3::MeshHelper নথিভুক্ত নয়।
src/mesh/helper/mesh-helper.h:209: সতর্কতা: সদস্যের পরামিতি ns3::MeshHelper::CreateInterface (সমস্ত) নথিভুক্ত নয়
src/mesh/helper/mesh-helper.h:119: সতর্কতা: সদস্যের পরামিতি ns3::MeshHelper::SetStandard নথিভুক্ত নয় (সমস্ত)
এখন শুধু কোড বোঝা, এবং কিছু ডক্স লেখার ব্যাপার!
ns-3 সুনির্দিষ্ট
স্ফিংসের জন্য, ডক্সিজেন ডক্স এবং উল্লেখ বেশ ভালো আমরা নকল করব না
এখানে মৌলিক বিষয়, পরিবর্তে পছন্দের ব্যবহারের উপর ফোকাস করা ns-3.
· ডক্সিজেন ব্যবহার করুন মডিউল গ্রুপ সম্পর্কিত আইটেম.
একটি মডিউলের জন্য প্রধান শিরোনামে, একটি Doxgyen গ্রুপ তৈরি করুন:
/ **
* \defgroup foo Foo প্রোটোকল।
*/
প্রতিটি সংশ্লিষ্ট শ্রেণীকে গোষ্ঠীর অন্তর্গত হিসাবে চিহ্নিত করুন:
/ **
* \inggroup foo
*
* Foo প্যাকেট প্রকার।
*/
ক্লাস Foo
· তুমি কি জানতে typedefs আনুষ্ঠানিক যুক্তি থাকতে পারে? এটি ফাংশনের ডকুমেন্টেশন সক্ষম করে
পয়েন্টার স্বাক্ষর:
/ **
* বার কলব্যাক ফাংশন স্বাক্ষর।
*
* \param ale ইম্পেরিয়াল আউন্সে এক পিন্ট অ্যালের আকার।
*/
typedef void (* BarCallback)(const int ale);
· অনুলিপি গুণ থেকে সাহায্য স্ট্রিং GetTypeId সংক্ষিপ্ত হিসাবে ব্যবহার করার পদ্ধতি
সংশ্লিষ্ট সদস্যদের বিবরণ।
· ভুল{298} আমাদের বাগজিলায় বাগ 298 এর একটি লিঙ্ক তৈরি করবে।
· \pname{foo} একটি বিবরণ বিন্যাস হবে foo বিন্যাস হিসেবে পরম foo বিন্যাস প্যারামিটার, এটি পরিষ্কার করে
যে আপনি একটি বাস্তব যুক্তি উল্লেখ করছেন.
· \RFC{301} RFC 301 এর একটি লিঙ্ক তৈরি করবে।
· অভ্যন্তরীণ শুধুমাত্র বাস্তবায়নের বিশদ আলোচনা সেট করার জন্য ব্যবহার করা উচিত, নয়
ছাপ ব্যক্তিগত ফাংশন (এগুলি ইতিমধ্যে চিহ্নিত করা হয়েছে, হিসাবে ব্যক্তিগত!)
তুচ্ছ নাম দিয়ে ক্লাস তৈরি করবেন না, যেমন শ্রেণী Aএমনকি টেস্ট স্যুটেও। এইগুলো
ক্লাস নামের আক্ষরিক 'A' এর সমস্ত দৃষ্টান্তকে লিঙ্ক হিসাবে রেন্ডার করা।
উপরে উল্লিখিত হিসাবে, স্ট্যাটিক ফাংশনগুলি একই ফাংশনগুলির ডকুমেন্টেশনের উত্তরাধিকারী হয় না
অভিভাবক শ্রেণী। ns-3 কিছু স্ট্যাটিক ফাংশন সর্বব্যাপী ব্যবহার করে; প্রস্তাবিত
এই ক্ষেত্রে ডকুমেন্টেশন ব্লক হল:
· ডিফল্ট কনস্ট্রাক্টর/ডিস্ট্রাক্টর:
আমার ক্লাস (); //!< ডিফল্ট কনস্ট্রাক্টর
~মাইক্লাস (); //!< ধ্বংসকারী
· ডামি ডেস্ট্রাক্টর এবং ডিসপোজ:
/** ডামি ধ্বংসকারী, DoDispose দেখুন। */
~মাইক্লাস ();
/** ধ্বংসকারী বাস্তবায়ন */
ভার্চুয়াল অকার্যকর DoDispose ();
· GetTypeId:
/ **
* এই ধরনের নিবন্ধন.
* \ অবজেক্ট TypeId ফেরত দিন।
*/
স্ট্যাটিক টাইপআইডি GetTypeId (অকার্যকর);
সক্ষম করা হলে তা উপসেট of ns-3 মডিউল
বেশিরভাগ সফ্টওয়্যার প্রকল্পের মতো, ns-3 মডিউল সংখ্যার পরিপ্রেক্ষিতে সবসময় বড় হচ্ছে,
কোড লাইন, এবং মেমরি পদচিহ্ন. ব্যবহারকারীরা, তবে, শুধুমাত্র এই মডিউলগুলির কয়েকটি ব্যবহার করতে পারে
একেবারে. এই কারণে, ব্যবহারকারীরা স্পষ্টভাবে শুধুমাত্র উপসেট সক্ষম করতে চাইতে পারেন
সম্ভব ns-3 মডিউল যা তারা আসলে তাদের গবেষণার জন্য প্রয়োজন।
এই অধ্যায়ে আলোচনা করা হয়েছে কিভাবে শুধুমাত্র সক্রিয় করতে হয় ns-3 যে মডিউলগুলিতে আপনি আগ্রহী
ব্যবহার.
কিভাবে থেকে সক্ষম করা a উপসেট of ns-3's মডিউল
যদি ভাগ করা লাইব্রেরি তৈরি করা হয়, তাহলে একটি মডিউল সক্ষম করলে অন্তত একটি হবে৷
লাইব্রেরি নির্মাণ করা হবে:
libns3-modulename.so
যদি মডিউলটিতে একটি পরীক্ষা লাইব্রেরি থাকে এবং পরীক্ষা লাইব্রেরি তৈরি করা হচ্ছে, তাহলে
libns3-modulename-test.so
নির্মিত হবে, খুব. অন্যান্য মডিউল যা মডিউল নির্ভর করে এবং তাদের পরীক্ষা লাইব্রেরি
এছাড়াও নির্মিত হবে।
ডিফল্টরূপে, সমস্ত মডিউল অন্তর্নির্মিত হয় ns-3. এইগুলির একটি উপসেট সক্ষম করার দুটি উপায় রয়েছে
মডিউল:
1. waf এর --enable-modules অপশন ব্যবহার করা
2. ব্যবহার করে ns-3 কনফিগারেশন ফাইল
সক্ষম করা মডিউল ব্যবহার waf এর --সক্ষম-মডিউল পছন্দ
উদাহরণ এবং পরীক্ষা সহ শুধুমাত্র মূল মডিউল সক্ষম করতে, উদাহরণস্বরূপ, এই কমান্ডগুলি চেষ্টা করুন:
$ ./waf পরিষ্কার
$ ./waf কনফিগার --enable-examples --enable-tests --enable-modules=core
$ ./waf বিল্ড
$ cd বিল্ড/ডিবাগ/
s ls
এবং নিম্নলিখিত লাইব্রেরি উপস্থিত থাকা উচিত:
bindings libns3-core.so ns3 স্ক্র্যাচ ইউটিলস
উদাহরণ libns3-core-test.so নমুনা src
মনে রাখবেন ./waff পরিষ্কার ধাপটি এখানে করা হয়েছে শুধুমাত্র মডিউল লাইব্রেরিগুলিকে আরও স্পষ্ট করার জন্য
তৈরী করা হয়েছে. আপনি করতে হবে না ./waff পরিষ্কার মডিউলগুলির উপসেটগুলি সক্ষম করার জন্য।
test.py চালানোর ফলে শুধুমাত্র সেই পরীক্ষাগুলি চালানো হবে যা মডিউল কোরের উপর নির্ভর করে:
24টি পরীক্ষায় 24টি পাস হয়েছে (24টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
"কোর" মডিউলের পরিবর্তে "নেটওয়ার্ক" মডিউলের জন্য উপরের ধাপগুলি পুনরাবৃত্তি করুন এবং
নিম্নলিখিত তৈরি করা হবে, যেহেতু নেটওয়ার্ক মূলের উপর নির্ভর করে:
বাইন্ডিং libns3-core.so libns3-network.so ns3 স্ক্র্যাচ ইউটিলস
উদাহরণ libns3-core-test.so libns3-network-test.so নমুনা src
test.py চালানোর ফলে সেই পরীক্ষাগুলি হবে যেগুলি শুধুমাত্র মূল এবং নেটওয়ার্ক মডিউলের উপর নির্ভর করে৷
চালানো হবে:
31টি পরীক্ষায় 31টি পাস হয়েছে (31টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
সক্ষম করা মডিউল ব্যবহার দ্য ns-3 কনফিগারেশন ফাইল
একটি কনফিগারেশন ফাইল, .ns3rc, যোগ করা হয়েছে ns-3 যা ব্যবহারকারীদের নির্দিষ্ট করতে দেয় যা
মডিউল বিল্ড অন্তর্ভুক্ত করা হয়.
এর একটি উপসেট সক্রিয় করার সময় ns-3 মডিউল, অগ্রাধিকার নিয়ম নিম্নরূপ:
1. --enable-modules কনফিগার স্ট্রিং যেকোনো .ns3rc ফাইলকে ওভাররাইড করে
2. উপরের স্তরে .ns3rc ফাইল ns-3 ডিরেক্টরি পরবর্তী পরামর্শ করা হয়, যদি উপস্থিত থাকে
3. সিস্টেম অনুসন্ধান করে ~/.ns3rc যদি উপরের দুটি অনির্দিষ্ট হয়
যদি উপরের কোনটিই মডিউলগুলিকে সীমাবদ্ধ না করে, তবে সমস্ত মডিউল যেগুলি waf ইচ্ছা সম্পর্কে জানে৷
নির্মাণ করা
.ns3rc ফাইলের রক্ষণাবেক্ষণ করা সংস্করণ ns-3 সোর্স কোড রিপোজিটরি থাকে
দ্য ব্যবহার ডিরেক্টরি এর কারণ হল যদি এটি শীর্ষ-স্তরের ডিরেক্টরিতে থাকত
সংগ্রহস্থল, এটি সক্ষম করে এমন রক্ষণাবেক্ষণকারীদের কাছ থেকে দুর্ঘটনাজনিত চেকইন প্রবণ হবে
মডিউল তারা ব্যবহার করতে চান. তাই, ব্যবহারকারীদের ম্যানুয়ালি থেকে .ns3rc কপি করতে হবে
ব্যবহার ডিরেক্টরি তাদের পছন্দের জায়গায় (শীর্ষ স্তরের ডিরেক্টরি বা তাদের হোম ডিরেক্টরি) থেকে
স্থায়ী মডুলার বিল্ড কনফিগারেশন সক্ষম করুন।
ধরে নিচ্ছি আপনি শীর্ষ পর্যায়ে আছেন ns-3 ডিরেক্টরি, আপনি .ns3rc এর একটি অনুলিপি পেতে পারেন
ফাইল যা আছে ব্যবহার নিম্নরূপ ডিরেক্টরি:
$ cp utils/.ns3rc।
.ns3rc ফাইলটি এখন আপনার শীর্ষ স্তরে থাকা উচিত ns-3 ডিরেক্টরি, এবং এতে রয়েছে
নিম্নলিখিত:
#! /usr/bin/env পাইথন
# মডিউলগুলির একটি তালিকা যা ns-3 চালানো হলে সক্রিয় করা হবে।
# তালিকাভুক্ত মডিউলগুলির উপর নির্ভর করে এমন মডিউলগুলিও সক্রিয় করা হবে৷
#
# 'all_modules' নির্বাচন করে সমস্ত মডিউল সক্রিয় করা যেতে পারে।
modules_enabled = ['all_modules']
# আপনি যদি উদাহরণগুলি চালানোর জন্য চান তবে এটিকে সত্য হিসাবে সেট করুন।
example_enabled = মিথ্যা
# আপনি যদি পরীক্ষা চালাতে চান তবে এটিকে সত্য হিসাবে সেট করুন।
tests_enabled = মিথ্যা
শুধুমাত্র মূল মডিউল সক্ষম করতে .ns3rc ফাইল পরিবর্তন করতে আপনার প্রিয় সম্পাদক ব্যবহার করুন
এই মত উদাহরণ এবং পরীক্ষা:
#! /usr/bin/env পাইথন
# মডিউলগুলির একটি তালিকা যা ns-3 চালানো হলে সক্রিয় করা হবে।
# তালিকাভুক্ত মডিউলগুলির উপর নির্ভর করে এমন মডিউলগুলিও সক্রিয় করা হবে৷
#
# 'all_modules' নির্বাচন করে সমস্ত মডিউল সক্রিয় করা যেতে পারে।
modules_enabled = ['কোর']
# আপনি যদি উদাহরণগুলি চালানোর জন্য চান তবে এটিকে সত্য হিসাবে সেট করুন।
example_enabled = সত্য
# আপনি যদি পরীক্ষা চালাতে চান তবে এটিকে সত্য হিসাবে সেট করুন।
tests_enabled = সত্য
আপনি যদি এই কমান্ডগুলি চেষ্টা করেন তবে শুধুমাত্র মূল মডিউলটি এখন সক্ষম হবে:
$ ./waf পরিষ্কার
$ ./waf কনফিগার করুন
$ ./waf বিল্ড
$ cd বিল্ড/ডিবাগ/
s ls
এবং নিম্নলিখিত লাইব্রেরি উপস্থিত থাকা উচিত:
bindings libns3-core.so ns3 স্ক্র্যাচ ইউটিলস
উদাহরণ libns3-core-test.so নমুনা src
মনে রাখবেন ./waff পরিষ্কার ধাপটি এখানে করা হয়েছে শুধুমাত্র মডিউল লাইব্রেরিগুলিকে আরও স্পষ্ট করার জন্য
তৈরী করা হয়েছে. আপনি করতে হবে না ./waff পরিষ্কার মডিউলগুলির উপসেটগুলি সক্ষম করার জন্য।
test.py চালানোর ফলে শুধুমাত্র সেই পরীক্ষাগুলি চালানো হবে যা মডিউল কোরের উপর নির্ভর করে:
24টি পরীক্ষায় 24টি পাস হয়েছে (24টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
"কোর" মডিউলের পরিবর্তে "নেটওয়ার্ক" মডিউলের জন্য উপরের ধাপগুলি পুনরাবৃত্তি করুন এবং
নিম্নলিখিত তৈরি করা হবে, যেহেতু নেটওয়ার্ক মূলের উপর নির্ভর করে:
বাইন্ডিং libns3-core.so libns3-network.so ns3 স্ক্র্যাচ ইউটিলস
উদাহরণ libns3-core-test.so libns3-network-test.so নমুনা src
test.py চালানোর ফলে সেই পরীক্ষাগুলি হবে যেগুলি শুধুমাত্র মূল এবং নেটওয়ার্ক মডিউলের উপর নির্ভর করে৷
চালানো হবে:
31টি পরীক্ষায় 31টি পাস হয়েছে (31টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
সক্রিয়/অক্ষম করা হচ্ছে ns-3 টেস্ট এবং উদাহরণ
সার্জারির ns-3 ডিস্ট্রিবিউশনে অনেক উদাহরণ এবং পরীক্ষা রয়েছে যা যাচাই করতে ব্যবহৃত হয় ns-3
পদ্ধতি. ব্যবহারকারীরা, যাইহোক, সর্বদা এই উদাহরণগুলি এবং পরীক্ষাগুলি তাদের জন্য চালিত করতে চান না
এর ইনস্টলেশন ns-3.
এই অধ্যায় কিভাবে নির্মাণ করতে হবে আলোচনা ns-3 এর উদাহরণ এবং পরীক্ষা সহ বা ছাড়া।
কিভাবে থেকে চালু অচল উদাহরণ এবং পরীক্ষা in ns-3
উদাহরণ এবং পরীক্ষাগুলি সক্ষম/অক্ষম করার 3টি উপায় রয়েছে৷ ns-3:
1. build.py ব্যবহার করে যখন ns-3 প্রথমবার নির্মিত হয়
2. ওয়াফ একবার ব্যবহার করা ns-3 নির্মিত হয়েছে
3. ব্যবহার করে ns-3 কনফিগারেশন ফাইল একবার ns-3 নির্মিত হয়েছে
চালু অচল উদাহরণ এবং পরীক্ষা ব্যবহার build.py
আপনি যখন উদাহরণ এবং পরীক্ষা সক্ষম/অক্ষম করতে build.py ব্যবহার করতে পারেন ns-3 প্রথম জন্য নির্মিত হয়
সময়।
ডিফল্টরূপে, উদাহরণ এবং পরীক্ষা অন্তর্নির্মিত হয় না ns-3.
ns-3-allinone ডিরেক্টরি থেকে, আপনি তৈরি করতে পারেন ns-3 কোনো উদাহরণ বা পরীক্ষা ছাড়াই
করেছে:
$ ./build.py
শীর্ষ স্তরে test.py চলছে ns-3 ডিরেক্টরি এখন কোন উদাহরণ বা পরীক্ষা হতে হবে না
সঞ্চালন করুন:
0টি পরীক্ষায় 0টি পাস হয়েছে (0টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
আপনি যদি নির্মাণ করতে চান ns-3 উদাহরণ এবং পরীক্ষা সহ, তারপর থেকে নিম্নলিখিতগুলি করুন
ns-3-অ্যালিনোন ডিরেক্টরি:
$ ./build.py --enable-examples --enable-tests
শীর্ষ স্তরে test.py চলছে ns-3 ডিরেক্টরিটি সমস্ত উদাহরণ এবং পরীক্ষার কারণ হবে
চালানো হবে:
170টি পরীক্ষায় 170টি পাস হয়েছে (170টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
চালু অচল উদাহরণ এবং পরীক্ষা ব্যবহার ওয়াফ
আপনি একবার উদাহরণ এবং পরীক্ষা সক্ষম/অক্ষম করতে waf ব্যবহার করতে পারেন ns-3 নির্মিত হয়েছে.
ডিফল্টরূপে, উদাহরণ এবং পরীক্ষা অন্তর্নির্মিত হয় না ns-3.
উপরের স্তর থেকে ns-3 ডিরেক্টরি, আপনি তৈরি করতে পারেন ns-3 কোনো উদাহরণ বা পরীক্ষা ছাড়াই
করেছে:
$ ./waf কনফিগার করুন
$ ./waf বিল্ড
test.py এখন চালানোর ফলে কোনো উদাহরণ বা পরীক্ষা চালানো হবে না:
0টি পরীক্ষায় 0টি পাস হয়েছে (0টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
আপনি যদি নির্মাণ করতে চান ns-3 উদাহরণ এবং পরীক্ষা সহ, তারপর উপরে থেকে নিম্নলিখিত করুন
স্তর ns-3 ডিরেক্টরি:
$ ./waf কনফিগার --enable-examples --enable-tests
$ ./waf বিল্ড
test.py চালানোর ফলে সমস্ত উদাহরণ এবং পরীক্ষা চালানো হবে:
170টি পরীক্ষায় 170টি পাস হয়েছে (170টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
চালু অচল উদাহরণ এবং পরীক্ষা ব্যবহার দ্য ns-3 কনফিগারেশন ফাইল
একটি কনফিগারেশন ফাইল, .ns3rc, যোগ করা হয়েছে ns-3 যা ব্যবহারকারীদের নির্দিষ্ট করতে দেয় কিনা
উদাহরণ এবং পরীক্ষা নির্মিত বা না করা উচিত. আপনি সক্রিয়/অক্ষম করতে এই ফাইলটি ব্যবহার করতে পারেন
উদাহরণ এবং পরীক্ষা একবার ns-3 নির্মিত হয়েছে.
উদাহরণ এবং পরীক্ষা নিষ্ক্রিয় করার সময়, অগ্রাধিকারের নিয়মগুলি নিম্নরূপ:
1. --enable-examples/--disable-examples কনফিগার স্ট্রিং যেকোনো .ns3rc ফাইলকে ওভাররাইড করে
2. --enable-tests/--disable-tests কনফিগার স্ট্রিং যেকোন .ns3rc ফাইলকে ওভাররাইড করে
3. উপরের স্তরে .ns3rc ফাইল ns-3 ডিরেক্টরি পরবর্তী পরামর্শ করা হয়, যদি উপস্থিত থাকে
4. সিস্টেম অনুসন্ধান করে ~/.ns3rc যদি .ns3rc ফাইলটি আগের ধাপে পাওয়া না যায়
যদি উপরের কোনটিই বিদ্যমান না থাকে, তাহলে উদাহরণ এবং পরীক্ষা তৈরি করা হবে না।
.ns3rc ফাইলের রক্ষণাবেক্ষণ করা সংস্করণ ns-3 সোর্স কোড রিপোজিটরি থাকে
দ্য ব্যবহার ডিরেক্টরি এর কারণ হল যদি এটি শীর্ষ-স্তরের ডিরেক্টরিতে থাকত
সংগ্রহস্থল, এটি সক্ষম করে এমন রক্ষণাবেক্ষণকারীদের কাছ থেকে দুর্ঘটনাজনিত চেকইন প্রবণ হবে
মডিউল তারা ব্যবহার করতে চান. তাই, ব্যবহারকারীদের ম্যানুয়ালি থেকে .ns3rc কপি করতে হবে
ব্যবহার ডিরেক্টরি তাদের পছন্দের জায়গায় (শীর্ষ স্তরের ডিরেক্টরি বা তাদের হোম ডিরেক্টরি) থেকে
উদাহরণ এবং পরীক্ষার ক্রমাগত সক্ষম সক্ষম করুন.
ধরে নিচ্ছি আপনি শীর্ষ পর্যায়ে আছেন ns-3 ডিরেক্টরি, আপনি .ns3rc এর একটি অনুলিপি পেতে পারেন
ফাইল যা আছে ব্যবহার নিম্নরূপ ডিরেক্টরি:
$ cp utils/.ns3rc।
.ns3rc ফাইলটি এখন আপনার শীর্ষ স্তরে থাকা উচিত ns-3 ডিরেক্টরি, এবং এতে রয়েছে
নিম্নলিখিত:
#! /usr/bin/env পাইথন
# মডিউলগুলির একটি তালিকা যা ns-3 চালানো হলে সক্রিয় করা হবে।
# তালিকাভুক্ত মডিউলগুলির উপর নির্ভর করে এমন মডিউলগুলিও সক্রিয় করা হবে৷
#
# 'all_modules' নির্বাচন করে সমস্ত মডিউল সক্রিয় করা যেতে পারে।
modules_enabled = ['all_modules']
# আপনি যদি উদাহরণগুলি চালানোর জন্য চান তবে এটিকে সত্য হিসাবে সেট করুন।
example_enabled = মিথ্যা
# আপনি যদি পরীক্ষা চালাতে চান তবে এটিকে সত্য হিসাবে সেট করুন।
tests_enabled = মিথ্যা
উপরের স্তর থেকে ns-3 ডিরেক্টরি, আপনি তৈরি করতে পারেন ns-3 কোনো উদাহরণ বা পরীক্ষা ছাড়াই
করেছে:
$ ./waf কনফিগার করুন
$ ./waf বিল্ড
test.py এখন চালানোর ফলে কোনো উদাহরণ বা পরীক্ষা চালানো হবে না:
0টি পরীক্ষায় 0টি পাস হয়েছে (0টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
আপনি যদি নির্মাণ করতে চান ns-3 উদাহরণ এবং পরীক্ষা সহ, পরিবর্তন করতে আপনার প্রিয় সম্পাদক ব্যবহার করুন
example_enabled এবং tests_enabled ফাইলের জন্য .ns3rc ফাইলের মান সত্য হতে হবে:
#! /usr/bin/env পাইথন
# মডিউলগুলির একটি তালিকা যা ns-3 চালানো হলে সক্রিয় করা হবে।
# তালিকাভুক্ত মডিউলগুলির উপর নির্ভর করে এমন মডিউলগুলিও সক্রিয় করা হবে৷
#
# 'all_modules' নির্বাচন করে সমস্ত মডিউল সক্রিয় করা যেতে পারে।
modules_enabled = ['all_modules']
# আপনি যদি উদাহরণগুলি চালানোর জন্য চান তবে এটিকে সত্য হিসাবে সেট করুন।
example_enabled = সত্য
# আপনি যদি পরীক্ষা চালাতে চান তবে এটিকে সত্য হিসাবে সেট করুন।
tests_enabled = সত্য
উপরের স্তর থেকে ns-3 ডিরেক্টরি, আপনি তৈরি করতে পারেন ns-3 সহজভাবে উদাহরণ এবং পরীক্ষা সহ
করছেন:
$ ./waf কনফিগার করুন
$ ./waf বিল্ড
test.py চালানোর ফলে সমস্ত উদাহরণ এবং পরীক্ষা চালানো হবে:
170টি পরীক্ষায় 170টি পাস হয়েছে (170টি পাস করেছে, 0টি এড়িয়ে গেছে, 0টি ব্যর্থ হয়েছে, 0টি ক্র্যাশ হয়েছে, 0টি ভালগ্রিন্ড ত্রুটি)
সমস্যা সমাধান
এই অধ্যায়টি নির্মাণ বা চলমান সম্ভাব্য সাধারণ ত্রুটি সম্পর্কে কিছু তথ্য পোস্ট করে
ns-3 প্রোগ্রাম।
দয়া করে মনে রাখবেন যে উইকি (http://www.nsnam.org/wiki/Troubleshooting) অবদান থাকতে পারে
আইটেম।
নির্মাণ করা ত্রুটি
রান-টাইম ত্রুটি
কখনও কখনও, একটি সফল বিল্ড করার পরে একটি প্রোগ্রামের সাথে ত্রুটি ঘটতে পারে। এগুলো রান-টাইম
ত্রুটি, এবং সাধারণত ঘটতে পারে যখন মেমরি দূষিত হয় বা পয়েন্টার মান অপ্রত্যাশিতভাবে হয়
খালি.
এখানে কি ঘটতে পারে তার একটি উদাহরণ:
$./waf --run tcp-point-to-point
'/home/tomh/ns-3-nsc/build' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
সংকলন সফলভাবে সমাপ্ত
কমান্ড ['/home/tomh/ns-3-nsc/build/debug/examples/tcp-point-to-point'] কোড -11 সহ প্রস্থান করা হয়েছে
ত্রুটি বার্তাটি বলে যে প্রোগ্রামটি অসফলভাবে সমাপ্ত হয়েছে, তবে এটি পরিষ্কার নয়
এই তথ্য থেকে কি ভুল হতে পারে। আরো ঘনিষ্ঠভাবে পরীক্ষা করতে, এটি অধীনে চালানোর চেষ্টা করুন
দ্য জিডিবি ডিবাগার:
$ ./waf --run tcp-point-to-point --command-template="gdb %s"
'/home/tomh/ns-3-nsc/build' ডিরেক্টরিতে প্রবেশ করা হচ্ছে
সংকলন সফলভাবে সমাপ্ত
GNU gdb Red Hat Linux (6.3.0.0-1.134.fc5rh)
কপিরাইট 2004 ফ্রি সফটওয়্যার ফাউন্ডেশন, ইনক.
GDB হল বিনামূল্যের সফ্টওয়্যার, GNU জেনারেল পাবলিক লাইসেন্স দ্বারা আচ্ছাদিত, এবং আপনি আছেন
এটি পরিবর্তন করতে এবং/অথবা নির্দিষ্ট শর্তে এর অনুলিপি বিতরণ করতে স্বাগত জানাই।
শর্ত দেখতে "শো কপি করা" টাইপ করুন।
GDB এর জন্য একেবারে কোন ওয়ারেন্টি নেই। বিস্তারিত জানার জন্য "শো ওয়ারেন্টি" টাইপ করুন।
এই GDB কে "i386-redhat-linux-gnu" হিসাবে কনফিগার করা হয়েছে...হোস্ট libthread_db ব্যবহার করে
লাইব্রেরি "/lib/libthread_db.so.1"।
(gdb) চালান
প্রোগ্রাম শুরু হচ্ছে: /home/tomh/ns-3-nsc/build/debug/examples/tcp-point-to-point
টার্গেট মেমরি থেকে পঠিত শেয়ার্ড অবজেক্ট থেকে চিহ্ন পড়া... সম্পন্ন।
লোড করা সিস্টেম 0xf5c000 এ DSO সরবরাহ করেছে
প্রোগ্রাম সিগন্যাল SIGSEGV, সেগমেন্টেশন ফল্ট পেয়েছে।
0x0804aa12 প্রধান (argc=1, argv=0xbfdfefa4)
../examples/tcp-point-to-point.cc:136-এ
136 Ptr localSocket = socketFactory->CreateSocket ();
(gdb) p localSocket
$1 = {m_ptr = 0x3c5d65}
(জিডিবি) পি সকেট ফ্যাক্টরি
$2 = {m_ptr = 0x0}
(gdb) প্রস্থান করুন
প্রোগ্রাম চলছে। যাইহোক প্রস্থান করবেন? (y বা n) y
প্রথমে নোট করুন যেভাবে প্রোগ্রামটি আহ্বান করা হয়েছিল-- একটি আর্গুমেন্ট হিসাবে চালানোর কমান্ডটি পাস করুন
কমান্ড টেমপ্লেট "gdb %s"।
এটি আমাদের বলে যে একটি নাল পয়েন্টার সকেট ফ্যাক্টরিকে ডিরেফার করার চেষ্টা করা হয়েছিল।
আসুন টিসিপি-পয়েন্ট-টু-পয়েন্টের 136 লাইনের চারপাশে দেখি, যেমন জিডিবি পরামর্শ দেয়:
Ptr সকেট ফ্যাক্টরি = n2->গেটঅবজেক্ট (Tcp::iid);
Ptr localSocket = socketFactory->CreateSocket ();
localSocket->Bind ();
এখানে অপরাধী হল GetObject এর রিটার্ন মান চেক করা হচ্ছে না এবং হতে পারে
খালি.
কখনও কখনও আপনি ব্যবহার করতে হতে পারে ভালগ্রিন্ড স্মৃতি পরীক্ষক আরও সূক্ষ্ম ত্রুটির জন্য। আবার,
আপনি একইভাবে ভ্যালগ্রিন্ড ব্যবহারের আহ্বান জানান:
$ ./waf --run tcp-point-to-point --command-template="valgrind %s"
উৎস
এই নথিতে লেখা আছে reStructuredText উন্নত স্পিংক্স এবং রক্ষণাবেক্ষণ করা হয়
ডক/ম্যানুয়াল ns-3 এর সোর্স কোডের ডিরেক্টরি।
onworks.net পরিষেবা ব্যবহার করে অনলাইনে ns-3-ম্যানুয়াল ব্যবহার করুন