';function Lazy(){if(LazyAdsense){LazyAdsense = false;var Adsensecode = document.createElement('script');Adsensecode.src = AdsenseUrl;Adsensecode.async = true;Adsensecode.crossOrigin = 'anonymous';document.head.appendChild(Adsensecode)}}
أخر الاخبار

الموضوع الثاني :TCP / UDP Connection Establishment : 1.2

TCP / UDP Connection Establishment : 1.2
تمر عملية إنشاء الاتصال بمجموعة من المراحل، وفي العادة يقوم الطرف المرسل بإرسال
طلب إنشاء الاتصال إلى الطرف الأخر وعند الموافقة على إجراء الاتصال يتم البدء بإرسال
مجموعة من المعلومات إلى الطرف المستقبل، في بروتوآول الـ  TCPتتم هذه العملية بثلاثة
مراحل تسمى  Three-way hand-shakeو آما هو واضح في الشكل التالي:


حيث يقوم الطرف المرسل بتوليد رقم تسلسلي  Sequence Numberويرسله إلى
الـ Serverويكون هذا الرقم المولد نقطة البدء لعملية الإرسال بحيث يتم زيادته بمقدار  1عند
آل عملية إرسال.
 -2يستلم الطرف المقابل الـ Sequence Numberويقوم بإرسال  Acknowledgmentإلى
المرسل مضاف إليه الرقم التسلسلي الذي تم إرساله
 -3عند هذه المرحلة يكون قد تم الموافقة على بدأ الجلسة وعندها يقوم بإرسال طلبه
مرفق معه الـ  Acknowledgmentالذي أرسل من قبل المستقبل.
أما في بروتوآول الـ  UDPفتتم بدون إرسال  Acknowledgmentsولا يتحقق الـ UDPمن
عمليات الوصول آما هو الحال في الـ TCPوهو ما سيتم توضيحه في الجزء التالي من هذا
الفصل.
TCP & UDP Header Encapsulation : 1.3
في طبقة الـ Transport Layerيتم التعامل مع إحدى البروتوآولين  TCPأو الـ UDPحيث
سيحدد فيها طبيعة الإرسال فإذا آان المطلوب هو الإرسال آـ Streamونوع الإرسال هو
 Unicastفيتم اختيار الـ TCPأما في حالة آان المطلوب هو الإرسال آـ Broadcastأو
 Multicastفيتم اختيار الـ UDPلعملية الإرسال ، وسوف نبين في الجزء التالي من هذا الفصل
مبدأ عملية الإرسال باستخدام بروتوآول الـ TCPوبروتوآول الـ... UDp


TCP Encapsulation : 1.3.1
سوف نبين في هذا الجزء طبيعة الاتصال باستخدام الـ TCPحيث يتميز هذا البروتوآول بكل
عمليات التحكم سواء على مستوى  Data Flowأو حجم الـ Bufferآما يدعم عمليات التحقق
من الوصول وفق الترتيب السليم  Delivered on Sequenceوهذا واضح من ترآيب Header
الخاصة به أنظر إلى الشكل التالي:



: Source & Destination Port 1.3.1.1
حيث يتم تحديد الـ Source Portوالـ Destination Portالخاصة بالبرنامج الذي يجري عملية
الاتصال ومن المعروف أنه لا يمكن لأآثر من برنامج استخدام نفس رقم الـ Portلاآن يمكن
للبرنامج الواحد استخدام أآثر من  ، Port Addressوبتأآيد فإن عملية اختيار الـ Portلليست
عشوائية حيث انه يجب الابتعاد عن الأرقام التي تبدأ بـ  0وتنتهي  1023إذ أنها أرقام
لبروتوآولات معروفة ويتم استخدامها في نظام التشغيل ومن الأمثلة عليها بروتوآول الـHTTP
والذي يستخدم الـ 80 Portوبروتوآول الـ  FTPوالذي يستخدم الـ 21 Portوغيره، ويفضل عند
اختيار الـ Portأن لا يبدأ برقم يقل عن  49.151انظر إلى الشكل التالي:



: Sequence & Acknowledgment Number 1.3.1.2
ويحتوي آل منهما على  32 Bitsويدل هذا الرقم على رقم التسلسل للـ Packetعند إرساله
أو استقباله ويتم توليده عشوائيا عند بداية الاتصال أما رقم الـ  Acknowledgmentفيحتوي
على الرقم التسلسلي للـ  Packetالذي تم التأآد من وصوله وتتم هذه العملية آما في
الشكل التالي:



: Header Length & Validation Controls 1.3.1.3
ويحتوي الجزء الثاني من الـ Headerالخاص بالـ TCPعلى 32 Bitsمقسمة على الـ Windows
16Bits Header Length + Validation Controls والـSize 16 Bits
وآما هو في الشكل التالي: 


ويحتوي الـ Header Lengthعلى حجم الـ Headerالخاص بالـ TCPمقسوم على  4أي لمعرفة
 تأخذ آل6 Controls  فهيValidation Controls ، أما الـ4 بـHLEN نضرب الـHeaderحجم الـ
منها  1 Bitفإذا آانت قيمته  0فهذا يعني أن هذه الأداة غير مستخدمة وإذا آانت  1فهذا
يعني أن هذه الأداة مستخدمة وآما في الشكل التالي:



: Window Size 1.3.1.4
ويعرف فيه حجم الـ Packetالذي يمكن إرساله من خلال الشبكة بناء على سرعة الوصول
بين آل  SYN Packetو  ، ACK Packetأي الوقت المستغرق لعملية التوصيل لكل Packet
وقد تزيد أو تنقص بناءا على أدائية الشبكة.
: Check Sum 1.3.1.5
وهي  16 Bitsوتستخدم لعملية التحقق من وصول الـ TCP Headerبشكل السليم حيث يتم
جمع آافة قيم الـ) TCP Headerآل  16 Bitsلوحدها( ثم قلبها ووضع الناتج في الـ Check
 Sumوفي الطرف المستقبل يقوم بتأآد من الـ Checksumبضرب قيمة الـ HLENبـ 4ثم مقارنة
الناتج مع مقلوب الـ Checksumوآما هو واضح في الشكل التالي:



: Urgent Pointer 1.3.1.6
من المعروف أن الـ Dataالمرسلة عبر الـ TCPيتم تجميعها في الـ Bufferقبل أن يتم عرضها
حيث يتم تحديد موقع الـ Dataالقادمة الجديدة في الـ Bufferومن هنا نحن بحاجة إلى وجود
 Pointerيؤشر على موقع الـ Dataفي الـ Bufferوهو هنا الـ Urgent Pointerلاحظ الشكل
التالي والذي يوضح وضع  Dataقادمة جديدة إلى الـ Bufferالخاص بالجهاز المستقبل :


Dot Net Streaming & Threading Overview: 1.3.2
تعرفنا سابقا على أجزاء  OSIو  TCP/IPوبينا آيفية التعامل مع هذه الطبقات في برمجيات
الشبكات ، وفي هذا الجزء سوف نبين آيفية التعامل مع الـ  Stream Libraryلإرسال Binary
 Dataبالإضافة إلى استخدام الـ  Threadفي برمجيات الشبكة...
أولا : الـ  Socketعرفنا ال Socketسابقا على أنها الأداة التي يتم نقل البيانات من خلالها ،
ولاستخدامها يلزم في البداية تعريف  System.Net.Socketsحيث يحتوي هذا ال
 Namespacesعلى عدد آبير من ال  Classesوالتي يتم استخدامها في برمجيات الشبكة.
يمكن الـ Stream Classesمن نقل  Textأو ، Binary Dataحيث بينا سابقا آيفية التعامل من
الـ Socketلنقل  Textباستخدام  Stream Readerوال  Stream Writerوفي هذا الجزء سنبين
آيفية التعامل معه لنقل ) Objectأي نوع أخر من البيانات ويمكن أن يكون صورة  Imageأو
صوت  Voiceأو أي شيء آخر يمكن أن يحول إلى  ،(.. Binary Dataوآما هو الحال في نقل
ال  Textآنا نحول  Textإلى  ASCII Codeثم إلى  Binaryأما في  Objectفيتم التعامل معه
باستخدام الـ Binary Readerو ال  Binary Writerوالتي تمكنك من التعامل مع أي ، Object
File Stream  والـText  لتعامل مع الـStream Writer  والـStream Reader آما وتستخدم الـ
لتسهيل التعامل مع الملفات بالإضافة إلى الـ  Memory Streamوالتي تستخدم آـ Buffer
لحفظ البيانات قبل إرسالها أو بعد استقبالها ، وتقوم أيضا بتحويل الـ Streamإلى مجموعة
من الـ Bitsوالـ Bitsإلى  Streamمرة أخرى لاحظ الشكل التالي والذي يوضح مكتبات
الـ Streamفي الدوت نيت:




وآمثال تطبيقي على هذا سوف نقوم ببناء برنامج يقوم بعملية نقل  Imageمن جهاز إلى
أخر  Client/Serverوللبدء قم بإنشاء مشروع جديد آما في الشكل التالي






في البداية قم بإضافة ال  Namespacesالتالية:
C#:
using System.Net.Sockets;
using System.IO;
للإجراء عملية الإرسال لا بد أولا من اشتقاق  Instanceمن الكلاس  MemoryStreamوالتي
سوف نستخدمها لتخزين الصورة داخل الذاآرة بشكل مؤقت لكي نحولها لاحقا إلى مصفوفة
:Server إلى الـSocket  عبر الNetworkStream  ثم إرسالها باستخدامBinary
C#:
try
{
openFileDialog1.ShowDialog ();
string mypic_path =openFileDialog1.FileName ;
pictureBox1.Image = Image.FromFile(mypic_path);
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms,pictureBox1.Image.RawFormat);
byte[] arrImage = ms.GetBuffer();
ms.Close();
TcpClient myclient = new TcpClient (txt_host.Text,5020);//Connecting with server

C#:
NetworkStream myns = myclient.GetStream ();
BinaryWriter mysw = new BinaryWriter (myns);
mysw.Write(arrImage);//send the stream to above address
mysw.Close ();
myns.Close ();
myclient.Close ();
}
catch (Exception ex){MessageBox.Show(ex.Message );}
في الجزء الخاص بالـ Serverوالذي يقوم بعملية التصنت على الـ  Portواستقبال الـ Stream
عبر الـ  Socketو قراءتها باستخدام الـ  Binary Readerوتحويله إلى ) Objectصيغته التي
آان عليها قبل الإرسال( مرة أخرى ، في هذا المثال نريد استقبال صورة وفي هذه الحالة
وفرت لدينا الدوت نيت خصائص جديدة في ال  Controlsالموجودة فيها ومن ضمنها Method
 Image.FromStreamالخاصة ب الـ  Picture Boxوالتي تسهل علينا إمكانية عرض الصورة
المرسلة من خلال  Streamلكي يتم تحويلها من  Streamإلى صورة تعرض على الـ Picture
 boxوآما في المثال التالي:

C#:
using System.Net.Sockets ;
using System.IO;
// Objects Declaration
TcpListener mytcpl; // Declare TCP Listener
Socket mysocket; // Declare an object from Socket Class
NetworkStream myns; //
StreamReader mysr;
void Image_Receiver()
{
mytcpl = new TcpListener (5000);// Open The Port
mytcpl.Start ();// Start Listening on That Port
mysocket = mytcpl.AcceptSocket ();
myns = new NetworkStream (mysocket);
pictureBox1.Image = Image.FromStream(myns); // Show The Image that Resaved
as Binary Stream
mytcpl.Stop();// Close TCP Session
if (mysocket.Connected ==true)//if Connected Start Again
{
while (true)
{
Image_Receiver();// Back to First Method
}
}
}
ولتطبيق سنقوم بإنشاء مشروع جديد آما في الشكل التالي :
:



سنقوم بوضع الـ Image_Receiver() Methodإما في الـ  Constructerالخاص بالبرنامج أو
بحدث بدأ التشغيل الخاص بالـ  ، Formو الميثود التالية في حدث الـ  Closingالخاص بالـ
 Formوذلك لتأآد من إغلاق الـ Socketعند إنهاء البرنامج:


C#:
private void Form1_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
try
{
mytcpl.Stop ();
Application.Exit();
}
catch (Exception ex) {MessageBox .Show (ex.Message );}
}
سنقوم بإضافة الكود التالي إلى ال  Save Buttonلكي تتمكن من تخزين الصورة المستقبلة:


C#:
try
{
saveFileDialog1.Filter = "JPEG Image (*.jpg)|*.jpg" ;
if(saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string mypic_path = saveFileDialog1.FileName;
pictureBox1.Image.Save(mypic_path);
}
}
catch (Exception)
{
}


: Threading Overview1.3.3
سوف يؤدي ال  Infinity Loopوالذي وضعناه إلى تعليق البرنامج والسبب أن الـ  Loopيعمل
على منطقة ال  Global Areaوالمخصصة للـ  Formإذ لن ينفذ إي شيء إلا بعد انتهاء ال
 Loopوهو ما لن يحدث أبدا إذ انه  ، Infinity Loopقدمت لنا الدوت نيت الحل لهذه
المشكلة وهي باستخدام تكنولوجيا ال  Threadingوالتي تسمح بالمعالجة المتوازية على
نفس المعالج وذلك من خلال تقسيم المهام على المعالج وعمل  Sessionمنفصلة لكل
برنامج وهو ما يسمى بالـ  ..Multitaskingوهنا لا يؤثر البرنامج على موارد النظام بشكل
آبير آما أن الـ  Loopستعمل في  Threadمنفصل عن الـ  Threadالخاص بال  Formانظر
الشكل التالي :



لاحظ انه قبل إضافة الـ  Threadآان الـ  Loopيعمل على منطقة الـ  Global Areaوهذا هو
سبب البطء الشديد وبعد استخدام الـ  Threadتم عمل  Sessionخاص للـ  Loopبحيث يعمل
بشكل متوازي مع البرنامج ..
: System.Threading Namespace  يلزم أولا تعريف الـThread ولاستخدام الـ


C#:
using System.Threading;

ثم اشتقاق  Instanceمنه وإدراج اسم الميثود التي تريد عمل  Threadلها في ال Delegate
الخاص بها آما يلي :


C#:
Thread myth;
myth= new Thread (new System.Threading .ThreadStart(Image_Receiver));
myth.Start ();
الآن قم بإضافة () myth.Aportفي حدث ال  Closing Formآما يلي
C#:
private void Form1_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
try
{
mytcpl.Stop ();
myth.Aport();
}
catch (Exception ex) {MessageBox .Show (ex.Message );}
}

ميزة ال  Threadرائعة جدا إذ تمكنك من تشغيل أآثر من  Threadوفي نفس الوقت وفي
نفس البرنامج وهو ما يسمى بالـ  ، Multithreadingسنبين في الجزء التالي من هذا
الفصل طبيعة الاتصال باستخدام الـ. Udp



تعليقات

اعلان 5بانر

اعلان 3

اعلان1

اعلان




حجم الخط
+
16
-
تباعد السطور
+
2
-