fmo_82

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

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

اخواني الأعزاء اشكر تشجيعكم لي على الإستمرار ,

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

وكم دعى لك دعوه فى ظهر الغيب فما تفعله هو انك تترك علم ينتفع به و تراث لا يرتبط بفتره معينه و لكنه ممتد

لانك تنتظر الاجر من الله ...

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

تشجعت في البداية لتعليق اخي عبد الواحد عن عدد الطبقات في برتوكول ال TCP/IP وذلك لما يوحي انه اهتم بالموضوع ولكن لم اجد مشاركات اخرى له

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

اخي الحبيب اذا كان هذا عذرك فهو مقبول .. شافاك الله من كل مرض ... لكن بعد ذلك انتظر مشاركاتك

0

شارك هذا الرد


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

حدثت معى مشكله

عندما قمت بتجربة تطبيق client/server على النت ...لاحظت ان التطبيق لا يعمل مع الاشخاص الذين يكون لديهم اتصال عن طريق DSL ...فما السبب؟ وجزاكم الله خيراً

0

شارك هذا الرد


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

السبب أنك جربت مع الاشخاص الذين يستخدمون الDSL من خلال Network داخلية LAN فهم لا يملكون IP حقيقية بل أنهم يستخدمون ال NAT [Network Address Translation] و هذه الحالة لها بعض الاعدادات الخاصة مثل الport forwarding لتحقيق هذا

0

شارك هذا الرد


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

اشكرك اخي bashmohandes على الإجابة , يعتبر توفر ال Real IP امر ضروري ولابد منه في حالة استخدام برمجيات win32 بين جهازين عبر الإنترنت او ان تلجأ الى استخدام ال web app بدلا منها بستخدام مضيف host server وال ASP.NET ... او اذا كنت تستخدم DSL تستطيع طلب Real IP من ISP في منطقتك او ان تجعل برنامجك يدعم ال NAT راجع استخدامها في الدوت نيت بال MSDN ..

0

شارك هذا الرد


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

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

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

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

30204154748.jpg

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

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

30204135116.jpg

تم تخصيص عناوين خاصة لل 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.com/search?hl=en&lr=&q=I...ing+Programming

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

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

0

شارك هذا الرد


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

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

الدرس الخامس : 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 الخاص به , انظر إلى الشكل التالي:

30907413713.gif

في الدوت نيت يمكننا التعامل مع 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.com/search?hl=en&q=C%23+DNS+Programming

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

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

شارك هذا الرد


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

سلام الله عليكم

أخي العزيز فادي يشهد الله أن اللسان ليعجز عن شكرك على هذه المواضيع التي أقل مايمكن وصفها به

أنها أروع من الخيال ( ياريت تنزل هذه المواضيع على هيئه كتاب في الشبكات يدرس في الكليات)

بدلا من المراجع الأجنبيه العقيمه التي طريقتها في الشرح لاتناسبنا كعرب و لا تناسب مستوانا...

أخي لايسعني إلا أن أدعو الله أن يحفظك ويبارك فيك ويوفقك لما يحبه ويرضاه( و من لم يشكر الناس لم يشكر الله)

0

شارك هذا الرد


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

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

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

شارك هذا الرد


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

اشكرك اخي احمد , اقترح اضافة مجموعة دروس خاصة بال web Server وال XML واستخدامها في ال Win App إلى هذه السلسلة .. فما هو رأي الأخوة

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

شارك هذا الرد


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

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

الدرس السادس: SMTP & POP3 Programming

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

الجزء الأول: SMTP – Simple Mail Transfer Protocol Programming

من المعروف أن ال Mail Server يقوم بتجزئة عمليات إرسال و استقبال البريد الإلكتروني عبر الإنترنت إلى ثلاثة أجزاء وهي كما في الشكل التالي :

3120507239.jpg

MTA – Message Transfer Agent والمسئول عن الإرسال Outgoing والتوصيل Incoming للرسائل

MDA- Message Delivery Agent و المسئول عن عمليات ال filtering والتأكد من وصول الرسالة

MUA- Message User Agent والمسئول عن عملية قراءة و تخزين الرسالة في Database لدى المستقبل Client وتتم هذه العملية باستخدام بروتوكول POP - Post Office Protocol انظر إلى الشكل التالي :

31205083798.jpg

و يستخدم برتوكول ال 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 كما في الشكل التالي :

31205095192.jpg

ثم إعداد السيرفر من ال IIS كما في الشكل التالي :

31205105010.jpg

تدعم الدوت نيت استخدام بروتوكول ال SMTP من خلال النيم سبيس System.Web.Mail و تحتوي على الكلاس SmtpMail والتي من خلالها نستخدم الميثود Sendوالتي تستخدم لإرسال الرسالة عبر البورت 25 وهو البورت المخصص لبروتوكول SMTP و تعتبر الميثود Send " overloaded Method " حيث تأخذ عدة أشكال إذ بإمكانك استخدامها مع براميتر واحد إلى أربعة باراميترات , وبشكل افتراضي نستخدم البرامترات التالية :

SmtpMail.Send(string from, string to, string subject, string body)
البراميتر الأول يوضع فيه عنوان المرسل والثاني يوضع فيه عنوان المرسل إليه و البراميتر الثالث لعنوان الرسالة والرابع لنص الرسالة .  

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

31205114565.jpg

ثم قم بإضافة النيم سبيس 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", "[email protected]"); // لوضع اي اضافات تريدها مع الرسالة
  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

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

شارك هذا الرد


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

السلام عليكم

قمت بعمل البرنامج الاول و ظهرت لى هذه الرساله

Could not access 'CDO.Message' object

0

شارك هذا الرد


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

عن طريق تتبع الInner Exception للException ظهرت هذه الرساله

test messageCould not access 'CDO.Message' object.System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException (0x8004020F): The server rejected one or more recipient addresses. The server response was: 550 5.7.1 Unable to relay for [email protected]

  --- End of inner exception stack trace ---

  at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)

  at System.RuntimeType.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)

  at System.Web.Mail.LateBoundAccessHelper.CallMethod(Object obj, String methodName, Object[] args)System.Runtime.InteropServices.COMException (0x8004020F): The server rejected one or more recipient addresses. The server response was: 550 5.7.1 Unable to relay for [email protected]gawab.com

و بعمل بحث على الانترنت وجدت الموقع التالى

http://www.systemwebmail.com/faq/4.2.3.aspx

وكل الحلول الموجوده لم تفلح معى

وهذه الحلول هى

Suggestion 1

Specify a valid mail server for the SmtpMail.SmtpServer property. If that property is not set, at least set it to 127.0.0.1. For example:

SmtpMail.SmtpServer = "127.0.0.1"

Suggestion 2

If you are using "localhost" or "127.0.0.1" as the SmtpMail.SmtpServer, you may not have permissions to relay through the IIS SMTP Service. To allow access, open up the IIS Admin MMC. Locate the SMTP Virtual Server, and right-click, then select Properties. On the Access tab, click the Relay button. In the Relay Restrictions dialog, grant your IP address (127.0.0.1) to the Computers listbox. Close down all dialogs, and restart the SMTP Service.

Suggestion 3

If you are using "localhost" or "127.0.0.1" as the SmtpMail.SmtpServer, make sure Anonymous access is allowd. To allow access, open up the IIS Admin MMC. Locate the SMTP Virtual Server, and right-click, then select Properties. On the Access tab, click the Authentication button. Be sure "Anonymous Access" is the only checkbox checked. Close down all dialogs, and restart the SMTP Service.

Suggestion 4

The email address does not have a valid TO address. After iterating through the InnerExceptions, you may find this error message actually has to do with relaying. Try sending a test email to an email address that exists on the server specified by SmtpMail.SmtpServer. If you can send an email to that server, then it is a relay issue. Talk to your mail server administrator about letting your code relay through the mail server.

Suggestion 5

Use a real FROM address that exists on the SmtpMail.SmtpServer. Do not use something like "[email protected]", or some other bogus address as your MailMessage.FromProperty. More advanced mail servers will catch this, and will deny relaying.

Suggestion 6

I have no idea why this suggestion works, but I found it on the web. I figured I would mention it, just in case Suggestion 1 did not work. Instead of specifying

SmtpMail.SmtpServer = "127.0.0.1"

try

SmtpMail.SmtpServer.Insert( 0, "127.0.0.1 or your mail server name here")

0

شارك هذا الرد


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

اشكرك اخي الكريم , بنسبة لهذه المشكلة فقد ظهرت معي وقمت بحلها من خلال اعداد Virtual SMTP من ال IIS , إذا استخدمت حساب SMTP خاص بك تأكد من انه يدعم ال CDO Version 2 ..

ملاحظة هامة جدا :

هذا الكود يعمل بشكل جيد, لكن يجب التأكد من تفعيل ال 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 السابق الذكر .

*لا تنسى التأكد من ان بورت 25 والمخصص لل SMTP متاح لديك وذلك من خلال الفيروول الخاص بالويندوز

..... اخبرنا بنتائج

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

شارك هذا الرد


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

هل انا بحاجه الى static IP حتى استطيع جعل جهازى كSmtp Server ام هذا ليس شرطا

لقد وضعت فى الIP field فى الVirtual Smtp server الlan address لى و هو 10.0.0.1

هل هذا ينفع ام ماذا؟

مع العلم بان انا DSL و الdynamic ip

0

شارك هذا الرد


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

السلام عليكم

بعد تعديل الRelay restrictions لم يعد هناك اى Exception

ولكن المشكله ان الرساله لا تصل الى البريد الالكترونى و لكنها موجوده فى مجلد

C:\Inetpub\mailroot\Queue

ما الحل الان؟

وشكرا على مجهوداتك معنا :)

0

شارك هذا الرد


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

اشكرك اخي الكريم , بنسبة لعدم وصول الرسالة الى البريد الإلكتروني فهو امر طبيعي وذلك لكونك تستخدم Virtual SMTP وهو لتجربة فقط , أما إذا اردت تفعيله عمليا فيجب ان يتوفر لديك إما حساب SMTP Acount من ال ISP الخاص بك أو أن يتوفر لديك Static IP إذا اردت أن تكون SMTP Server طبعا في كلا الحالتين يجب أن يدعم مكتبة CDO Version 2 وهي متوفرة بشكل افتراضي مع Windows XP/2003 Server في ال IIS الخاص به ... وبتوفيق

0

شارك هذا الرد


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

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

انا سمعت عن opensmtp.dll و قيل لى انه يمكن ان نستخدمها لارسال الرسائل بدون مشاكل وهى افضل من الSMTP الموجود فى الSystem.Web.Mail

قمت بالبحث عن هذا الdll ووجدت ان مصدره SourceForge وعندما حملت الملف وكان مضغوطا و حينما حاولت فك الضغط بيطلعلى error يعنى من الاخر SourceForge حطه الFile بايظ

لو حد عنده الopensmtp.dll او يعرف لينك شغال انزلها منه يا ريت يقول عليه

0

شارك هذا الرد


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

اشكرك اخي الكريم سوف احاول ان ابحث لك عنه إن شاء الله ..

انتظرونا في درس برمجة ال POP3--)) يعتبر هذا الدرس مهم جدا كوننا سنثبت به المفاهيم السابقة من استخدام ال Stream و Socket إلى استخدام ال DNS بلإضافة إلى بعض المفاهيم الجديدة ... اتمنى التفاعل الجاد ..

0

شارك هذا الرد


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

ممكن أخي أن تضع الدروس على شكل PDF؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

0

شارك هذا الرد


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

تكرم يا سيدي :) ,

هذه السلسلة الأبتدائية لدروس على شكل PDF File .., سوف أقوم بإضافة كل درس يتم الإنتهاء من شرحه إلى هذه السلسلة إلى ان تكتمل بعون الله :

الجزء : 1/2

C# Network Programming Lectures -0.1.part1.rar

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

شارك هذا الرد


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

شارك هذا الرد


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

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

الدرس السادس الجزء الثاني : POP3- Post Office Protocol Version 3 Programming

كما تحدثنا سابقا فإن وظيفة برتوكول ال POP3 والذي يعمل في جزء ال MUA - Mail User Agent على بورت 110 ضمن برتوكول ال TCP تكمن في كونه المسئول عن عملية توصيل الرسالة إلى الزبون Client من خلال عمل Download لها من ال Mail Server حيث تحفظ الرسائل في ال Mail Folder والموجود أساسا في جهاز ال Client أنظر إلى الشكل التالي:

31205083798.jpg

ومن البدائل لل POP3 برتوكول Interactive Mail Access Protocol – IMAP فمن خلاله يستطيع المستخدم إنشاء Mail Folder خاصة به ولكن في ال Mail server وليس في جهاز الزبون وتعتبر هذه من ميزات ال IMAP وسيئاته بنفس الوقت إذ أن قراءة الرسالة تتم مباشرة من خلال ال Server حيث تستطيع قراءتها من أكثر من Client ولكن المشكلة فيه هي تحكم مدير خادم الرسائل Mail Server Administrator بحجم ال Mail Folder إذ تكون في العادة سعتها محدودة أنظر إلى الشكل التالي :

31805023244.jpg

لاحظ أن ال Mail Folder يقع ضمن Mail Server ويتم قراءته بعد التحقق Authentication من اسم المستخدم وكلمة المرور لكن كما قلنا فإن مشكلته تكمن في محدودية سعة ال Mail Folder لذا ينصح لشركات الكبيرة استخدام ال POP3 كونه غير محدود السعة فالذي يتحكم في السعة هو ال Client ولا دخل ل Mail Server Administrator بها.

وبما أننا قررنا اعتماد ال POP3 لعملية قراءة الرسائل سوف نبدأ ببرمجته إذ يلزم الأمر استخدام النيم سبيس System.Net.Sockets و System.Net و System.IO حيث يتم عمل Session خاص مع السيرفر باستخدام ال Socket للقيام بعملية تفحص وجود رسائل جديدة وفي حالة وجودها يقوم بتعبئة عناوينها في List Box أو Treelist خاص حسب الحاجة وعند الضغط على إحداها يقوم ال Client بعمل Download لرسالة من ال Mail Server إلى ال Mail Folder ثم عرضها في Textbox.

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

31805033967.jpg

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

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

لاحظ انه يتم التعامل مع ال Socket وال Stream لإنشاء Session مع السيرفر باستخدام برتوكول ال TCP وقراءة الرسالة من ال POP3 Server .

ثم قم بإضافة التعاريف التالية في بداية البرنامج (أي بعد تعريف الكلاس الرئيسي – في منطقة ال Global Declaration) :

public TcpClient Server;//اشتقاق اوبجكت من برتوكول التي سي بي وذلك بهدف إنشاء الجلسة 
public NetworkStream NetStrm;// سوف نستخدمه لإرسال معلومات المستخدم
public StreamReader  RdStrm; // لقراءة المعلومات الواردة من البوب 3 سيرفر
public string Data; // لاستخدامها في البرنامج
public byte[] szData; // لتخزين البيانات الواردة من البوب 3 سيرفر
public string CRLF = "\r\n";// لاستخدامها في البرنامج

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

// create server POP3 with port 110
// لإنشاء سيشن مع البوب سيرفر عبر البورت المخصص وهو 110
Server = new TcpClient(POPServ.Text,110);      
try
{
// initialization
NetStrm = Server.GetStream();
RdStrm= new StreamReader(Server.GetStream());
Status.Items.Add(RdStrm.ReadLine());

// Login Process
//إدخال اسم المستخدم وكلمة المرور وتمريرها إلى البوب سيرفر
Data = "USER "+ User.Text+CRLF;    
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
Data = "PASS "+ Passw.Text+CRLF;    
//بعد التأكد من اسم المستخدم وكلمة المرور يتم قراءة صندوق الوارد الخاص بالمستخدم
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

// Send STAT command to get information ie: number of mail and size
Data = "STAT"+CRLF;    
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());

قم بإضافة الكود التالي إلى ال Disconnect Button :

// Send QUIT command to close session from POP server
Data = "QUIT"+CRLF;    
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);
Status.Items.Add(RdStrm.ReadLine());
//close connection
NetStrm.Close();
RdStrm.Close();

ولقراءة الرسائل من صندوق الوارد( بشكل افتراضي سيتم قراءة الرسالة الأخيرة ) قم بإضافة الكود التالي إلى ال Read Last Come Email Button :

string szTemp;      
Message.Clear();
try
{
// retrieve mail with number mail parameter
Data = "RETR 1"+CRLF; // لتحديد رقم الرسالة المراد قراءتها    
szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());
NetStrm.Write(szData,0,szData.Length);    
szTemp = RdStrm.ReadLine(); // تخزين الرسالة بشكل مؤقت حتى يتم طباعتها
if(szTemp[0]!='-')
{
while(szTemp!=".")
 {
Message.Text += szTemp+CRLF;
szTemp = RdStrm.ReadLine();
}
 }
else
{Status.Items.Add(szTemp);}
}

catch(InvalidOperationException err)
{Status.Items.Add("Error: "+err.ToString());}

وهنا قد قمت بشرح كيفية عمل البوب 3 وبرمجته في الدوت نت وهذا مثال بسيط تستطيع البدء منه لعمل مشروع كامل شبيه بال Outlook الخاص بميكروسوفت حيث تستطيع استخدام ملف ال DLL الخاص بالإنترنت إكسبلورر لعرض الرسائل الواردة بدلا من عرضها على شكل HTML Code كما تستطيع عمل Tree List لوضع الرسائل الواردة حيث يكون لكل رسالة رقم تسلسلي يتم وضعه في الكود السابق لقراءتها حيث استخدمت الرقم 1 بشكل افتراضي والذي يقوم بقراءة الرسالة الأخيرة الواردة .

في الدرس القادم سوف نتحدث عن برمجة ال HTTP .. انتظرونا

0

شارك هذا الرد


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

لتنزيل ملف ال PDF لسلسلة الآن على الرابط :

http://d.turboupload.com/d/153870/C_Networ...ng_0.2.rar.html

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

شارك هذا الرد


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

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

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

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

لكن كأن ملف الpdf الpart1 هو نفسه part2 ؟

شكراً جزيلاً

0

شارك هذا الرد


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

اشكرك اخي قم بتزيل ملف ال PDF من الرابط الأخير على :

http://d.turboupload.com/d/153870/C_Networ...ng_0.2.rar.html

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

شارك هذا الرد


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

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

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



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

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

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