قواعد المشاركة في المنتدى

(قسم الاعلانات) الموضوع:كتاب الكلمات والأشياء بي دي إف بواسطة: (كريم يونس) :: (قسم الدعم الفني) الموضوع:شركة تزيين حدائق فى ابوظبى 0547735525 هاند ميد بواسطة: (RODY2020) :: (قسم الاعلانات) الموضوع:أرخص شركات لترميم وبناء حمامات السباحة بالشارقة 0569795951 مع المحترفون بواسطة: (zena fathy) :: (قسم الدعم الفني) الموضوع:شركة تنظيف سجاد مع التعقيم بالبخار في الرياض 0560387770 فرسان العرب بواسطة: (RODY2020) :: (قسم الاعلانات) الموضوع:اهم النصائح من الايمان كلين لتنظيف المياه 0500096306 بواسطة: (zena fathy) :: (قسم الاعلانات) الموضوع:أرخص شركات مكافحة الحشرات بالرياض 0560387770 فرسان العرب بواسطة: (zena fathy) :: (قسم الاعلانات) الموضوع:افضل شركة تنظيف بحفر الباطن بواسطة: (منهل المعرفه) :: (قسم الاعلانات) الموضوع:ارخص شحن برى سريع بواسطة: (شام السيد) :: (أخبار التكنولوجيا) الموضوع:العملات الرقمية هل هي الصورة المستقبلية للأموال؟؟ بواسطة: (Mohammed Hafiz) :: (قسم الشكاوي والمشاكل الفنية والملاحظات) الموضوع:Cheapest Madden NFL 19 Coins بواسطة: (Anthony78) :: (قسم الاعلانات) الموضوع:افضل شركة تمديد مواسير الغاز بشروط الدفاع المدني بواسطة: (كريم يونس) :: (منتدى ال SQL العام) الموضوع:شركه تنظيف مكيفات بالرياض بواسطة: (uj]hggعبدالله) :: (قسم الاعلانات) الموضوع:أفضل شركة لتركيب الباركية بالشارقة 0507172540 الجوهرة الملكية بواسطة: (magda manfy) :: (قسم الاعلانات) الموضوع:ديكورات وتشطيبات 2021 مع شركة عقارى01100448640 بواسطة: (husayn fahmi) :: (قسم الاعلانات) الموضوع:احدث ديكورات الريسبشن مع شركة عقارى01100448640 بواسطة: (husayn fahmi) :: (قسم الاعلانات) الموضوع:الكبسولة المبرمجة وخسارة الوزن في 4 أشهر فقط بواسطة: (engoma) :: (منتدى Microsoft Excel) الموضوع:شرح الفيجوال بيزيك للمتوسطين vba بواسطة: (hs889) :: (قسم الاعلانات) الموضوع:شركة ركن الجنوب لمكافحة الحشرات بخميس مشيط بواسطة: (غعا) :: (قسم الاعلانات) الموضوع:حمامات كبيرة مع شركة عقارى 01100448640 بواسطة: (husayn fahmi) :: (قسم الاعلانات) الموضوع:سايتوتك 200 للبيع الان وحصري 00962781150400 حبوب سايتوتك المعتمده للبيع بواسطة: (momo50080)

المواضيع المثبته: (منتدى ADO.NET العام) الموضوع:الكامل في قواعد البيانات مع VB.net بواسطة: (المهندس عدي) :: (منتدى مبرمجي لغة جافا JAVA) الموضوع:درس : الاستثناءات في جافا Exceptions بواسطة: (nardien28) :: (قسم الدروس و الدورات) الموضوع:دورة مجانية في الفجوال بيسك دوت نيت و خاصة بالمبتدئين بواسطة: (ITPROGRAMMER) :: (قسم الـ portable) الموضوع:برنامج اكسترا لرفع الصور بواسطة: (kkarem55) :: (منتدى الكتب الالكترونية) الموضوع:كتاب لبرامج مصممة بالفيجوال مع أكوادها (الجزء الثاني) بواسطة: (First Star) :: (لغة PHP) الموضوع:دروس php بواسطة: (أحمد إبراهيم شقليه) :: (منتدى الوورد والباور بوينت) الموضوع:دورة انتاج برامج تفاعلية بإستخدام الباور بوينت بواسطة: (خليل إبراهيم) :: (Oracle قسم قواعد البيانات أوراكل) الموضوع:اعداد و تنصيب اوراكل 9i ويندز NT/2000/XP بواسطة: (oracle_egypt) :: (منتدى الدعم الفني للماسنجر المحيط العربي) الموضوع:اقتراحات تطوير الماسنجر بواسطة: (jbsa) :: (منتدى الدعم الفني للماسنجر المحيط العربي) الموضوع:مشاكل ماسنجر المحيط العربي بواسطة: (jbsa) :: (منتدى أنظمة الشبكات وأمنها) الموضوع:ماهو الـ IPSec بواسطة: (khaled helal) :: (منتدى Microsoft Excel) الموضوع:open office بواسطة: (ramies) :: (منتدى برمجة الألعاب) الموضوع:استراتيجية انتاج و تسويق الالعاب بواسطة: (مصطفي البارودي) :: (القسم المفتوح) الموضوع:الى الاخوه الاعضاء مع التحيه والتقدير بخصوص العناوين للمشاركة بواسطة: (startnet) :: (منتدى برمجة الألعاب) الموضوع:مجموعة من مشاريع الالعاب بواسطة: (مصطفي البارودي) :: (منتدى Microsoft SQL Server) الموضوع:SQL SERVER vs ORACLE بواسطة: (m.atassi) :: (منتدى مبرمجي ASP.NET) الموضوع:كتاب تصميم موقع اخباري بواسطة: (م.محمد الساعدي) :: (منتدى التصميم والجرافيكس) الموضوع:دروس فوتوشوب تو توب بواسطة: (Professional VB99) :: (منتدى مبرمجي Microsoft Visual VB.NET) الموضوع:ارشيف جميع البرامج التى صنعها اعضاء قسم الدوت نت بواسطة: (alaa gomaa) :: (منتدى Microsoft Visual Basic) الموضوع:دورة التعامل مع Data Report باستخدام ADODC ( شرح بالصور ) بواسطة: (Max Bayne)

عدد الصفحات : 9  « < 1  2  3  4  5  6  7  8  9   > » إضافة رد إضافة موضوع جديد

> Dot Net Networks & TCP/IP Programming,تعلم برمجة الشبكات والنظم الموزعة وبرتوكول ال TCP\IP
Bookmark and Share
تقييم الموضوع Label معدل التقيم:4
مشاركةالثلاثاء,04/ذو الحجة/1426 هـ,08:24 صباحاً
المشاركة #41

خبير برمجة شبكات ونظم موزعة
الرتبة في المنتدى:رائد

أيقونة المجموعة

المجموعة: مجموعة الخبراء المعتمدين
المشاركات: 506
سجل في:الأحد,28/رمضان/1426 هـ,04:59 صباحاً
الدولة:الأردن
رقم العضوية: 6228



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

الدرس الثاني عشر: Asynchronous Sockets Programming :

سوف نتحدث في هذا الدرس عن استخدام ال Asynchronous Socket بشكل أكثر تفصيلا عما تحدثنا به سابقا وسوف نطبق مجموعة من الأمثلة العملية على استخدام الاتصال الغير متزامن في برمجيات الشبكات ...
من المعروف أن الاتصال المتزامن مهم جدا في البرمجيات التي تحتاج إلى العمل في الزمن الحقيقي حيث لا يسمح باستخدام الاتصال لأمر آخر إلى بعد انتهاء العملية الجارية واستخدامه مهم جدا في العمليات التي تتطلب مثل هذه الأمور لا كن لا ينصح أبدا استخدامه في حالة إذا كانت الجهة المستقبلة للبيانات تستخدم Slow Connection كاعتماد الشبكة على ال Dialup لربط الجهازين المرسل مع المستقبل أو في حالة إذا كان هنالك مجموعة كبيرة من المستخدمين تستخدم السيرفر حيث يمنع الأسلوب المتزامن بقية المستخدمين على الشبكة من إجراء عملية الإرسال في حالة كون ال Server يستقبل بيانات من جهاز آخر , وفي هذه الحالة ينصح باستخدام الاتصال الغير المتزامن إذ يعتبر مهم جدا في حالة إذا أردنا من البرنامج القيام بعدة مهام وعلى نفس ال Thread وباستخدام نفس ال Connection , أو كما ذكرنا سابقا في حالة إذا كان الاتصال بطيء نسبيا أو انه يوجد عدد مستخدمين يستخدمون نفس ال Server ..

أولا Asynchronous Socket Class and its members :
تدعم الدوت نيت الاتصال غير المتزامن بمجموعة من ال methods الموجودة ضمن ال Socket Class والتي يتم استدعائها من ال System.Net.Socket Namespaces وقد ميزت الدوت نيت هذه الميثودس بوجود ال Begin في بداية أسم الميثود, ولكل Begin Method يوجد Method End مقابلة لها والتي تستخدم لإرجاع callback result عند انتهاء ال Begin Method من التنفيذ وهي كما يلي:




1- BeginAccept و تستخدم لقبول ال Client Request وإسناده إلى الObject AsyncCallback وباستخدام هذه الطريقة سوف يتمكن ال Server من استقبال عدد من ال Clients Requests في نفس الوقت وبدون الحاجة لانتظار الانتهاء من العملية الجارية حيث يتم في كل مرة استدعاء الميثود باستخدام ال AsyncCallback Delegate وتستخدم كما يلي كما يلي:

 كود
m_mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint (IPAddress.Any, 5020);

m_mainSocket.Bind (ipLocal);
m_mainSocket.Listen (10);
m_mainSocket.BeginAccept (new AsyncCallback (Client_request_method), null);


حيث سيتم إضافة ال Client Request فيReference Callback منفصل عن السابق وهنا لابد من إنشاء method لاستقبال ال Client Request وإنهاء ال Client Accepted Object باستخدام الميثود EndAccept :

 كود
public void Client_request_method(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
Myclient = listener.EndAccept(ar);
Myclient.Send(/* data to be send*/ );
listener.BeginAccept(new AsyncCallback(Client_request_method), listener);
Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString()); }



في Dot Net 2005 أصبحت ال BeginAccept Method تأخذ عدة أشكال كما يلي:


الشكل الأول في الدوت نيت 2003 و 2005 وتأخذ AsyncCallBack Delegate و State Object لإرجاع معلومات عن حالة ال Request في ال Socket وكما يلي:
MySocket.BeginAccept(AsyncCallback , object state)


الشكل الثاني في الدوت نيت 2005 حيث يمكنك فيه تحديد حجم البيانات المستلمة
 كود
MySocket.BeginAccept(int Data_ Receive_Size , AsyncCallback , object state)



الشكل الثالث في الدوت نيت 2005 حيث بمكن فيه تحديد ال Accepted Socket
 كود
MySocket.BeginAccept(Socket accept_Socket ,int Data_ Receive_Size , AsyncCallback , object state)


2- BeginConnect وتستخدم لبدأ Asynchronous Connection على ال Socket ورقم البورت المحدد حيث يسند لها ال IPEndPoint وال Asynchronous Callback وال State Object وكما يلي:
 كود
MySocket.BeginConnect(EndPoint IP,Syncallback Result,object state)


وتستخدم كما يلي كمثال:
 كود
Socket MySocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipend = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 5020);

MySocket.BeginConnect(ipend, new AsyncCallback(Connected), MySocket);


في ال Connected Method يتم تحديد ال CallBack Socket كما يلي:

 كود
public static void Connected(IAsyncResult iar)
{
Socket sock = (Socket)iar.AsyncState;
try
{
sock.EndConnect(iar);
}
catch (SocketException)
{
Console.WriteLine("Unable to connect to host");
}}


3- BeginReceive وتستخدم لإستقبال بيانات من ال Client وتخزينها في Byte Array والصيغة العامة لها كما يلي:

 كود
MySocket.BeginReceive(Byte[] buffer,int offset, SocketFlags,AsyncCallback, object sate)


ويستخدم كما يلي كمثال:

 كود
byte[] data = new byte[1024];
MySocket.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ReceivedData), MySocket);

void ReceivedData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(receivedData);
}


كما تستخدم الميثود BeginReceiveFrom لإستقبال البيانات من موقع محدد باستخدام ال UDP حيث يضاف إلى التركيب السابق IPEndPoint Refrance Object .


4- BeginSend وتستخدم لإرسال بيانات إلى الطرف المستقبل عبر ال Asynchronous Socket والصيغة العامة لها كما يلي:

 كود
MySocket.BeginSend (Byte[] buffer,int offset, SocketFlags,AsyncCallback, object sate)


وتستخدم كما يلي كمثال:

 كود
private static void SendData(IAsyncResult iar)
{
Socket server = (Socket)iar.AsyncState;
int sent = server.EndSend(iar);
}

byte[] data = Encoding.ASCII.GetBytes("Hello Word");
MySocket.BeginSend(data, 0, data.Length, SocketFlags.None,
new AsyncCallback(SendData), MySocket);


كما تستخدم الميثود BeginSendto لإرسال البيانات إلى Remote Host محدد باستخدام ال UDP حيث يضاف إلى التركيب السابق IPEndPoint Refrance Object .

5- كما تم إضافة مجموعة من الميثود الجديدة في الدوت نيت 2005 وهي:
BegonDiconnect لإنهاء الاتصال و BeginSendFile لإرسال ملف و ال BeginReceiveMessageFrom والتي تستخدم لإستقبال عدد محدد من البيانات وتخزينها في مكان محدد في ال Bufer ..

التركيب التالي:BeginSendFile تأخذ ال

 كود
MySocket.BeginSendFile(string filename,AsyncCallback Asyn,object state)


وال BeginReceiveMessageFrom التركيب التالي:

 كود
MySocket.BeginReceiveMessageFrom(byte Buffer ,int offset,int size,SocketFlags sf,ref EndPoint,AsyncCallback ascb,object state)



وال BegonDiconnect التركيب التالي:

 كود
MySocket.BeginDisconnect(bool reuseSocket,AsyncCallback ascb,object state)


ثانيا: تطبيقات ال Asynchronous Socket في الدوت نيت :

تمر عملية الاتصال الغير متزامن بمجموعة من المراحل تبدأ بإنشاء الObject Socket في ال Server Side بعد ذلك يتم تعريف ال BeginConnect لبدأ Asynchronous Connection على ال Socket حيث يتم إسناد Object IPEndPoint والMethod Asynchronous Callback وال State Object لها وتبدأ في هذه الحالة عملية الاتصال بال Socket , وبعد ذلك تمرر إلى ال BeginAccept لقبول ال Client Request حيث يتم قبول الطلب ويرسل Acknowledgement إلى ال Client ليعلمه فيها بقبول الجلسة وإمكانية البدء للإرسال و يستطيع ال Client بعد الموافقة على الجلسة البدء بالإرسال باستخدام الميثود BeginSend ويستقبل ال Server الرسالة من ال Client باستخدام الميثود BeginReceive وكما ذكرنا سابقا فإن لكل عملية Begin تقابلها الميثود End للاستعداد لإجراء عملية أخرى على نفس ال Thread في البرنامج وهو ما ميز الاتصال الغير متزامن عن الاتصال المتزامن.



وبناء على المفاهيم السابقة سوف نقوم الآن بإنشاء برنامج Client/Server Chatting يعتمد على ال Asynchronous Socket لإرسال واستقبال البيانات .

وللبدء قم بإنشاء مشروع جديد كما في الشكل التالي:



سوف نستخدم ال Namespaces التالية:

 كود
using System.Net;
using System.Net.Sockets;
using System.Text;


في ال Global Declaration (أي بعد تعريف ال Main Class)قم بإضافة التعاريف التالية:

 كود
public class Form1 : System.Windows.Forms.Form
{
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 5020);
private byte[] data = new byte[1024];
private int size = 1024;


في ال Form Load قم بإضافة الكود التالي حيث سنعرف Connection يعتمد على ال TCP ويعمل على البورت 5020 ثم تعريف عملية قبول الاتصال باستخدام ال BeginAccept :

 كود
private void Form1_Load(object sender, System.EventArgs e)
{
server = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 5020);
server.Bind(iep);
server.Listen(5);
server.BeginAccept(new AsyncCallback(AcceptConn), server);
}


ثم إنشاء Accept Callback Method والذي سيتم فيه إنهاء ال Accepted Request باستخدام ال EndAccept Method وبعد ذلك إرسال Acknowledgement إلى ال Client تخبره فيها بقبول الطلب وترسل باستخدام ال BeginSend Method كما يلي:

 كود
void AcceptConn(IAsyncResult iar)
{
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar);
conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString();
string stringData = "Welcome to my server";
byte[] message1 = Encoding.ASCII.GetBytes(stringData);
client.BeginSend(message1, 0, message1.Length, SocketFlags.None,new AsyncCallback(SendData), client);
}


ثم إنشاء Send Callback method لإنهاء ال BeginSend وكما يلي:

 كود
void SendData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int sent = client.EndSend(iar);
client.BeginReceive(data, 0, size, SocketFlags.None,new AsyncCallback(ReceiveData), client);
}


ثم إنشاء Receive Callback method لإنهاء ال BeginReceive وكما يلي:

 كود
void ReceiveData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int recv = client.EndReceive(iar);
if (recv == 0)
{
client.Close();
conStatus.Text = "Waiting for client...";
server.BeginAccept(new AsyncCallback(AcceptConn), server);
return;
}
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
results.Items.Add(receivedData);
byte[] message2 = Encoding.ASCII.GetBytes(receivedData);
client.BeginSend(message2, 0, message2.Length, SocketFlags.None,new AsyncCallback(SendData), client);
}


وهنا قد تم الانتهاء من برنامج ال Server والآن سوف نقوم بإنشاء برنامج ال Client وللبدء قم بإنشاء مشروع جديد كما في الشكل التالي:



سوف نستخدم ال Namespaces التالية:

 كود
using System.Net;
using System.Net.Sockets;
using System.Text;


في ال Global Declaration (أي بعد تعريف ال Main Class)قم بإضافة التعاريف التالية:

 كود
public class Form1 : System.Windows.Forms.Form
{
private Socket client;
private byte[] data = new byte[1024];
private int size = 1024;


في ال Connect Button قم بكتابة الكود التالي:

 كود
conStatus.Text = "Connecting...";
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text), 5020);
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);


ثم قم بإنشاء Callback Connect method كما يلي:

 كود
void Connected(IAsyncResult iar)
{
client = (Socket)iar.AsyncState;
try
{
client.EndConnect(iar);
conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString();
client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
}
catch (SocketException)
{
conStatus.Text = "Error connecting";
}
}


ثم إنشاء Receive Callback method لإنهاء ال BeginReceive وكما يلي:

 كود
void ReceiveData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
results.Items.Add(stringData);
}


ثم إضافة الكود التالي في ال Send Button :
 كود

try
{
byte[] message = Encoding.ASCII.GetBytes(newText.Text);
newText.Clear();
client.BeginSend(message, 0, message.Length, SocketFlags.None,new AsyncCallback(SendData), client);
newText.Focus();
}
catch(Exception ex){MessageBox.Show(ex.Message);}

ثم إنشاء Send Callback method لإنهاء ال BeginSend وكما يلي:

void SendData(IAsyncResult iar)
{
try
{
Socket remote = (Socket)iar.AsyncState;
int sent = remote.EndSend(iar);
remote.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), remote);
}
catch(Exception ex){MessageBox.Show(ex.Message);}

}


ثم إنشاء Receive Callback method لإنهاء ال BeginReceive وكما يلي:

 كود

void ReceiveData(IAsyncResult iar)
{
try
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
results.Items.Add(stringData);
}
catch(Exception ex){MessageBox.Show(ex.Message);}
}


وكما لاحظنا فإن برنامج ال Client لا يختلف كثيرا عن برنامج ال Server حيث نعرف في ال Server ال Socket Connection وال BeginAccept Method أما في ال Client فنعرف ال Socket Connection و ال BeginConnect Method وتبقى عملية الإرسال والاستقبال هي نفسها في Server وال Client ...




الملفات المرفقة
 L12 Asynchronous Sockets.rar ( 254.82ك ) عدد مرات التنزيل: 754
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالثلاثاء,04/ذو الحجة/1426 هـ,08:35 صباحاً
المشاركة #42

خبير برمجة شبكات ونظم موزعة
الرتبة في المنتدى:رائد

أيقونة المجموعة

المجموعة: مجموعة الخبراء المعتمدين
المشاركات: 506
سجل في:الأحد,28/رمضان/1426 هـ,04:59 صباحاً
الدولة:الأردن
رقم العضوية: 6228



وهنا قد تم الانتهاء من الجزء الثاني وفي الجزء الثالث من هذه السلسلة سوف نتحدث ال Multicasting بشكل أكثر تفصيلا كما سوف نتحدث Network Security Programming والتي تضم ال Cryptographyوال Authentication Protocols




لتحميل ال Chapter 2 ثلاثة دروس :


الملفات المرفقة
 C# Network Programming Chapter2.rar ( 445.08ك ) عدد مرات التنزيل: 937
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالجمعة,14/ذو الحجة/1426 هـ,04:41 مساءً
المشاركة #43

خبير برمجة شبكات ونظم موزعة
الرتبة في المنتدى:رائد

أيقونة المجموعة

المجموعة: مجموعة الخبراء المعتمدين
المشاركات: 506
سجل في:الأحد,28/رمضان/1426 هـ,04:59 صباحاً
الدولة:الأردن
رقم العضوية: 6228



بسم الله الرحمن الرحيم , يعتبر هذا الدرس واحد من أهم الدروس التي عرضناها سابقا إذ سوف نتعلم فيه كيفية بناء أنظمة متقدمة مثل ال Conference Systems بشتى أنواعها معتمدا على Multicasting Programming .

الدرس الثالث عشر: Advanced Multicasting Systems :

قمنا سابقا بتعريف ال Multicasting وبينا الفرق بينها وبين ال Broadcasting وبينا أنواعها وكيفية التعامل معها في الدوت نيت وفي هذه الدرس سوف نتحدث عنها بشكل أكثر تفصيلا وذلك لأهميتها الكبيرة في برمجيات الشبكات وخاصة برمجيات ال Conferencing...

أولا : Architecture of Multicast Sockets :

من المعروف انه يتم التعامل مع ال Multicasting عبر برتوكول ال UDP وباستخدام ال Class D Subnet Mask وتتم عملية إدارة المجموعات باستخدام برتوكول ال IGMP – Internet Group Management Protocol والذي هو جزء من ال Internet Protocol Model وكما يتضح من الشكل التالي فإن برتوكول ال IGMP يحتوي على عمليات التحقق من الوصول السليم للبيانات (حيث يتم إرسال حجم البيانات الكلي لرسالة وهي اختيارية إذ يمكن إلغائها بوضع الرقم صفر) , و تحتوي أيضا على ال TTL Time to Live والذي يحدد فيه العمر الافتراضي لكل رسالة, ونوع العملية الإدارية ( ضم إلى مجموعة , إلغاء من مجموعة , أو إرجاع معلومات عن المجموعة Membership Query) وأخيرا عنوان المجموعة التي يتم تحديدها برمجيا ضمن ال Range المحدد لل Class D .



وتم تخصيص ال Range في ال Multicasting من 224.0.0.0 إلى 239.255.255.255 ونستطيع تحديده بثلاثة طرق فإما بشكل يدوي Static أو Dynamic أو على أساس ال Scope-Relative وبشكل عام تستخدم هذه التوزيعات كما يلي كمثال:
التخصيص 224.0.0.1 ويستخدم في جميع الشبكات المحلية فقط حيث لا يتم تمريره إلى شبكة أخرى عبر ال Router أما إذا أردنا التمرير إلى شبكات أخرى عبر ال Router فنستخدم التخصيص 224.0.0.2 و لكن بشرط استخدام نفس ال Subnet في الشبكات الأخرى ... ولمعرفة جميع التخصيصات لل Multicasting انظر الرابط التالي:

http://www.iana.org/assignments/multicast-addresses

يتم نقل ال Multicast Packets بين ال Backbone Tunnels باستخدام ال Unicast Tunnel حيث يتم إرسالها من داخل الشبكة إلى ال Router و ترسل من Router إلى أخر عبر ال Backbone Tunnel باستخدام أسلوب ال Unicast وهو ما يوفر الكثير من ال Bandwidth في الشبكة حيث ترسل نسخة واحدة إلى ال Router ويقوم هو بتوزيعها على الأجهزة باستخدام ال Unicast المشكلة الوحيدة في ال Multicast هو انه يعتمد بشكل كامل على استخدام ال UDP Connectionless Protocol.

ويمكننا استخدام ال Multicasting في ثلاثة أنواع من الشبكات وهي شبكات ال Peer to Peer حيث لا وجود لجهاز Server والكل يستقبل و يرسل من و إلى ال Group الذي هو فيه, والنوع الثاني Server Based Network حيث يتم إرسال رسالة واحدة إلى ال Server ويقوم ال Server بتوزيعها على بقية الأجهزة في الشبكة , أما النوع الثالث فيتم من خلال ال Router , وكما يتضح من الشكل التالي فإن عملية الإرسال تتم بعد انضمام ال Client إلى المجموعة التي تملك ال IP Multicast ويرسل ال Client رسالة واحدة إلى ال Router حيث يقوم ال Router بتوزيعها على الأجهزة في المجموعة مستخدما ال Routing Table.



وكما كان الحال في الإرسال باستخدام ال Broadcasting يتم الإرسال في Multicasting من جهاز محدد إلى مجموعة معينة وليس إلى الكل كما في ال Broadcast , حيث تُكون كل مجموعة من الأجهزة Group خاص ويتم التخصيص كما ذكرنا سابقا وفق ال IP Multicasting حيث تمتلك كل مجموعة نفس ال IP Multicast ويوجد عدة أشكال لل Multicasting ومن الأمثلة عليها الإرسال إلى مجموعة one to Group و الإرسال إلى أكثر من مجموعة one to Multi Group :

1 – الإرسال مجموعة One to Group:
وفيه يملك ال User Sender نفس ال IP Multicasting الذي يملكه ال Receiver Users ويتم الإرسال من داخل ال Group إلى جميع أعضائه حيث ترسل ك Unicast إلى ال Access Point حيث يقوم بتوزيعها على كافة الأعضاء في المجموعة بأسلوب ال Broadcast وكما في الشكل التالي:



- الإرسال إلى أكثر من مجموعة One to Multi-Groups:

وفيه قد يكون ال IP Multicasting لل User Sender مختلف عن Receiver Users ويتم الإرسال من User داخل ال Group إلى المجموعة الذي هو عضو منها وإلى مجموعات أخرى , ويتم تحديدها باستخدام Address List للمجموعات التي نريد الإرسال لها ...



ثانيا :Using Multicast Sockets with .NET:

شرحنا سابقا كيفية التعامل مع ال Multicasting في الدوت نيت وتعرفنا على ال Members وال Classes الخاصة بها وهنا سوف نبين بشيء من التفصيل هذه العمليات ونطبق عليها مجموعة من الأمثلة وبعد ذلك سنقوم ببناء نظام Conference System معتمدا على ال Multicasting ...

من العمليات الأساسية في التعامل مع ال Multicasting :

1- الانضمام أو الخروج من مجموعة Joining || Drop Group :

لا تلزم عملية الانضمام إلى ال Multicast Group أي عمليات تحقق سوى التصنت على ال port وال IP Multicasting المحدد , ويتم ذلك بعد تعريف udpClient Object وباستخدام ال JoinMulticastGroup Method يتم تعريف ال IP Multicasting الذي سوف ننضم إليه وكما يلي:

 كود
UdpClient sock = new UdpClient(9050);
sock.JoinMulticastGroup(IPAddress.Parse("225.100.0.1"), 50);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);

وكما يلي لإلغاء عملية الانضمام من مجموعة:
 كود
sock.DropMulticastGroup(IPAddress.Parse("225.100.0.1"));


إذ تستخدم الMethods JoinMulticastGroup و DropMulticastGroup لضم أو إلغاء عنوان أو مجموعة من العناوين من ال Multicast Group , وباستخدام Class MulticastOption: يمكننا تخزين IP Address List لتعامل معها في Multicast Group لعمل Join و Drop لأي Multicast Group وتستخدم كما يلي كمثال لإضافة عضوية لاستقبال رسائل Multicast :

أولا نعرف ال UDP Socket وكما يلي :

 كود
mcastSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,
ProtocolType.Udp);


ثانيا نقوم بتعريف Address List ثم نسند إليها ال IP الذي نريد إدخاله في ال Group أو نجعل ال User يدخل العنوان بنفسه نربطها بالسكوت باستخدام الميثود Bind وكما يلي :

 كود
IPAddress localIPAddr = IPAddress.Parse(Console.ReadLine());
mcastSocket.Bind(IPlocal);


ثالثا نقوم بتعريف ال Multicast Option ونسند لها العنوان المحدد كما يلي:

 كود
MulticastOption mcastOption;
mcastOption = new MulticastOption(localIPAddr);


ومن ثم نضيف التغير على SetSocketOption حيث تأخذ هذه الميثود ثلاثة باروميترات الأول لتحديد مستوى التغيير على IP أو على IPv6 أو على Socket أو TCP أو UDP وفي حالتنا هذه سوف نستخدم التغير على IP إذ ما نريده هو ضم IP إلى Multicast Group وفي الباروميتر الثاني نحدد نوع التغيير حيث نريد إضافة عضوية ويمكن الاختيار بين إضافة عضويه AddMembership أو إلغاء عضوية DropMembership وأخيرا نسند إليه ال MulticastOption Object والذي قمنا بإنشائه و كما يلي:

 كود
mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,mcastOption);


2- الإرسال إلى مجموعة Sending Data to a Multicast Group:

حتى نستطيع الإرسال باستخدام ال IP Multicasting لابد أولا من تعريف ال Socket Object باستخدام ال UDP Connection وإسناد ال IP Multicasting ورقم ال Port إلى ال Object IPEndPoint ... ونستطيع الإرسال باستخدام ال sendto method حيث نسند لها ال data as Bytes Array وال IPEndPoint Object وكما يلي لإرسال رسالة نصية:

 كود
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse((“225.100.0.1”), 9050);
byte[] data = Encoding.ASCII.GetBytes(msg.Text);
server.SendTo(data, iep);
server.Close();
msg.Clear();
msg.Focus();


ولإرسال Binary Data كإرسال صورة مثلا لابد من استخدام ال Memory Stream لتخزين الصورة في الذاكرة على هيئة Stream ثم تحويلها إلى Byte Array وبعد ذلك إرسالها باستخدام ال sendto Method وكما يلي:

 كود
MemoryStream ms = new MemoryStream();
PictureBox1.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arrImage = ms.GetBuffer();
ms.Close();
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(“225.100.0.1”), 5020);
server.SendTo(arrImage,iep);


3- الاستقبال من مجموعة Receiving Data From a Multicast Group:

حتى نستطيع الاستقبال من مجموعة لابد أولا من تحديد ال IP Multicast الخاص بالمجموعة و الانضمام إليه ثم استقبال البيانات باستخدام ال Receive Method ويتم ذلك كما يلي لاستقبال رسالة نصية وعرضها في list Box:

 كود
UdpClient sock = new UdpClient(9050);
sock.JoinMulticastGroup(IPAddress.Parse(“225.100.0.1”), 50);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);

byte[] data = sock.Receive(ref iep);
string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
listBox1.Items.Add(iep.Address.ToString() +" :_ "+stringData );


ولاستقبال صورة نستخدم ال memory Stream لاستقبال البيانات من ال Receive Method وتخزينها في الذاكرة على هيئة Stream Data ثم تحويلها إلى صورة مرة أخرى باستخدام ال image.FromStream Method وكما يلي:

 كود
UdpClient sock = new UdpClient(5020);
sock.JoinMulticastGroup(IPAddress.Parse(“225.100.0.1”));
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);

byte[] data = sock.Receive(ref iep);
MemoryStream ms = new MemoryStream(data);
pictureBox1.Image = Image.FromStream(ms);
sock.Close();


ملاحظات هامة في استخدام ال Multicasting في برمجيات الشبكات :

1- من الملاحظ أننا لا نستطيع استخدام ال Network Stream لعملية إرسال ال Multicasting إذ يتطلب استخدامها وجود TCP Socket Connection وهو غير متاح في ال Multicasting ويستعاض عنها باستخدام ال memory Stream لإرسال Binary Stream عبر ال sendto method ...

2- لا يمكنك استخدام ال Multicasting ك loopback في حالة عدم وجود شبكة أو اتصال لذلك لن تستطيع تجربة أي من تطبيقات ال Multicasting في حالة عدم اتصالك بالشبكة.

3- يمكن لكل جهاز أن ينضم إلى أكثر من مجموعة بحيث يستقبل من جهات متعددة, كذلك يستطيع الإرسال إلى عدة مجموعات.

4- في العادة تكون السعة المسموحة لإرسال ال Multicasting Data عبر ال sendto Method محدودة لذلك يمكنك استخدام ال Binary Reader & Writer وال Stream Reader & Writer لإرسال والاستقبال بدلا منها ...

5- تتم عملية اختيار ال IP Multicast وفق لل Network Topology التي تملكها لذلك لابد من التقيد بالعناوين المحددة وهو ما بينته سابقا ..


ثالثا تطبيق مشروع نظام المؤتمرات Multicasting Conferencing Systems :

في هذا التطبيق سوف نفترض وجود غرفة صفية حيث يقوم المحاضر بإلقاء المحاضرة عن بعد أمام طلابه إذ نريد هنا جعل الطلاب يرون الأستاذ وكما يستطيع الأستاذ رؤية طلابه بالإضافة إلى إمكانية عرض المحاضرة على ال Power Point Slides كما يستطيع الطلاب التحدث مع الأستاذ باستخدام Text Chatting ...

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




1- Full/Half Duplex Multicast Video Conferencing System:

وفرت لنا Microsoft مجموعة من ال Classes الخارجية والتي تتعامل مع ال DirectX 9 مباشرة حيث نستطيع استخدامها لتعامل مع الكاميرا أو ال Scanner أو الصوت أو أي طرفية أخرى وفي هذا التطبيق سوف نستخدم الClasses Direct Show Dot Net لالتقاط صورة عبر الكاميرا وعرضها على ال Picture box حيث نستطيع إرسالها لاحقا إلى ال Multicast Group باستخدام ال memory Stream وال Sendto method وهو ما بيناه سابقا ..

وحتى نستطيع استخدامها سوف نضم ال Direct Show Classes إلى المشروع وكما يلي:



وحتى نتعامل معها سوف نستدعيها باستخدام :

 كود
using DShowNET;
using DShowNET.Device;


وسيكون شكل برنامج الإرسال عبر الكاميرا كما في الشكل التالي:



سوف نستخدم ال DeviceSelector Class لإختيار جهاز الإدخال عند بداية تشغيل البرنامج وكما يلي:

 كود
DeviceSelector selector = new DeviceSelector( capDevices );
selector.ShowDialog( this );
dev = selector.SelectedDevice;



و لإلتاط الصورة عبر الكاميرا سوف نقوم بإنشاء method جديدة كما يلي :

 كود
void OnCaptureDone()
{
try {
Trace.WriteLine( "!!DLG: OnCaptureDone" );
toolBarBtnGrab.Enabled = true;
int hr;
if( sampGrabber == null )return;
hr = sampGrabber.SetCallback( null, 0 );
int w = videoInfoHeader.BmiHeader.Width;
int h = videoInfoHeader.BmiHeader.Height;
if( ((w & 0x03) != 0) || (w < 32) || (w > 4096) || (h < 32) || (h > 4096) )
return;
int stride = w * 3;
GCHandle handle = GCHandle.Alloc( savedArray, GCHandleType.Pinned );
int scan0 = (int) handle.AddrOfPinnedObject();
scan0 += (h - 1) * stride;
Bitmap b = new Bitmap( w, h, -stride, PixelFormat.Format24bppRgb, (IntPtr) scan0 );
handle.Free();
savedArray = null;
Image old = pictureBox.Image;
pictureBox.Image = b;
if( old != null ) old.Dispose();
toolBarBtnSave.Enabled = true;}
catch( Exception){}
}


ثم عمل Timer وإضافة الكود التالي فيه لاستمرار عملية التقاط الصورة:
 كود
int hr;
int size = videoInfoHeader.BmiHeader.ImageSize;
savedArray = new byte[ size + 64000 ];


ولإرسال الصورة إلى الطرف الأخر سوف نستخدم method إرسال الصورة ونضعه في Timer وكما يلي:
 كود
try
{
MemoryStream ms = new MemoryStream();
pictureBox.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arrImage = ms.GetBuffer();
ms.Close();
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text), 5020);
server.SendTo(arrImage, iep);
server.Close();}
catch (Exception){}


وهنا يستطيع المحاضر إرسال الصورة عبر الكاميرا إلى طلابه كما سوف يتمكن من رؤية طلابه عبر الكاميرا وسوف نفترض هنا استخدامه لشبكة لا سلكية حيث سيرسل البيانات إلى ال Access Point بأسلوب ال Unicast وسوف يتولا ال Access Point توزيع البيانات إلى جميع الأعضاء المنضمين إلى ال Multicast Group ويرسلها لهم باستخدام ال Broadcast وكما في الشكل التالي:



وكما نلاحظ في الشكل السابق فإن المحاضر ينضم إلى مجموعتين مجموعة الأساتذة وهي 225.100.1.1 حيث سيستقبل صورة طلابه عليها, ومجموعة الطلاب 224.100.0.1 والتي سوف يرسل الصورة إليها .. وكما نلاحظ ايضا فإن عملية الإرسال بين ال Access Point1 وال Access Point2 تتم باستخدام ال Unicast ...

وحتى يستطيع الطلاب رؤية أستاذهم والأستاذ رؤية طلابه , لابد من إنشاء برنامج الاستقبال حيث سنستخدم نفس ال method التي شرحنها سابقا لاستقبال الصورة وللبدء قم بعمل New Form جديد كما في الشكل التالي:



سوف نستخدم ال Namespaces التالية لاستقبال الصورة من ال Multicast Group :

 كود
using System.Net.Sockets ;
using System.Net;
using System.IO;
using System.Threading;



ثم قم بكتابة method الاستقبال كما يلي:

 كود
void Image_Receiver()
{
UdpClient sock = new UdpClient(5020);
sock.JoinMulticastGroup(IPAddress.Parse(textBox1.Text));
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
 
byte[] data = sock.Receive(ref iep);
MemoryStream ms = new MemoryStream(data);
pictureBox1.Image = Image.FromStream(ms);
sock.Close();

}
وحتى نستدعيها لابد من استخدام ال Threading حتى لا يتأثر نظام التشغيل بعملية الاستقبال , وحتى نقوم بذلك قم بعمل Timer وضع فيه الكود التالي لاستخدام ال Threading :

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


وحتى تتمكن من تخزين الصورة الملتقطة عبر الكاميرا على هيئة JPEG Image File قم بإنشاء saveFileDialog واستدعيه كما يلي:

 كود
try
{

saveFileDialog1.Filter = "JPEG Image (*.jpg)|*.jpg" ;
if(saveFileDialog1.ShowDialog() == DialogResult.OK)
{

string mypic_path = saveFileDialog1.FileName;
pictureBox1.Image.Save(mypic_path);
}
}
catch (Exception){}


وهنا قد تم الانتهاء من المشروع الأول وهو ال Video Conference System , وحتى يستطيع المحاضر عرض المحاضرة باستخدام برنامج ال Power Point سوف نقوم بعمل مشروع مؤتمرات سطح المكتب ...

2- Full/Half Duplex Multicast Desktop Conferencing System:

الهدف من هذا المشروع هو تمكين الأستاذ من عرض المحاضرة باستخدام برنامج ال Power Point حيث سترسل صورة سطح المكتب من جهاز الأستاذ إلى أجهزة الطلبة , ولا تختلف عملية الإرسال عن البرنامج السابق في شيء سوى إنشاء Classes لتقوم بالتقاط صورة سطح المكتب ومن ثم إرسالها إلى ال Multicast Group ومن ثم استقبالها وعرضها على الطلاب باستخدام Data Show Projector ...

وهنا مخطط عمل البرنامج



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

ولإنشاء برنامج إرسال صورة سطح المكتب قم بعمل New Form جديد كما في الشكل التالي:



في البداية سوف نقوم بعمل Three Classes لالتقاط صورة سطح المكتب وكما يلي:

أولا PlatFormInvokeGDI32.cs لالتقاط صورة سطح المكتب باستخدام ال GDI+ وال API:

 كود
using System;
using System.Runtime.InteropServices;
namespace SampleGrabberNET
{

//This class shall keep the GDI32 APIs being used in our program.
public class PlatformInvokeGDI32
{

#region Class Variables
public const int SRCCOPY = 13369376;
#endregion

#region Class Functions
[DllImport("gdi32.dll",EntryPoint="DeleteDC")]
public static extern IntPtr DeleteDC(IntPtr hDc);

[DllImport("gdi32.dll",EntryPoint="DeleteObject")]
public static extern IntPtr DeleteObject(IntPtr hDc);

[DllImport("gdi32.dll",EntryPoint="BitBlt")]
public static extern bool BitBlt(IntPtr hdcDest,int xDest,int yDest,int wDest,int hDest,IntPtr hdcSource,int xSrc,int ySrc,int RasterOp);

[DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);

[DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

[DllImport ("gdi32.dll",EntryPoint="SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc,IntPtr bmp);
#endregion

#region Public Constructor
public PlatformInvokeGDI32()
{
}
#endregion
}}




ثانيا PlatformInvokeUSER32.cs إذ سوف نستخدمها مع ال Class السابق لالتقاط صورة سطح المكتب باستخدام ال user32 API :
 كود
using System;
using System.Runtime.InteropServices;
namespace SampleGrabberNET
{
// This class shall keep the User32 APIs being used in our program.
public class PlatformInvokeUSER32
{

#region Class Variables
public const int SM_CXSCREEN=0;
public const int SM_CYSCREEN=1;
#endregion

#region Class Functions
[DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();

[DllImport("user32.dll",EntryPoint="GetDC")]
public static extern IntPtr GetDC(IntPtr ptr);

[DllImport("user32.dll",EntryPoint="GetSystemMetrics")]
public static extern int GetSystemMetrics(int abc);

[DllImport("user32.dll",EntryPoint="GetWindowDC")]
public static extern IntPtr GetWindowDC(Int32 ptr);

[DllImport("user32.dll",EntryPoint="ReleaseDC")]
public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc);

#endregion

#region Public Constructor
public PlatformInvokeUSER32()
{
}
#endregion
}

//This structure shall be used to keep the size of the screen.
public struct SIZE
{
public int cx;
public int cy;
}
}


ثالثا: CaptureScreen.cs والتي سوف نستخدمها بشكل مباشر في البرنامج حيث يتعامل مع الClass PlatFormInvokeGDI32 وال PlatformInvokeUSER32 Class :

 كود
using System;
using System.Drawing;

namespace SampleGrabberNET
{
//This class shall keep all the functionality for capturing the desktop.
public class CaptureScreen
{
#region Public Class Functions
public static Bitmap GetDesktopImage()
{
//In size variable we shall keep the size of the screen.
SIZE size;

//Variable to keep the handle to bitmap.
IntPtr hBitmap;
//Here we get the handle to the desktop device context.
IntPtr hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow());
//Here we make a compatible device context in memory for screen device context.
IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);
//We pass SM_CXSCREEN constant to GetSystemMetrics to get the X coordinates of screen.
size.cx=PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN);
//We pass SM_CYSCREEN constant to GetSystemMetrics to get the Y coordinates of screen.
size.cy=PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CYSCREEN);
//We create a compatible bitmap of screen size using screen device context.
hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);
//As hBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used.
if (hBitmap!=IntPtr.Zero)
{
//Here we select the compatible bitmap in memory device context and keeps the reference to Old bitmap.
IntPtr hOld = (IntPtr) PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap);
//We copy the Bitmap to the memory device context.
PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);
//We select the old bitmap back to the memory device context.
PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
//We delete the memory device context.
PlatformInvokeGDI32.DeleteDC(hMemDC);
//We release the screen device context.
PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC);//Image is created by Image bitmap handle and stored in local variable.
Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
//Release the memory to avoid memory leaks.
PlatformInvokeGDI32.DeleteObject(hBitmap);
//This statement runs the garbage collector manually.
GC.Collect();//Return the bitmap
return bmp;
}//If hBitmap is null return null.
return null;
}
#endregion
}
}


وحتى نستطيع التحكم في حجم الصورة سوف نكتب ال method التالية:

 كود
public Bitmap ResizeBitmap( Bitmap b, int nWidth, int nHeight )
{
Bitmap result = new Bitmap( nWidth, nHeight ); using( Graphics g = Graphics.FromImage( (Image) result ) ) g.DrawImage( b, 0, 0, nWidth, nHeight );
return result;
}


سوف نستخدم ال Namespaces التالية في البرنامج لتعامل مع ال Multicasting :

 كود
using System.Net;
using System.Net.Sockets;
using System.IO;


ثم نقوم بعمل Timer لالتقاط صورة سطح المكتب و إرسالها إلى ال Multicast Group المحدد :

 كود
Bitmap bt = new Bitmap(CaptureScreen.GetDesktopImage());
picScreen.Image = ResizeBitmap(bt, 352, 200 );
MemoryStream ms = new MemoryStream();
picScreen.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arrImage = ms.GetBuffer();
ms.Close();
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text), 5020);
server.SendTo(arrImage,iep);
server.Close();



3- Full/Half Duplex Multicast Text Conferencing System:

وحتى يستطيع الطلبة التحدث إلى الأستاذ باستخدام ال Text Chat Multicast Conference System سوف نقوم بإنشاء New Form جديد وكما في الشكل التالي:



ثم قم بإضافة ال Namespaces التالية:

 كود
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;


سوف نستخدم ال method التالية لإجراء عملية الإرسال حيث سترسل الرسالة عند الضغط على ال Enter بعد كتابة الرسالة في ال Textbox المخصص :

 كود
private void msg_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{if(e.KeyChar == '\r'){
try{
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(txt_host.Text), 9050);
byte[] data = Encoding.ASCII.GetBytes(msg.Text);
server.SendTo(data, iep);
server.Close();
msg.Clear();
msg.Focus();
}catch(Exception){}}}


وسوف نستخدم الميثود التالية لعملية الاستقبال حيث ستعرض الرسالة المستقبلة في list Box مخصص:

 كود
public void server()
{
try
{
UdpClient sock = new UdpClient(9050);
sock.JoinMulticastGroup(IPAddress.Parse(txt_host.Text), 50);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);

byte[] data = sock.Receive(ref iep);
string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
listBox1.Items.Add(iep.Address.ToString() +" :_ "+stringData );
sock.Close();
listBox1.Focus();
msg.Focus();
myth.Abort();
}
catch(Exception){}
}
ولاستدعائها لابد من استخدام ال Threading , قم بعمل Timer واستدعي فيه ال method السابقة باستخدام ال Thread وكما يلي:
 كود
Thread myth;
myth= new Thread (new System.Threading .ThreadStart(server));
myth.Start ();


سوف نشغل ال Timer عند الضغط على زر الاتصال باستخدام timer1.Enabled = true وفي زر إنهاء الاتصال قم بإضافة الكود التالي:

 كود
timer1.Enabled = false;
txt_host.ReadOnly = false;
msg.Enabled=false;
try
{
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(txt_host.Text), 9050);
byte[] data = Encoding.ASCII.GetBytes("has Left the Room");

server.SendTo(data, iep);
server.Close();
msg.Clear();
msg.Focus();

}
catch(Exception){}


وهنا قد تم الانتهاء من الدرس الثالث عشر وفي الدرس التالي سوف نتحدث عن ال Network Security Programming وأساليب تشفير وحماية البيانات واستخدامها في برمجيات الشبكات ...

لتحميل الدرس ونظام المؤتمرات انظر المرفقات :


الملفات المرفقة
 Multicast Conference System.rar ( 1980.05ك ) عدد مرات التنزيل: 851
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,17/ذو الحجة/1426 هـ,05:12 صباحاً
المشاركة #44

الرتبة في المنتدى:ملازم

أيقونة المجموعة

المجموعة: أعضاء فعالين
المشاركات: 198
سجل في:الثلاثاء,15/ذو الحجة/1425 هـ,02:35 مساءً
الدولة:اليمن
رقم العضوية: 1329



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

[DllImport("gdi32.dll")]
private static extern int CreateDC(string lpDriverName, string lpDeviceName, string lpOutput, string lpInitData);
[DllImport("gdi32.dll")]
private static extern int CreateCompatibleDC(int hDC);
[DllImport("gdi32.dll")]
private static extern int CreateCompatibleBitmap(int hDC, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(int hdc, int nIndex);
[DllImport("gdi32.dll")]
private static extern int SelectObject(int hDC, int hObject);
[DllImport("gdi32.dll")]
private static extern int BitBlt(int srchDC, int srcX, int srcY, int srcW, int srcH, int desthDC, int destX, int destY, int op);
[DllImport("gdi32.dll")]
private static extern int DeleteDC(int hDC);
[DllImport("gdi32.dll")]
private static extern int DeleteObject(int hObj);
try
{
const int SRCCOPY = 13369376;
int FW, FH;
int hSDC, hMDC;
int hBMP, hBMPOld;
int r;
//string dirname = clsstartup.arraygeneralsetting[8].ToString()+ @"\Temp\Pic";
hSDC = CreateDC("DISPLAY", "", "", "");
hMDC = CreateCompatibleDC(hSDC);
FW = GetDeviceCaps(hSDC, 8);
FH = GetDeviceCaps(hSDC, 10);
hBMP = CreateCompatibleBitmap(hSDC, FW, FH);
hBMPOld = SelectObject(hMDC, hBMP);
r = BitBlt(hMDC, 0, 0, FW, FH, hSDC, 0, 0, SRCCOPY);
hBMP = SelectObject(hMDC, hBMPOld);
r = DeleteDC(hSDC);
r = DeleteDC(hMDC);
Bitmap imgdesktop = Image.FromHbitmap(new IntPtr(hBMP));
DeleteObject(hBMP);
imgdesktop.Save(dirname, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch(Exception ex)
{
}


أولا : أود أن أعرف هل هناك فرق أم أنهما طريقتان مختلفتان ولا يوجد بينهما فرق مع العلم من أنة جميع الدوال الموجودة هناوالبرمجة تقريبا أنت قمت باستخدامها وأضفت عليها.
ثانيا : ما فائدة تقسيمك الكود إلى ثلاثة كلاسات لماذا لم تسرد البرمجة كاملة في كلاس واحد ومن ثم تفوم باستخدامة ولماذا أستخدمت دوال الـ api (حيث كان أستاذي في الجامعة يجن جنونة عندما أذكر لة دوال api في الـ .net)هل لانة لا يوجد كلاسات في الـ .net تدعم هذا الشيء.

وشكرا




--------------------

الحماس خطوة هامة على الطريق، ولكن التقدم الحقيقي هو نتيجه لتصرف صحيح وبشكل ثابت
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,17/ذو الحجة/1426 هـ,06:04 صباحاً
المشاركة #45

خبير برمجة شبكات ونظم موزعة
الرتبة في المنتدى:رائد

أيقونة المجموعة

المجموعة: مجموعة الخبراء المعتمدين
المشاركات: 506
سجل في:الأحد,28/رمضان/1426 هـ,04:59 صباحاً
الدولة:الأردن
رقم العضوية: 6228



الأخ students بانسبة للكود السابق الذي وضعته في الدرس فهو ليس ابتكاري وإنما مأخوذ عن ال MSDN وطريقة التقسيم هذه مهمة جدا إذ تنظم العمل بشكل كبير مما يزيد من فاعلية البرنامج وتسهيل استخدامه لاحقا حيث فصلنا الكلاسات التي تتعامل مع ال API واستدعيناها باستخدام الكلاس الأخير وكأنك تتعامل مع Based Function في الدوت نيت وهذه الطريقة متبعة في اغلب البرمجيات لتسهيل التعامل مع ادوات ال API في برمجيات اخرى لاحقا , الكود الذي تفضلت بوضعه جيد لاكن قارن اداءه مع اداء الكود الموجود في الدرس وسوف تعرف الفرق ..
واخيرا لا مناص من استخدام ال API في جميع للغات البرمجة التي تعتمد على نظام التشغيل Windows وهو ماسهل على المبرمجين بشكل كبير جدا فمثلا لست مضطرا لبرمجة الاف الأكواد لتشغيل ملف صوت إذ سوف تطر في عدم استخدام ال API إلى كتابة الاف من الأكواد لتعامل مع كرت الصوت والبورت ونظام العرض و و و و ...
وهو ما عمل ثورة حقيقية في عالم البرمجة وظهرت هذه الدوال بعد اصدار مايكروسوفت نظام التشغيل Windows 95 حيث وجدت الحاجة لوجود قاعدة يعتمد عليها المبرمجين لتعامل مع ال Hardware في الكمبيوتر وعندها اصدرت ال DirectX ...

اعتذر عن الإطالة وارجو ان اكون قد وصلت الفكرة
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالاثنين,17/ذو الحجة/1426 هـ,06:49 صباحاً
المشاركة #46

الرتبة في المنتدى:ملازم

أيقونة المجموعة

المجموعة: أعضاء فعالين
المشاركات: 198
سجل في:الثلاثاء,15/ذو الحجة/1425 هـ,02:35 مساءً
الدولة:اليمن
رقم العضوية: 1329



أشكرك أخ فادي والحمد لله وصلت الفكرة


--------------------

الحماس خطوة هامة على الطريق، ولكن التقدم الحقيقي هو نتيجه لتصرف صحيح وبشكل ثابت
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالجمعة,28/ذو الحجة/1426 هـ,01:51 مساءً
المشاركة #47

خبير برمجة شبكات ونظم موزعة
الرتبة في المنتدى:رائد

أيقونة المجموعة

المجموعة: مجموعة الخبراء المعتمدين
المشاركات: 506
سجل في:الأحد,28/رمضان/1426 هـ,04:59 صباحاً
الدولة:الأردن
رقم العضوية: 6228



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

الدرس الرابع عشر: Network Security Programming:

تتلخص الفكرة من الأمن بحماية البيانات من الدخول غبر المخول unauthorized Access
باستخدام عدة أساليب وأهمها :

-Data Encryption & Decryption التشفير وفك التشفير
-Authentications التحقق من هوية الشخص مرسل الرسالة
-Set Policies & Permissions تحديد وتنفيذ السياسات و الصلاحيات

دعمت في الدوت نيت جميع أساليب الحماية التي ذكرناها سابقا باستخدام ال Security Namespaces والتي تحتوي على مجموعة ضخمة من المكتبات الفرعية وهي كما في الشكل التالي



أولا : Cryptography Namespace Overview :

Cryptography in .NET: وهي المكتبة التي تهتم بكل ما يخص عمليات تشفير وفك تشفير البيانات من Clear Text إلى Cipher Text وبالعكس وتستخدم بشكل أساسي لتشفير البيانات قبل عملية الإرسال وفك تشفيرها عند الاستلام , ونستطيع تقسيم طرق التشفير فيها إلى ثلاثة أقسام رئيسية هي:

A- Symmetric algorithms: الأسلوب المتماثل وفيه يستخدم المفتاح السري ذاته لعملية التشفير وفك التشفير وهي طريقة سريعة لإجراء عملية التشفير وفك التشفير لا كنها ليست آمنة كطريقة الغير المتماثلة ودعمت الدوت نيت التشفير المتماثل بمجموعة من ال Classes Algorithms وهي:

- الكلاس الذي يدعم التشفير باستخدام الDES-Data Encryption Standard :
DESCryptoServiceProvider
- الكلاس الذي يدعم RC2 Algorithms : RC2CryptoServiceProvider
- الكلاس الذي يدعم Algorithms Rijndael Managed : RijndaelManaged

الطريقة المعتادة في التشفير بالأسلوب المتماثل هي تشفير الرسالة وإرسالها عبر الشبكة لاكن باستخدام هذه الطريقة فإن نسبة الخطأ التي قد تكون عالية جدا وقد نفقد بعض هذه البيانات مما يؤدي إلى فقد الرسالة أو قد تسرق وتجرى عليها عمليات لمحاولة فك الشيفرة ناهيك عن الحجم الهائل التي قد تحجزه من ال Network Bandwidth ..وتم حل هذه المشكلة بجعل عملية التشفير تتم على مستوى ال Stream نفسه ويستخدم لهذه العملية ال CryptoStream Class حيث يتم استخدام مفتاحين لتشفير مفتاح التشفير Encryption Kay ومفتاح لفك التشفير IV Installation Victor Decryption ويشترط استخدام نفس المفتاحين في عملية التشفير وفك التشفير ويستخدم الكلاس السابق مع ال MemoryStream أو FileStream حيث نمرر له ال Stream Data ونوع التشفير سواء DES أو TripleDES أو RC2 , وكمثال سوف نستخدم ال TripleDES إذيجب أن يتكون كلا المفتاحين من 16 Bits ...

 كود
Symmetric Stream Encryption Example:

byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};

string phrase = msg.Text;
MemoryStream ms = new MemoryStream();
 
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
CryptoStream csw = new CryptoStream(ms,tdes.CreateEncryptor(Key, IV), CryptoStreamMode.Write);

csw.Write(Encoding.ASCII.GetBytes(phrase), 0, phrase.Length);
csw.FlushFinalBlock();

byte[] cryptdata = ms.GetBuffer();

textBox1.Text=Encoding.ASCII.GetString(cryptdata, 0, (int)ms.Length);

 كود

Symmetric Stream Decryption Example:

byte[] Keyy = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
byte[] IVv = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};

ms.Position = 0;
byte[] data = new byte[1024];

CryptoStream csr = new CryptoStream(ms,tdes.CreateDecryptor(Keyy, IVv),CryptoStreamMode.Read);

int recv = csr.Read(data, 0, data.Length);
string newphrase = Encoding.ASCII.GetString(data, 0, recv);
textBox1.Text=newphrase;



في برمجيات الشبكات نقوم في البداية بتشفير البيانات المرسلة باستخدام أي من الأساليب السابقة لتشفير ثم نحول البيانات المشفرة إلى Stream لإرسالها عبر ال Socket باستخدام ال Network Stream , ثم يقوم الطرف المستقبل باستقبال الرسالة باستخدام ال Network Stream عبر ال Socket , عملية فك التشفير تكون كما هي الخوارزمية المستخدمة ثم تحمل الرسالة إلى ال memory stream وتخزن في Byte Array عندها يمكن أن تحول إلى رسالة مرة أخرى وكما في الشكل التالي:



B- Asymmetric algorithms: الأسلوب الغير متماثل وهو أكثر أمانا من الأسلوب المتماثل إذ تشفر البيانات باستخدام مفتاح عام Public Kay ولفك التشفير يستخدم مفتاح خاص Private Kay ويكون هناك علاقة بين المفتاحين ويستخدم 128 Bits لتشفير وهو أفضل أساليب التشفير للبيانات ودعمت الدوت نيت التشفير الغير متماثل والذي يدعم تشفير المفتاح الخاص Private Kay باستخدام Tow Algorithms Classes وهي:

- DSACryptoServiceProvider for Digital Signature Algorithm
التواقيع الرقمية :والهدف منها التحقق من هوية الشخص مرسل الرسالة وكمثال يقوم المرسل بتوليد ملخص لرسالة باستخدام الHash Function وبعد ذلك يقوم بتشفير ملخص الرسالة الذي تم توليده لتكوين المفتاح الخاص والذي سيستخدم كتوقيع رقمي للمرسل ثم يرسل المفتاح العام مع الرسالة, أما بما يتعلق بالمستلم فيقوم بفك تشفير الملخص باستخدام المفتاح العام ويجب أن يتم ذلك باستخدام نفس الخوارزمية التي اتبعها المرسل في تشفير الملخص, فإذا كان ملخص الرسالة التي ولدها المستلم هي نفسها التي ولدها المرسل عندها يتحقق من أن الشخص مرسل الرسالة هو نفسه .
في البداية سوف ننشئ instance من ال DSACryptoServiceProvider لتوليد المفتاح العام والخاص ثم نكون ال Hash sign Value ونخزنه في Byte Array ولفحصه نولد hash sign value جديد ونقارنه بالسابق فإذا تشابها عندها نقرر أن الشخص هو نفسه صاحب الرسالة المرسلة وكما يلي:

 كود

using System;
using System.Security.Cryptography;

class DSACSPSample
{

static void Main()
{
try
{
//Create a new instance of DSACryptoServiceProvider to generate
//a new key pair.
DSACryptoServiceProvider DSA = new DSACryptoServiceProvider();

//The hash value to sign.
byte[] HashValue = {59,4,248,102,77,97,142,201,210,12,224,93,25,41,100,197,213,134,130,135};
//The value to hold the signed value.
byte[] SignedHashValue = DSASignHash(HashValue, DSA.ExportParameters(true), "SHA1");

//Verify the hash and display the results.
if(DSAVerifyHash(HashValue, SignedHashValue, DSA.ExportParameters(false), "SHA1"))
{Console.WriteLine("The hash value was verified.");}
else
{Console.WriteLine("The hash value was not verified.");}}
catch(ArgumentNullException e)
{Console.WriteLine(e.Message);}
}
public static byte[] DSASignHash(byte[] HashToSign, DSAParameters DSAKeyInfo, string HashAlg)
{
try
{
//Create a new instance of DSACryptoServiceProvider.
DSACryptoServiceProvider DSA = new DSACryptoServiceProvider();

//Import the key information.
DSA.ImportParameters(DSAKeyInfo);

//Create an DSASignatureFormatter object and pass it the
//DSACryptoServiceProvider to transfer the private key.
DSASignatureFormatter DSAFormatter = new DSASignatureFormatter(DSA);

//Set the hash algorithm to the passed value.
DSAFormatter.SetHashAlgorithm(HashAlg);

//Create a signature for HashValue and return it.
return DSAFormatter.CreateSignature(HashToSign);
}
catch(CryptographicException e)
{Console.WriteLine(e.Message);return null;}
}

public static bool DSAVerifyHash(byte[] HashValue, byte[] SignedHashValue, DSAParameters DSAKeyInfo, string HashAlg)
{
try
{
//Create a new instance of DSACryptoServiceProvider.
DSACryptoServiceProvider DSA = new DSACryptoServiceProvider();

//Import the key information.
DSA.ImportParameters(DSAKeyInfo);

//Create an DSASignatureDeformatter object and pass it the
//DSACryptoServiceProvider to transfer the private key.
DSASignatureDeformatter DSADeformatter = new DSASignatureDeformatter(DSA);

//Set the hash algorithm to the passed value.
DSADeformatter.SetHashAlgorithm(HashAlg);

//Verify signature and return the result.
return DSADeformatter.VerifySignature(HashValue, SignedHashValue);
}
catch(CryptographicException e){Console.WriteLine(e.Message);return false;}}}


- RSACryptoServiceProvider
ويستخدم في إجراء التشفير وفك التشفير الغير متماثل وهو non inherited Class في البداية سوف ننشئ instance جديد من ال RSACryptoServiceProvider وذلك لتوليد المفتاح العام والخاص ونرفق المفتاح العام مع الرسالة ومن ثم يقوم المستلم بفك الرسالة باستخدام المفتاح الخاص وتتم كما في الشكل التالي:



وهنا مثال توضيحي لطريقة التشفير وفك التشفير باستخدام ال RSA Algorithm :

 كود

using System;
using System.Security.Cryptography;
using System.Text;

class RSACSPSample
{

static void Main()
{
try
{
//Create a UnicodeEncoder to convert between byte array and string.
UnicodeEncoding ByteConverter = new UnicodeEncoding();

//Create byte arrays to hold original, encrypted, and decrypted data.
byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
byte[] encryptedData;
byte[] decryptedData;

//Create a new instance of RSACryptoServiceProvider to generate
//public and private key data.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

//Pass the data to ENCRYPT, the public key information
//(using RSACryptoServiceProvider.ExportParameters(false),
//and a boolean flag specifying no OAEP padding.
encryptedData = RSAEncrypt(dataToEncrypt,RSA.ExportParameters(false), false);

//Pass the data to DECRYPT, the private key information
//(using RSACryptoServiceProvider.ExportParameters(true),
//and a boolean flag specifying no OAEP padding.
decryptedData = RSADecrypt(encryptedData,RSA.ExportParameters(true), false);

//Display the decrypted plaintext to the console.
Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData));
}
catch(ArgumentNullException) {Console.WriteLine("Encryption failed.");}
}


ننشئ الميثود التي ستقوم بتشفير الرسالة:

 كود

static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
try{
//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

//Import the RSA Key information. This only needs
//to include the public key information.
RSA.ImportParameters(RSAKeyInfo);

//Encrypt the passed byte array and specify OAEP padding.
//OAEP padding is only available on Microsoft Windows XP or
//later.
return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}
//Catch and display a CryptographicException
//to the console.
catch(CryptographicException e){Console.WriteLine(e.Message);return null;}
}


ننشئ الميثود التي ستقوم بفك تشفير الرسالة:

 كود

static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo,bool DoOAEPPadding)
{
try
{
//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Import the RSA Key information. This needs
//to include the private key information.
RSA.ImportParameters(RSAKeyInfo);

//Decrypt the passed byte array and specify OAEP padding.
//OAEP padding is only available on Microsoft Windows XP or
//later.
return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
}
//Catch and display a CryptographicException
//to the console.
catch(CryptographicException e){Console.WriteLine(e.ToString());return null;}
}}


C- Hashing algorithms: وهو أقوى الأساليب البرمجية لتشفير البيانات إذ يستخدم فيه algorithm 512 bits كحد أقصى بدلا من 128 bits باستخدام Message Digest Algorithms MAC وهنا لن تستطيع فك تشفير الرسالة وإرجاعها إلى حالتها السابقة ويستخدم بشكل أساسي لتوليد ال Passwords وفي توليد التواقيع الرقمية Digital Signature وفي اغلب الحالات تستخدم لتخزين كلمة المرور Password في ال Database بشكل امن.
ويستخدم ال SHA1Managed و ال SHA256Managed وال SHA384Managed وال SHA512Managed لتعريف Hash Object ومنه نستخدم ال ComputeHash Method لتوليد ال hash code وتخزينه في byte Array وكما يلي كمثال:

 كود

SHA1Managed shaM1 = new SHA1Managed ();
byte[] my_kay1= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code");
byte[] hashed_kay1 = shaM1.ComputeHash(my_kay1);
MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay1));

SHA256Managed shaM2 = new SHA256Managed();
byte[] my_kay2= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code");
byte[] hashed_kay2 = shaM2.ComputeHash(my_kay2);
MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay2));

SHA384Managed shaM3 = new SHA384Managed ();
byte[] my_kay3= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code");
byte[] hashed_kay3 = shaM3.ComputeHash(my_kay3);
MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay3));

SHA512Managed shaM4 = new SHA512Managed ();
byte[] my_kay4= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code");
byte[] hashed_kay4 = shaM4.ComputeHash(my_kay4);
MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay4));


ثانيا: Permission Namespace Overview :

وتدعم ال Permission Namespace في الدوت نيت ثلاثة أنواع من الصلاحيات وهي ال Socket permissions وال Identity Permissions وال Role- based permissions ...

Socket Permission: وتمكنك من تحديد صلاحيات استخدام ال Socket في برمجيات الشبكات باستخدام SocketPermission و SocketPermissionAttribute ضمن ال System.Net وال System.Security.Permissions Namespaces وكمثال نستطيع منع Client Host Address معين من الاتصال مع ال Listener Application , ويتم ذلك بتعريف Attribute SocketPermission نحدد فيها نوع العملية وال Access Kind و عنوان ال Host الذي سيطبق عليه ال Permission ورقم ال Port ونوع ال Transport سواء موجه أو غير موجه TCP أو UDP.

نريد في هذا المثال منع اتصال ال127.0.0.1 Address loopback بال Socket عبر جميع ال Ports وبغض النظر عن نوع ال Socket المستخدم.

 كود
[SocketPermission(SecurityAction.Deny, Access="Connect", Host="127.0.0.1",Port="All", Transport="All")]


يمكننا ال object SecurityAction من تحديد نوع العملية التي نريدها وكما يلي:



Assert: وتعني السماح Client Host معين من إجراء عملية محددة
Demand: وتعني تطبيق الصلاحيات على جميع ال Classes التي تقع في منطقة ال Stack أعلى ال Defined Abstract
Deny: وتعني منع ال Client Host من إجراء عملية معينة.
InheritanceDemand : وفيها تطبق الصلاحيات على ال Class الذي سيرث ال Class الحالي.
PermitOnly: وفيه يمنع جميع ال Access عدا ال Client User المحدد.
...

وفي الAccess property نحدد نوع عملية المنع أو السماح وتأخذ خيارين هما :

Accept لمنع أو السماح ل Client Socket من عمل Binding مع ال IP Address و ال Port المحدد.
Connect لمنع أو السماح ل Client Socket من عمل connect مع ال Remote Host المحدد.

في ال Host وال Port نحدد عنوان ال Host الذي سيطبق عليه ال Permission و رقم ال Port التي يتصل بها ( في ال Port property نستطيع تمرير كلمة all لدلالة على تطبيق الصلاحية على جميع ال Ports )

وأخيرا نحدد ال Transport property والتي سنعرف فيها نوع ال Socket المستخدم وتأخذ الخيارات التالية:
All بدون تحديد نوع ال Socket إذ تطبق هذه ال Permession على جميع ال Socket Types.
Connectionless إذا كانت ال Socket تستخدم Datagram Protocols وكمثال بروتوكول UDP.
ConnectionOriented إذا كانت ال Socket تستخدم Oriented Protocols وكمثال بروتوكول TCP.
TCP إذ تستطيع تحديده مباشرة.
UDP إذ تستطيع تحديده مباشرة.

سيكون الدرس التالي حسب طلب الأعضاء


الملفات المرفقة
 Security.rar ( 78.84ك ) عدد مرات التنزيل: 700
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالجمعة,26/محرم/1427 هـ,11:59 صباحاً
المشاركة #48

الرتبة في المنتدى:رقيب

أيقونة المجموعة

المجموعة: الأعضاء
المشاركات: 6
سجل في:الأحد,07/محرم/1427 هـ,08:00 صباحاً
الدولة:اليمن
رقم العضوية: 8042



السلام عليكم

أخي الفاضل : فادي ,,, لك جزيل الشكر و الإمتنان على هذه الدروس الراااائعه و على نفسك الطيبه و الكريمه المعطائه

لي طلب ألا وهو : أتمنى أن يكون الدرس القادم عن كيفية إرسال الصوت من الClient إلى ال Server ؟؟؟
مثلاً في برنامج زي الماسنجر !!

لك جزيل الشكر ,,, أطيب المُنى
أخوك : الوفي دومـاً


--------------------
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالجمعة,26/محرم/1427 هـ,03:26 مساءً
المشاركة #49

خبير برمجة شبكات ونظم موزعة
الرتبة في المنتدى:رائد

أيقونة المجموعة

المجموعة: مجموعة الخبراء المعتمدين
المشاركات: 506
سجل في:الأحد,28/رمضان/1426 هـ,04:59 صباحاً
الدولة:الأردن
رقم العضوية: 6228



انشاء الله سيكون هذا هو الدرس التالي وقد احتاج بعض الوقت لتجهيزه لما فيه من تعقيد بعض الشيء لاكن انشاء الله سأحاول تيسيره قدر الإمكان , تستطيع الرجوع إلى المشاركة التالية مؤقتا إلى حين الإنتهاء من اعداد الدرس
http://www.arabmoheet.net/forum/default.asp?codepage=3&topic_no=4072&page=3&#entry22079

واهلا وسهلا بك
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالثلاثاء,21/فر/1427 هـ,04:56 مساءً
المشاركة #50

خبير برمجة شبكات ونظم موزعة
الرتبة في المنتدى:رائد

أيقونة المجموعة

المجموعة: مجموعة الخبراء المعتمدين
المشاركات: 506
سجل في:الأحد,28/رمضان/1426 هـ,04:59 صباحاً
الدولة:الأردن
رقم العضوية: 6228



انتظروا الفصل الخاص بالـVoice Over IP Programming والذي سيتم إضافته غدا بمشيئة الله ...




للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة

    

عدد المتصفحين لهذا المنتدى «1»: (الضيوف «1» - المتخفون «0»)
الأعضاء «0»: .

عدد الصفحات : 9  « < 1  2  3  4  5  6  7  8  9   > » إضافة رد جديد إضافة موضوع جديد



 
الوقت الأن:اليوم,01:44 صباحاً بتوقيت القدس المحتلة

Powered By arabmoheet v3.1

منتديات المحيط العربي  -  راسلنا  -   أعلى
X   رسالة المنتدى
(سوف يتم اغلاق هذه النافذة بعد 2 ثانية)
X   رسالة المنتدى
(سوف يتم اغلاق هذه النافذة بعد 2 ثانية)