PDA

View Full Version : تعلّم Csharp



zied toumi
10-17-2013, 17:36
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

إنشاأ الله عيدكم مبروك و كل عام و أنتم بألف خير
أتوجّه إليكم بهذا الرّابط لكلّ من يريد أن يتعلّم #c
http://www.kutub.info/library/book/11488

ismail1992
10-17-2013, 23:45
سلام عليكم شكرا أخي العزيز على هدا كتاب المفيد في لغة سي شارب

salim telecom
10-18-2013, 00:38
السلام عليكم أخي الكريم شكرا لك اخي الكريم بارك الله فيك كتب جميل و انا كمهندس قد أعجبني
و الله أعلم و الله الموفق

feres007
10-18-2013, 15:24
شكرا على الكتاب القيم حقا انه مفيد
وارجو منك ان تضيف كتب اخرى في هدا المجال

rikisabri
10-18-2013, 16:00
السلام عليكم ورحمة االه و بركاته مشكور اخي الكريم على هده المعلومات
انل شخصيا استفدت منه فبالتوفيق لك وللجميع.
السلام

zied toumi
10-18-2013, 17:10
السلام عليكم ورحمة االه و بركاته, هذا كتاب آخر
http://www.rofof.com/11p8i721/DotNet_2008.html

---------- Post added at 02:10 PM ---------- Previous post was at 01:40 PM ----------

بسم الله الرحمن الرحيم
سأبدأ بإذن الله شرح لغة السى شارب فى إطار الدوت نت
و سيكون الشرح للمبتدئين أو مرجعا للمحترفين بإذن الله
و سأقوم بالشرح على Visual Studio 2005
و طبعا ممكن تستخدم الفيجوال سى شارب 2003 أو 2005
و سأضع الدروس بإذن الله بمعدل درس كل يومين أو درسين فى الأسبوع فى حالة انشغالى

zied toumi
10-18-2013, 17:13
نبدأ على بركة الله الدرس الأول و هو طبعا للمبتدئين فقط
كيفية التعامل مع البرنامج

حنفتح برنامج ال Microsoft Visual Studio و ندوس File و New و Project
و بعد كده نختار من القائمة Visual C# اختيار Windows و نختار Windows Application كما بالصورة
8147

zied toumi
10-18-2013, 17:15
و طبعا ممكن نغير مسار الملفات بتاعت المشروع عن طريق تغيير ال Location كما بأسفل الصورة
و نضغط أوكى
حيظهرلنا صفحة مقسمة إلى 3 أجزاء رئيسية
الميمنة و هى تحتوى فى أعلاها على ال Solution Explorer و فى أسفلها على الProperties

zied toumi
10-18-2013, 17:19
الميسرة و تحتوى على الToolbox


الوسط و يحتوى على البرنامج بتاعنا
و يجب معرفة ال3 حاجات اللى فاتوا دول كويس قبل البدء
فى وسط البرنامج أمامنا Form1 و هى وجهة البرنامج اللى حنصممه و تسمى الفورم Form
و طبعا البرنامج لا يقتصر على فورم واحدة فقط بل يمكن إضافة المزيد عن طريق القائمة Project و Add Windows Form و لكن مش موضوعنا دلوقتى
المهم ...
حنغير الكلام اللى مكتوب فى أعلاها من فورم 1 إلى Dvd4arab و ذلك عن طريق :
نضغط على Form1 كليكة واحدة شمال و فى صندوق الProperties و سبق أن قلت أنه فى أسفل يمين الصفحة
حنلاقى خاصية إسمها Text حنغير الكلام اللى جنبها من Form1 إلى Dvd4arab
و حنلاقى زرار شكله زى زرار الPlay فى أعلى البرنامج كما بالصورة حندوس عليه
8149

zied toumi
10-18-2013, 17:37
و ده بمثابة اختبار للبرنامج اللى احنا عملناه أو Debug و حيظهرلنا البرنامج
و الكلام المكتوب أعلاه هو Dvd4arab بدلا من Form1
دلوقتى نقفل الفورم اللى اتفتحتلنا و عايزين نزود زرار فى البرنامج
حنلاقى فى الToolbox تحت قائمة Common Controls اختيار Button ندوس عليه كليكة شمال و نرسمه فى الفورم فى المكان اللى عايزينه
أو ممكن ندوس عليه DoubleClick و حنلاقيه اتحط فى الفورم تلقائيا
طاب دلوقتى عايزين نبدأ فى برمجة لأن كل اللى كنا بنعمله إلى الآن شكليات
البرمجة لازم تكون فى أحداث معينة يعنى مثلا لما أدوس على الزرار يحصل كذا و كذا ...
حنوصل للحتة دى إزاى ؟
حندوس على الزرار اللى إحنا حطيناه ده و اللى اسمه دلوقتى button1 كليكتين شمال
حيظهرلنا صفحة جديدة مكتوب فيها الكلام ده







public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

}
}







private void button1_Click(object sender, EventArgs e)
و الكلام ده معناه :
Private أى خاص بالحتة دى أو بالModule اللى إحنا فيها و حنشوف الكلام ده فيما بعد
Void يعنى حدث
button1_Click تدل على الحدث اللى حيحدث عنده الكود اللى حنكتبه هنا و هو كليكة شمال على button1
و الكلام الغريب اللى بين القوسين ده هو الParameters-List و فكك منها دلوقتى
طاب دلوقتى إحنا حنكتب كود يخلى الكلام اللى مكتوب على الزرار بتاعنا و هو button1 يتحول إلى مثلا You clicked me
حنكتب فى المكان اللى كان واقف فيه المؤشر بين العلامتين { و } الكود ده



button1.Text = "You clicked me";






---------- Post added at 02:29 PM ---------- Previous post was at 02:23 PM ----------

مع ملاحظة أنه يجب وضع العلامة ; فى آخر كل جزء من الكود
و أن أى نص غير متغير يجب وضعه بين علامتى " " و يسمى String
دلوقتى الزرار اللى إحنا حطيناه ده كان مكتوب عليه button1 و دى خاصية إسمها Text زى بالظبط الخاصية اللى كان اسمها Text اللى غيرنا بها إسم الفورم فيما قبل إلى Dvd4arab
و ده يختلف عن إسم الزرار فلو مثلا إحنا غيرنا الكلام اللى مكتوب على الفورم حيفضل إسمها ثابت و هذا الإسم لا يظهر لمستخدم البرنامج بتاعك و لكن تستخدمه أنت فى الكود فقط
يعنى لما حندوس كليكة شمال على الزرار بتاعنا حيتغير الكلا اللى عليه (Text) إلى You clicked me و لكن إسمه (Name) اللى هو button1 حيفضل ثابت إلا لو غيرته عن طريق الProperties أو عن طريق الكود ب button1.Name
و دلوقتى حنشغل البرنامج عن طريق الزرار اللى شبه Play اللى اتكلمنا عليه من قبل
حيظهرلنا البرنامج و الكلام اللى مكتوب على الزرار button1
حندوس على الزرار ده و حنلاحظ إن الكلام اللى عليه إتغير إلى You clicked me
و ممكن مايكنش باين عندك كل الجملة You clicked me فده ناتج عن إنه الزرار صغير أوى فممكن تكبره عن طريق كليكة شمال عليه و غير أبعاده عن طريق النقاط ال8 اللى حوله
و طبعا إحنا عندنا أعلى الصفحة 2 Tabs إلى الآن :
واحدة اسمها Form1.cs* و الثانية Form1.cs[Design]* و الأولى بتجيبلك صفحة الكود و الثانية صفحة التصميم اليدوى

---------- Post added at 02:30 PM ---------- Previous post was at 02:29 PM ----------

و طبعا فيه حاجات كتير أوى ممكن تغيرها فى الزرار button1 أو الفورم Form1 فممكن مثلا تغير طولها Height أو عرضها Width أو ....
و ده عن طريق إما يدويا فى صندوق الProperties كما غيرنا الText من قبل أو بالكود عن طريق كود شبه اللى احنا عملناه من شوية

فممكن مثلا كل ماندوس على الbutton1 يزيد عرضه بمقدار معين و ذلك عن طريق إننا نكتب تحت الكود بتاع تغيير الText الآتى و لكن قبل إغلاق علامه ال {
نكتب button1 و ده إسم الزرار و ليس الكلام اللى عليه و بعد كده نكتب نقطة . حنلاقى قائمة كبيرة إنفتحتلنا و هى كل الأشياء اللى ممكن نغيرها فى هذا الزر
حنختار من القائمة Width و هو العرض و لو مش لاقيينها نكتب W و حنلاقيها بسهولة و لما تيجى العلامة عليها ندوس Enter و حتتكتب لوحدها و ده مش أكتر من تسهيل بدلا من كتابة كل الكلمة
و ممكن بدلا من Enter تكمل كتابة الكود عادى جدا و تدوس = .... أو أى حاجة إنت عايزها حسب الكود

نرجع لحتة العرض
و إحنا لحد دلوقتى كتبنا button1.Width حنكمل الكلام ده إلى أن يصبح




button1.Width = button1.Width + 20;









---------- Post added at 02:31 PM ---------- Previous post was at 02:30 PM ----------


و برده ماننساش علامة ;
و نشغل البرنامج
حنلاقى كل ما بندوس على الزرار بيزيد عرضه
و ماحدش يفتكر إنه دى زى المعادلات الجبرية يعنى ممكن نضيع اللى فى اليمين مع اللى فى الشمال
و لكن معنى المعادلة دى إنه اللى بعد علامة ال = يتم حسابه و تخزينه فى اللى قبل علامة ال=
و بذلك كل مرة يتم إضافة 20 على button1.Width
و ممكن تكتشفوا بقى فى الخواص الأخرى للأشياء لأن من الدرس اللى جاى إن شاء الله سأبدأ فى شرح البرمجة الحقيقية بلغة السى شارب


نيجى على آخر حتة فى الموضوع بتاعنا و هى كيفية عمل البرنامج .exe علشان نشغله عند أى حد
ممكن نعمل برنامج مكون من فايل واحد .exe و ده لو انت عايز تشغله على جهازك فقط لأنه مش مضمون إنه يشتغل عند الناس التانية
و ده حتلاقيه فى الملف اللى اسمه Bin فى مجلد الشغل بتاعك
فلو كان مثلا المسار اللى انت اخترته فى الأول خالص
C:\Documents and Settings\TheGhostFish\My Documents\Visual Studio 2005\Projects\WindowsApplication1
حيبقى مسار المجلد Bin بتاعك و جواه مجلد Debug أهوه
C:\Documents and Settings\TheGhostFish\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplicati on1\bin\Debug
و حتلاقى ملف إسمه WindowsApplication1.exe و هو ده البرنامج بتاعك

أما لو عايز توزع البرنامج بصورة أوسع ممكن تعمله setup.exe زى بتاع البرمج اللى بننزلها كلها
و ده عن طريق تدوس Project فى أعلى البرنامج و تختار آخر خيار و هوWindowsAppliction1 properties حيطلعلك صفحة تضغط فيها على Publish و هو آخر خيار و حتلاقى زرارين فى آخر الصفحة و هما Publish Wizard و Publish Now و هما المسئولين عن العملية دى

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

تم بحمد الله الدرس الأول


---------- Post added at 02:32 PM ---------- Previous post was at 02:31 PM ----------

الدرس الثانى

Using Console

حندوس من قائمة File فى أعلى البرنامج على New ثم Project
و بدل ماختارنا Windows Application حنختار Console Application
حيطلعلنا المرادى كود على طول من غير فورم
فال Console Appliction مش زى أى برنامج
بل كل الشغل اللى فيها عن طريق نافذة زى ال Command Prompt

دلوقتى مؤشر الكتابة واقف تحت جزئية

---------- Post added at 02:33 PM ---------- Previous post was at 02:32 PM ----------

و طبعا بين علامتى { و }
فيه أوامر كتير ممكن نكتبها فى الحتة دى لها علاقة بالConsole
فحنكتب Console و ندوس . و حنلاقى قائمة كبيرة انفتحتلنا
حنختار WriteLine و نكمل الكود علشان يبقى بالمنظر ده

---------- Post added at 02:35 PM ---------- Previous post was at 02:33 PM ----------

هذا هو الكود


static void Main(string[] args)




Console.WriteLine("Welcome to C Sharp");




---------- Post added at 02:36 PM ---------- Previous post was at 02:35 PM ----------


و بعد كده ندوس فى أعلى البرنامج على زر Start Debugging
حنلاقى صفحة سوداء انفتحتلنا و انكتب فيها عبارة Welcome to C Sharp
و بعد كده تتقفل فى ساعتها

فعلشان نلحق نشوف اللى بيحصل يبقى من الأفضل لما نيجى نشغل برامج الConsole بدل ما ندوس Start Debugging ندوس من قائمة Debug فى أعلى البرنامج على الخيار Start Without Debugging
و حنلاقى البرنامج بيطلب مننا ندوس أى زرار قبل ما يتقفل
دلوقتى حنزود على السطر الأول اللى كتبناه سطر جديد بحيث يكون الكود كله

---------- Post added at 02:37 PM ---------- Previous post was at 02:36 PM ----------

"Console.WriteLine("Welcome to C Sharp ) ;
Console.WriteLine("How Are You ? " ) ;

zied toumi
10-18-2013, 18:39
Start Without Debugging
حنلاقى بيكتبلنا فى السطر الأول Welcome to C Sharp و فى الثانى How Are You ?
دلوقتى حنغير السطر الأول فى الكود بحيث يكون الكود الكلى





Console.Write("Welcome to C Sharp");
Console.WriteLine("How Are You ?");




و نشغل البرنامج
حنلاقيه طلعلنا الكلام كله فى سطر واحد و الجملة الأولى مشبوكة فى الثانية
نستخلص من كده إن خاصية WriteLine بتكتب الكلام و بعد كده بتعمل Enter تلقائيا علشان تنتقل للسطر اللى وراه
أما Write فبتكتب الكلام و بس من غير ما تنقلك للسطر اللى وراه بعد الكتابة

---------- Post added at 02:44 PM ---------- Previous post was at 02:39 PM ----------

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

و دلوقتى حنمسح السطرين اللى كتبناهم من شوية و نكتب مكانهم

كود


Console.Write("Please Write Your Name : ");
string x = Console.ReadLine();
Console.WriteLine("Welcome " + x);






و نشغل البرنامج
حنلاقيه بيكتب Please Write Your Name : و بيستنى لما تكتب إسمك و لما تدوس Enter بيقولك Welcome و جنبها إسمك
نستخلص من المثال السابق إن خاصية ReadLine دى بتخلى البرنامج يستنى لحد مانتا تدخله معلومة معينة
فالمعلومة دى إحنا خلناه يسجلها فى المتغير x و طبعا لازم يكون String علشان الإسم فيه حروف
و بعد كده خلناه يكتب Welcome و جنبها المتغير x اللى انت سجلت فيه إسمك من قبل
طاب ليه كتبت فى الكود كلمة Welcome بين علامتى " " و ماكتبتش x بين العلامتين دول ؟
علشان Welcome دى كلمة أنا كاتبها ولا تمثل للبرنامج أى متغير سابق تم فرضه
أما x فالبرنامج عارف هى إيه من الأول
و طبعا أنا حطيت جنب Welcome مسافة Space علشان مايبقاش الإسم لازق فى Welcome
و كمان الرمز + علشان يتم الجمع بينهما طبعا ليس جمعا جبريا و لكن بوضعهما جنب بعضهما

ملحوظة :
كان ممكن أفرض المتغير x فى سطر منفصل يعنى أشيل سطر

كود:


string x = Console.ReadLine();



و أحط مكانه

كود :


string x;
x = Console.ReadLine();



و حاتدينى نفس النتائج

و طبعا ممكن تتحكم فى شكل الصفحة السوداء المفتوحة عن طريق أوامر عديدة مثل :
BackgroundColor و هى تتحكم فى أرضية الكلام المكتوب
مثال :

كود :


Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine("Welcome to C Sharp");



و يتم تغيير اللون عن طريق ConsoleColor و بعد كتابة النقطة يظهر لك قائمة تختار منها اللون اللى عايزه

Foregroundcolor و هى تتحكم فى لون الكلام المكتوب
مثال :

كود :


Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Welcome to C Sharp");



طاب لو كتبنا الكود ده :

كود :


Console.WriteLine("Welcome to C Sharp");
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Good Bye");



حنلاقى السطر الأول Welcome to C Sharp باللون الأصلى و حنلاقى السطر الثانى Good Bye باللون الأحمر و ذلك لأن البرنامج يقرأ التعليمات بالترتيب كما بالكود
فإحنا حولنا اللون لأحمر بعد ما كتبنا السطر الأول فينطبق اللون الأحمر على الأسطر المقبلة وليس السابقة على عكس الTextBox أو أى مكون آخر فلو غيرت لونه بيتغير من الأول

Title و هى تحدد لك الكلام المكتوب فى الشريط الأزرق أعلى الصفحة السوداء بتاعتنا
مثال :

كود :





;




"


Console.Title="Welcome to C Sharp




و هناك الكثير من الأشياء الأخرى الممكن تغييرها مثل WindowHeight و تتحكم فى الارتفع و WindowWidth و تتحكم فى العرض
مثال :






;




Console.WindowHeight= 20




;






Console.WindowWidth = 30







ملحوظة :
يمكن استخدام الConsole فى الWindows Applictions و ليس فقط فى الConsole Applictions و ذلك من أجل تجربة النواتج و يظهر لك النواتج فى صندوق الOutPut و الذى نأتى به من View و OutPut و لكن بالطبع سيكون للقراءة فقط و لن يمكن الكتابة فيه فهو لمجرد اختبار النواتج للمبرمج ولا يظهر لمستخدم البرنامج


تم بحمد الله الدرس الثانى


---------- Post added at 03:39 PM ---------- Previous post was at 02:44 PM ----------


الدرس الثالث

MessageBox

فى العديد من البرامج نجد نوافذ صغيرة تنفتح لنا و تتحدث عن Error أو أى حاجة تانية و يكون فيها زرار Ok أو Ok و Cancel أو Ignore و Retry و Abord أو ....
حندوس على قائمة File أعلى البرنامج و ندوس New و Project و نختار Windows Appliction و ندوس ok
و نضيف Button و نغير من الProperties بتاعته الName بتاعه إلى cmdMsg و الText بتاعه إلى Show Message
و بعد كده DoubleClick على الزرار بتاعنا علشان نكتب الكود اللى احنا عايزينه

دلوقتى إحنا عايزين نظهر MessageBox
و ده عن طريق إننا نكتب MessageBox.Show
و المثال ده حيوضحلنا الموضوع

كود

zied toumi
10-18-2013, 18:42
;("#MessageBox.Show("Welcome To C

و حنشغل البرنامج عن طريق زرار Start Debugging
و ندوس على الزرار بتاعنا حنلاقى نافذة إتفتحتلنا بالشكل ده

---------- Post added at 03:42 PM ---------- Previous post was at 03:41 PM ----------


و لكن ممكن نضيف و نعدل خصائص الMessageBox اللى طلعلنا ده
حنمسح الكود اللى كتبناه و نكتب الكود ده

imaddine1986
10-18-2013, 18:57
مشكور اخي رغم اني افضل متابعة الموضوع افضل اي بدا بجزء
والاجابة على الاعضاء ثم الانتقال الى قسم اخر من الشرح افضل من كتاب بكثير

zied tarhouni
10-18-2013, 22:30
اخوان انا اخوكم زياد من تونس عضو جديد مبتدا اريد معرفة ازاى ممكن ازود النقاط او الدولارات هنا ارد علا كل رد اخد 10 سنتيم بس الحقيقة الموضوع شاق للغاية فيكم تساعدونى .

rmdn
10-18-2013, 23:15
شكرا على الكتاب القيم حقا انه مفيد
وارجو منك ان تضيف كتب اخرى في هدا المجال

محمد أبو بكر
10-19-2013, 03:16
انا اتعلمت كتير جدا من الفيديوهات دى
http://www.youtube.com/watch?v=SXmVym6L8dw&list=PLAC325451207E3105
و سهلة و هتستفيد كتير
بالتوفيق

jahdour2013
10-19-2013, 13:24
السلام عليكم و رحمة الله
لغة برمجة C صعب نوع ما
لكن جزاك الله كل خير على هذا الرابط
و السلام:bravo:

zied toumi
10-19-2013, 18:08
بسم الله الرحمن الرحيم

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

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

zied toumi
10-19-2013, 18:12
لإجراء عملية الاتصال بين Client و Server يلزم ما يلي :

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

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

ahmed adel ibrahem
10-19-2013, 18:13
شكرا على الكتاب القيم حقا انه مفيد
وارجو منك ان تضيف كتب اخرى

zied toumi
10-19-2013, 18:20
في نموذج osi يتم تقسيم ال upper Layers الى ثلاثة طبقات
Application لتعامل مع البرنامج نفسة او ما يسمى user interface
Presentation تمثيل البيانات المرسلة وهي كما ظهرت سابقا بتحويل البيانات الى الASCII
[FONT=tahoma]Session وفيها البدأ بعملية التخاطب بين الجهازين و التعريف ببعضهم البعض( فتح الجلسة) والتي سأتي على شرحها بعد قليل[/FO

NT]
اما في بروتوكول ال 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 **** 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 connectionsExample 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 وعذروني على عدم التفصيل ببعض الأمور وما ذلك الا بسبب ضيق الوقت ..الباب الأن مفتوح لنقاش واتمنى ان ارى منكم التفاعل


---------- Post added at 03:19 PM ---------- Previous post was at 03:14 PM ----------

في نموذج 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 يستطيع استقبال الرسالة , وهنا مثال يوضح عمل هذه الطبقة

---------- Post added at 03:19 PM ---------- Previous post was at 03:19 PM ----------

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 **** 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

---------- Post added at 03:20 PM ---------- Previous post was at 03:19 PM ----------

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

zied toumi
10-19-2013, 18:22
الجزء الخاص ب 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); // **** 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 );}
}

---------- Post added at 03:22 PM ---------- Previous post was at 03:21 PM ----------

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

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

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

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

zied toumi
10-19-2013, 18:25
في البداية قم بإضافة النيم سبيسس التالي :


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

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


try{تحديد
8163الباث الخاص بصورة****FileDialog1.ShowDialog ();string mypic_path =****FileDialog1.FileName;pictureBox1.Image = Image.FromFile(mypic_path);MemoryStream ms = new MemoryStream(); pictureBox1.Image.Save(ms,pictureBox1.Image.RawFor mat); تخزين الصورة ووضعها في مصفوفة من النوع بايت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 );}

bozit
10-19-2013, 18:26
السلام عليكم ورحمة الله تعالى وبركاته
معلومات جد مفيدة
مشكور

zied toumi
10-19-2013, 18:30
بسم الله الرحمن الرحيم
الدرس الثاني: الجزء الثاني
سوف ابدأ في هذا الجزء شرح الجزء الخاص بالسيرفر والذي يقوم بعملية التصنت على البورت واستقبال ال 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);// **** 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 جديد كما في الشكل التالي :

zied toumi
10-19-2013, 18:31
أضف الميثود السابقة في كلاس البرنامج ثم قم باستدعائها بواسطة وضع 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.. وهنا لا يؤثر البرنامج على موارد النظام بشكل كبير انظر الشكل التالي :8164

zied toumi
10-19-2013, 19:43
لاحظ انه قبل اضافة ال 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 والذي سأتي على شرحه لاحقا بإذن الله .... انتظرونا في الدرس القادم .. أتمنى منكم التطبيق.

---------- Post added at 04:40 PM ---------- Previous post was at 03:32 PM ----------

بسم الله الرحمن الرحيم
الدرس : 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والتنصت عليها ثم استلام الرسالة عبر هذا البورت وتوزيعها على الكل بدون تحديد رقم بورت معين حيث يتم تسليمها على البورت المخصص لعملية البرودكاست وهو البورت صفر:

---------- Post added at 04:42 PM ---------- Previous post was at 04:40 PM ----------

لتعريف نقطة الهدف ورقم البورت الخاصة بسيرفر ونستخدمها لكي يقوم السيرفر بستلام الرسالة
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();

---------- Post added at 04:43 PM ---------- Previous post was at 04:42 PM ----------

تم الإنتهاء الأن من شرح الجزأ الخاص بسيرفر .. وسأعرض هنا الكود الخاص به بشكل كامل لكي تستطيع تطبيقه وهذا هو الكود:
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 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);
}
}
}

zied toumi
10-19-2013, 19:48
الأن الجزء الخاص بال 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();
}
}

---------- Post added at 04:46 PM ---------- Previous post was at 04:43 PM ----------

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

الدرس: IP Multicasting واستخدامها لعمل Multicasting Group

تحدثنا سابقا عن برتوكول ال UDP وشرحنا كيفية استخدامه لعمل برود كاست حيث تستطيع عمل البرود كاست بطريقتين إما باستخدام IPAddress.Any والذي يلزمه وجود سيرفر يقوم بعملية التصنت على البورت المحدد حيث يستقبل من خلاله أي رسالة ثم يقوم ببثها إلى كل الأجهزة أو باستخدام IPAddress.Broadcast والذي من خلاله يمكن عمل بث إلى كل الأجهزة حيث لا ضرورة لوجود جهاز سيرفر بحيث أن الكل يمكنه التصنت على بورت معين يستقبل ويرسل من خلالها أي رسالة إلى كل الأجهزة وتشبه عملية البرودكاست عملية البث الإذاعي حيث أن الجميع يستمع إلى شخص واحد ولكن يختلف بأن أي شخص يستطيع الإرسال و الاستقبال وفي نفس الوقت ... , وفي هذا الدرس سوف نتحدث عن ال IP Multicasting وذلك بهدف استخدامه لعمل ال Multicasting , يعتبر هذا الموضوع من المواضيع المهمة جدا في برمجيات الشبكات ولهذا خصصت له درس منفصل عن البقية إذ أن اغلب برمجيات ال Conferences تعتمد عليه بشكل كبير ويعرف Multicast على انه الإرسال إلى مجموعة من المستخدمين ( اثنان أو أكثر ) سواء كان Managed باستخدام Client/Server حيث يكون هنالك جهاز Server في الشبكة وظيفته استقبال الرسائل من ال Group Clients ثم إرسالها إلى كامل المجموعة مرة أخرى انظر إلى الشكل التالي :

صورة

لاحظ انه يتم إرسال طلب الانضمام إلى المجموعة من قبل ال Clients وإذا وافق السيرفر على الطلب يقوم بضم عنوان الجهاز إلى ال IP Address List Members الخاصة به حيث يعيد توزيع الرسائل المستقبلة إلى كل الأعضاء الموافق عليهم و الموجودين في قائمة عناوين الأعضاء .

النوع الثاني ويسمى بال unmanaged- peer-to-peer Technique حيث أن كل جهاز يعمل ك server و client في نفس الوقت ولا وجود لجهاز سيرفر مركزي مخصص لعملية الاستقبال والتوزيع حيث تتم الموافقة على طلب الانضمام إلى المجموعة بشكل تلقائي وأي جهاز في المجموعة له الحق في الانضمام ثم الاستقبال و الإرسال إلى كامل المجموعة لاحظ الشكل التالي :
صورة

تم تخصيص عناوين خاصة لل Multicasting وهو ما يسمى بال IP Multicast Address وهي كما يلي :
المدى من 224.0.0.0 إلى 224.0.0.255 لشبكات المحلية LAN
المدى من 224.0.1.0 إلى 224.0.1.255 لل Internetwork
المدى من 224.0.2.0 إلى 224.0.255.255 لل AD-HOC Network block
كما يوجد تخصيصات أخرى له سوف آتي على ذكرها عند الحاجة ...


قدمت الدوت نيت دعم كبير لل IP Multicast باستخدام ال Socket Namespace حيث يتم تعريفها باستخدام ال الميثود SetSocketOption والتي تقوم بإدارة عمليات الانضمام والخروج من والى المجموعة multicast group (join & leave ) كما تستخدم لإضافة وإلغاء العضوية AddMembership و DropMembership و تستخدم الميثود UdpClient Object لتحديد رقم البورت والتي سيتم استقبال البيانات من خلالها بالإضافة إلى تعريف ال IP Multicasting والذي من خلاله تحدد الجهات التي سوف تستقبل الرسالة من خلال تحديد ال Range IP الخاص بشبكات المحلية LAN حيث يستطيع أي شخص يتنصت على هذا البورت ويستخدم نفس ال Range استقبال هذه الرسالة , يستخدم الكود التالي لإرسال رسالة إلى عدة جهات بحيث نستخدم رقم البورت 9050 و ضمن ال Range 224.100.0.1 كمثال:

---------- Post added at 04:47 PM ---------- Previous post was at 04:46 PM ----------

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class MultiSend
{
public static void Main()
{
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050);

byte[] data = Encoding.ASCII.GetBytes("This is a test message");
server.SendTo(data, iep);
server.Close();
}
}

في البداية قمنا بتعريف السوكت بتحديد الجهة التي سوف تستقبل الرسالة وهي (أي شخص يتنصت على الشبكة) ثم تحديد نوع السوكت والبرتوكول المستخدم , وبعد ذلك تحديد نقطة الهدف وذلك بوضع ال IP Multicast الذي نريد ويتبعه رقم البورت التي سيتم استقبال البيانات من خلالها ( بقية الكود تم شرحه سابقا عندما استخدمنا ال UDP لعمل برود كاست) ..


ولإنشاء برنامج الاستقبال سوف نستخدم تعريف السوكت نفسه ونضيف ال UdpClient Object ونسند له رقم البورت التي نريد التصنت عليها

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class UdpClientMultiRecv
{
public static void Main()
{
UdpClient sock = new UdpClient(9050); // التصنت على رقم البورت هذا

sock.JoinMulticastGroup(IPAddress.Parse("224.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);
Console.WriteLine("received: {0} from: {1}", stringData, iep.ToString());
sock.Close();
}
}

لاحظ انه توجد طرق متعددة لاستقبال البيانات و إرسالها كما يمكن استخدام الكوديين السابقين في نفس البرنامج للإرسال و الاستقبال كما يمكنك إرسال صورة إلى جانب النص ( انظر الدرس الثاني) أو أي شيء أخر يمكن تحويله إلى Binary إذ ما عليك سوى إضافة ال memory Stream وال Binary Reader وال Binary Writer إلى كود الإرسال و الاستقبال كما يمكنك عمل برنامج لإرسال صورة عبر الكاميرا إلى جهات متعددة باستخدام نفس الخاصية والتي سآتي على شرحها في الدروس اللاحقة إن شاء الله ...
في هذا الدرس قمنا بتوضيح الأساسيات في ال IP Multicasting ولزيادة المعلومات انظر نتائج البحث التالية :
http://www.google.co...ing Programming

في الدرس القادم سوف نتحدث بإذن الله عن : DNS Programming ..

لا تتردد أبدا في كتابة أي استفسار أو سؤال حول هذا الدرس أو الدروس السابقة أو أي موضوع آخر يتحدث عن برمجة الشبكات
0

---------- Post added at 04:48 PM ---------- Previous post was at 04:47 PM ----------

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

الدرس الخامس : DNS Programming
تعتبر خدمة DNS واحدة من أهم الخدمات التي تستخدم في الإنترنت والشبكات بشكل عام, وتختصر وظيفة DNS بالقيام بعملية ترجمة ال Domain Name إلى Domain IP من وإلى العكس ويتم ذلك من خلال مجموعة كبيرة جدا من مزودات DNS ( والتي تقوم بتحديث قاعدة البيانات الخاصة بها كل فترة معينة) , تبدأ هذه العملية بقيام الA Client بطلب ال Domain الخاص بال Client B وذلك بإدخال Domain Name الخاص به - حيث تم مسبقا قيام ال Client B بتعريف نفسه في قاعدة البيانات الخاصة ب DNS Server - كما يحتوي كل Client على قاعدة بيانات تحتوي على عناوين ال Domains وتسمى بال local DNS حيث يقوم بالبحث بداخلها على عنوان Domain من خلال Domain Name فإذا لم يجده يقوم بطلب عنوان الدومين من ال DNS Server وبعد إيجاده يقوم ال DNS Server بإرسال العنوان إلى ال Client ويقوم بدوره بتخزين العنوان في Local DNS الخاص به , انظر إلى الشكل التالي:
صورة
في الدوت نيت يمكننا التعامل مع DNS باستخدام النيم سبيس System.Net والتي تحتوي على جميع ال Classes DNS والتي تحتوي على كل ال Methods الخاصة ب DNS وتقسم هذه الميثودس إلى قسمين متزامن Synchronous Methods و غير متزامن Asynchronous Methods وهي كما يلي:

أولا الميثودس المتزامنة Synchronous Methods وهي :
GetHostNameوالتي تستخدم لجلب اسم الهوست وترجع هذه الميثود قيمة String تحتوي على ال Computer Name ولا تأخذ هذه الميثود أي باراميترات ويمكن استخدامها كما يلي :

zied toumi
10-19-2013, 19:49
string hostname = Dns.GetHostName();
الميثود GetHostByName و الميثود GetHostByAddress وتستخدم كل منها كما يلي :

IPHostEntry host_ip = Dns.GetHostByName(Computer_Name); // لجلب العنوان باستخدام الاسم
IPHostEntry host_name = Dns.GetHostByAddress(IP_Address); // لجلب الاسم باستخدام العنوان
الميثود Resolve وهي Overloaded Method حيث ترجع Host Name إذا أرسلت لها IP Address وترجع Host Address إذا أرسلت لها Host Name في ال IPHostEntry ولا يختلف استخدامها عن استخدام الميثودس السابقة .
وهذا المثال يبين طريقة استخدامها :
using System;
using System.Net;

class FMO_DNS
{
public static void Main()
{
IPHostEntry IPHost = Dns.Resolve("www.yahoo.com"); // الدومين الذي نريد معرفة الأي بي الخاص به
Console.WriteLine(IPHost.HostName); // جلب اسم الدومين بالكامل

IPAddress[] addr = IPHost.AddressList; // وضع قائمة العناوين في مصفوفة

for(int i= 0; i < addr.Length; i++) // طباعة عناصر المصفوفة
{
Console.WriteLine(addr[i]);
}
}
}
ثانيا الميثودس غير المتزامنة Asynchronous Methods :
وتبدأ عادة بكلمة Begin أو End ومن الأمثلة عليها :
BeginGetHostByName و BeginResolve و EndGetHostByName و EndResolve
طبيعة عملها كما هو الحال في الميثودس المتزامنة لكنها تختلف بكون انه لا يشترط تنفيذها لإكمال عمل البرنامج في حين المتزامن لا تسمح بلإنتقال إلى الخطوة الثانية في البرنامج إلا في حالة انتهاء عملها وقد تسبب هذه السيئة بخفض البريفورمانس بشكل عام في البرنامج لذلك ينصح باستخدام الطريقة الغير متزامنة وتستخدم كما يلي : Begin___
public static IAsyncResult BeginResolve(string hostname,
AsyncCallback requestCallback, object stateObject)
حيث يتم وضع الهوست نيم في البراميتر الأول و البراميتر الثاني يعرف فيه ال delegate وتسمح لك بتمرير مدخلات إلا delegate , ويستخدم End____ كما يلي :
public static IPHostEntry EndResolve(IasyncResult ar)
وهنا مثال شامل و بسيط يقوم بجلب جميع الأيبز الموجودة على الشبكة :
using System;
using System.IO;
using System.Diagnostics;
using System.Net;
using System.Collections.Specialized;

namespace NetworkIPs
{
public class Names

{
public StringCollection GetNames()

{
ProcessStartInfo _startInfo = new ProcessStartInfo("net","view");
_startInfo.CreateNoWindow = true;
_startInfo.UseShellExecute = false;
_startInfo.RedirectStandardOutput = true;
Process _process = Process.Start(_startInfo);
StreamReader _reader = _process.StandardOutput;
StringCollection _machineNames = GetMachineNamesFromProcessOutput(_reader.ReadToEnd ());
StringCollection _machineIPs = new StringCollection();
foreach(string machine in _machineNames)
{
_machineIPs.Add(IPAddresses(machine));
}
return _machineIPs;
}

private static string IPAddresses(string server)
{
try
{
System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding();
// Get server related information.
IPHostEntry heserver = Dns.Resolve(server);
//assumin the machine has only one IP address
return heserver.AddressList[0].ToString();
}

catch

{
return "Address Retrieval error for " + server;
}
}

//string manipulations
private StringCollection GetMachineNamesFromProcessOutput(string processOutput)
{
string _allMachines = processOutput.Substring( processOutput.IndexOf("\\"));
StringCollection _machines= new StringCollection();
while(_allMachines.IndexOf("\\") != -1 )
{
_machines.Add(_allMachines.Substring(_allMachines. IndexOf("\\"),
_allMachines.IndexOf(" ",_allMachines.IndexOf("\\")) - _allMachines.IndexOf("\\")).Replace("\\",String.Empty));
_allMachines = _allMachines.Substring(_allMachines.IndexOf(" ",_allMachines.IndexOf("\\") + 1));
}
return _machines;
}
}
public class Runner
{
static void Main()
{
Names _names = new Names();
StringCollection names = _names.GetNames();
foreach(string name in names)
Console.WriteLine(name);
Console.ReadLine();
}
}ولمزيد من المعلومات انظر نتائج البحث التالي :
http://www.google.co...DNS Programming

في الدرس القادم سوف نتحدث بإذن الله عن SMTP & HTTP Programming

zied toumi
10-19-2013, 20:06
بسم الله الرحمن الرحيم ,

الدرس السادس: SMTP & POP3 Programming
تحدثنا في الدرس السابق عن برمجة برتوكول DNS والمسئول عن عملية ترجمة Domain من اسم نطاق إلى IP وبالعكس وبينا كيفية القيام بهذه العملية في سي شارب , في هذا الدرس سوف نتحدث عن برمجة بعض البروتوكولات الأخرى لطبقة ال Application Layer وهما هنا ال SMTP والمسئول عن إرسال الرسائل عبر البريد الإلكتروني و ال POP3 والمسئول عن عملية توصيل الرسالة إلى الزبون من خلال عمل Download لها من ال Mail Server وفي الدرس اللاحق سوف نتحدث عن ال HTTP Programming والذي يستخدم بشكل أساسي في تصفح ال Web , مع العلم انه يوجد بروتوكولات كثيرة سوف آتي على شرحها عند الحاجة ..

الجزء الأول: SMTP – Simple Mail Transfer Protocol Programming
من المعروف أن ال Mail Server يقوم بتجزئة عمليات إرسال و استقبال البريد الإلكتروني عبر الإنترنت إلى ثلاثة أجزاء وهي كما في الشكل التالي :
صورة
MTA – Message Transfer Agent والمسئول عن الإرسال Outgoing والتوصيل Incoming للرسائل
MDA- Message Delivery Agent و المسئول عن عمليات ال filtering والتأكد من وصول الرسالة
MUA- Message User Agent والمسئول عن عملية قراءة و تخزين الرسالة في Database لدى المستقبل Client وتتم هذه العملية باستخدام بروتوكول POP - Post Office Protocol انظر إلى الشكل التالي :
صورة
و يستخدم برتوكول ال SMTP Simple Mail Transfer Protocol بشكل أساسي في ال MTA أي عمليات إرسال Outgoing وتوصيل Incoming الرسائل .

لتطبيق يجب أولا التأكد من أنك تملك حساب SMTP من ال Internet Provider الخاص بك تستطيع تجربة ال Account الخاص بك من خلال برنامج ال Outlook Express الموجود مع ال Windows إذا كنت لا تملك حساب SMTP تستطيع تجربة البرنامج من خلال إنشاء Virtual SMTP Server عن طريق ال IIS وذلك بتثبيتها من : Control Panel >> Add/Remove Programs تأكد من تفعيل كل من ال IIS وال SMTP كما في الشكل التالي :
صورة
ثم إعداد السيرفر من ال IIS كما في الشكل التالي :
صورة
تدعم الدوت نيت استخدام بروتوكول ال SMTP من خلال النيم سبيس System.Web.Mail و تحتوي على الكلاس SmtpMail والتي من خلالها نستخدم الميثود Sendوالتي تستخدم لإرسال الرسالة عبر البورت 25 وهو البورت المخصص لبروتوكول SMTP و تعتبر الميثود Send " overloaded Method " حيث تأخذ عدة أشكال إذ بإمكانك استخدامها مع براميتر واحد إلى أربعة باراميترات , وبشكل افتراضي نستخدم البرامترات التالية :
SmtpMail.Send(string from, string to, string subject, string body)
البراميتر الأول يوضع فيه عنوان المرسل والثاني يوضع فيه عنوان المرسل إليه و البراميتر الثالث لعنوان الرسالة والرابع لنص الرسالة .
ولعمل برنامج يقوم بإرسال البريد الإلكتروني قم بإنشاء فورم كما في الشكل التالي:
صورة
ثم قم بإضافة النيم سبيس System.Web.Mail , ( إذا لم تظهر لديك .Mail قم بإدراج النيم سبيس System.Web إلى ال References ) ثم قم بكتابة الكود التالي :

لا تنسى إضافة النيم سبيس هذا في بداية البرنامج
using System.Web.Mail; //

ثم كتابة الكود هذا في زر الإرسال
try
{
string from = textBox1.Text;
string to = textBox2.Text;
string subject = textBox3.Text;
string body = textBox4.Text;
SmtpMail.SmtpServer = textBox5.Text;
SmtpMail.Send(from, to, subject, body);
}
catch (Exception ex) {MessageBox.Show(ex.Message);}
ملاحظة هامة جدا :
هذا الكود يعمل بشكل جيد, لكن يجب التأكد من تفعيل ال SMTP من ال IIS كما ذكر في السابق وقم بوضع IP الخاص ب ال SMTP (والذي تم تعريفه مسبقا في SMTP Virtual Server )بال Textbox SMTP Server , يجب التأكد أيضا من ال SMTP Server لديك يدعم استخدام المكتبة CDO2 - Microsoft Collaboration Data Objects Version 2 وإلا سوف تحصل على Exception يخبرك بأنه لا يستطيع الوصول إلى CDO2 Object , في العادة يتم استخدمها مع Windows XP و Windows 2000 وتعمل بشكل افتراضي عند تثبيت ال SMTP Virtual Server أو مع Microsoft Exchange Server2003 أما إذا كنت تستخدم Exchange Version 5 أو 5.5 فسوف تحصل على ال Exception السابق الذكر .

الجزء الأكثر تقدم: SMTP Advanced Programming
يعتبر المثال السابق مثال بسيط لإرسال رسائل عبر SMTP باستخدام CDO2 , وفي العادة عند إنشاء برامج مثل برنامج ال Outlook يتم استخدام ال HTML Format بالإضافة إلا إمكانية إرسال ملحقات وطبعا يعطيك عدة خيارات لإرسال و استقبال البريد الإلكتروني هل باستخدام ال HTTP أو ال POP3 ... وهنا سوف نقوم بإنشاء برنامج بسيط يقوم بإرسال واستقبال البريد الإلكتروني باستخدام ال SMTP و POP3 بنسبة لاستخدام ال POP3 فيجب أن يتوفر لديك حساب POP3 من ال ISP الخاص بك أو أن تقوم بتثبيت Microsoft Exchange Server2003 على جهازك وإعداده بحيث يستخدم ال POP3 إذ عندها سوف تحتاج لوجود Domain Controller مثبت على الجهاز و Windows 2003 Server بالإضافة إلى تثبيت الActive Directory عليه.
قدمت الدوت نيت دعم ممتاز لاستخدام هذه الخواص وذلك من خلال النيم سبيس System.Web.Mail وباستخدام الكلاس MailMessage لدعم ال HTML Format و الكلاس MailAttachment لدعم إمكانية إرسال ملحقات مع الرسالة ولكن لبرمجة ال POP3 يلزم استخدام النيم سبيس System.Net.Sockets و System.Net و System.IO حيث يتم عمل Session خاص مع السيرفر للقيام بعملية تفحص وجود رسائل جديدة وفي حالة وجودها يقوم بتعبئتها في List Box أو Treelist حسب الحاجة وعند الضغط على إحداها يقوم ال Client بعمل Download لرسالة من ال Mail Server ولعمل Advanced SMTP eMail Sender قم بأخذ Object من الكلاس MailMessage كما يلي :
لا تنسى إضافة النيم سبيس هذا في بداية البرنامج
using System.Web.Mail; //

try
{
MailMessage mm = new MailMessage();

ثم إضافة الكود التالي وكما في السابق
mm.From = textBox1.Text;
mm.To = textBox2.Text;
// mm.Cc = لاحظ انه يمكنك من الإرسال لأكثر من شخص هذه حسب الحاجة
// mm.Bcc = لاحظ انه يمكنك من الإرسال لأكثر من شخص هذه حسب الحاجة
mm.Subject = textBox3.Text;
mm.Headers.Add("Reply-To", "fadi822000@yahoo.com"); // لوضع اي اضافات تريدها مع الرسالة
mm.Headers.Add("Comments", "This is a test HTML message");// لوضع اي اضافات تريدها مع الرسالة
mm.Priority = MailPriority.High; // يمكنك وضع خيارات أهمية الرسالة
mm.BodyFormat = MailFormat.Html; // نوع الفورمات المستخدم
mm.Body = "<html><body><h1>" + textBox4.Text + "</h1></html>";
SmtpMail.Send(mm);
}
catch (Exception ex) {MessageBox.Show(ex.Message);}لاحظ أن جسم الرسالة يستخدم كود ال HTML وهذا يمكنك من وضع أي لون أو حجم أو أي شيء يمكن عمله باستخدام ال HTML (راجع قسم ال HTML بالمنتدى لتعرف على هذه اللغة السكربتية الرائعة) , ولجعل البرنامج قادر على إرسال ملحقات يجب استخدام الكلاس MailAttachment وإدراج اسم الملف فيه وكما يلي بالكود :
MailAttachment myattach =
new MailAttachment("Your_Attached_File_path.extension", MailEncoding.Base64);
mm.Attachments.Add(myattach);وهنا قد انتهينا من عمل برنامج ال SMTP بشكل كامل , طبعا عملية الDesign وغيرها تعتمد على حسب ذوق وذكاء وخبرة المبرمج.

في الجزء الثاني من هذا الدرس سوف نتحدث عن برمجة برتوكول POP3- Post Office Protocol Version 3

---------- Post added at 05:06 PM ---------- Previous post was at 04:49 PM ----------

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

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

zied toumi
10-19-2013, 20:08
بسم الله الرحمن الرحيم ,

الدرس الرابع: IP Multicasting واستخدامها لعمل Multicasting Group

تحدثنا سابقا عن برتوكول ال UDP وشرحنا كيفية استخدامه لعمل برود كاست حيث تستطيع عمل البرود كاست بطريقتين إما باستخدام IPAddress.Any والذي يلزمه وجود سيرفر يقوم بعملية التصنت على البورت المحدد حيث يستقبل من خلاله أي رسالة ثم يقوم ببثها إلى كل الأجهزة أو باستخدام IPAddress.Broadcast والذي من خلاله يمكن عمل بث إلى كل الأجهزة حيث لا ضرورة لوجود جهاز سيرفر بحيث أن الكل يمكنه التصنت على بورت معين يستقبل ويرسل من خلالها أي رسالة إلى كل الأجهزة وتشبه عملية البرودكاست عملية البث الإذاعي حيث أن الجميع يستمع إلى شخص واحد ولكن يختلف بأن أي شخص يستطيع الإرسال و الاستقبال وفي نفس الوقت ... , وفي هذا الدرس سوف نتحدث عن ال IP Multicasting وذلك بهدف استخدامه لعمل ال Multicasting , يعتبر هذا الموضوع من المواضيع المهمة جدا في برمجيات الشبكات ولهذا خصصت له درس منفصل عن البقية إذ أن اغلب برمجيات ال Conferences تعتمد عليه بشكل كبير ويعرف Multicast على انه الإرسال إلى مجموعة من المستخدمين ( اثنان أو أكثر ) سواء كان Managed باستخدام Client/Server حيث يكون هنالك جهاز Server في الشبكة وظيفته استقبال الرسائل من ال Group Clients ثم إرسالها إلى كامل المجموعة مرة أخرى انظر إلى الشكل التالي :

صورة

لاحظ انه يتم إرسال طلب الانضمام إلى المجموعة من قبل ال Clients وإذا وافق السيرفر على الطلب يقوم بضم عنوان الجهاز إلى ال IP Address List Members الخاصة به حيث يعيد توزيع الرسائل المستقبلة إلى كل الأعضاء الموافق عليهم و الموجودين في قائمة عناوين الأعضاء .

النوع الثاني ويسمى بال unmanaged- peer-to-peer Technique حيث أن كل جهاز يعمل ك server و client في نفس الوقت ولا وجود لجهاز سيرفر مركزي مخصص لعملية الاستقبال والتوزيع حيث تتم الموافقة على طلب الانضمام إلى المجموعة بشكل تلقائي وأي جهاز في المجموعة له الحق في الانضمام ثم الاستقبال و الإرسال إلى كامل المجموعة لاحظ الشكل التالي :
صورة

تم تخصيص عناوين خاصة لل Multicasting وهو ما يسمى بال IP Multicast Address وهي كما يلي :
المدى من 224.0.0.0 إلى 224.0.0.255 لشبكات المحلية LAN
المدى من 224.0.1.0 إلى 224.0.1.255 لل Internetwork
المدى من 224.0.2.0 إلى 224.0.255.255 لل AD-HOC Network block
كما يوجد تخصيصات أخرى له سوف آتي على ذكرها عند الحاجة ...


قدمت الدوت نيت دعم كبير لل IP Multicast باستخدام ال Socket Namespace حيث يتم تعريفها باستخدام ال الميثود SetSocketOption والتي تقوم بإدارة عمليات الانضمام والخروج من والى المجموعة multicast group (join & leave ) كما تستخدم لإضافة وإلغاء العضوية AddMembership و DropMembership و تستخدم الميثود UdpClient Object لتحديد رقم البورت والتي سيتم استقبال البيانات من خلالها بالإضافة إلى تعريف ال IP Multicasting والذي من خلاله تحدد الجهات التي سوف تستقبل الرسالة من خلال تحديد ال Range IP الخاص بشبكات المحلية LAN حيث يستطيع أي شخص يتنصت على هذا البورت ويستخدم نفس ال Range استقبال هذه الرسالة , يستخدم الكود التالي لإرسال رسالة إلى عدة جهات بحيث نستخدم رقم البورت 9050 و ضمن ال Range 224.100.0.1 كمثال:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class MultiSend
{
public static void Main()
{
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050);

byte[] data = Encoding.ASCII.GetBytes("This is a test message");
server.SendTo(data, iep);
server.Close();
}
}في البداية قمنا بتعريف السوكت بتحديد الجهة التي سوف تستقبل الرسالة وهي (أي شخص يتنصت على الشبكة) ثم تحديد نوع السوكت والبرتوكول المستخدم , وبعد ذلك تحديد نقطة الهدف وذلك بوضع ال IP Multicast الذي نريد ويتبعه رقم البورت التي سيتم استقبال البيانات من خلالها ( بقية الكود تم شرحه سابقا عندما استخدمنا ال UDP لعمل برود كاست) ..


ولإنشاء برنامج الاستقبال سوف نستخدم تعريف السوكت نفسه ونضيف ال UdpClient Object ونسند له رقم البورت التي نريد التصنت عليها
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class UdpClientMultiRecv
{
public static void Main()
{
UdpClient sock = new UdpClient(9050); // التصنت على رقم البورت هذا

sock.JoinMulticastGroup(IPAddress.Parse("224.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);
Console.WriteLine("received: {0} from: {1}", stringData, iep.ToString());
sock.Close();
}
} لاحظ انه توجد طرق متعددة لاستقبال البيانات و إرسالها كما يمكن استخدام الكوديين السابقين في نفس البرنامج للإرسال و الاستقبال كما يمكنك إرسال صورة إلى جانب النص ( انظر الدرس الثاني) أو أي شيء أخر يمكن تحويله إلى Binary إذ ما عليك سوى إضافة ال memory Stream وال Binary Reader وال Binary Writer إلى كود الإرسال و الاستقبال كما يمكنك عمل برنامج لإرسال صورة عبر الكاميرا إلى جهات متعددة باستخدام نفس الخاصية والتي سآتي على شرحها في الدروس اللاحقة إن شاء الله ...
في هذا الدرس قمنا بتوضيح الأساسيات في ال IP Multicasting ولزيادة المعلومات انظر نتائج البحث التالية :
http://www.google.co...ing Programming

في الدرس القادم سوف نتحدث بإذن الله عن : DNS Programming ..

لا تتردد أبدا في كتابة أي استفسار أو سؤال حول هذا الدرس أو الدروس السابقة أو أي موضوع آخر يتحدث عن برمجة الشبكات
0

zied toumi
10-19-2013, 20:08
الدرس الخامس : DNS Programming
تعتبر خدمة DNS واحدة من أهم الخدمات التي تستخدم في الإنترنت والشبكات بشكل عام, وتختصر وظيفة DNS بالقيام بعملية ترجمة ال Domain Name إلى Domain IP من وإلى العكس ويتم ذلك من خلال مجموعة كبيرة جدا من مزودات DNS ( والتي تقوم بتحديث قاعدة البيانات الخاصة بها كل فترة معينة) , تبدأ هذه العملية بقيام الA Client بطلب ال Domain الخاص بال Client B وذلك بإدخال Domain Name الخاص به - حيث تم مسبقا قيام ال Client B بتعريف نفسه في قاعدة البيانات الخاصة ب DNS Server - كما يحتوي كل Client على قاعدة بيانات تحتوي على عناوين ال Domains وتسمى بال local DNS حيث يقوم بالبحث بداخلها على عنوان Domain من خلال Domain Name فإذا لم يجده يقوم بطلب عنوان الدومين من ال DNS Server وبعد إيجاده يقوم ال DNS Server بإرسال العنوان إلى ال Client ويقوم بدوره بتخزين العنوان في Local DNS الخاص به , انظر إلى الشكل التالي:
صورة
في الدوت نيت يمكننا التعامل مع DNS باستخدام النيم سبيس System.Net والتي تحتوي على جميع ال Classes DNS والتي تحتوي على كل ال Methods الخاصة ب DNS وتقسم هذه الميثودس إلى قسمين متزامن Synchronous Methods و غير متزامن Asynchronous Methods وهي كما يلي:

أولا الميثودس المتزامنة Synchronous Methods وهي :
GetHostNameوالتي تستخدم لجلب اسم الهوست وترجع هذه الميثود قيمة String تحتوي على ال Computer Name ولا تأخذ هذه الميثود أي باراميترات ويمكن استخدامها كما يلي :
string hostname = Dns.GetHostName();
الميثود GetHostByName و الميثود GetHostByAddress وتستخدم كل منها كما يلي :

IPHostEntry host_ip = Dns.GetHostByName(Computer_Name); // لجلب العنوان باستخدام الاسم
IPHostEntry host_name = Dns.GetHostByAddress(IP_Address); // لجلب الاسم باستخدام العنوان
الميثود Resolve وهي Overloaded Method حيث ترجع Host Name إذا أرسلت لها IP Address وترجع Host Address إذا أرسلت لها Host Name في ال IPHostEntry ولا يختلف استخدامها عن استخدام الميثودس السابقة .
وهذا المثال يبين طريقة استخدامها :
using System;
using System.Net;

class FMO_DNS
{
public static void Main()
{
IPHostEntry IPHost = Dns.Resolve("www.yahoo.com"); // الدومين الذي نريد معرفة الأي بي الخاص به
Console.WriteLine(IPHost.HostName); // جلب اسم الدومين بالكامل

IPAddress[] addr = IPHost.AddressList; // وضع قائمة العناوين في مصفوفة

for(int i= 0; i < addr.Length; i++) // طباعة عناصر المصفوفة
{
Console.WriteLine(addr[i]);
}
}
}
ثانيا الميثودس غير المتزامنة Asynchronous Methods :
وتبدأ عادة بكلمة Begin أو End ومن الأمثلة عليها :
BeginGetHostByName و BeginResolve و EndGetHostByName و EndResolve
طبيعة عملها كما هو الحال في الميثودس المتزامنة لكنها تختلف بكون انه لا يشترط تنفيذها لإكمال عمل البرنامج في حين المتزامن لا تسمح بلإنتقال إلى الخطوة الثانية في البرنامج إلا في حالة انتهاء عملها وقد تسبب هذه السيئة بخفض البريفورمانس بشكل عام في البرنامج لذلك ينصح باستخدام الطريقة الغير متزامنة وتستخدم كما يلي : Begin___
public static IAsyncResult BeginResolve(string hostname,
AsyncCallback requestCallback, object stateObject)
حيث يتم وضع الهوست نيم في البراميتر الأول و البراميتر الثاني يعرف فيه ال delegate وتسمح لك بتمرير مدخلات إلا delegate , ويستخدم End____ كما يلي :
public static IPHostEntry EndResolve(IasyncResult ar)
وهنا مثال شامل و بسيط يقوم بجلب جميع الأيبز الموجودة على الشبكة :
using System;
using System.IO;
using System.Diagnostics;
using System.Net;
using System.Collections.Specialized;

namespace NetworkIPs
{
public class Names

{
public StringCollection GetNames()

{
ProcessStartInfo _startInfo = new ProcessStartInfo("net","view");
_startInfo.CreateNoWindow = true;
_startInfo.UseShellExecute = false;
_startInfo.RedirectStandardOutput = true;
Process _process = Process.Start(_startInfo);
StreamReader _reader = _process.StandardOutput;
StringCollection _machineNames = GetMachineNamesFromProcessOutput(_reader.ReadToEnd ());
StringCollection _machineIPs = new StringCollection();
foreach(string machine in _machineNames)
{
_machineIPs.Add(IPAddresses(machine));
}
return _machineIPs;
}

private static string IPAddresses(string server)
{
try
{
System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding();
// Get server related information.
IPHostEntry heserver = Dns.Resolve(server);
//assumin the machine has only one IP address
return heserver.AddressList[0].ToString();
}

catch

{
return "Address Retrieval error for " + server;
}
}

//string manipulations
private StringCollection GetMachineNamesFromProcessOutput(string processOutput)
{
string _allMachines = processOutput.Substring( processOutput.IndexOf("\\"));
StringCollection _machines= new StringCollection();
while(_allMachines.IndexOf("\\") != -1 )
{
_machines.Add(_allMachines.Substring(_allMachines. IndexOf("\\"),
_allMachines.IndexOf(" ",_allMachines.IndexOf("\\")) - _allMachines.IndexOf("\\")).Replace("\\",String.Empty));
_allMachines = _allMachines.Substring(_allMachines.IndexOf(" ",_allMachines.IndexOf("\\") + 1));
}
return _machines;
}
}
public class Runner
{
static void Main()
{
Names _names = new Names();
StringCollection names = _names.GetNames();
foreach(string name in names)
Console.WriteLine(name);
Console.ReadLine();
}
}ولمزيد من المعلومات انظر نتائج البحث التالي :
http://www.google.co...DNS Programming

في الدرس القادم سوف نتحدث بإذن الله عن SMTP & HTTP Programming

zied toumi
10-19-2013, 20:10
بسم الله الرحمن الرحيم ,

الدرس السادس: SMTP & POP3 Programming
تحدثنا في الدرس السابق عن برمجة برتوكول DNS والمسئول عن عملية ترجمة Domain من اسم نطاق إلى IP وبالعكس وبينا كيفية القيام بهذه العملية في سي شارب , في هذا الدرس سوف نتحدث عن برمجة بعض البروتوكولات الأخرى لطبقة ال Application Layer وهما هنا ال SMTP والمسئول عن إرسال الرسائل عبر البريد الإلكتروني و ال POP3 والمسئول عن عملية توصيل الرسالة إلى الزبون من خلال عمل Download لها من ال Mail Server وفي الدرس اللاحق سوف نتحدث عن ال HTTP Programming والذي يستخدم بشكل أساسي في تصفح ال Web , مع العلم انه يوجد بروتوكولات كثيرة سوف آتي على شرحها عند الحاجة ..

الجزء الأول: SMTP – Simple Mail Transfer Protocol Programming
من المعروف أن ال Mail Server يقوم بتجزئة عمليات إرسال و استقبال البريد الإلكتروني عبر الإنترنت إلى ثلاثة أجزاء وهي كما في الشكل التالي :
صورة
MTA – Message Transfer Agent والمسئول عن الإرسال Outgoing والتوصيل Incoming للرسائل
MDA- Message Delivery Agent و المسئول عن عمليات ال filtering والتأكد من وصول الرسالة
MUA- Message User Agent والمسئول عن عملية قراءة و تخزين الرسالة في Database لدى المستقبل Client وتتم هذه العملية باستخدام بروتوكول POP - Post Office Protocol انظر إلى الشكل التالي :
صورة
و يستخدم برتوكول ال SMTP Simple Mail Transfer Protocol بشكل أساسي في ال MTA أي عمليات إرسال Outgoing وتوصيل Incoming الرسائل .

لتطبيق يجب أولا التأكد من أنك تملك حساب SMTP من ال Internet Provider الخاص بك تستطيع تجربة ال Account الخاص بك من خلال برنامج ال Outlook Express الموجود مع ال Windows إذا كنت لا تملك حساب SMTP تستطيع تجربة البرنامج من خلال إنشاء Virtual SMTP Server عن طريق ال IIS وذلك بتثبيتها من : Control Panel >> Add/Remove Programs تأكد من تفعيل كل من ال IIS وال SMTP كما في الشكل التالي :
صورة
ثم إعداد السيرفر من ال IIS كما في الشكل التالي :
صورة
تدعم الدوت نيت استخدام بروتوكول ال SMTP من خلال النيم سبيس System.Web.Mail و تحتوي على الكلاس SmtpMail والتي من خلالها نستخدم الميثود Sendوالتي تستخدم لإرسال الرسالة عبر البورت 25 وهو البورت المخصص لبروتوكول SMTP و تعتبر الميثود Send " overloaded Method " حيث تأخذ عدة أشكال إذ بإمكانك استخدامها مع براميتر واحد إلى أربعة باراميترات , وبشكل افتراضي نستخدم البرامترات التالية :
SmtpMail.Send(string from, string to, string subject, string body)
البراميتر الأول يوضع فيه عنوان المرسل والثاني يوضع فيه عنوان المرسل إليه و البراميتر الثالث لعنوان الرسالة والرابع لنص الرسالة .
ولعمل برنامج يقوم بإرسال البريد الإلكتروني قم بإنشاء فورم كما في الشكل التالي:
صورة
ثم قم بإضافة النيم سبيس System.Web.Mail , ( إذا لم تظهر لديك .Mail قم بإدراج النيم سبيس System.Web إلى ال References ) ثم قم بكتابة الكود التالي :

لا تنسى إضافة النيم سبيس هذا في بداية البرنامج
using System.Web.Mail; //

ثم كتابة الكود هذا في زر الإرسال
try
{
string from = textBox1.Text;
string to = textBox2.Text;
string subject = textBox3.Text;
string body = textBox4.Text;
SmtpMail.SmtpServer = textBox5.Text;
SmtpMail.Send(from, to, subject, body);
}
catch (Exception ex) {MessageBox.Show(ex.Message);}
ملاحظة هامة جدا :
هذا الكود يعمل بشكل جيد, لكن يجب التأكد من تفعيل ال SMTP من ال IIS كما ذكر في السابق وقم بوضع IP الخاص ب ال SMTP (والذي تم تعريفه مسبقا في SMTP Virtual Server )بال Textbox SMTP Server , يجب التأكد أيضا من ال SMTP Server لديك يدعم استخدام المكتبة CDO2 - Microsoft Collaboration Data Objects Version 2 وإلا سوف تحصل على Exception يخبرك بأنه لا يستطيع الوصول إلى CDO2 Object , في العادة يتم استخدمها مع Windows XP و Windows 2000 وتعمل بشكل افتراضي عند تثبيت ال SMTP Virtual Server أو مع Microsoft Exchange Server2003 أما إذا كنت تستخدم Exchange Version 5 أو 5.5 فسوف تحصل على ال Exception السابق الذكر .

الجزء الأكثر تقدم: SMTP Advanced Programming
يعتبر المثال السابق مثال بسيط لإرسال رسائل عبر SMTP باستخدام CDO2 , وفي العادة عند إنشاء برامج مثل برنامج ال Outlook يتم استخدام ال HTML Format بالإضافة إلا إمكانية إرسال ملحقات وطبعا يعطيك عدة خيارات لإرسال و استقبال البريد الإلكتروني هل باستخدام ال HTTP أو ال POP3 ... وهنا سوف نقوم بإنشاء برنامج بسيط يقوم بإرسال واستقبال البريد الإلكتروني باستخدام ال SMTP و POP3 بنسبة لاستخدام ال POP3 فيجب أن يتوفر لديك حساب POP3 من ال ISP الخاص بك أو أن تقوم بتثبيت Microsoft Exchange Server2003 على جهازك وإعداده بحيث يستخدم ال POP3 إذ عندها سوف تحتاج لوجود Domain Controller مثبت على الجهاز و Windows 2003 Server بالإضافة إلى تثبيت الActive Directory عليه.
قدمت الدوت نيت دعم ممتاز لاستخدام هذه الخواص وذلك من خلال النيم سبيس System.Web.Mail وباستخدام الكلاس MailMessage لدعم ال HTML Format و الكلاس MailAttachment لدعم إمكانية إرسال ملحقات مع الرسالة ولكن لبرمجة ال POP3 يلزم استخدام النيم سبيس System.Net.Sockets و System.Net و System.IO حيث يتم عمل Session خاص مع السيرفر للقيام بعملية تفحص وجود رسائل جديدة وفي حالة وجودها يقوم بتعبئتها في List Box أو Treelist حسب الحاجة وعند الضغط على إحداها يقوم ال Client بعمل Download لرسالة من ال Mail Server ولعمل Advanced SMTP eMail Sender قم بأخذ Object من الكلاس MailMessage كما يلي :
لا تنسى إضافة النيم سبيس هذا في بداية البرنامج
using System.Web.Mail; //

try
{
MailMessage mm = new MailMessage();

ثم إضافة الكود التالي وكما في السابق
mm.From = textBox1.Text;
mm.To = textBox2.Text;
// mm.Cc = لاحظ انه يمكنك من الإرسال لأكثر من شخص هذه حسب الحاجة
// mm.Bcc = لاحظ انه يمكنك من الإرسال لأكثر من شخص هذه حسب الحاجة
mm.Subject = textBox3.Text;
mm.Headers.Add("Reply-To", "fadi822000@yahoo.com"); // لوضع اي اضافات تريدها مع الرسالة
mm.Headers.Add("Comments", "This is a test HTML message");// لوضع اي اضافات تريدها مع الرسالة
mm.Priority = MailPriority.High; // يمكنك وضع خيارات أهمية الرسالة
mm.BodyFormat = MailFormat.Html; // نوع الفورمات المستخدم
mm.Body = "<html><body><h1>" + textBox4.Text + "</h1></html>";
SmtpMail.Send(mm);
}
catch (Exception ex) {MessageBox.Show(ex.Message);}لاحظ أن جسم الرسالة يستخدم كود ال HTML وهذا يمكنك من وضع أي لون أو حجم أو أي شيء يمكن عمله باستخدام ال HTML (راجع قسم ال HTML بالمنتدى لتعرف على هذه اللغة السكربتية الرائعة) , ولجعل البرنامج قادر على إرسال ملحقات يجب استخدام الكلاس MailAttachment وإدراج اسم الملف فيه وكما يلي بالكود :
MailAttachment myattach =
new MailAttachment("Your_Attached_File_path.extension", MailEncoding.Base64);
mm.Attachments.Add(myattach);وهنا قد انتهينا من عمل برنامج ال SMTP بشكل كامل , طبعا عملية الDesign وغيرها تعتمد على حسب ذوق وذكاء وخبرة المبرمج.

في الجزء الثاني من هذا الدرس سوف نتحدث عن برمجة برتوكول POP3- Post Office Protocol Version 3

---------- Post added at 05:10 PM ---------- Previous post was at 05:09 PM ----------

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

الدرس السابع: HTTP – Hyper Text Transfer Protocol Programming

تتلخص وظيفة ال HTTP بشكل عام على انه البرتوكول المستخدم لتوصيل طلب المستخدم User Request إلى الويب سيرفر ثم قيام ال web server بالرد على ال Request والذي يسمى ب Server Response وبتأكيد تستطيع نقل جميع أشكال ال (Multimedia) من النص وصورة و صوت و فيديو وغيره .. من ال Web Server إلى ال Client Application باستخدام Byte Stream object.
يعمل برتوكول ال HTTP على ال Application Layer وهذا يعني استخدامه بشكل مباشر من واجهة المستخدم كما هو الحال في DNS,SMTP,POP3,FTP

zied toumi
10-19-2013, 20:11
أولا : Downloading From Web Server
نستطيع التعامل مع ال Web Server في الدوت نيت باستخدام الكلاس WebClient الموجود في النيم سبيس System.Net إذ تقدم لنا جميع الإمكانيات لتوصيل طلب الزبون و الرد عليهUser Request & Server Response وتدعم ال WebClient Class ثلاثة Methods لتحميل البيانات من ال Web Server وهي:

1- DownloadData ووظيفتها جلب البيانات من ال Web Server وتخزينها في Byte Array وتعرض على شكل HTML Code وتستخدم كما يلي كمثال :
using System;
using System.Net;
using System.Text;
class DownloadData_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
byte[] response = wc.DownloadData("http://www.google.com");
Console.WriteLine(Encoding.ASCII.GetString(respons e));
}
}2- DownloadFileووظيفتها نقل ملف ما من ال Web Server وتخزينها مباشرة في Local Computer وهو سهل الاستخدام جدا إذ ما عليك سوا تمرير موقع الملف والمكان الذي تريد تخزين الملف فيه ويستخدم كما يلي كمثال :
using System;
using System.Net;

class DownloadFile_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
string filename = "C:\\ra.zip";

Console.WriteLine("Download in Progress Please Waite...");

wc.DownloadFile("http://www.personalmicrocosms.com/zip/ra.zip", filename);

Console.WriteLine("file downloaded");
}
}
3- ****Read ووظيفتها إنشاء Read Only Stream بين الزبون والسيرفر لجلب بيانات من URL محدد وتخزينه في Stream Object بعد تمرير ال URL للموقع الذي تريد عرضه وباستخدام الميثود ReadLine نستطيع عرض البيانات المخزنة في ال Stream Object على شكل HTML Code .
ملاحظة : تستخدم الميثود Peek لمعرفة نهاية ال Stream Object .
using System;
using System.IO;
using System.Net;

class ****Read_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
string response;

Stream strm = wc.****Read("http://www.google.com");
StreamReader sr = new StreamReader(strm);

while(sr.Peek() > -1)
{
response = sr.ReadLine();
Console.WriteLine(response);
}
sr.Close();
}
}
ويحتوي ال WebClient Class على مجموعة من ال Properties والتي تستخدم لجلب معلومات عن ال Web Host مثلproperty ResponseHeaders والذي يستخدم لجلب معلومات هامة عن ال web host مثل عدد ال Headers ونوع ال cash control واسم ال Server و نوع ال Encoding المستخدم وغيرها من المعلومات الهامة, ويستخدم كما يلي كمثال:
using System;
using System.Net;

class ResponseHeaders_property
{
public static void Main ()
{
WebClient wc = new WebClient();
byte[] response = wc.DownloadData("http://www.google.com");
WebHeaderCollection whc = wc.ResponseHeaders;
Console.WriteLine("header count = {0}", whc.Count);
for (int i = 0; i < whc.Count; i++)
{
Console.WriteLine(whc.GetKey(i) + " = " + whc.Get(i));
}
}
}

//Output:
//header count = 6
//Cache-Control = private
//Content-Type = text/html
//Set-Cookie = PREF=ID=6ae22f44980c5d78…
//7JRA; expires=Sun, 17-Jan-2038 19:14:
//Server = GWS/2.1
//Transfer-Encoding = chunked
//Date = Wed, 23 Nov 2005 10:10:58 GMTثانيا : Uploading to Web Server
يدعم ال WebClient أربعة Methods لتحميل البيانات إلى ال Web Server وهي :
1- ****Write ويستخدم لإرسال Stream Data إلى ال Web Server وذلك بعد تمرير عنوان ال URL للملف والنص الذي نريد كتابته على ال Web Page طبعا يجب أن تملك الصلاحيات لذلك ويستخدم كما يلي كمثال :
using System;
using System.IO;
using System.Net;
class ****Write_method
{
public static void Main ()
{
WebClient wc = new WebClient();
string data = "<h1>Welcome to My Page</h1>";
Stream strm = wc.****Write("C:\\mypage.html");
StreamWriter sw = new StreamWriter(strm);
sw.WriteLine(data);
sw.Close();
strm.Close();
}
}
2 – UploadData ويستخدم لنقل محتويات مصفوفة من النوع Byte إلى ال Web Server وهذا يعني انك تستطيع من خلالها رفع أي نوع من البيانات مثل النص الصور الفيديو وغيره إلى ال web server بعد تحويلها إلى Byte Array ويستخدم كما يلي كمثال :
using System;
using System.Net;
using System.Text;

class UploadData_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
string data = "This is The Text Before Converted it to Byte";
byte[] dataarray = Encoding.ASCII.GetBytes(data);
wc.UploadData("C:\\mydata.txt", dataarray);
}
}
3- UploadFile وتستخدم هذه الميثود لرفع ملف من ال Local Computer إلى ال Web Host وهي بسطة الاستخدام جدا وتستخدم كما يلي كمثال :
using System;
using System.Net;

class UploadFile_Method
{
public static void Main ()
{
WebClient wc = new WebClient();
wc.UploadFile("http://www.yoursite.com", "C:\\myfile.html");
}
}
4- UploadValues وتستخدم لرفع Collection من البيانات وال values الخاصة بها إلى الويب سيرفر وذلك بعد تحويل ال Collection إلى Byte Array ولتعريف Collection نستخدم الكلاس NameValueCollection الموجود في النيم سبيس System.Collections.Specialized وبعد تعريفه نستخدم الميثود add لإضافة ال Collection جديد.. وتستخدم كما يلي كمثال :
using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;

class UploadValues_Method
{

public static void Main ()
{
WebClient wc = new WebClient();
NameValueCollection nvc = new NameValueCollection();
nvc.Add("firstname", "Fadi");
nvc.Add("lastname", "Abdel-qader");
byte[] response = wc.UploadValues("http://localhost/mypage.aspx", nvc);
Console.WriteLine(Encoding.ASCII.GetString(respons e));
}
}ثالثا :المواضيع الأكثر تقدما في ال HTTP Programming:

يعتبر هذا الجزء من أهم الأجزاء في برمجة تطبيقات Web Client Applications والذي سوف نتحدث فيه عن استخدام كل من ال HttpWebRequest Class و ال HttpWebResponse Class :

1- استخدام HttpWebRequest Class :
يحتوي هذا الكلاس على مجموعة من ال Properties والتي تستخدم بشكل أساسي في تطبيقات ال Web Client Applications لإنشاء مثل :

1- استخدام خاصية ال Web Proxy : والتي نمرر فيها عنوان ال Proxy Server ورقم البورت حتى نستطيع التعامل مع ال HTTP Web Requestsمن خلف Proxy Server أو Firewall ويتم تعريف ال Proxy Server Prosperity كما يلي كمثال :
using System;
using System.Net;

class ProxyServer_Property
{
public static void Main ()
{
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(
"http://www.google.com");

WebProxy proxysrv = new WebProxy("http://proxy1.server.net:8080");
hwr.Proxy = proxysrv;

}
}
نعرف في البداية ال HttpWebRequest Object ثم نعرف WebProxy Object من الكلاس webProxy ونسند له عنوان ال Proxy Server ورقم البورت وبعد ذلك نستطيع إسناده إلى أي اوبجكت باستخدام الخاصية Proxy التي تكون موجودة عادة في جميع HttpWebRequest Objects ..

2- استخدام ال HttpWebrequest لإرسال بيانات إلى الويب سيرفر باستخدام ال Streams وتستخدم كما يلي كمثال :
HttpWebrequest hwr = (HttpWebRequest)WebRequest.Create("http://localhost");
Stream strm = hwr.GetRequestStream();
StreamWriter sw = new StreamWriter(strm);
sw.WriteLine(data);
بعد تعريف ال HttpWebRequest Object نقوم بتعريف Stream Object ونسند له ال Request Stream من خلال الميثود GetRequestStream .

2 - استخدام HttpWebResponse Class:

تستخدم ال HttpWebResponse Object لإرجاع بيانات من الويب سيرفر إلى ال Client حيث نستخدم الميثود GetResponse و الميثود BeginGetResponse لهذه العملية ولا يوجد فرق في وظيفة هذه الميثودس سوى أن BeginGetResponse تعتبر asynchronous Method .
يحتوي ال HttpWebResponse Object على عدد من ال Properties وهي :

1- CharacterSet : وتستخدم لتحديد نوع ال Character Set
2- ContentEncoding : وتستخدم لعملية ال encoding
3- ContentLength : وتستخدم لمعرفة حجم الرد
4- ContentType : لتحديد نوع ال Respone
5- Cookies : لتعامل مع ال Cookies ولستخدامها يجب أولا إنشاء ملف Cookie فارغ وتعريفه كما يلي كمثال :
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://www.amazon.com");
hwr.CookieContainer = new CookieContainer();
وذلك قبل ال HTTP Request ثم نسنده إليه كما يلي :

---------- Post added at 05:11 PM ---------- Previous post was at 05:11 PM ----------

HttpWebResponse hwrsp = (HttpWebResponse)hwr.GetResponse();
hwrsp.Cookies = hwr.CookieContainer.GetCookies(hwr.RequestUri);
6- Headers : لمعرفة ال HTTP Headers
7- LastModified : يرجع فيه وقت وتاريخ أخر تعديل
8- Method : لمعرفة الميثود والتي تستخدم في ال HTTP Response
9 – ProtocolVersion : لمعرفة ال HTTP Version
10 – ResponseUri : ال URL الخاص بسيرفر
11 – Server : لمعرفة اسم السيرفر
12 – StatusCode : لمعرفة نوع ال Coding امستخدم
13 – StatusDescription : لإرجاع Text يحتوي على حالة ال HTTP


في الدرس القادم سوف نتحدث عن الProgramming Web Services & XML إن شاء الله ..

لتحميل كافة الدروس انظر التوقيع :rolleyes:

لتحميل الدرس اللأخير على شكل PDF File :
ملفات مرفقة

perfect_signals
10-19-2013, 20:37
انا فتحت الرابط ولكن لقيت الموضوع صعب تعلم السى بلس
محتاج فيديو وليس مجرد كتابة وموفق باذن الله على اى حال

marwen marwen
10-20-2013, 01:27
السلام عليكم
أخي الكريم شكرا لك اخي الكريم بارك الله فيك كتب جميل و انا كمهندس قد أعجبني
و الله أعلم و الله الموفق

ahmedelkheder
10-20-2013, 01:51
لشكرك على هذا الموضوع القيم

dirtywalid
10-20-2013, 16:45
السلام عليكم ورحمة االه و بركاته مشكور اخي الكريم على هده المعلومات
انل شخصيا استفدت منه فبالتوفيق لك وللجميع.

doola2020
10-23-2013, 02:59
السي شارب يا أخي الكريم لغة برمجة مشهورة جدا مثلها مثل السي بلس بلس ولغة الفيجوال بيسيك ويوجد العديد من برامج أو لغات البرمجة الأخري

AshrafQassim
10-24-2013, 13:04
حبييى اذا اردت التعلم الحقية للغات البرمجة معظمها لا اقصد كلها هناك ما يسمى بكتا بhow to pragram
السلسلة دى بتيح لي امكانية تعلم واحترافاالبرمجة فى اى وقت ومجانا

WASEM DALLOUL
10-24-2013, 13:15
السلام عليكم
لغة السي لغة برمجة جيده جدا ومهمة جدا وهي تفيدنا في برمجة المؤشرات والأكسبيرتات التي نستخدمها في تجارتنا بالفوركس

nacero
12-22-2013, 16:56
العديد من المزايا الاخرى مثل التحكم فى بعض الاجهزه الكهربيه من خلال هاتفك ..

Moro_Mezo
12-22-2013, 18:06
اذا اردت التعلم الحقية للغات البرمجة معظمها لا اقصد كلها هناك ما يسمى بكتا بhow to pragram
السلسلة دى بتيح لي امكانية تعلم واحترافاالبرمجة فى اى وقت ومجانا

---------- Post added at 05:06 PM ---------- Previous post was at 05:05 PM ----------

اذا اردت التعلم الحقية للغات البرمجة معظمها لا اقصد كلها هناك ما يسمى بكتا بhow to pragram
السلسلة دى بتيح لي امكانية تعلم واحترافاالبرمجة فى اى وقت ومجانا

fido
07-12-2014, 03:08
بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله و بركاته
جزاك الله خيرالجزاء على هذا الموضوع
وجعله الله في موازين حسناتك يوم القيامة

.................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. ................

abokarem
09-08-2014, 19:49
عليكم السلام
الف شكر على الرابط وبالفعل لغه السى لغه هامه جدا ولابد ان نتعرف على كل المعلومات ان اردنا تعلمها جيدا
ولكن الامر ليس بهذه السهوله وينصح بمده سنه على الاقل

lAlio
09-11-2014, 21:00
الصراحه أخى مش عارف برضه كيف أخفى هويتى إزاى ؟؟ انا معرفش غير لفظ دى ان اس ومش عارف لازمته ايه هههههههههههه جاهل انا

ahmedibrahim258259
09-13-2014, 22:35
السلام عليكم ورحمة الله وبركاته مشكور اخي الكريم على هذا الفيديو في تعلم السي شارب جزاك الله خير ومنتظرين منك المزيد
تقبل مروري

maherforex007
09-14-2014, 14:46
السلام عليكم ورحمة الله وبركاته
مشكور اخي الغالي
على موضوع تعلّم Csharp
بالتوفيق و السلام:bravo:

ro5man
09-18-2014, 19:55
مجهود طيب، شكرا لك أخي الكريم.

geomagdy
02-16-2015, 16:42
سلام عليكم ورحمة الله تعالى وبراكاته
شكرا لك اخي الكريم على الموضوع
واصل عملك الجيد اخي الكريم تقبل تحياتي اخي الغالى
تقبل مرورى اخى الكريم
شكراااااااااا

شمس
03-22-2015, 00:15
شكراً على ما تقدمت به لزملائك في المنتدى الباحثين في مجال لغات البرمجيات التي تعتبر من أهم مجالات الإعلامية . فبمثل هذه المواضيع يمكن لنا التقدم و تطوير مستوى مهارتنا . فانشأ الله تعم المنفعة
شكراً لكل الأعضاء المشاركين في إثراء الموضوع

MedMax
04-22-2015, 20:38
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
بارك الله فيك اخى الفاضل وجزاك خيرا
واحسن الله اليك
وجعله فى ميزان حسناتك
وسبحان الله الذي خلق فابدع وخلق فسوى .

yhassen
06-25-2015, 20:47
السلام عليكم ورحمة الله تعالى وبركاته و بعـد.
جزاك الله خيرا اخـي على هذه المعلومات والتوضيحـات والشرح..
..أشكرك آخى الفاضل على الموضوع المميز....
وأسأل الله الربح الوفير و تحقيق الأحلام للجميع في عالم الفوركس
شـكرا جزيلا و جـزاك الله كل خــيـر و بالتوفيق ان شــاء الله

جابر1979
06-25-2015, 20:49
السلام عليكم و رحمة الله تعالى و بركاته ، موسوعة جميلة و كبيرة من الكتب التي نحتاجها في حياتنا و من الضروري الاستفادة منها ، شكرًا لك اخي الفاضل.

arkantos
06-25-2015, 23:56
السلام عليكم ورحمة الله وبركاته اخى الكريم
مشكور علي هذه المعلومات الاكثر من رائعة بخصوص تعلّم Csharp
جزاك الله كل خير
اتمني لك التوفيق و تقبل مروري

zouhairz
07-09-2015, 17:03
بسم الله الرحمن الرحيم الحمد لله وأفضل الصلاة وأتم التسليم على سيدنا محمد وعلى آله الطيبين وصحبه الغر المحجلين
ومن والاهم واتبع هداهم إلى يوم الدين السلام عليكم و رحمة الله تعال و بركاته


شكرااااا ه جزيلاااااا اااااخي

mamdouh.adil
09-30-2015, 13:22
شكرا جزيل سيدى الفاضل ليس على الكتاب ولكن على الموقع نفسه هذا الموقع من اجمل وافضل المواقع التعليميه فى العالم العربى كله
كميه رهيبه من الكتب التعليميه بروابط تعمل مباشرة ولذلك بدل من وضع رابط الكتاب سوف اقوم بوضع رابط الموقع نفسه
ليستفيد جميع الموجودين فى المنتدى وخاصة الذين يرغبون فى تعلم لغات اخره غير السى
رابط الموقع
http://www.kutub.info/

torkhan mohamed
03-03-2016, 01:50
السلام عليكم ورحمه الله وبركاته
شكرا اخى على الموضوع الجميل
واتمنى منك دائما الافاده لنا والله يجازيك كل خير واتمنى لك التوفيق
وبارك الله فيك وجزاك خيراً والسلام عليكم ورحمه الله

waleedsherif
03-03-2016, 04:10
الف شكر اخي العزيز علي الشرح و نتمني لك التوفيق

---------- Post added at 01:10 AM ---------- Previous post was at 01:07 AM ----------

شكرا لك اخي العزيز و نتمني لك التوفيق و النجاح
دائما و ابدا و الانبهار بالكتاب العظيم

wajdi1919
03-03-2016, 08:11
اخي هذا كتاب برمجة لااعلم العلاقة بينه وبين سوق الفوركس فلا اظن الوركس تحتاج لغة برمجة علي الاقل هذا ماعتقده اخي الكريم تقبل مروري

جمال صادق
03-03-2016, 08:40
التعلم من افضل الطرق التى تقوى التعامل من بين الاشخاص من وقت لاخر و علينا ان نتعلم كيفية الاستفادة من قوة العمل و من لافضل ان نرى الكثير من الاليات الاخرى

sh1938626
03-03-2016, 21:47
السلام عليكم أخي الكريم شكرا لك اخي الكريم بارك الله فيك كتب جميل و انا كمهندس قد أعجبني
و الله أعلم و الله الموفق

Ayman ElSayed
03-04-2016, 00:35
السلام عليكم
لم يخطر في بالي ان اتعلم هذه اللغة من بين كل لغات البرمجة التي يكون من خلالها تحديد مستقبلي
المهني ولكني اميل الى تعلم الشبكات واخذت بها كورسات معتمدة بالفعل واعمل فيها الان

AboMoZo
03-04-2016, 11:24
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
جزاك الله كل خير علي هذا الطرح المفيد
بإنتظار جديدك بفارغ الصبر فلا تحرمنا من الفائدة
وخالص التحية وتمنياتي بالتوفيق والسداد

TMT
03-07-2016, 03:02
السلام عليكم ورحمه الله وبركاته
شكرا اخى على الموضوع الجميل وفي انتظار ما هو جديد من ابداعاتك معنا
اتمني لك التوفيق و تقبل مروري
وبارك الله فيك وجزاك خيراً والسلام عليكم ورحمه الله

Mohammadino
04-07-2016, 20:47
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله
أسأل الله أن يحصنك بالقرآن ..
ويبعد عنك الشيطان ..
وييسر لك من الأعمال ما يقربك فيها إلى عليين ..
وأن يصب عليك من نفحات الإيمان وعافية الأبدان ورضا الرحمن ..
ويجعل لقيانا في أعالي الجنان ..

ashrafbek
04-09-2016, 22:13
اخي الكريم السلام عليكم ورحمة الله وبركاته
اشكرك جزيل الشكر علي موضوعك الاكثر من رائع
وانتظر منك ومن جميع اعضاء هذا المنتدي الجميل الاستفادة دوماً
تقبل خالص الود والتقدير

AYA.M
05-27-2016, 23:22
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
اسعدني التواجد بهذا المنتدي الرائع واتمني دوماً الافادة للجميع
واشكرك شكراً جزيلاً علي طرحك لهذا الموضوع الجميل
تمنياتي لكم بالنجاح الدائم

SHADY0
05-30-2016, 03:26
السلام عليكم ورحمة الله وبركاتة
شكرا اخى على هذا الموضوع الجميل شرح مميز وجميل واتمنى منك دائما الافاده واتمنى لكم النجاح
و التوفيق في هذا المجال والسلام عليكم ورحمة الله وبركاتة

ebrahim mounir
05-30-2016, 04:04
*************الـسـلام عليكـم ورحـمة الله وبـركاتـه
مـوضـوع رائـع وجـمـيـل واسـتـفـدت منـه كـثـيـرا
شـكـرا لــجـهـودك وتعـبـك فى نشـر هـذا الـمـحتـوى الاكـثـر مـن رائـعتحياتى لجميع اعضاء مـنـتـدى فـوركـس الـعرب الـكـرام
دمـتـم فـى حـفـظ الله والـسـلام عـلـيـكـم ورحـمـة الله وبـركـاتـه *************525

Feras Odeh
05-30-2016, 07:18
السلام عليكم ورحمه الله وبركاته
شكرا اخى على الموضوع الجميل وفي انتظار ما هو جديد من ابداعاتك معنا

---------- Post added at 07:17 AM ---------- Previous post was at 07:17 AM ----------

الموضوع الجميل وفي انتظار ما هو جديد من ابداعاتك معنا
اتمني لك التوفيق و تقبل مروري

---------- Post added at 07:18 AM ---------- Previous post was at 07:17 AM ----------

انها لغة برمجه جدا جميله سأحاول تجربتها
و سأوافيك بنتائج
و شكرا جزيلا

zeco2020
06-09-2016, 18:17
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
اسعدني التواجد بهذا المنتدي الرائع واتمني دوماً الافادة للجميع
واشكرك شكراً جزيلاً علي طرحك لهذا الموضوع الجميل
تمنياتي لكم بالنجاح الدائم:):):)

SHADY0
06-10-2016, 05:04
السلام عليكم ورحمة الله وبركاتة
شكرا اخى على هذا الموضوع الجميل شرح مميز وجميل واتمنى منك دائما الافاده واتمنى لكم النجاح
و التوفيق في هذا المجال والسلام عليكم ورحمة الله وبركاتة

محمد ابوغزاله
06-10-2016, 18:21
السلام عليكم ورحمة الله وبركاته
شكرا اخى الكريم لطرحك هذا الموضوع القيم
واسأل الله ان يوفقك لمزيد من الموضوعات الشيقه

Ayman ElSayed
11-04-2016, 05:28
لم يخطر في بالي ان اتعلم هذه اللغة من بين كل لغات البرمجة التي يكون من خلالها تحديد مستقبلي
المهني ولكني اميل الى تعلم الشبكات واخذت بها كورسات معتمدة بالفعل واعمل فيها الان حاليا

mohamedali19
11-04-2016, 14:03
بسم الله الرحمن الرحيم

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

مشكور اخي الكريم على هده المعلومات
بارك الله فيك

mh11090
11-14-2016, 07:17
السلام عليكم ورحمه الله وبركاته
شكرا اخى على الموضوع الجميل
و>>>>>>>>>>>>>>>>>>>>
وبارك الله فيك وجزاك خيراً والسلام عليكم ورحمه الله

mh11090
11-14-2016, 07:22
السلام عليكم ورحمة االه و بركاته مشكور اخي الكريم على هده المعلومات
انل شخصيا استفدت منه فبالتوفيق لك وللجميع.
السلام
شكرا على الكتاب القيم حقا انه مفيد
وارجو منك ان تضيف كتب اخرى في هدا المجال

godagog
11-15-2016, 20:04
السلام عليكم ورحمة الله وبركاته اخي الكريم
مشكور جدا علي هذه المشاركة القيمة والرائعه
اتمني لك التوفيق
تحياتي

wahid357
12-17-2016, 14:00
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله تعالى وبركاته
بارك الله فيك على هذا الشرح والموضوع القيم والمميز
جزاك الله خيرا على كل هذه المعلومات

saadelasrg
12-19-2016, 20:19
و طبعا ممكن نغير مسار الملفات بتاعت المشروع عن طريق تغيير ال Location كما بأسفل الصورة
و نضغط أوكى

elamir84
12-30-2016, 20:38
السلام عليكم،
في البداية أود شكرك على المجهود الرائع والموضوع المتميز
بصدد التحميل لتجربة المؤشرات
تقبل مروري وشكرا

ahmed_sawalhy
01-06-2017, 14:08
بسم الله الرحمن الرحيم
شكرا اخي الكريم على هذا الموضوع المفيد لكل الاعضاء الكرام اذا كانو جدد او خبراء
ننتظر منك المزيد من الموضوعات الهامة
تحياتي لك و بانتظار مزيدك .
تقبل مرورى