fmo_82

سلسلة دروس C# Network Programming

237 ردود في هذا الموضوع

ملاحظة هامة: تم اخضاع كتاب أحترف برمجة الشبكات والنظم الموزعة الإصدار الورقي الكامل 2006 إلى الرخصة المجانية SCPL ويمكنك الآن تحميل الكتاب والشامل لكل هذه السلسلة من الرابط ادناه

TCP_IP_ProgrammingV2006Ar.jpg

رابط تحميل الإصدار الورقي الكامل

______________________________________________________________________________

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

الخطة المبدئية لدروس:

- Introduction to Network Programming
- Managed Streaming
- Using TCP Connection and UDP Connectionless Protocols to Send Data
- Helper Socket Classes
- Advanced Socket Members & Network Layer Programming
- Using Threads
- IP Multicasting
- DNS Programming
- Web Services Programming
- SMTP/HTTP/FTP Protocols Programming
- Advanced Multicasting and Conference Systems
- Voice Over IP Programming
- Protecting Network Data cipher using (DES,TDES,RSA,Hashing,MD5...)
- Serialization
- Remoting and Client/Server Concept
- Remote Control Application
- Row Socket & Packet Programming

للوصول السريع لدروس:

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

مقدمة في الـStreaming والـThreading

برمجة Connectionless Sockets Via UDP

مقدمة في الـ IP Multicasting واستخدامها لعمل Multicasting Group

مقدمة في برمجة الـDNS Programming

مقدمة في برمجة الـSMTP

مقدمة في برمجة الـ POP3

مقدمة في برمجة الـHTTP – Hyper Text Transfer Protocol Programming

مقدمة في برمجة الـWeb Services Programming

مقدمة في برمجة الـFTP – File Transfer Protocol Programming

برمجة Managed I/O: Streams, Readers, and Writers

برمجة Socket & Network Layer Programming

برمجة السوكت غير المتزامنة Asynchronous Sockets Programming

برمجة أنظمة الـMulticasting المتقدمة Advanced Multicasting Systems

مقدمة في أمن برمجة الشبكات والتشفير Network Security Programming

مقدمة في برمجة الـVoice Over IP Programming

مقدمة في الـThe Serialization Programming

برمجة الـRemotting Programming

استخدام الـRSACryptoServiceProvider في أمن برمجة الشبكات

مقدمة في برمجة الـRaw Socket Programming in Dot Net

حمل من هنا النسخة الإلكترونية المجانية الإصدار 2006 الكامل

ملاحظة إلى كل مبرمجين ال VB.NET وحتى تعم الفائدة على الجميع تستطيعون ترجمة الأكواد من C Sharp إلى VB.NET باستخدام الرابط التالي :

http://www.developerfusion.com/utilities/c...csharptovb.aspx

حيث قمت بتجربة الترجمة لأغلب الأكواد ولم يكن هنالك أي مشاكل , من الممكن وجود بعض الإختلافات في الإجراء أو اسم أو موقع الخواص أ والدوال لكن في الأغلب متشابهة ولمعرفة الطريقة المقابلة في VB.NET تستطيع الضغط عليها في C# Editor والضغط على المفتاح F1 .. وأي سؤال أو استفسار بخصوص التحويل إلى الـ VB.NET لهذه الأكواد فانا مستعد ..

TCP-IP Programming Outline.pdf

Network_Programming.pdf

تم تعديل بواسطه فادي عبدالقادر
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

thanks man

I hope u will continue

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خير و احنا معاك ان شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته

جزاك الله على البدأ ، ونحن ورائك ياباشا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

20_10_05_01_08_22_1129795702layers.JPG

لإجراء عملية الاتصال بين 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 وعذروني على عدم التفصيل ببعض الأمور وما ذلك الا بسبب ضيق الوقت ..الباب الأن مفتوح لنقاش واتمنى ان ارى منكم التفاعل ... انتظرونا في الدرس القادم

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته

منتظر رد ايه ومشاركة ايه الموضوع ممتاز جدا جدا ولقد أوضحتة كالماء السلس والله ليس مجاملة لقد أعانك الله وأعتقد أن الأعضاء متفقين على ذلك

جزاك الله خيرا ، وبالطبع بعد التطبيق والمحاول والتجربة العملي سوف نقوم بعرض المشاكل التي تعرضنا لها والإحتمالات المتوقعة والأفكار الجديدة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الجزء الخاص ب 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
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هل اعتبر دا اغراء لمتابعة دروسك المتميزه ؟

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بتأكيد اخي عبد الواحد حيث ان اعطاء المعلومة بشكل متسلسل يجذب القارئ ويجعله يتابع الموضوع بشكل دائم ... وأتمنى ان تبقى مشارك نشط معنا

انتظروا المزيد قريبا جدا جدا....

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أكثر من رائع

نحن معك على طول الخط بإذن الله

وبانتظار جديدك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الدرس الثاني : الجزء الأول

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

أولا : ال Socket : قلنا سابقا أن السوكت هي الأداة التي يتم نقل البيانات من خلالها من جهاز إلى أخر ولاستخدامها يلزم في البداية تعريف النيم سبيس System.Net.Sockets حيث يحتوي هذا النيم سبيس على عدد ضخم من الكلاسس والتي يتم استخدامها في برمجيات الشبكة , انظر الرابط التالي لتعرف على جميع المكونات في التفصيل :

http://msdn.microsoft.com/library/default....mnetsockets.asp

و الرابط التالي لتعرف على مكونات System.Net بتفصيل:

http://msdn.microsoft.com/library/default....rfsystemnet.asp

يمكنك السوكت من نقل Text او Object ,حيث بينا سابقا كيفية التعامل من السوكت لنقل Text وفي هذا الدرس سنبين كيفية التعامل معه لنقل Object , وكما هو الحال في نقل ال Text كنا نحول التكست الى اسكي ثم الى باينري اما في الأبجكت فيتم التعامل معه باستخدام ال Stream Library والتي يتم الوصول اليها من System.IO وتحتوي هذه المكتبة على Binary Reader و Binary Writer تمكنك من التعامل مع أي Object انظر الصورة المرفقة :

21_10_05_07_33_20_1129905200ObjectLib.jpg

حيث تساعدك هذه المكتبة على تحويل أي اوبجكت إلى باينري باستخدام Binary Reader لتسهل إرساله عبر الشبكة باستخدام Network Stream ثم تحويله مرة أخرى إلى اوبجكت باستخدام Binary Writer , وكمثال تطبيقي على هذا سوف نقوم ببناء برنامج يقوم بعملية نقل الصورة من جهاز إلى أخر Client/Server وللبدء قم بإنشاء New Form جديد كما هو في الشكل التالي :

21_10_05_07_35_14_1129905314form1.JPG

في البداية قم بإضافة النيم سبيسس التالي :

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

للإجراء عملية الإرسال لا بد أولا من اخذ اوبجك من الكلاس MemoryStream والتي سوف نستخدمها لتخزين الصورة داخل الذاكرة بشكل Stream لكي نحولها لاحقا إلى مصفوفة Binary ثم إرسالها عبر NetworkStream إلى جهاز السيرفر والذي سأتي على شرحه في الجزأ الثاني من هذا الدرس, انظر الكود التالية :

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

إرسال الصورة المخزنة إلى جهاز السيرفر
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 );}

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

انتظروا الجزء الثاني قريبا .. والذي سوف نتحدث به عن الجزء الخاص بال Server وعملية Thread ..

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الدرس الثاني: الجزء الثاني

سوف ابدأ في هذا الجزء شرح الجزء الخاص بالسيرفر والذي يقوم بعملية التصنت على البورت واستقبال ال Stream عبر ال Binary Reader وتحويله إلى اوبجكت مرة أخرى , في هذا المثال نريد استقبال صورة وليس شيء أخر وفي هذه الحالة وفرت لدينا الدوت نيت خصائص جديدة في ال Controls الموجودة فيها ومن ضمنها خاصية Image.FromStream الخاصة ب ال PictureBox والتي تسهل علينا إمكانية عرض الصورة المرسلة من خلال Stream لكي يتم تحويلها من Binary Stream إلى صورة تعرض على ال Picturebox انظر المثال التالي :

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 ();// Accept Any Request From Client and Start The Session
myns = new NetworkStream (mysocket);// Receive The Binary Data From Port
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
}
}
}

ولتطبيق قم بإنشاء New Form جديد كما في الشكل التالي :

21_10_05_01_20_05_1129926005Form_Server.JPG

أضف الميثود السابقة في كلاس البرنامج ثم قم باستدعائها بواسطة وضع Image_Receiver()اما في ال Constructer الخاص بالبرنامج أو بحدث بدأ التشغيل الخاص بالفورم , وقم بوضع الميثود التالية في حدث Closing الخاص بالفورم :

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
try
{
 mytcpl.Stop ();
 Application.Exit();
}
catch (Exception ex) {MessageBox .Show (ex.Message );}
 }

وذلك لتأكد من إغلاق السوكت عند إنهاء البرنامج ,..

قم بإضافة الكود التالي الى ال Save لكي تتمكن من تخزين الصورة المستقبلة

  private void menuItem1_Click(object sender, System.EventArgs e)
 {
 try
 {
   saveFileDialog1.ShowDialog ();
   string mypic_path = saveFileDialog1.FileName;
   pictureBox1.Image.Save(mypic_path);
 }
 catch (Exception){}
 }

قم بتشغيل البرنامج الآن ...

ماذا تلاحظ !! لقد لاحظت أن البرنامج بطيء جدا لدرجة لا يمكن فيها فتح أي برنامج أخر , فكر بالسبب ..

لن أترككم تفكرون كثيرا كون أن ذلك قد يؤدي إلى تعليق الجهاز بالكامل وخاصة إذا لم يتوفر لديك الحجم الكافي من ذاكرة الرام او إذا كان المعالج لديك بطيء نسبيا .. السبب في ذلك اللوب الذي لا ينتهي وعملية التصنت على البورت والتي لا تنتهي أيضا حيث أن البرنامج يعمل على الجزء العام والمخصص لإدارة نظام التشغيل في المعالج وهذا يعني انه لا يوجد مجال لفتح برنامج جديد إذ أن الموارد جميعها محجوزة , إذا ما هو الحل ....

لقد وفرت الدوت نيت الحل لهذه المشكلة وهي باستخدام تكنولوجيا ال Threading والتي تسمح بالمعالجة المتوازية على نفس المعالج وذلك من خلال تقسيم المهام على المعالج وعمل Session منفصلة لكل برنامج وهو ما يسمى بال Multitasking.. وهنا لا يؤثر البرنامج على موارد النظام بشكل كبير انظر الشكل التالي :

21_10_05_01_21_12_1129926072Thread1.JPG

لاحظ انه قبل اضافة ال Thread كان البرنامج يعمل على منطقة ال Global Area وهذا هو سبب البطء الشديد وبعد استخدام ال Thread تم عمل Session خاص للبرنامج بحيث يعمل بشكل متوازي مع بقية البرامج ..

ولاستخدام ال Thread في البرنامج يلزم أولا تعريف المكتبة او انيم سبيس الخاص به وهو

 using System.Threading;

ثم قم باشتقاق اوبجكت منه وادرج اسم الميثود الذي تريد عمل Thread له كما يلي : اكتب هذا الكود في حدث بدأ التشغيل للفورم Form1_Load

Thread myth;
myth= new Thread  (new System.Threading .ThreadStart(Image_Receiver));
myth.Start ();

ألان قم بإضافة Application.ExitThread في حدث ال Closing Form كما يلي

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
try
{
 mytcpl.Stop ();
 Application.ExitThread ();
 Application.Exit();
}
catch (Exception ex) {MessageBox .Show (ex.Message );}
 }

ميزة ال Thread رائعة جدا اذ تمكنك من تشغيل اكثر من Thread وفي نفس الوقت وفي نفس البرنامج وهو ما يسمى بال Multithreading والذي سأتي على شرحه لاحقا بإذن الله .... انتظرونا في الدرس القادم .. أتمنى منكم التطبيق.

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ربنا يكرمك

بصراحه دروس روعه و شرح باسلوب رائع وجميل

انا اتمنى ان تستمر و ربنا يوفقك

ا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ممتاز ممتاز ممتاز

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

اخ فادى جزاك الله خير على الدروس المتميزه

خصوصا ان برمجه الشبكات من المواضيع المهمه فى السى #

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

عذراً اخى fmo_82 ولكن (على حد علمى ) ان ال tcp/ip يتكون من 5 طبقات(layers 5)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الTCP/UDP في الحقيقة مجرد طبقة (Layer) واحدة في الInternet Protocol Stack و هي الطبقة الرابعة( Transport Layer ) و الحقيقة أن الInternet Protocol يُحدد الطبقات في خمسة طبقات و هي

1- الPhysical Layer

2- الDataLink Layer

3- الNetwork IP Layer

4- الTransport (TCP/UDP ) Layer

5- الApplication (HTTP, FTP, ..etc) Layer

و لكن الطبقتين 1 و 2 يتم دمجهما سوياً في طبقة واحدة تُسمى Host To Network Layer و هكذا يُصبح العدد 4 طبقات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

الدرس الثالث : Connectionless Sockets Via UDP

تحدثنا سابقا عن ال TCP – Connection Oriented Protocol وقلنا ان بروتوكول ال TCP هو بروتوكول موجه وهذا يعني انه يلزم احتواء ال Header الخاص به على عنوان المرسل و عنوان المستقبل كما يلزم ايضا القيام بعمليات التحقق Authentication و يدعم عمليات التحقق من الوصول و التسليم بشكل الصحيح .... لكن ماذا لو كان كل ذلك غير مهم بنسبة لك اذ تريد من برنامجك ان يقوم بعملية بث اذاعي Broadcast لرسالتك ولا يهمك من سوف يستلم الرسالة و ان السرعة في الإرسال و الإستقبال هي الهدف الأساسي اذا وجب عليك ترك بروتوكول ال TCP والتوجه نحو ال UDP User Datagram Protocol ويسمى ايضا بال Connectionless Protocol في هذا البروتوكول تستطيع عمل ما يسمى بال Broadcast و ال Multicast (البرود-يعني الإرسال الى الكل و الملتي-يعني الإرسال الى مجموعة اثنان او اكثر واليوني-يعني الإرسال لواحد فقط) يوجد شرط وحيد يلزم ان تأخذه بعين الإعتبار عند استخدام ال UDP لعملية البث بستخدام Broadcast وهو ان الشبكة التي تريد عمل بث لها تتصل معها بشكل مباشر Direct Connection اي بدون وجود Router بينك وبين المستقبل اذ ان ال Router يمنع عمليات البث الإذاعي Broadcast حيث يلزم ان تكون الشبكة ضمن ال Range Class سواء A او B او C

لأستخدام ال UDP يلزم اولا تعريف النيم سبيس System.Net و ال System.Net.Socket لاحظ انه في ال TCP كان يلزم تعريف رقم البورت والعنوان للجهاز المستقبل اما في ال UDP فتستطيع تعريفه كما هو في TCP كما وتستطيع عمل Broadcast بستخدام IPAddress.Any بعد اشتقاق كائن من الكلاس IPEndPoint (وتعني نقطة الهدف) وتستطيع ايضا عدم تحديد رقم البورت وذلك بستخدام الميثود Bind() حيث يتم تعريفها بنقطة الهدف ب 0 ويتم كل ذلك كما يلي كمثال :

التالي هو الجزء الخاص بالسيرفر ووظيفته فتح البورت 9050والتنصت عليها ثم استلام الرسالة عبر هذا البورت وتوزيعها على الكل بدون تحديد رقم بورت معين حيث يتم تسليمها على البورت المخصص لعملية البرودكاست وهو البورت صفر:

لتعريف نقطة الهدف ورقم البورت الخاصة بسيرفر ونستخدمها لكي يقوم السيرفر بستلام الرسالة
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);

لتحديد نوع البرتوكول المستخدم يتم ذلك كما يلي
  Socket newsock = new Socket(AddressFamily.InterNetwork,
          SocketType.Dgram, ProtocolType.Udp);

ثم اعطاء نقطة الهدف ورقم البورت الى الميثود بيند ويستخدم هذا الميثود عند الإستقبال فقط
newsock.Bind(ipep);

الأن تم استقبال الرسالة ونريد بثها الى كل من يتصل مع السيرفر على البورت السابقة ولعمل ذلك يلزم اولا تعريف نقطة الهدف كما يلي
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
لاحظ ان عنوان نقطة الهدف هو اني ورقم البورت صفر وهذا يعني ارسال الرسالة المستلمة الى الكل وبما فيهم الشخص مرسل الرسالة و السيرفر

هنا يتم استلام الرسالة من السيرفر الى السيرفر مرة اخرى عبر الشبكة
recv = newsock.ReceiveFrom(data, ref Remote);

لطباعة عنوان مرسل الرسالة و الرسالة نفسها
Console.WriteLine("Message received from {0}:", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

نقوم هنا بإرسال رسالة ترحيبية لكل جهاز جديد يشبك على السيرفر نخبره بها انه تم الموافقة على دخوله ضمن الأجهزة طبعا هذه رسالة اختيارية تستطيع حذفها اذا كنت لا تريدها
string welcome = "Welcome Customer ...";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);

هنا لوب لا نهائي الهدف منه هو عدند استقبال اي رسالة في اي وقت من قبل اي جهاز يقوم السيرفر بستلامها وتسليمها الى كل من هو على الشبكة ... اذا اردت تحديد عدد معين من الرسائل المستلمة تستطيع تغيير الترو الى اي رقم تريده
while(true)
  {
    data = new byte[1024];
    recv = newsock.ReceiveFrom(data, ref Remote);
 
    Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
    newsock.SendTo(data, recv, SocketFlags.None, Remote);
  }
هنا يتم اغلاق السوكت في حالة اذا تم الخروج من اللوب الا نهائي طبعا هنا لن يتم الوصول الى هذه النقطة الا اذا وضعنا كلمة بريك داخل الوب وفق شرط معين وهنا نستطيع وضع جملة شرطية انه في حالة استقبال رسالة او نص رسالة معينة اخرج من اللوب وقم بإغلاق السوكت وهذا يعني انك تستطيع عمل تحكم عن بعد للإغلاق السيرفر كما يمكنك وضع جملة تشغيل اي ملف تنفيذي على السيرفر في حالة ورود نص معين وهكذا
server.Close();

تم الإنتهاء الأن من شرح الجزأ الخاص بسيرفر .. وسأعرض هنا الكود الخاص به بشكل كامل لكي تستطيع تطبيقه وهذا هو الكود:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text; // سوف استخدم هذه المكتبة لتحويل الأسكي الى باينري و بالعكس
class SimpleUdpSrvr
{
 public static void Main()
 {
  int recv;
  byte[] data = new byte[1024];
  IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
  Socket newsock = new Socket(AddressFamily.InterNetwork,
          SocketType.Dgram, ProtocolType.Udp);
  newsock.Bind(ipep);
  Console.WriteLine("Waiting for a client...");
  IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
  EndPoint Remote = (EndPoint)(sender);
  recv = newsock.ReceiveFrom(data, ref Remote);
  Console.WriteLine("Message received from {0}:", Remote.ToString());
  Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
  string welcome = " Welcome Customer ...";
  data = Encoding.ASCII.GetBytes(welcome);
  newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
  while(true)
  {
    data = new byte[1024];
    recv = newsock.ReceiveFrom(data, ref Remote);
 
    Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
    newsock.SendTo(data, recv, SocketFlags.None, Remote);
  }
 }
}

الأن الجزء الخاص بال Client , يقتصر العمل هنا على قيام ال Client بفتح جلسة مع السيرفر وذلك بعد تعريفه بنقطة الإستلام ورقم البورت وكما تم في السابق اللا ان الإختلاف هو في الوظيفة اذا يقتصر فقط على استقبال الرسالة من السيرفر وارسال اي رساله له عبر البورت المخصص للقيام بهذه العملية انظر الكود التالي :

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class SimpleUdpClient
{
public static void Main()
{
 byte[] data = new byte[1024];

 string input, stringData;
 IPEndPoint ipep = new IPEndPoint(
 IPAddress.Parse("127.0.0.1"), 9050);
 Socket server = new Socket(AddressFamily.InterNetwork,
 SocketType.Dgram, ProtocolType.Udp);
            // في حالة فقدان الإتصال مع السيرفر يظهر الرسالة التاية
 string welcome = "Hello, are you there?";
 data = Encoding.ASCII.GetBytes(welcome);
 server.SendTo(data, data.Length, SocketFlags.None, ipep);
 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
 EndPoint Remote = (EndPoint)sender;
 
data = new byte[1024];
 int recv = server.ReceiveFrom(data, ref Remote);
 Console.WriteLine("Message received from {0}:", Remote.ToString());
 Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
 
//هذا اللوب لكي تستطيع ارسال عدد غير محدد من الرسائل
while(true)
 {
 input = Console.ReadLine();
// في حالة اذا اردت انهاء الجلسة اكتب
// Exit  
if (input == "exit")
   break;
 server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
 data = new byte[1024];
 recv = server.ReceiveFrom(data, ref Remote);
 stringData = Encoding.ASCII.GetString(data, 0, recv);
 Console.WriteLine(stringData);
 }
 Console.WriteLine("Stopping client");
 server.Close();
}
}

انتظرونا في الدرس القادم ...

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم , سوف اقوم بإدراج الأمثلة التي يتم طرحها بعد كل درس .. لكن اتمنى القيام بالتطبيق العملي لكل مثال حتى تعم الفائدة على الجميع ...

هنا البرنامج الخاص بدرس الثاني والذي يستخدم فيه بروتوكول ال TCP لنقل الصورة من جهاز Client الى Server ..

23_10_05_06_47_51_1130118471Examble.JPG

المثال :

Images Sender.zip

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

نقاش تابع لدرس الثالث :

الغريب اني لم اجد اي أسئلة او نقاش في الدرس الثالث وكأن الموضوع لا يقبل النقاش :( , لذلك سوف اضع بنفسي بعض الأسئلة , لعلها تثير التساؤلات

لا ارى فرقا بين البرود كاست و ال Multicast كون ان كليهما يمكن استخدامهما بوجود سيرفر او بدون وجود سيرفر فما هو الفرق؟؟

لا تستعجل فسوف اشرحها إن شاء الله في الدرس القادم لكن عدوني ان يكون هذا النقاش بشكل دائم في الدروس القادمة ...

تم تعديل بواسطه فادي عبدالقادر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اشكرك اخي الكريم ,

وجدت هذا الملف في الإنترنت وهو لشركة Cisco وهو عبارة عن دورة صغيرة لتعلم كيفية عمل ال TCP/IP امل ان يفيد

سوف يكون الدرس القادم عن ال IP Multicasting لذا اتمنى منكم قرائة هذا المرفق لفهم عمل البرتوكولات بشكل افضل كما اتمنى ايضا منكم كتابة اية امور تودوا تعلمها في برمجة الشبكات .. في الإنتظار

TCP-IP.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

اولا جزاك الله خيرا على جهدك و على دروسك المفيده جدا و جزاك الله خير الجزاء

انا عن نفسى استرجعت الكثير من المعلومات التى كدت ان انساها من طول تركها و استفدت معلومات جديده و ان كنت لم اتابع اخر رسالتين لك

ثانيا:اريد ان اوضح لك شىء و فى الحقيقه كنت اتمنى ان ارسل هذا فى موضوع عام حتى يراه كل الخبراء او مقدمى الدروس ... كنت اريد ان اقول ان ما تفعله هو علم ينتفع به قد لا تجد احد يرد و لكن هذا لا يدل على عدم متابعته و قد لا تكون هناك متابعه جيده فى وقت ما ولكن تاكد ان موضوعك سيكون مفيدا لكل الاعضاء فى كل وقت اى ما اقصده هو انه لا اريدك ان تحبط لعدم وجود كثيرون من يتابعون دروسك فدروسك ستبقى وان لم يتابعها او يطالعها احد الان فسوف يطالعها هو او غيره او اى اعضاء جدد بعد ذلك .

فالدروس ستظل موجوده طالما المنتدى موجود و وتقديم الدروس لا يرتبط بفتره معينه بل هو كالتراث الذى يظل لكى يتابعه الجميع ان لم يكن فى وقت كتابه و نشر الدروس فاكيد بعدها ستجد من يطالع الدروس سواء باسبوع او بشهر وانا من حوالى ايام قليله كنت اقرا دروس على هذا المنتدى تم نشرها من اكثر من سنه و لكننى لم اكن وقتها عضوا فى هذا المنتدى و ما اريد ان اقوله هو بعد عام من نشردروسك المهمه تخيل كم تابعها و كم قراءها وكم دعى لك دعوه فى ظهر الغيب فما تفعله هو انك تترك علم ينتفع به و تراث لا يرتبط بفتره معينه و لكنه ممتد

و جزاك الله خير الجزاء و الرجاء اكمال الدروس :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
لماذا اتعب نفسي بإعداد الدروس( والله يعلم انها تأخذ مني ساعات) ولا يوجد احد يود قرائتها ...

لانك تنتظر الاجر من الله ...استمر يا اخى وربنا معاك

(اسف على التأخر فى التجاوب معكم ...ظروفى الصحيه كانت سيئه الايام الماضيه ...بالاضافه الى زنقة الدراسه)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .