الدرس الأول : مقدمة في برمجة الشبكات و بروتوكول TCP/IP

عام 0 geek4arab
Spread the love

بسم الله الرحمن الرحيم

الدرس الأول : مقدمة في برمجة الشبكات و بروتوكول TCP/IP

من المعروف ان الشبكة هي مجموعة من الأجهزة متصلة مع بعضها عبر وسيلة اتصال معينة ومن هنا سيندرج لدينا التقسيم المعروف لمنظمة OSIلعملية الإتصال والتي تتكون من سبعة طبقات كل طبقة منها تشكل وظيفة بعينها وتم اختصارها الى اربعة طبقات في برتوكول TCP/IP وتبين الصورة المرفقة هذه الطبقات ,

لإجراء عملية الاتصال بين Client و Server يلزم ما يلي :

في الجهاز المرسل Client :

1- تبدا عملية توليف الرسالة المرسلة في ال Application Layer ووظيفتها هنا التعامل مع الرسالة نفسها وتحويلها من صيغة نصية الى Data يمكن ارسالها عبر الشبكة , ففي برمجيات الدردشة Chat يتم تحويل النص المكتوب الى ASCII Code ثم يتم تحويل هذا الأسكي الى مجموعة من Binary Code توضع في مصفوفة لتجهيزها وارسالها عبر Socket (بقية الطبقات) وهنا توضيح هذه الخطوة في الكود

String str=Console.ReadLine(); // كتابة الرسالة هنا ووضعها في متغير من نوع ستريغ
ASCIIEncoding asen= new ASCIIEncoding(); // تحويل النص المكتوب الى الأسكي
byte[] ba=asen.GetBytes(str); //تحويل الأسكي الى باينري كود وتخزينها في مصفوفة من النوع بايت

في نموذج osi يتم تقسيم ال upper Layers الى ثلاثة طبقات

Application لتعامل مع البرنامج نفسة او ما يسمى user interface

Presentation تمثيل البيانات المرسلة وهي كما ظهرت سابقا بتحويل البيانات الى الASCII

Session وفيها البدأ بعملية التخاطب بين الجهازين و التعريف ببعضهم البعض( فتح الجلسة) والتي سأتي على شرحها بعد قليل

اما في بروتوكول ال TCP/IP فكتفى بوجود طبقة Application والتي تقوم بعمل الطبقات الثلاث الأولى في OSI

في session Layer يتم التعرف وفتح الجلسة بعدة خطوات وهي كما يلي :

1- اجراء الإتصال المبدئي بجهاز server عبر ال IP و البورت المحدد وذلك بعد تحديد عملية الإتصال سواء عبر UDP او عبر TCP

2- التعريف بنفسه وعمل ال Authentication اذا تطلب جهاز السيرفر ذلك

3- قبول او رفض الجلسة ويتم ذلك بإرسال الموافقة على فتح الجلسة او رفضها

4- بدأ الجلسة وقيام السيرفر بعمل Listening على البورت الخاص بالبرنامج

عندما يتم الموافقة على فتح الجلسة والبدأ بعملية التخاطب يقوم جهاز المرسل Client بتحميل الرسالة الى الطبقة الأخرى وهي هنا طبقة Transport وفي هذه الطبقة يتم تحديد طبيعة الإتصال سواء عبر TCP – Connection Protocol او عبر ال UDP – Connectionless Protocol ففي البروتوكول الأول يتم تحديد طرفين وهما المرسل والمستقبل وبورت الإتصال اما ال UDP فيتم تحديد الطرف المرسل و المستقبل (اختياري) اي انه يمكن عمل ال Broadcast بدون تحديد جهة معينة لأستقبال الرسالة اي ان اي شخص يقوم بتنصت عبر هذا البورت Listening يستطيع استقبال الرسالة , وهنا مثال يوضح عمل هذه الطبقة

TcpClient tcpclnt = new TcpClient(); // اختيار برتوكول التي سي بي لعملية الإتصال
tcpclnt.Connect("192.168.0.2",8001);//حيث يلزم تحديد الطرف مستقبل الرسالة والبورت المخصص

ولارسال الرسالة عبر الشبكة نستخدم في الدوت نت ميثود جاهز يقوم بهذه العملية ويسمى Network Stream وهو المسئول عن التعامل مع وسيلة الإتصال وارسال الرسالة الى الطرف المعني بشكل Stream Data او بستخدام ال Socket نفسه وكمثال على ذلك:

NetworkStream mynetsream = tcpclnt.GetStream (); 
StreamWriter myswrite = new StreamWriter (mynetsream);
myswrite.WriteLine("Your Message");

وبعد ذلك تسلم الى Network Layer وهي مكون من Datalink Layer و Network Layer في OSI

طبعا يتولى نظام التشغيل و بروتوكول TCP/IP ارسال الرسالة عبر الشبكة

وهنا ملخص عمل كل من Network Layer و DataLink Layer

Network layer :
Layer 3 of the Open Systems Interconnection (OSI) reference model for networking. The network layer is responsible for functions such as the following:
- Logical addressing and routing of packets over the network
- Establishing and releasing connections and paths between two nodes on a network
- Transferring data, generating and confirming receipts, and resetting connections
Example about network layer : IP-internet protocol , ICMP -internet control message protocol , Routing 
DataLink layer: The link layer provides physically means Example : ARP Address Resolution Protocol , RARP Reverse Address Resolution Protocol.

وبهذا قمت بشرح كيفية الإتصال عبر Layers .

اما بنسبة للجهاز المستقبل Server يقوم بالمرور على نفس الطبقات ولكن بالعكس حيث يستلم كرت الشبكة البكت لتحول الى Datalink ثم Network ثم Transport ثم Application ومنها تحول من Binary الى Ascii ومن Ascii الى Text .. وهذه الكود يوضح مبدأ عمل ال Server

TcpListener myList=new TcpListener("127.0.0.1",8001); // تحديد البورت والأي بي الخاص بسيرفر والذي سيتم التنصت عليه
myList.Start();// البدأ بعملية التنصت
Socket s=myList.AcceptSocket(); // قبول اي طلب يأتي لفتح جلسة جديدة عبر السوكت

byte[] b=new byte[100];//تكوين مصفوفة لأستقبال الرسالة
int k=s.Receive(b); //  البدأ بلإستقبال والتحويل من الباينري الى الأسكي 
for (int i=0;i<k;i++)
Console.Write(Convert.ToChar(b[i])); طباعة الرسالة بعد تحويلها من اسكي
s.Close(); اغلاق السوكت

في الدرس القادم سوف نتحدث بإذن الله بشكل اكثر تفصيلا عن السوكت وعن Threads وعذروني على عدم التفصيل ببعض الأمور وما ذلك الا بسبب ضيق الوقت ..الباب الأن مفتوح لنقاش واتمنى ان ارى منكم التفاعل … انتظرونا في الدرس القادم

 

مجموعة الأمثلة لدرس الأول – للمساعدة في التطبيق

الجزء الخاص ب Client

using System.Net.Sockets;
using System.IO;

private void button1_Click(object sender, System.EventArgs e)
{
  try
  {

TcpClient myclient = new TcpClient ("127.0.0.1",5000); // الإتصال مع السيرفر
NetworkStream mynetsream = tcpclnt.GetStream (); 
StreamWriter myswrite = new StreamWriter (mynetsream);
mynetsream .WriteLine(txt_msg.Text);
myswrite.Close ();
mynetsream .Close ();
myclient.Close ();

  }
  catch (Exception ex)
  {
    MessageBox.Show (ex.Message );
  }
  }

الجزء الخاص ب Server

using System.Net.Sockets;
using System.IO;

TcpListener mytcpl; // Objects  Declaration 
Socket mysocket;
NetworkStream myns;
StreamReader mysr;
mytcpl = new TcpListener (5000); // Open The Port
mytcpl.Start ();// Start Listening on That Port
mysocket = mytcpl.AcceptSocket ();	// Accept Any Request From Client and Start a Session
myns = new NetworkStream (mysocket);// Receives The Binary Data From Port
mysr = new StreamReader (myns); // Convert Received Data to String
MessageBox.Show (mysr.ReadLine()); // Print The Message
mytcpl.Stop();	

يفضل اضافة هذه الميثود عند الحدث الخاص بإغلاق البرنامج
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
	{
  try
  {
 	 mytcpl.Stop ();
 	 Application.Exit();
  }
  catch (Exception ex) {MessageBox .Show (ex.Message );}
  }

تم تعديل بواسطه fmo_82

الكاتب geek4arab

geek4arab

مواضيع متعلقة

التعليقات مغلقة