كيف نبرمج Proxy Server؟ من البداية حتى النهاية - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : الاقسام الاخرى (http://vb4arb.com/vb/forumdisplay.php?fid=74) +--- قسم : قسم المقالات العام (http://vb4arb.com/vb/forumdisplay.php?fid=85) +--- الموضوع : كيف نبرمج Proxy Server؟ من البداية حتى النهاية (/showthread.php?tid=7954) |
كيف نبرمج Proxy Server؟ من البداية حتى النهاية - 3amo - 14-03-13 السلام عليكم ورحمة الله وبركاته
أهلا بكم أحبتي في الله
بعد أن تطرقت بالشرح لمبدأ عمل الـ Proxy Switcher في سين جيم
حول الـ Proxy Server سأمر اليوم بحول الله للجانب التطبيقي و أبدأ بأول تطبيق و هو حول الإعداد و التنصت و الرد . أي أننا سنرى كيف نعد البرنامج ليصبح Proxy Switcher ثم نرى الجزء الأول و هو جزء التنصت على الطلبات و نظهر فحواها. بالإضافة إلى طريقة الرد على المتصفحات.
اخترت استعمال الـ Socket لأنها بسيطة و متوفرة في كل اللغات تقريبا بالإضافة إلى أنه يمكن استعمالها عن طريق API التي يوفرها Windows رغم أن هناك كلاسات خاصة في VB تسمح لي بالتنصت على نوع معين من أنواع الاتصالات. هذا بالإضافة أن الـ Socket تمكنني من تلقي كل أنواع الاتصالات عكس الأنواع المخصصة التي يختص كل واحد منها في نوع معين.
غير أنه لا يمنعنا لاحقا من استعمال نوع معين فقط مثل httprequest حين نريد تصميم برنامج حماية من المواقع غير المرغوبة لسبيين هما أن التصفح عادة يتم باستعمال البروتوكول http أوhttps و بالتالي سيكفينا النوع httprequest و سيوفر لنا الكثير من البيانات المفصلة مثل العنوان، نوع الاتصال، الضغط، الحجم، المتصفح، الكوكيز...إلخ عكس الـ socket التي ستعطينا ما تم إرساله أو استقباله بشكل نص واحد يصعب تفسيره و فصله و بالتالي تصعب معالجته.
لكن كما قلنا سنبدأ فقط باستعمال الـ Socket بشكل مبسط فقط لهضم الفكرة و معرفة كيف تعمل الأشياء
نبدأ بتصميم واجهة بسيطة تمكننا من:
إذن فواجهتنا ستكون بالشكل التالي:
[ATTACH=CONFIG]1960[/ATTACH]
كما هو ملاحظ فالواجهة بسيطة تبدأ بزر التعطيل "معطل" لأنه لا يوجد شيء في البداية.الآن ننتقل لأهم خطوات الكود و كما قلنا سنستخدم الـ Threading في التنصت و المعالجة. و هنا السؤال: لماذا لا أبدأ في التنصت من البرنامج الرئيسي مباشرة من البرنامج الرئيسي؟
الجواب: لسبب بسيط جدا و هو أن عملية التنصت ستكون حلقة لا نهائية كما أنها هي عملية توقف أي شيء آخر أثناء التنصت و بالتالي سيستحيل علي ضغط زر أو إيقاف العملية. لكن حين نعمل Thread فرعي فيمكنني قتله أو توقيفه مؤقتا كما يمكنني التفاعل مع الواجهة من دون انتظار انتهاء تنصت لأنني سأعمل على التوازي و ليس على التسلسل.
لائحة إظهار الاتصالات listResult في VB.Net في الحالة التلقائية. الثريدات الفرعية لا يمكنها تغيير خصائص المكونات الرسومية التي ينشؤها thread آخر بما فيها مكونات النافذة. لكننا نريد من ثريدات المعالجة أن يكتب لنا محتوى كل اتصال داخل الـ ListBox و بالتالي سيقع مشكل لأنها ممنوعة من ذلك. لكن يمكننا السماح لها بالتعامل مع المكونات و تغيير خصائصها بان نطلب من البرنامج تجاهل ايقاف الثريدات الفرعية من التغيير على المكونات الرسومية. الآن أضع أسماء المكونات و أنواعها مربع نص لكتابة الايبي txtIP مربع نص لكتابة الـمنفذ txtPort زر التفعيلbtnEnable زر التعطيلbtnDisable نمر للكود البرمجي لكل حالة مع الشرح المتغيرات و الإعدادات العامة اتفقنا أنه يلزمنا استعمال الـ Socket و يلزمنا استعمال الـ Threads . بالإضافة إلى حاجتنا لاستعمال الريجيستري .لذا في لغات الدوت نت سيلزمنا إضافة الريفيرنسات اللازمة لذلك كود : [COLOR=#000000][FONT=arabic transparent][COLOR=#000000][FONT=arabic transparent][COLOR=#000000][FONT=arabic transparent][FONT=courier new][SIZE=2][FONT=courier new][SIZE=2][FONT=courier new][SIZE=2]Imports System.Net يلزمنا الآن أن نصرح بمتغير ListeningThread من نوع Thread و ظيفيته التنصت حيث سنربطه لاحقا مع إجراء التنصت لينفذه بشكل لانهائي و متوازي مع البرنامج الرئيسي. يلزمنا أيضا Socket من نوع TcpListener لكي نوضفها في إجراء التنصت. و قد جعلناها متغيرا عاما لأننا نحتاج لإيقاف التنصت حين نضغط على زر التعطيل. فلو جعلناها متغيرا محليا في إجراء التنصت لن يكون بإمكاننا إيقاف التنصت من زر الإيقاف لأنه لن يستطيع الوصول إلى المتغيرات المحلية لإجراء آخر. و بالتالي لن نتمكن من تحرير المنفذ ليستعمل مرة أخرى. كما يلزمنا أيضا أن نفتتح النافذة الرئيسية باعلان السماح للثريدات الفرعية بالتعامل مع المكونات الرسومية للنافذة ( نقصد بالتحديد القدرة على إضافة أسطر في لائحة إظهار الإتصلات). إقتباس :[SIZE=2]'Declarer les variables globales التفعيل و التعطيل
لنبدأ مع أول زر و هو الزر btnEnable وظيفته هي:
إقتباس :[SIZE=2]Private Sub btnEnable_Click(ByVal sender As System.Object, _[/SIZE]أما الزر btnDisable أولا. فوظيفته هي:
إذن سيكون كوده كالآتي: إقتباس :[SIZE=2]Private Sub btnDisable_Click(ByVal sender As System.Object, _[/SIZE]هذه هي إعدادات تفعيل و تعطيل البروكسي سيرفر و هي عادة لا تكون من إعدادات البرنامج الاعتيادية إذ يكفي أن تضاف في أول مرة عند التثبيت و تزال عند إزالة التثبيت أو تضاف في قائمة الإعدادات لتغيير المنفذ أو الـ IP حين يريد الإستعمال ذلك. لو جعلناها كذلك فيجب أن نضع الكود الخاص بإنشاء الـ Thread و إطلاقه و إنهائه في البرنامج الرئيسي إذ يجب أن يتم إطلاقه عند تشغيل الجهاز/ البرنامج و ينتهي بإغلاقه. التنصت
عندما ينطلق الـ Thread الخاص بالتنصت فإنه سينفذ إجراء التنصت الذي أسميناه سابقا ProxyListen. هذا الإجراء اتفقنا أنه إجراء لا نهائي بين التنصت و انشاء thread فرعي لكل طلب يردنا و إطلاقه. إذن فبالتأكيد سيكون هناك حلقة تكرارية من نوع While True أو في لغات أخرى Repeat Until False. أما التنصت فيحتاج إلى Socket و لنحدد أكثر يجب أن تكون من نوع TcpListener لأنها تفي بالغرض لكنها لن تلاحظ الطلبات التي تأتي من البرامج التي تستعمل البروتوكول Udp على غرار برامج التورنت فهنا سيلزمني UdpListener. إذن عمليا إجراء التنصت يسكون كما يلي:
[TABLE] [TR] [TD="bgcolor: #ff9900"]دالة جانبية[/TD] [/TR] [TR] [TD] في VB.Net الـ IP الذي نمرره للـ TcpListenerيجب أن يكون من نوع IPaddress الذي بدوره يحتاج إلى الـ IP بشكل جدول بايتات و ليس بشكل جملة أي أن القيمة 127.0.0.1 يجب أن تمرر بشكل جدول بايتات فيه 4 خانات فيها على التوالي: 127 ثم 0 ثم 0 ثم 1. لفعل هذا الأمر سننشئ دالة نسميها GetIP مثلا تحول الجملة إلى جدول بايتات و ذلك بالشكل التالي:
[/TD] [/TR] [/TABLE] إقتباس :[SIZE=2]Private [SIZE=3]Function GetIP(ByVal ipString As String) As Byte() إذن فكود الإجراء ProxyListen سيكون بالشكل: إقتباس :[SIZE=2]Private Sub ProxyListen() معالجة الطلبات
بالنسبة للكود السابق كله مشترك بين كل البرامج و متشابه لأنه لا يقوم بأي عمل عدى استقبال الطلبات. أما كود المعالجة فهو الذي يحدد عمل البرنامج.
في برنامجنا هذا سنجعل كود المعلجة بسيطا جدا يقوم بوظيفتين هما:
إذن الكود html الذي سنعيده سيكون بالشكل التالي:
[TABLE="align: center"] [TR] [TH="bgcolor: red, align: center"]HTML[/TH] [/TR] [TR] [TD][SIZE=2]<html> <header> <title>Startimes proxy</html> </header> <body> <h1>Hello World</h1> </body> </html>[/TD] [/TR] [/TABLE] [/SIZE] و هنا بدل أن يتصل المتصفح و يحصل على html خاص بصفحة ما فسوف يصله كود html الذي سنعيده له و بدل أن يظهر محتوى موقع google مثلا سيظهر محتوى الصفحة التي انشأناها له. [TABLE] [TR] [TD="bgcolor: #ff9900"]دالة جانبية[/TD] [/TR] [TR] [TD]مع الـ Socket لا نتعامل بالجمل النصحية بل نتعامل بجداول البايتات. و لهذا وجب تحويل الكود html إلى جدول بايتات قبل إرساله. و عند استقبال طلب يجب تحويله إلى جملة أيضا. لفعل ذلك يجب أن نكتب دالتين هما StringToBytes و BytesToString بالشكل التالي:[/TD] [/TR] [/TABLE] إقتباس :[SIZE=2][SIZE=2]Private [SIZE=3]Function BytesToString(ByVal buffer() As Byte) As String إقتباس :[SIZE=2]Private [SIZE=3]FunctionStringToBytes(ByVal s As String) As Byte() إذن كود الإجراء ProxyExecute الذي يقبل باراميترا هو الـ Socket التي سيتعامل معها ينفذ الخطوات التالية:
بلغة الـVB.Net نترجم الأمر بالشكل التالي:
إقتباس :[SIZE=2]Private Sub ProxyExecute(ByVal request As Socket) التنفيذ
نصل أخيرا لمرحلة التنفيذ فالآن نشغل البرنامج بوضع المدير لأنه سيتطلب ذلك من أجل التعديل على الريجيستري ثم نضغط زر التفعيل.
بعدها نفتح متصفحا و نكتب www.google.com مثلا أو نحاول تصفح موقع أو الضغط على رابط ما سنرى النتائج التاليةعلى مستوى المتصفحات (Internet Explorer, FireFox,Safari,Chrom,Opra) [ATTACH=CONFIG]1961[/ATTACH]
على مستوى البرنامج[ATTACH=CONFIG]1962[/ATTACH] قبل الإغلاق تأكدوا من تعطيل البروكسي حتى يعيد كل شيء كما كان سابقا. في مثالنا لم أهتم بما يريده المتصفح و قمت بارجاع نتيحة له مباشرة. في البرامج الحقيقية نقوم بالرد على المتصفح بعد دراسة طلبه عن طريق معرفة ماذا يريد فإن كان مثلا يريد موقعا ممنوعا نوجه له رسالة أو نوجهه لموقع آخر أو يمكننا أن نمرر الطلب للنت و نعيد له النتيجة الحقيقية أو مع التعديل. في الختام أتمنى أنكم استفدتم أستودعكم الله الذي لا تضيع ودائعه و السلام عليكم و رحمة الله و بركاته موضوع منقول من منتديات ستار تيمز لللاستاذ [b]Samir_Aloui [/b] كيف نبرمج Proxy Server؟ من البداية حتى النهاية - <br> - 14-03-13 ياأخي ماذا أقول والله ابدعت انت ايضاً جزاك الله عنا خير الجزاء وجزاء الخير وجعله في ميزان حسناتك ياأخي العزيز أخي ارجوا منك "فضلاً لا أمراً " أن ترفق أيضاً لو تكرمت اكواد c# وجزاك الله خيراً انا متابع إن شاء الله وشكرا إلك مرة اخرى كيف نبرمج Proxy Server؟ من البداية حتى النهاية - 3amo - 14-03-13 إقتباس :ياأخي ماذا أقول والله ابدعت انت ايضاً جزاك الله عنا خير الجزاء وجزاء الخير وجعله في ميزان حسناتك ياأخي العزيزبارك الله فيك وزادك من علمه حاول اخي العزيز تحويل الاكواد من vb.netالى c# وهذا الموقع يتيح لك تحويل الاكواد الى كلتا اللغتين http://www.developerfusion.com/tools/convert/vb-to-csharp/?batchId=3e8b9914-2337-4a86-8650-91fd7865fe0e ونرجوا من احد الاعضاء تعديل الكود لc# بالتوفيق كيف نبرمج Proxy Server؟ من البداية حتى النهاية - shaker.soft - 25-05-13 شكرا ............. |