238
Version 2.0, 2006 اﻹﻟﻜﺘﺮوﻧﻴﺔ اﻟﻨﺴﺨﺔ و اﻟﻮرﻗﻴﺔ ﻟﻨﺴﺨﺔ ﻣﻠﺨﺺ هﻲ ﻣﺠﺎﻧﻴﺔ ﻧﺴﺨﺔ هﻲ، ﺑﻴﻊ ﻳﻤﻨﻊ ورﻗﻴﺔ ﺑﺼﻮرة ﺑﻴﻌﻬﺎ ﻳﻤﻨﻊ آﻤﺎ اﻷﺷﻜﺎل ﻣﻦ ﺷﻜﻞ ﺑﺄي اﻹﻟﻜﺘﺮوﻧﻴﺔ اﻟﻨﺴﺨﺔ... ﻣﻦ اﻟﻜﺜﻴﺮ إﺿﺎﻓﺔ ﻣﻊ اﻟﻜﺘﺎب ﻣﻦ اﻟﻤﻌﺘﻤﺪة اﻟﻨﺴﺨﺔ هﻲ اﻟﻮرﻗﻴﺔ اﻟﻨﺴﺨﺔ اﻟﺠﺪﻳﺪة اﻟﺘﻌﻠﻴﻤﻴﺔ اﻟﺪروس... ا أو واﻻﺳﺘﻔﺴﺎر أ ﻟﻄﻠﺐ اﻟﺘﺎﻟﻴﺔ ﻟﻌﻨﺎوﻳﻦ اﺣﺪ ﻋﻠﻰ اﻻﺗﺼﺎل ﻳﺮﺟﻰ ﻟﺘﻮزﻳﻊMobile : +962796284475 Phone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan Mobile : +962796284475 Phone: +96265055999 E-mail: [email protected] اﻷول اﻟﻜﺘﺎب واﻟﻤﺘﺨﺼﺺ هﺬا ﻓﻲ اﻟﻤﺠﺎل ﻓﻘﻂ اﻟﻌﺮﺑﻴﺔ ﺑﺎﻟﻠﻐﺔ اﻹﻟﻜﺘﺮوﻧﻴﺔ اﻟﻨﺴﺨﺔVersion 2 Dot Net Networks & TCP/IP Programming وﺑﺮوﺗﻮآﻮل اﻟﺸﺒﻜﺎت ﺑﺮﻣﺠﺔ اﺣﺘﺮفTCP/IP اﻹﻟﻜﺘﺮوﻧﻴﺔ اﻟﻨﺴﺨﺔ اﻟﺜﺎﻧﻲ اﻹﺻﺪارWith Microsoft Visual C# & VB.NET اﻟﻘﺎدر ﻋﺒﺪ ﻓﺎدي ﺗﺄﻟﻴﻒ اﻷردن ﻟﻠﻤﺆﻟﻒ ﻣﺤﻔﻮﻇﺔ اﻟﺤﻘﻮق ﺟﻤﻴﻊ2006

Ip معلومات حول

Embed Size (px)

DESCRIPTION

rgftesad

Citation preview

Page 1: Ip معلومات حول

1

Version 2.0, 2006

يمنع بيع ، هي نسخة مجانيةهي ملخص لنسخة الورقية والنسخة اإللكترونية ...النسخة اإللكترونية بأي شكل من األشكال آما يمنع بيعها بصورة ورقية

النسخة الورقية هي النسخة المعتمدة من الكتاب مع إضافة الكثير من ...الدروس التعليمية الجديدة

لتوزيع يرجى االتصال على احد لعناوين التاليةلطلب أ واالستفسار أو ا

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected]

في هذا والمتخصصالكتاب األول باللغة العربية فقطالمجال

— النسخة اإللكترونية—

Version 2

Dot Net Networks & TCP/IP Programming

اإلصدار الثاني النسخة اإللكترونية— TCP/IPاحترف برمجة الشبكات وبروتوآول With Microsoft Visual C# & VB.NET

األردن–تأليف فادي عبد القادر جميع الحقوق محفوظة للمؤلف

2006

Page 2: Ip معلومات حول

2

:المقدمة

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

وتطبيقات TCP/IP Models بمقدمة عامة عن و يبدأ الكتاب، بأسلوب جميل وممتع Client/Server باستخدام للغات الدوت نيت آما ويحتوي على شرح مفصل عن Socket Programmingالـ وTransport Layer Protocols و الـNetwork Layer Programming وبناء

Voice Chat Systemsوالـ آأنظمة المؤتمرات Multicasting ـأنظمة متقدمة باستخدام ال Voice Over IP Programmingويحتوي الكتاب على شرح ألهم األمور المتعلقة بالـ

آما ويحتوي على شرح ، وأنظمة التحكم عن بعد وغيرها Remote Desktop ـوبرمجيات الوأخيرا ، واستخداماتها في برمجيات الشبكات Application Layer ـمفصل ألهم برتوآوالت ال

مفصل عن طرق الحماية ووضع الصالحيات والسياسات في برمجيات الشبكاتشرح Row الـ باستخدام المرسلة Packets إلى طرق تحليل والتصنت على الـ ةباإلضاف

Programming والـPacket Sniffer ...

:اإلهداء يما يتعلق بالـ المبرمجين العرب فالطالب و وجود مرجع لكل آان الهدف من تأليف الكتاب

Network Programming الطالب آلاهدي هذا الكتاب إلى في بيئة الدوت نيت لذلك ...والمبرمجين العرب في جميع أنحاء العالم

فادي عبدالقادر April – 2006

Page 3: Ip معلومات حول

3

:)غير المجانيةالالنسخة ( إلى الكتاب النسخة الورقيةإضافتهااألمور التي سيتم

سيتم التطرق إلى معاييرVoice Over IP Programming يف : أوال . SCTP Transport Protocol إلى الـ ةباإلضاف H.323 والـ SIP مثل الـ VOIP الـ

.Advanced Web Services Programming & Remotting Services :ثانيا

ARP,RARP,ICMP & Advanced Row & Packet Sniffering Applications : ثالثا

Programming.

.Remote Desktop Applications & Controls :رابعا

في TAPI Telephony واالتصال عبر امراقبة عبر الكاميرال أنظمةنشاء إ : خامسا .Image Processing باستخدام الـ حالة ورود تغيير في الصور الملتقطة

واستخدامها في Multithreading الـ اشرح مفصل عن تكنولوجي : سادسا

.برمجيات الشبكات

ومعاير التشفير Programming Network Security شرح مفصل عن : سابعاDESوالـ RSAوالـ DSA والـ SSLواستخدامها في برمجيات الشبكات .

والتصنت على حرآة Keyboard Listeningعن طرق بناء برمجيات الـ شرح : ثامناوالـ Hooks Programmingات عبر الشبكة باستخدام الـ ونقل المعلومMouseالـ

Network Programming.

واستخدامها في بيئة Application Layer Protocols شرح موسع عن الـ :تاسعا .الدوت نيت

على Real Applicationsمجموعة اآبر من المشاريع واألمثلة العملية :عاشرا

.آل فصول الكتاب

Page 4: Ip معلومات حول

4

:ملخص الفصول

Part1 Networks & TCPIP Programming Overview: Chapter 1: TCP/IP Layers & Message Encapsulation Overview Chapter 2: IPv4 & IPv6 Architecture Overview Chapter 3: IP Multicasting Overview Part2 Streaming: Chapter 4: Streaming (Classes & Members) Chapter 5: Applied Streaming in Dot Net (+Advanced Applications in Full Version Book) Part3 Transport & Network Layer Programming: Chapter 6: Transport TCP & UDP (Classes & Members) Chapter 7: Synchronous Sockets Programming Chapter 8: Asynchronous Sockets Programming Chapter 9: Advanced Multicasting Systems (Architecture & Conference Systems) Chapter 10 VOIP - Voice Over IP Programming (+Advanced VOIP Programming in Full Version Book) Part4 Application Layer Programming: Chapter 11 DNS Programming Chapter 12 HTTP Programming Chapter 13 Web Services & XML Programming (+Advanced Remotting in Full Version Book) Chapter 14 SMTP & POP3 Programming (+ Create a Program Similar Like Microsoft Outlook in Full Version Book) Chapter 15 FTP Programming Part5 Network Security Programming: Chapter 16 Cryptography (+ More Advanced Topics Just in Full Version Book) Chapter 17 Socket Permissions Chapter 18 Packet Sniffer & Row Programming (Just in Full Version Book) Part6 Multithreading Chapter 19 Multithreading (Using & Managing) (Just in Full Version Book) Appendixes: Most Important Dot Net Namespaces For Network Applications

Page 5: Ip معلومات حول

5

:فهرس المحتويات في النسخة اإللكترونية

Part 1 Networks & TCPIP Programming Overview: Chapter 1: TCP/IP Layers & Message Encapsulation Overview ……… Page 10

- TCP/IP Layers Encapsulation Overview - TCP / UDP Connection Establishment - TCP & UDP Header Encapsulation - Using TCP Connection Oriented in Dot Net to Send Unicast Messages - Using UDP Connectionless in Dot Net to Send Broadcast Messages - Streaming & Threading Overview & Using it to Send Images Throw Network

Chapter 2: IPv4 & IPv6 Architecture Overview ……………….……. Page 35

- IPv4 Architecture - Classful IP Address

- Unicast IP - Broadcast IP - Multicast IP

- CIDR Nation Overview - IPv6 Architecture Overview Chapter 3: IP Multicasting Overview ………………………………. Page 41

- IP Multicasting Overview - Using IP Multicasting in Dot Net to Create a Multicast Groups

Part2 Streaming: Chapter 4: Streaming (Classes & Members) ……………….……. Page 47

- Stream Classes - Stream Members - Stream Manipulation

Chapter 5: Applied Streaming in Dot Net ……………….……. Page 56

- Create a Simple Remote Control Application Using StreamReader & StreamWriter Classes - Create a Remote Desktop Application By Using TCP Streaming Connection

- Create an Advanced Remote Web Camera Monitoring System By Using TCP Streaming Connection & Image Processing.

- Create a Simple Application to Store & Read Images (Binary Data) in Microsoft Access & Microsoft SQL Server Database Management System By Using Streams Library & ADO.NET

Page 6: Ip معلومات حول

6

Part3 Transport & Network Layer Programming: Chapter 6: Transport TCP & UDP (Classes & Members) ….……. Page 71

- TCP Classes Members - UDP Classes Members

Chapter 7: Synchronous Sockets Programming …………..……. Page 77

- Introduction to Socket Programming - Synchronous Socket Programming - Synchronous Socket Classes & Members

Chapter 8: Asynchronous Sockets Programming ………………. Page 85

- Asynchronous Socket Class and its members - Applied Asynchronous Socket in Dot Net

Chapter 9: Advanced Multicasting Systems ……………..……. Page 99 - Architecture of Multicast Sockets - Using Multicast Sockets with .NET - Multicast Conferencing Systems: - Full/Half Duplex Multicast Video Conferencing System. - Full/Half Duplex Multicast Desktop Conferencing System. - Full/Half Duplex Multicast Text Conferencing System Chapter 10 VOIP - Voice Over IP Programming ………….……. Page 127

- The Concept & Requirements of Voice Communication Systems - How to Create a Voice Chat Throw Dot Net Using Unmanaged API’s Functions - Testing UDP Multicasting, TCP and Thinking in SCTP to Transfer Voice Throw Networks - How to Create a Voice Conference System Using Microsoft Direct Play 9

Part 4 Application Layer Programming: Chapter 11 DNS Programming ……………….………………..…. Page 156

- Synchronous DNS Members - Asynchronous DNS Members

Chapter 12 HTTP Programming ……………….…….…….….…. Page 163

- The Concept of HTTP Protocol - Using HTTP in Dot Net - Advanced HTTP Programming - Using HttpWebRequest - Using HttpWebResponse

Page 7: Ip معلومات حول

7

Chapter 13 Web Services & XML Programming …………... Page 174

- Introduction to Web services & XML - Create A Simple Web Service Application - Advanced Remotting & Web Services Programming

Chapter 14 SMTP & POP3 Programming ……………….……. Page 180

- SMTP Protocol - SMTP Concept - Using SMTP in Dot Net - Advanced SMTP Programming - POP3 Protocol

- POP3 Concept - Using POP3 in Dot Net

Chapter 15 FTP Programming …………………………..……. Page 191

- Introduction to FTP – File Transfer Protocol - Create a Simple Application to Transfer Files By Using COM Components - Create a Simple Application to Transfer Files By Using Web Classes Components - Create a Simple Application to Transfer Files By Using Socket Programming & Streaming Libraries

Part5 Network Security Programming: Chapter 16 Cryptography ……………….………………..…. Page 210

- Cryptography in Dot Net - Hashing In Dot Net - Digital Signature Algorithms

Chapter 17 Socket Permissions ……………..….……. Page 224

- Permission Namespace Overview - Security Action - Socket Access property

Chapter 18 Packet Sniffer & Row Programming

- Introduction to Row Programming - Create a Packet Sniffer Application - Using ARP,RARP in Security Programming.

Page 8: Ip معلومات حول

8

Part6 Multithreading Chapter 19 Multithreading Using & Managing

- Introduction to Threading in Dot Net - Threading Classes & Members - Multithreading & Network Applications

Appendixes: Most Important Dot Net Namespaces For Network Applications ……………….……. Page 232

- System.Net Namespace

- System.Net.Socket Namespace - System.Threading Namespace - System.Runtime.Remoting

- System.Runtime.Serialization

Page 9: Ip معلومات حول

9

Chapter 1 TCP/IP Layers & Message Encapsulation Overview & Introduction to Network Programming Chapter2 IPv4 & IPv6 Architecture Overview Chapter3 IP Multicasting Overview

Part1 Networks & TCP/IP Programming Overview

Page 10: Ip معلومات حول

10

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 1 TCP/IP Layers & Message Encapsulation Overview & Introduction to Network Programming

- TCP/IP Layers Encapsulation Overview - TCP / UDP Connection Establishment

- TCP & UDP Header Encapsulation

- Using TCP Connection Oriented in Dot Net to Send Unicast Messages

- Using UDP Connectionless in Dot Net to Send Broadcast Messages

- Streaming & Threading Overview & Using it to Send Images Throw Network

Page 11: Ip معلومات حول

11

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

1.1 : IP Layers Encapsulation Overview/TCP

من المعروف أن الشبكة هي مجموعة من األجهزة متصلة مع بعضها عبر وسيلة اتصال معينة لعملية االتصال والتي تمر بسبعة OSIومن هنا سيندرج لدينا التقسيم المعروف لمنظمة

وتم .على البيانات المرسلة Headersيتم إضافتها آـ ة طبقات لكل طبقة منها وظيفة معين : وتبين الصورة المرفقة هذه الطبقاتTCP/IP برتوآول في خمسة طبقاتإلىاختصارها

ووظيفتها هنا التعامل مع Application Layer ـتبدأ عملية توليف الرسالة المرسلة في الففي ، يمكن إرسالها عبر الشبكة Dataالرسالة نفسها وتحويلها من صيغة نصية إلى

ثم إلى مجموعة من ASCII Code يتم تحويل النص المكتوب إلى Chatبرمجيات الدردشة Binary Code أو الـBits توضع في مصفوفة لتجهيزها وإرسالها عبرSocket والذي يربط طبقة

الشكل التالي وضحي و Internet Layer أو الـ Network Layerالـ مع Transport Layer ـال :Socketطبيعة عمل الـ

Network في Destination IP مع Transport Layer المحدد في Portحيث يربط رقم الـ

Layerويقوم الـ Serverبالطرف المقابل بالموافقة على طلب الـ Client وتقتصر وظيفة التي يتم تحديدها ثم Socket Option مع الـ Port على ربط رقم الـServer في الـSocketالـ

Page 12: Ip معلومات حول

12

ويمكن في هذه المرحلة وضع شروط ، الذي تم تحديده Portالبدء بعملية التصنت على الـ أو ما شابه أو الموافقة بشكل Authenticationمعينة لقبول الجلسة مثل عمليات التحقق الـ

.مباشر

: إلى ثالثة طبقاتupper Layers ـ تم تقسيم الOSIفي نموذج

Application لتعامل مع البرنامج نفسه أو ما يسمى User Interface

Presentation تمثيل البيانات المرسلة وهي آما ظهرت سابقا بتحويل البيانات إلى في الدوت نيت تتم عملية تمثيل ، أو استخدام أساليب لضغط البيانات أو تشفيرها ASCIIـال

:آما يليASCIIEncoding Class باستخدام الــBinaryالرسالة بالـ

#C String str=Console.ReadLine(); ASCIIEncoding asen= new ASCIIEncoding();

byte[] ba=asen.GetBytes(str);

NET.VB Dim str As String = Console.ReadLine Dim asen As ASCIIEncoding = New ASCIIEncoding Dim ba As Byte() = asen.GetBytes(str)

Sessionفتح ( وفيها البدء بعملية التخاطب بين الجهازين و التعريف ببعضهم البعض …) الجلسة

والتي تقوم بعمل Layer Application فكتفا بوجود طبقةTCP/IP ـأما في بروتوآول ال

ات يتم التعرف وفتح الجلسة بعدة خطوSession Layerفي ، OSIالطبقات الثالث األولى في :وهي آما يلي

المحدد وذلك بعد تحديد عملية Port ـ و الIP ـ عبر الServer الـ إجراء االتصال المبدئي ب-1

.TCP أو عبر UDPاالتصال سواء عبر ذلكServerـ إذا تطلب الAuthentication ـ التعريف بنفسه وعمل ال-2 الجلسة أو رفضها قبول أو رفض الجلسة ويتم ذلك بإرسال الموافقة على فتح-3 الخاص بالبرنامج Portـ على الListening بعمل Serverـ بدأ الجلسة وقيام ال-4

:TCP Protocol باستخدام ال وهنا مثال يوضح عمل هذه الطبقة

:#C

TcpClient tcpclnt = new TcpClient("192.168.0.2",8001);

:NET.VB Dim tcpclnt As TcpClient = New TcpClient("192.168.0.2", 8001)

Clientعندما يتم الموافقة على فتح الجلسة والبدء بعملية التخاطب يقوم جهاز المرسل

وفي هذه الطبقة يتم تحديد Transportبتحميل الرسالة إلى الطبقة األخرى وهي هنا طبقة UDP - Connectionless ـ أو عبر الTCP - Connection Protocolطبيعة االتصال سواء عبر

Protocolففي البروتوآول األول يتم تحديد طرفين وهما المرسل والمستقبل و Port االتصال أن أي وهذا يعني Broadcast آل األجهزة الطرف المستقبل فيمكن أن يكون UDP ـأما ال

آما يمكن من عمل ، يستطيع استقبال الرسالة Portـشخص يقوم بتصنت عبر هذا ال في Port مع رقم الـMulticast IP أو الـBroadcast IPويتم ذلك بوضع الـ ، Multicastingالـ ...Socketالـ

Page 13: Ip معلومات حول

13

جاهز يقوم بهذه Classنستخدم في الدوت نت TCPعبر الـوإلرسال الرسالة عبر الشبكة

وهو المسئول عن التعامل مع وسيلة االتصال وإرسال NetworkStreamالعملية ويسمى وآمثال نفسهSocketأو باستخدام ال ، Stream Dataطرف المعني بشكل الرسالة إلى ال

:على ذلكC#: NetworkStream mynetsream = tcpclnt.GetStream (); StreamWriter myswrite = new StreamWriter (mynetsream); myswrite.WriteLine("Your Message"); myswrite.Close (); mynetsream.Close (); tcpclnt.Close ();

:NET.VB

Dim mynetsream As NetworkStream = tcpclnt.GetStream Dim myswrite As StreamWriter = New StreamWriter(mynetsream) myswrite.WriteLine("Your Message") myswrite.Close () mynetsream.Close () tcpclnt.Close ()

إذ تتم عنونة الرسالة ووضع عنوان المرسل Network Layerوبعد ذلك تسلم إلى ومن Physical Tunnelوالمستقبل عليها وتسلم إلى الطبقة األدنى ليتم إرسالها عبر ال

...IP,IPv6,ARB-Address Resolution Protocolاألمثلة عليها بالعكس يقوم بالمرور على نفس الطبقات ولكن ف Server الأما بنسبة للجهاز المستقبل

ثم Transport ثم Network ثم Data linkلتحول إلى Bitsحيث يستلم آرت الشبكة ال Application ومنها تحول من Binary إلى ASCII ومن ASCII إلى Text .. الكود يوضح اوهذ

: Serverمبدأ عمل ال

:#C TcpListener myList=new TcpListener(5020); myList.Start(); Socket s=myList.AcceptSocket(); NetworkStream myns = new NetworkStream (mysocket); StreamReader mysr = new StreamReader (myns); Console.Write (mysr.ReadLine()); s.Close(); VB.NET: Dim myList As TcpListener = New TcpListener(5020) myList.Start() Dim s As Socket = myList.AcceptSocket() Dim myns As NetworkStream = New NetworkStream(mysocket) Dim mysr As StreamReader = New StreamReader(myns) Console.Write (mysr.ReadLine()) s.Close()

Server الخاص بالـMAC Addressبعد إجراء عملية العنونة يقوم المرسل بسؤال عن عنوان الـ

ويقوم هذا البروتوآول ARP-Address Resolution Protocolوتتم هذه العملية عبر بروتوآول الـ وفي حالة عدم وجوده يقوم MAC Table في الـMAC Addressبالتحقق من وجود الـ

Page 14: Ip معلومات حول

14

IP إلى آل الشبكة يسأل فيها عن صاحب الـRequest Broadcast Message ARBبإرسالAddress المراد اإلرسال له فإذا وجده يرسل الجهاز المعني ICMP Message يخبره فيها الخاص به وبعد استالم الرسالة يقوم بتخزين العنوان المعني في MAC Addressبعنوان الـ

MAC Table الحظ الشكل التالي، في المرات الالحقة الخاصة به ولكي يتم استخدامه:

Internet Encapsulation هل سيكون آـEncapsulationوبعد هذه المرحلة يتم تحديد نوع الـ والشكل التالي يوضح آل Data Link Layer ويتم ذلك في الـEthernet Encapsulation أو

:هذه العمليات

Page 15: Ip معلومات حول

15

: آما يليPacketوفي النهاية يكون الشكل العام للـ

وعملية اإلرسال باستخدام Ethernetويجب التفريق بين عملية اإلرسال باستخدام الـ تتم عملية اإلرسال بعد معرفة Ethernet إذ أنه في الـSerial Connection أو الـInternetالـق مبدأ فيتم الوصول وفInternet أما في الـARP لطرف األخر باستخدام الـMAC Addressالـ : الحظ الشكل التاليPPP – Point to Point Protocolالـ

بايت 60 إلى 20 من Header ويتراوح حجم الـData على الـHeaderفي آل طبقة يتم إضافة .Header التي يتم إضافتها إلى الـ Optionsحسب الـ

Packetوم بعملية الـ وهو برنامج يقEtherealفي المثال التالي سنقوم باستخدام برنامج الـSnifferوالذي يمكن تثبيته من الموقع الخاص به وهو :

0Hhttp://www.ethereal.com/download.html

Page 16: Ip معلومات حول

16

:HTTP والـDNS والـARBمثال على استخدام الـ

Interface Cardلذي يقوم بتصنت على الـ واEtherealالحظ الشكل التالي في برنامج الـ :Internet Explorer باستخدام الـGoogleحيث قمنا بطلب الدخول على موقع الـ

وهو هنا Gateway الخاص بالـMAC Addressالحظ أن أول عملية آانت السؤال عن الـنية قام وفي العملية الثاBroadcast Message حيث أرسلت هذه الرسالة آـ10.0.0.138

الخاص به بعد هذه MAC Address وأرسل عنوان الـARP Request بالرد على الـRouterالـ DNS Request Query بإرسال Google بإلستفسار عن عنوان الـClientالعملية سيقوم الـ

والموجودة DNS Table في الـGoogle الخاص بالـIP Addressالحظ أنه في المثال قد وجد الـ من قبل والدليل على ذلك Google التشغيل وهذا يعني انه تم الدخول على الـضمن نظام

وبعد هذه العملية قام موقع DNS Table موجود في الـGoogle الخاص بالـIP Addressأن الـ 8 بالرد على الطلب يخبره بوجوده وضمن العنوان المحدد الحظ أن العمليات من Googleالـ

وتتم Googleإرسال لمحتويات الصفحة الخاصة بموقع الـ هي عمليات طلب و 20إلى . HTTP Protocolباستخدام الـ

Page 17: Ip معلومات حول

17

2.1 : UDP Connection Establishment/ TCP

وفي العادة يقوم الطرف المرسل بإرسال ، تمر عملية إنشاء االتصال بمجموعة من المراحل الموافقة على إجراء االتصال يتم البدء بإرسال طلب إنشاء االتصال إلى الطرف األخر وعند

تتم هذه العملية بثالثة TCPفي بروتوآول الـ ، مجموعة من المعلومات إلى الطرف المستقبل :و آما هو واضح في الشكل التالي Three-way hand-shakeمراحل تسمى

ويرسله إلى Sequence Number حيث يقوم الطرف المرسل بتوليد رقم تسلسلي -1 عند 1 ويكون هذا الرقم المولد نقطة البدء لعملية اإلرسال بحيث يتم زيادته بمقدار Serverالـ

.آل عملية إرسال إلى Acknowledgment ويقوم بإرسال Sequence Number يستلم الطرف المقابل الـ-2

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

. الذي أرسل من قبل المستقبلAcknowledgmentمرفق معه الـ

من UDP وال يتحقق الـAcknowledgments بدون إرسال فتتمUDPأما في بروتوآول الـ وهو ما سيتم توضيحه في الجزء التالي من هذا TCPعمليات الوصول آما هو الحال في الـ

.الفصل 3.1 : Encapsulation Header UDP & TCP

حيث UDP أو الـTCP يتم التعامل مع إحدى البروتوآولين Transport Layerفي طبقة الـ ونوع اإلرسال هو Stream فيها طبيعة اإلرسال فإذا آان المطلوب هو اإلرسال آـسيحددUnicastفيتم اختيار الـ TCPأما في حالة آان المطلوب هو اإلرسال آـ Broadcast أو

Multicastفيتم اختيار الـ UDP وسوف نبين في الجزء التالي من هذا الفصل ، لعملية اإلرسال ...UDP وبروتوآول الـTCPستخدام بروتوآول الـمبدأ عملية اإلرسال با

Page 18: Ip معلومات حول

18

.13.1 : EncapsulationTCP حيث يتميز هذا البروتوآول بكل TCPسوف نبين في هذا الجزء طبيعة االتصال باستخدام الـ

آما يدعم عمليات التحقق Buffer أو حجم الـData Flowعمليات التحكم سواء على مستوى Header وهذا واضح من ترآيب Delivered on Sequenceتيب السليم من الوصول وفق التر

:الخاصة به أنظر إلى الشكل التالي

1..13.1 Destination Port& Source :

الخاصة بالبرنامج الذي يجري عملية Destination Port والـSource Portحيث يتم تحديد الـ الآن يمكن Portبرنامج استخدام نفس رقم الـاالتصال ومن المعروف أنه ال يمكن ألآثر من

لليست Portوبتأآيد فإن عملية اختيار الـ ، Port Addressللبرنامج الواحد استخدام أآثر من إذ أنها أرقام 1023 وتنتهي 0عشوائية حيث انه يجب االبتعاد عن األرقام التي تبدأ بـ HTTPل ومن األمثلة عليها بروتوآول الـلبروتوآوالت معروفة ويتم استخدامها في نظام التشغي

ويفضل عند ، وغيرهPort 21 والذي يستخدم الـFTP وبروتوآول الـ Port 80والذي يستخدم الـ : انظر إلى الشكل التالي 49.151 أن ال يبدأ برقم يقل عن Portاختيار الـ

Page 19: Ip معلومات حول

19

.2.13.1 Acknowledgment Number& Sequence : عند إرساله Packet ويدل هذا الرقم على رقم التسلسل للـBits 32ي آل منهما على ويحتو

فيحتوي Acknowledgmentأو استقباله ويتم توليده عشوائيا عند بداية االتصال أما رقم الـ الذي تم التأآد من وصوله وتتم هذه العملية آما في Packetعلى الرقم التسلسلي للـ

:الشكل التالي

.3.13.1 ControlsValidation& Header Length :

Windows مقسمة على الـBits 32 علىTCP الخاص بالـHeaderويحتوي الجزء الثاني من الـSize 16 Bitsوالـ Header Length + Validation Controls 16Bits

:وآما هو في الشكل التالي

أي لمعرفة 4 مقسوم على TCPالخاص بالـ Header على حجم الـHeader Lengthويحتوي الـ تأخذ آل Controls 6 فهي Validation Controlsأما الـ ، 4 بـHLEN نضرب الـHeaderحجم الـ

فهذا 1 فهذا يعني أن هذه األداة غير مستخدمة وإذا آانت 0 فإذا آانت قيمته Bit 1منها :يعني أن هذه األداة مستخدمة وآما في الشكل التالي

Page 20: Ip معلومات حول

20

.4.13.1 Window Size: الذي يمكن إرساله من خالل الشبكة بناء على سرعة الوصول Packetويعرف فيه حجم الـ

Packetأي الوقت المستغرق لعملية التوصيل لكل ، ACK Packet و SYN Packetبين آل .وقد تزيد أو تنقص بناءا على أدائية الشبكة

.5.13.1 Check Sum:

بشكل السليم حيث يتم TCP Headerدم لعملية التحقق من وصول الـ وتستخBits 16وهي Checkثم قلبها ووضع الناتج في الـ) لوحدهاBits 16آل (TCP Headerجمع آافة قيم الـ

Sumوفي الطرف المستقبل يقوم بتأآد من الـ Checksumبضرب قيمة الـ HLENثم مقارنة 4 بـ : واضح في الشكل التالي وآما هوChecksumالناتج مع مقلوب الـ

.6.13.1 Urgent Pointer: قبل أن يتم عرضها Buffer يتم تجميعها في الـTCP المرسلة عبر الـDataمن المعروف أن الـ

ومن هنا نحن بحاجة إلى وجود Buffer القادمة الجديدة في الـDataحيث يتم تحديد موقع الـPointerيؤشر على موقع الـ Dataفي الـ Bufferوهو هنا الـ Urgent Pointer الحظ الشكل

: الخاص بالجهاز المستقبل Buffer قادمة جديدة إلى الـDataالتالي والذي يوضح وضع

Page 21: Ip معلومات حول

21

3.2.1: Threading Overview& Dot Net Streaming

برمجيات وبينا آيفية التعامل مع هذه الطبقات في TCP/IP و OSI سابقا على أجزاءتعرفنا Binary إلرسال Stream Libraryالـ آيفية التعامل معوفي هذا الجزء سوف نبين ، لشبكاتا

Data ـباإلضافة إلى استخدام ال Thread في برمجيات الشبكة...

، األداة التي يتم نقل البيانات من خاللها سابقا على أنها Socketال عرفنا Socket ـال: أوال ال حيث يحتوي هذا System.Net.Socketsية تعريف والستخدامها يلزم في البدا

Namespaces ال من آبير على عددClassesوالتي يتم استخدامها في برمجيات الشبكة .

حيث بينا سابقا آيفية التعامل من ،Binary Data أو Text من نقل Classes Streamالـ يمكن سنبين الجزءوفي هذا Stream Writer وال Stream Readerباستخدام Text لنقل Socketـال

أو Imageأي نوع أخر من البيانات ويمكن أن يكون صورة ( Objectآيفية التعامل معه لنقل وآما هو الحال في نقل ، ..)Binary Data أو أي شيء آخر يمكن أن يحول إلى Voiceصوت

فيتم التعامل معه Object أما في Binary ثم إلى Code ASCII إلىText آنا نحول Textال ، Object من التعامل مع أي والتي تمكنك Binary Writerال و Binary Readerلـباستخدام ا

File Stream والـ Text لتعامل مع الـ Stream Writer والـ Stream Readerآما وتستخدم الـ Buffer آـ والتي تستخدمMemory Stream إلى الـ ةلتسهيل التعامل مع الملفات باإلضاف

إلى مجموعة Streamوتقوم أيضا بتحويل الـ، لحفظ البيانات قبل إرسالها أو بعد استقبالها مرة أخرى الحظ الشكل التالي والذي يوضح مكتبات Stream إلى Bits والـBitsمن الـ

: في الدوت نيتStreamالـ

من جهاز إلى Image نقل وآمثال تطبيقي على هذا سوف نقوم ببناء برنامج يقوم بعملية :جديد آما في الشكل التالي مشروع وللبدء قم بإنشاء Client/Serverأخر

Page 22: Ip معلومات حول

22

:ةالتالي Namespaces الفي البداية قم بإضافة:#C

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

VB.NET: Imports System.Net.Sockets Imports System.IO

والتي MemoryStream من الكالس Instance اإلرسال ال بد أوال من اشتقاق لإلجراء عملية

لكي نحولها الحقا إلى مصفوفة بشكل مؤقت سوف نستخدمها لتخزين الصورة داخل الذاآرة Binary باستخدام ثم إرسالها NetworkStream عبر الSocket ـإلى الServer:

:#C try { openFileDialog1.ShowDialog (); string mypic_path =openFileDialog1.FileName ; pictureBox1.Image = Image.FromFile(mypic_path); MemoryStream ms = new MemoryStream(); pictureBox1.Image.Save(ms,pictureBox1.Image.RawFormat); byte[] arrImage = ms.GetBuffer(); ms.Close(); TcpClient myclient = new TcpClient (txt_host.Text,5020);//Connecting with server

VB.NET: openFileDialog1.ShowDialog Dim mypic_path As String = openFileDialog1.FileName pictureBox1.Image = Image.FromFile(mypic_path) Dim ms As MemoryStream = New MemoryStream pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat) Dim arrImage As Byte() = ms.GetBuffer ms.Close Dim myclient As TcpClient = New TcpClient(txt_host.Text, 5020)

:#C

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 );}

Page 23: Ip معلومات حول

23

VB.NET: Try Dim myns As NetworkStream = myclient.GetStream Dim mysw As BinaryWriter = New BinaryWriter(myns) mysw.Write(arrImage) mysw.Close myns.Close myclient.Close Catch ex As Exception Msgbox(ex.Message) End Try

Stream ـ واستقبال الPortـ والذي يقوم بعملية التصنت على الServerـالجزء الخاص بالفي صيغته التي (Object وتحويله إلى Binary Reader ـ التخدام و قراءتها باسSocket الـ عبر

وفي هذه الحالة ا المثال نريد استقبال صورة في هذ، مرة أخرى )آان عليها قبل اإلرسال Method الموجودة فيها ومن ضمنها Controlsوفرت لدينا الدوت نيت خصائص جديدة في ال

Image.FromStream ـالخاصة ب ال Picture Box والتي تسهل علينا إمكانية عرض الصورة Picture ـ إلى صورة تعرض على الStream لكي يتم تحويلها من Streamالمرسلة من خالل

box وآما في المثال التالي:

:#C using System.Net.Sockets ; using System.IO;

// Objects Declaration TcpListener mytcpl; // Declare TCP Listener Socket mysocket; // Declare an object from Socket Class NetworkStream myns; // StreamReader mysr;

void Image_Receiver()

{ mytcpl = new TcpListener (5000);// Open The Port mytcpl.Start ();// Start Listening on That Port mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); 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 }

} }

Page 24: Ip معلومات حول

24

VB.NET: Private mytcpl As TcpListener Private mysocket As Socket Private pictureBox1 As System.Windows.Forms.PictureBox Private mainMenu1 As System.Windows.Forms.MainMenu Private menuItem1 As System.Windows.Forms.MenuItem Private saveFileDialog1 As System.Windows.Forms.SaveFileDialog Private myns As NetworkStream Sub Image_Receiver() mytcpl = New TcpListener(5000) mytcpl.Start() mysocket = mytcpl.AcceptSocket myns = New NetworkStream(mysocket) pictureBox1.Image = Image.FromStream(myns) mytcpl.Stop() If mysocket.Connected = True Then While True Image_Receiver() End While End If End Sub

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

الخاص بالبرنامج أو Constructer ـ في الإما ()Method Image_Receiverسنقوم بوضع الـبالـ الخاص Closing الـ الميثود التالية في حدثو ، Formبالـ بحدث بدأ التشغيل الخاص

Form ـالوذلك لتأآد من إغالقSocketعند إنهاء البرنامج :

Page 25: Ip معلومات حول

25

:#C private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) {

try {

mytcpl.Stop (); Application.Exit();

} catch (Exception ex) {MessageBox .Show (ex.Message );}

} VB.NET: Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Try mytcpl.Stop() Application.ExitThread() Application.Exit() Catch ex As Exception Msgbox(ex.Message) End Try End Sub

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

:#C

try { saveFileDialog1.Filter = "JPEG Image (*.jpg)|*.jpg" ; if(saveFileDialog1.ShowDialog() == DialogResult.OK) { string mypic_path = saveFileDialog1.FileName; pictureBox1.Image.Save(mypic_path); } } catch (Exception)

{

} VB.NET: Try saveFileDialog1.Filter = "JPEG Image (*.jpg)|*.jpg" If saveFileDialog1.ShowDialog = DialogResult.OK Then Dim mypic_path As String = saveFileDialog1.FileName pictureBox1.Image.Save(mypic_path) End If Catch generatedExceptionVariable0 As Exception End Try

Page 26: Ip معلومات حول

26

.3.31Threading Overview:

يعمل Loop والذي وضعناه إلى تعليق البرنامج والسبب أن الـ Infinity Loopسوف يؤدي ال إذ لن ينفذ إي شيء إال بعد انتهاء ال Form والمخصصة للـ Global Areaعلى منطقة ال

Loop وهو ما لن يحدث أبدا إذ انه Infinity Loop ، الدوت نيت الحل لهذه قدمت لنا والتي تسمح بالمعالجة المتوازية على Threadingدام تكنولوجيا ال المشكلة وهي باستخ

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

انظر Form الخاص بال Threadمنفصل عن الـ Thread ستعمل في Loopآما أن الـ آبير :الشكل التالي

وهذا هو Global Area ـ يعمل على منطقة الLoop الـ آانThread ـالحظ انه قبل إضافة البحيث يعمل Loopللـ خاص Session تم عمل Thread ـسبب البطء الشديد وبعد استخدام ال

.. البرنامجبشكل متوازي مع

:Namespace System.Threadingالـ يلزم أوال تعريف Thread ـام الوالستخد

:#C using System.Threading;

VB.NET: imports System.Threading

Delegateفي ال لها Thread منه وإدراج اسم الميثود التي تريد عمل Instanceثم اشتقاق : آما يلي الخاص بها

:#C

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

Page 27: Ip معلومات حول

27

VB.NET: Imports System.Threading Dim myth As Thread myth = New Thread(New System.Threading.ThreadStart(Image_Receiver)) myth.Start

آما يليClosing Form في حدث ال ()myth.Aportبإضافة قم اآلن

:#C private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) {

try {

mytcpl.Stop (); myth.Aport();

} catch (Exception ex) {MessageBox .Show (ex.Message );} }

VB.NET: Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Try mytcpl.Stop() myth.Aport() () Catch ex As Exception Msgbox(ex.Message) End Try End Sub

وفي نفس الوقت وفي Thread رائعة جدا إذ تمكنك من تشغيل أآثر من Threadميزة ال

سنبين في الجزء التالي من هذا ، Multithreading ـنفس البرنامج وهو ما يسمى بال .UDPالفصل طبيعة االتصال باستخدام الـ

Page 28: Ip معلومات حول

28

4.3.1 : Encapsulation -User Datagram Protocol-UDP تميز هذا البروتوآول حيث يUDPسوف نبين في هذا الجزء طبيعة االتصال باستخدام الـ

Unicast الذي يدعم اإلرسال آـ TCP بعكس الـBroadcast و Multicastبإمكانية اإلرسال آـ Dataالآن مشكلة هذا البروتوآول هو عدم دعمه لعمليات التحكم على مستوى ، فقط Flowأو حجم الـ Buffer آما ال يدعم عمليات التحقق من الوصول وفق الترتيب السليم

Delivered on Sequence وتعتبر هذه األمور من أهم عيوبه ويوضح الشكل التالي الترآيب :العام لهذا البروتوآول

الآن الحظ عدم TCPي الـ هي نفسها فHeader Length أو الـLength و الـCheck Sumالـ في Delivered On Sequence أو الـ Buffer Managementوجود أي من األمور الخاصة بالـ

Packets للـFragmentationوالمشكلة هنا أننا ال نستطيع عمل ، UDP الخاص بالـHeaderالـ آما أنه ال وجود ألي، حيث أن إعادة تجميعها بالترتيب الصحيح أمر غير مضمون

Acknowledgment الشكل التالي يوضح طبيعة التراسل ، لتحقق من وصول البيانات :UDPباستخدام الـ

ـ و الName Space Net.System تعريف أواليلزم في الدوت نيت UDP ال ستخدامال

System.Net.Socket الحظ انه في ال TCPآان يلزم تعريف رقم ال Port والعنوان للجهاز آما وتستطيع عمل TCP فتستطيع تعريفه آما هو في UDP ـ في الأما المستقبلBroadcast مباستخدا IPAddress.Any أوIPAddress.Broadcast بعد اشتقاق آائن من

Method Bindال مباستخدا Port عدم تحديد رقم الأيضا وتستطيع IPEndPointالكالس ... 0 بـحيث يتم تعريفها

Portـ عليها ثم استالم الرسالة عبر هذا الوالتصنتPort 5020ـ فتح التمي في المثال التالي :وتوزيعها على الكل

:#C

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5020);

Page 29: Ip معلومات حول

29

NET.VB Dim ipep As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020)

:برتوآول المستخدم آما يليتحديد نوع ال وSocketوتتم عملية إنشاء الـ

:#C Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

NET.VB

Dim newsock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

... Send إلى الميثود IPEndpoint Object نمررثم

والتي يتم وضعها في الطرف المستقبل فقط يتم استخدامها لربط الـ Bind Methodفي الـ

IP Address ورقم الـ Port بالـ Socket :

:#C newsock.Bind(ipep); VB.NET: newsock.Bind(ipep)

السابقة Portـ على الServerـاآلن تم استقبال الرسالة ونريد بثها إلى آل من يتصل مع ال

: آما يليIPEndPoint Objectولعمل ذلك يلزم أوال تعريف

:#C IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)(sender);

VB.NET: Dim sender As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim Remote As EndPoint = CType((sender), EndPoint)

صفر وهذا يعني Port ورقم الAny هو IPEndPoint Object المسند إلىعنوانالالحظ أن :Serverـإرسال الرسالة المستلمة إلى الكل وبما فيهم الشخص مرسل الرسالة و ال

:#C recv = newsock.ReceiveFrom(data, ref Remote); VB.NET: recv = newsock.ReceiveFrom(data, Remote)

:لطباعة عنوان مرسل الرسالة و الرسالة نفسها

:#C Console.WriteLine("Message received from {0}:", Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

VB.NET: Console.WriteLine("Message received from {0}:", Remote.ToString) Console.WriteLine(Encoding.ASCII.GetString(Data, 0, recv))

Page 30: Ip معلومات حول

30

نخبره بها انه تم ل Serverـ المع يقوم بشبكنقوم هنا بإرسال رسالة ترحيبية لكل جهاز جديد

:انضمامهالموافقة على

:#C string welcome = "Welcome Customer ..."; data = Encoding.ASCII.GetBytes(welcome); newsock.SendTo(data, data.Length, SocketFlags.None, Remote);

VB.NET: Dim welcome As String = "Welcome Customer ..." Data = Encoding.ASCII.GetBytes(welcome) newsock.SendTo(Data, Data.Length, SocketFlags.None, Remote)

حيث عند استقبال أي رسالة في أي وقت من قبل أي جهاز :Infinity Loop الـ الهدف منإذا أردت تحديد عدد ... باستالمها وتسليمها إلى آل من هو على الشبكة Serverـيقوم ال

إلى أي رقم infinity loop في الـ True الـمعين من الرسائل المستلمة تستطيع تغيير ..تريده

:#C

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(); VB.NET: While True Data = New Byte(1024) {} recv = newsock.ReceiveFrom(Data, Remote) Console.WriteLine(Encoding.ASCII.GetString(Data, 0, recv)) newsock.SendTo(Data, recv, SocketFlags.None, Remote) End While server.Close()

لن يتم الوصول إلى و Infinity Loop في حالة إذا تم الخروج من Socketالـ هنا إغالق يتم

انه أي وفق شرط معين Infinity Loopالـ ضمن Breakتم مقاطعته بوضع هذه النقطة إال إذا

الـ إغالق وسيتم Loop الـ منسيتم الخروجفي حالة استقبال رسالة أو نص رسالة معينة

Socketإغالق الـ ذا يعني انك تستطيع وهServerآما يمكنك وضع جملة تشغيل عن بعد

. في حالة ورود نص معين وهكذا Serverأي ملف تنفيذي على ال

، UDPوسوف اعرض المثال الكامل لعملية اإلرسال عبر الـ

Page 31: Ip معلومات حول

31

:Serverأوال الجزء الخاص بالـ

C#: 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, 5020); 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); } } }

Page 32: Ip معلومات حول

32

VB.NET: Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Class SimpleUdpSrvr Public Shared Sub Main() Dim recv As Integer Dim data(1024) As Byte Dim ipep As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020) Dim newsock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) newsock.Bind(ipep) Console.WriteLine("Waiting for a client...") Dim sender As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim Remote As EndPoint = CType((sender), EndPoint) recv = newsock.ReceiveFrom(data, Remote) Console.WriteLine("Message received from {0}:", Remote.ToString) Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)) Dim welcome As String = " 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, Remote) Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)) newsock.SendTo(data, recv, SocketFlags.None, Remote) End While End Sub End Class

Server جلسة مع البإنشاء Clientالـ يقتصر العمل على قيام ، Client الجزء الخاص بالـ ثانيا

وآما تم في السابق إال أن االختالف هو في Portورقم ال IPEndPointبالـ وذلك بعد تعريفه

وإرسال أي رساله له عبر Serverالوظيفة إذا يقتصر فقط على استقبال الرسالة من ال

:المخصص Portال

C#: using System; using System.Net; using System.Net.Sockets; using System.Text; class SimpleUdpClient {

Page 33: Ip معلومات حول

33

public static void Main() { byte[] data = new byte[1024]; string input, stringData; IPEndPoint ipep = new IPEndPoint( IPAddress.Parse("127.0.0.1"), 5020); Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);

:ةالتالي يظهر الرسالة Server مع الاالتصالفي حالة فقدان

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(); } }

VB.NET: Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Class SimpleUdpClient Public Shared Sub Main() Dim data(1024) As Byte

Page 34: Ip معلومات حول

34

Dim input As String Dim stringData As String Dim ipep As IPEndPoint = New IPEndPoint(IPAddress.Parse("127.0.0.1"), 5020) Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim welcome As String = "Hello, are you there?" data = Encoding.ASCII.GetBytes(welcome) server.SendTo(data, data.Length, SocketFlags.None, ipep) Dim sender As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim Remote As EndPoint = CType(sender, EndPoint) data = New Byte(1024) {} Dim recv As Integer = server.ReceiveFrom(data, Remote) Console.WriteLine("Message received from {0}:", Remote.ToString) Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)) While True input = Console.ReadLine If input = "exit" Then ' break End If server.SendTo(Encoding.ASCII.GetBytes(input), Remote) data = New Byte(1024) {} recv = server.ReceiveFrom(data, Remote) stringData = Encoding.ASCII.GetString(data, 0, recv) Console.WriteLine(stringData) End While Console.WriteLine("Stopping client") server.Close() End Sub End Class

في UDP والـTCP الـ و استخدامTCP/IPمراحل االتصال باستخدام الـوهكذا بينا ... الدوت نيت

ومعمارية Network Layer Encapsulationعن سيتم الحديث في الفصل التالي ...IPv6 والـIPv4بروتوآول الـ

Page 35: Ip معلومات حول

35

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 2 IPv4 & IPv6 Architecture Overview

- IPv4 Architecture - Classful IP Address

i. Unicast IP ii. Broadcast IP iii. Multicast IP

- CIDR Nation Overview

- IPv6 Architecture Overview

Page 36: Ip معلومات حول

36

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

وتتم ، IP باستخدام بروتوآول اإلنترنت Packetعملية عنونة الـ تتم Network Layerفي الـ فإذا تم استخدام Transport Layerهذه المرحلة بناءا على البروتوآول المستخدم في الـ

UDP أما في حالة آان الـ Unicast عندها ال نستطيع إال أن يكون العنوان المستخدم TCPالـ Broadcast أو Multicast أو Unicastع وضع عنوان هو البروتوآول المستخدم عندها نستطي

IPv4وسوف نأتي في الجزء التالي من هذا الفصل على شرح ترآيب بروتوآول اإلنترنت : فيهBroadcast والـMulticast والـUnicastوطرق وضع عناوين الـ

2.1 : Architecture4 IPv

:IPv4نت يوضح الشكل التالي الترآيب العام لبروتوآول اإلنتر

Options بناءا على الـBytes 60 إلى 20 من IPv4 الخاص بالـHeaderيتراوح حجم الـ 20 ثابت وهو Header عندها سيكون حجم الـOptionsالمستخدم فإذا لم يتم استخدام الـ

Bytesوفي هذه الحالة يمكننا معرفة حجم الـ Dataالمرسلة عبر الـ TCPآما يلي :

Data = total Length – (20 Bytes for IPv4 Header+ 20 Bytes For TCP Header)

: آما يليIPv4 Header الخاصة بالـBytes 20وتقسم الـ

Bits4 يوضع فيها الـ Version 4 المستخدم وهو هناIPv في الـ0100 ويتم تمثيله Binary. Bits4 للـ Header Lengthويوضع في حجم الـ Header 4 مقسوم على Bits8 للـ Type of Services حيث يمثل فيها مدى جودة الخدمة المطلوبة للبروتوآول

Maximum Services أو الـMinimum Delayومنها ، Application Layerالمستخدم في الـ ...وغيرها

Bits32 عمليات الـستخدم لوتFragmentationوإعادة ترتيب الـ Fragments Bits8 تحديد الـ وتستخدم ل Time to Live –TTL ويعبر عن عدد الـ Hopsأو الـ Routers

hops 16والعدد االفتراضي لها ، المرور من خاللها إلى أن تنتهي Packetالتي يسمح للـ . من قيمتها1 يتم طرح Routerوعند مرورها بكل

Bits8 أخرى لتحديد نوع البروتوآول المستخدم في الـ Upper Layerء سواTCP أو UDP...

Page 37: Ip معلومات حول

37

Bits 16 للـ Checksumوال تختلف طريقة حسابه عن الطريقة المستخدمة في الـ TCP أو . والتي شرحناها في الفصل األولUDPالـ

Bits 32 لتحديد عنوان الجهاز المرسل Bits 32 لتحديد عنوان الجهاز المستقبل أخرى

Broadcast والـUnicastة توليد الـوسف نبين في الجزء التالي من هذا الفصل طريق

: CIDR - Classless InterDomain Routing والـ Classful باستخدام الـ Unicastوالـ .1.12 : Classful IP Address

يعبر ، بسيطة جدا ويقسم فيها العنوان إلى جزأينClassfulتعتبر عملية العنونة باستخدام الـ وآما هو موضح في Host ID والجزء الثاني عن الـNetwork IDالجزء األول عن عنوان الـ

:الشكل التالي

0 صفر Binary األول في الـBit ويكون قيمة الـ126 إلى 1 من Class Aحيث يبدأ الـ 1 واحد Binary األول في الـBit ويكون قيمة الـ 191 إلى 128 من Class Bويبدأ 1 واحد واحد Binary األول والثاني في الـBitيكون قيمة الـ و223 إلى 192 من Class Cويبدأ

1... ويستخدم لتعبير عن الـ 111 األولى منه Bits وتكون الثالثة 224 فيبدأ من Class Dأما

Multicast Group... :والشكل التالي يوضح هذه التقسيمات

Page 38: Ip معلومات حول

38

الخاصة Bitsة يتم تعبئة الـ من أي من التقسيمات السابقBroadcastوالستخراج عنوان الـ يجب أوال تحديد 10.0.0.1 للعنوان Broadcast Address بواحد وآمثال لمعرفة الـ Host IDبالـ

ألن الجزء الخاص Class Aومن الواضح أنه ينتمي إلى ، ينتمي هذا العنوان Classإلى أي 0.0.1 هو Host ID بالـإذا الجزء الخاص ، 126 والـ1 وهو بين 10 يبدأ بـNetwork IDبالـ

ويصبح Host ID في الجزء الخاص بالـ255 نضع قيمة Broadcast Addressولتحويله إلى Classful في الـ Class A للـ Broadcast Address وهو الـ 10.255.255.255: العنوان آما يلي

Nation...

فمثال القيمة العظمى أنه محدود إلى درجة آبيرةClassful Nationالآن المشكلة في الـ لجعل إمكانية Subnetsوآان الحل بإمكانية دمج الـ ، Host 8-32 2 هو Class Aلعدد العناوين للـ

Classless وهو ما يسمى بالـHost Partتوليد عناوين أآثر للـ

.2 .12 : Classless InterDomain Routing IP Address-CIDR

وضمها إلى Network Part الخاصة بالـBitsجموعة من الـوتتم هذه العملية باستئجار م 192.168.1.0/24 عنوان جديد من العنوان 1024 وآمثال لتوليد Host Partالـ

آما Subnet عندها يصبح الـNetwork ID الخاصة بالـBits 24 من الـBits 2 نقوم باستئجار وآما هو Addresses 10 2 أي Host ID ، 32-22 = 10 Bits ويصبح للـ 192.168.1.0/22: يلي

:واضح في الشكل التالي

Bits 22 نقوم بتقسيم الـ 192.168.1.0/22 الخاص بالعنوان الجديد Broadcastولمعرفة الـ : وآما يليBits 8على العنوان حيث آل جزء يأخذ

8 8 6 192 168 1 0 11111111 11111111 11111100 00000000

وهذا يعني أن 252 في الجزء الثالث إلى عشري وسيكون في المثال one’sثم نحول الـ

192.168.255.254 وستنهي بـ192.168.252.0 ستبدأ بـ Addresses Rangeالـ ...192.168.255.255: هو Broadcast IPإذا سيكون الـ

الآن مازالت CIDRالحظ أن مشكلة المحدودية للعناوين قد حلت بشكل جزئي باستخدام الـ

حيث زاد IPv6اإلمكانيات محدودة إذا أردنا توليد عناوين لمالين من األجهزة وآان الحل في الـ والذي سيتم الحديث عنه في الجزء التالي من Bits 128 إلى Bits 32فيه حجم العناوين من

.هذا الفصل

Page 39: Ip معلومات حول

39

2.2 : Architecture6IPv IPv4 الكثير من المشاآل التي آانت تواجه الـIPv6 حل الـIPv4 وهو الجيل التالي للـIPv6الـ

:ونلخصها بمجموعة من النقاط تبقى محدودة مع زيادة IPv4 Address الحاجة إلى عناوين أآثر حيث أن القيمة العظمى للـ-

. في العالمIP’s عناوين الـالطلب على والتي قد تم حلها في Routing إلى مجموعة من المشاآل وخاصة في IPv4 قد يؤدي الـ- IPv6الـ حيث لم يدعم أي من عمليات التشفير والتحقق IPv4 في الـSecurity مشكلة الـ-

Authenticationعلى مستوى الـ Network Layerوقد حلت هذه المشكلة في الـ IPv4 الآن Socket على مستوى الـPort والـIP حيث يتم تشفير الـIPSecباستخدام بروتوآول الـ

.Network Layer مدمجة على مستوى الـSecurityأصبحت الحاجة ملحة لجعل هذه الـ إذ يتم إرسال رسالة واحدة إلى any cast حيث تم تطويره إلى الـBroadcast تطوير مبدأ الـ-

، عن اإلرسال Routerلشبكة وفي حالة وجد الجهاز المعني يتوقف الـآل جهاز على ا المستخدم عند البحث عن Bandwidthوالهدف في هذه الطريقة إيجاد طريقة تخفض من الـ

. جهاز ما على الشبكة

وهو رقم آبير جدا آما Addresses 2128 آل هذه المشاآل حيث دعم ما يعادلIPv6حل الـ آما دعم عمليات Routing مما سرع من عمليات التوجيه Routing Tableقلل من الحجم الـ

Type of آم تم حذف الـNetwork Layer والتشفير على مستوى الـAuthenticationالـServicesوحل محلها الـ Priorityويوضح الشكل التالي الـ، أي األولوياتHeader الخاصة

: IPv6بالـ

لتمثيل العنوان وتكون IPv4 في الـDecimal بدال من الـhexadecimal الـ IPv6يستخدم الـ :الصيغة العامة له آما يلي آمثال

69dc:8864:ffff:ffff:0:1280:8c0a:ffff

.Bits 16في آل منزلة يوضع بها ، IPv4 بالـ4الحظ انه يتكون من ثمانية منازل بدال من :لكل منزلة فيه وآما في الشكل التالي Digits 4 نعطي Hexadecimalولتمثيله في الـ

Page 40: Ip معلومات حول

40

Geographic-based و Provider-Based Addresses إلى نوعين IPv6وتقسم العناوين في الـAddressesحيث يقوم الـ ISP’sبتوزيع العنـاوين على الـ Clientsباستخدام الـ Standard

فهو مخصص Geographic-based Addresses وأما الـ Provider-Based Addressesالخاص أي انه سيكون لكل دولة رمز خاص يكون في بداية العنوان وآما ، إلعطاء العناوين الدولية

:يلي

- Provider-Based Addresses a) Registry ID

b) Provider ID c) Subscriber ID d) Subscriber Subnet e) Host Number - Geographic-based Addresses

a) Registry ID b) World Zone

c) Country, City, etc.

:الحظ الشكل التالي

وآيفية توليد عناوين IPv6 والـIPv4وقد بينا في هذا الفصل مبدأ عمل الـ .CIDR Nation والـ Classful باستخدام الـ Broadcast والـUnicastالـ

واستخدامها لعمل الـIP Multicastingسيتم الحديث في الفصل التالي عن Multicast Group...

Page 41: Ip معلومات حول

41

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 3 IP Multicasting Programming Overview

- IP Multicasting Overview

- Using IP Multicasting in Dot Net to Create a Multicast Groups

Page 42: Ip معلومات حول

42

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

3.1:Overview IP Multicasting :

حيث وشرحنا آيفية استخدامه لعمل برود آاست UDPتحدثنا سابقا عن برتوآول ال والذي يلزمه وجود IPAddress.Anyتستطيع عمل البرود آاست بطريقتين إما باستخدام

Serverل يقوم بعملية التصنت على اPort المحدد حيث يستقبل من خالله أي رسالة ثم والذي من خالله يمكن عمل IPAddress.Broadcastيقوم ببثها إلى آل األجهزة أو باستخدام

بحيث أن الكل يمكنه التصنت على Serverبث إلى آل األجهزة حيث ال ضرورة لوجود جهاز الـ إلى آل األجهزة وتشبه عملية يستقبل ويرسل من خاللها أي رسالة المحدد و Portالـ

Broadcast أما إذا ، الكل ويرسل إلى الكل من عملية البث اإلذاعي حيث أن الجميع يستمع وذلك بهدف IP Multicasting ـ اليجب استخدام أردنا تقسيم اإلرسال إلى مجموعات عندها

اضيع المهمة جدا في يعتبر هذا الموضوع من المو ، Multicast Group ـاستخدامه لعمل ال إذ أن )التاسعانظر الفصل ( منفصل عن البقيةفصلبرمجيات الشبكات ولهذا خصصت له

على انه اإلرسال Multicast تعتمد عليه بشكل آبير ويعرف Conferences ـاغلب برمجيات ال حيث يكون Client/Server باستخدام Managedإلى مجموعة من المستخدمين سواء آان

ثم إرسالها Group Clients ـ في الشبكة وظيفته استقبال الرسائل من الServer جهاز هنالك :إلى آامل المجموعة مرة أخرى انظر إلى الشكل التالي

Server وإذا وافق الClientsالحظ انه يتم إرسال طلب االنضمام إلى المجموعة من قبل ال وتشترك آل الخاصة بهIP Address Listعلى الطلب يقوم بضم عنوان الجهاز إلى ال

ويتم اإلرسال إلى جميع أعضاء المجموعة التي تشترك IP Multicastمجموعة بنفس ال . وهو مابين سابقاClass D والذي يقع ضمن ال IP Multicastبنفي ال

حيث أن آل جهاز unmanaged- peer-to-peer Technique النوع الثاني ويسمى بال

مرآزي مخصص لعملية Server في نفس الوقت وال وجود لجهاز client و serverك يعمل االستقبال والتوزيع حيث تتم الموافقة على طلب االنضمام إلى المجموعة بشكل تلقائي

وأي جهاز في المجموعة له الحق في االنضمام ثم االستقبال و اإلرسال إلى آامل :المجموعة الحظ الشكل التالي

Page 43: Ip معلومات حول

43

IP Multicast Address ـ وهو ما يسمى بال Multicasting ـتم تخصيص عناوين خاصة لل :وهي آما يلي

LAN لشبكات المحلية 224.0.0.255 إلى 224.0.0.0المدى من Internetwork ـ لل224.0.1.255 إلى 224.0.1.0المدى من AD-HOC Network block ـ لل224.0.255.255 إلى 224.0.2.0المدى من

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

حيث يتم Socket Namespace ـ باستخدام الIP Multicast ـ للجيدقدمت الدوت نيت دعم والتي تقوم بإدارة عمليات االنضمام والخروج SetSocketOption الميثود ـتعريفها باستخدام الستخدم إلضافة وإلغاء العضوية آما ت ) multicast group) join & leaveمن والى المجموعة

AddMembership و DropMembership الـستخدم ي و UdpClient Object لتحديد رقم IP Multicasting ـ استقبال البيانات من خالله باإلضافة إلى تعريف السيتم والذي Portال

حيث يستطيع أي شخص ، سوف تستقبل الرسالة والذي من خالله تحدد الجهات التي يستخدم ، استقبال هذه الرسالة IP Multicast ويستخدم نفس ال Portيتنصت على هذا ال

و ضمن ال Port 5020الكود التالي إلرسال رسالة إلى عدة جهات بحيث نستخدم رقم الGroup 224.100.0.1آمثال :

:#C

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"), 5020); byte[] data = Encoding.ASCII.GetBytes("This is a test message"); server.SendTo(data, iep); server.Close(); } }

Page 44: Ip معلومات حول

44

VB.NET: Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Class MultiSend Public Shared Sub Main() Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Pars("224.100.0.1"), 5020) Dim data As Byte() = Encoding.ASCII.GetBytes("This is a test message") server.SendTo(data, iep) server.Close() End Sub End Class

أي ( الجهة التي سوف تستقبل الرسالة وهي وتحديد Socketـالفي البداية قمنا بتعريف

ثم تحديد نوع ) المحددIP Multicast Group باستخدام الـ شخص يتنصت على الشبكة ... والبرتوآول المستخدم Socketـال

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

:#C

using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpClientMultiRecv { public static void Main() { UdpClient sock = new UdpClient(5020); 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();}}

Page 45: Ip معلومات حول

45

VB.NET: Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Class UdpClientMultiRecv Public Shared Sub Main() Dim sock As UdpClient = New UdpClient(5020) sock.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim data As Byte() = sock.Receive(iep) Dim stringData As String = Encoding.ASCII.GetString(data, 0, data.Length) Console.WriteLine("received: {0} from: {1}", stringData, iep.ToString) sock.Close() End Sub End Class

الحظ انه توجد طرق متعددة الستقبال البيانات و إرسالها آما يمكن استخدام الكوديين

إلى جانب Imageالسابقين في نفس البرنامج لإلرسال و االستقبال آما يمكنك إرسال إذ ما عليك سوى Binaryأو أي شيء أخر يمكن تحويله إلى ) التاسعانظر الفصل ( النص

إلى آود اإلرسال Binary Writer ـوال Binary Reader ـ والmemory Stream ـإضافة العمل برنامج إلرسال صورة عبر الكاميرا إلى جهات متعددة باستخدام و االستقبال آما يمكنك Advanced Multicastالفصل التاسع آتي على شرحها في نفس الخاصية والتي س

Systems...

Page 46: Ip معلومات حول

46

Chapter4 Streaming in Dot Net Chapter5 Applied Streaming in Dot Net

Part 2 Streaming in Dot Net

Page 47: Ip معلومات حول

47

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 4 Streaming in Dot Net Managed I/O: Streams, Readers, and Writers

- Stream Classes - Stream Members - Stream Manipulation

Page 48: Ip معلومات حول

48

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

2.1 :and Writers, Readers, Streams: O/Managed I:

واستخدامها Streams Library ـتحدثنا سابقا في الجزء األول بشكل عام عن استخدامات ال ـ من جهاز إلى آخر وآمثال قمنا بإرسال صورة من الText Data و Binary Dataإلرسال

Clientـ إلى ال Serverـ باستخدام ال Binary Reader & Binary Writer .. هو تسهيل عملية نقل البيانات من مكان إلى أخر Stream ـإن الهدف من إنشاء مكتبات ال

سواء عبر الشبكة أو داخل نفس الجهاز آما هو الحال بتعامل مع الملفات أو التعامل مع ر حيث تسهل علينا عملية تحويلها إلى الطابعة أو أي طرفية أو جهاز آخر موصول بالكمبيوت

Byte Array وإرسالها وهو ما حل الكثير من المشاآل التي آانت تواجه المبرمجين في .. Binary Dataالتعامل مع

والغير متزامن Synchronous بأسلوبين المتزامن Streamالـيمكن التعامل مع Asynchronous الـ وبشكل افتراضي تعمل جميعIO Streams باألسلوب المتزامن الآن

في Processing Unitالعيب فيه هو تأثيره الشديد على أدائية النظام إذ يقوم بإغالق ال المخصصة للبرنامج بحيث ال يسمح بتنفيذ أي أمر آخر إال بعد االنتهاء من العملية Threadالـ

ذا آنت تتعامل مع أجهزة قراءة الجارية وال ينصح ابدآ استخدام األسلوب المتزامن في حالة إ لكنها مهمة جدا بالبرمجيات Magnetic Tapeالـ أو Floppy Diskالـوآتابة بطيئة نسبيا مثل

حيث أنها تعتمد األسلوب Real Time Systemsالـالتي تعتمد على أنظمة الزمن الحقيقي أو بأي عملية أخرى إلى حين المتزامن في عملية إرسال واستقبال البيانات وهو ما يمنع القيام

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

زامن يحتاج إلى وجود الخواص السابقة عندها ينصح باستخدام األسلوب الغير متAsynchronous حيث تستطيع من خالله تنفيذ عمليات أخرى في وحدة المعالجة وبدون

لكل عملية طلب إدخال Separate threadالحاجة النتظار إنهاء العملية الجارية إذ يتم إنشاء ة مما ال يؤثر على أدائية النظام وينصح باستخدامه إذا آانت عملية القراءة أو الكتابأو إخراج

تجرى من خالل أجهزة بطيئة نسبيا ويمكن تميز الميثود المتزامن عن الغير متزامن في في بداية اسم الميثود الغير متزامن وآمثال عليها End أو Beginالدوت نيت بوجود آلمة

BeginWrite و BeginRead الـ وEndWrite الـ وEndRead..

Stream Classes: أوال

Nameوالمندرجة تحت Classesالـ بمجموعة من Streamsالـليات تدعم الدوت نيت عمSpace System.IO تستخدم . نقل البياناتاإلدخال و اإلخراج ل والتي تستخدم لعمليات و FileStreamومن األمثلة عليها ، Stream Classes ، Backing storageالـبعض

Back Storageبعضها ال يستخدم أي وآذلك فإن MemoryStreamالـ وBufferedStreamالـ عبر الشبكة وبدون Streamالـ والتي تستخدم لنقل NetworkStreamالـومن األمثلة عليها

في الدوت نيت آما في الشكل Stream Classesالـو تقسم ، Backing Storageاستخدام :التالي

Page 49: Ip معلومات حول

49

1- BufferedStream Class : دار معين من الذاآرة ويستخدم بشكل أساسي لحجز مق

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

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

ويستخدم ، في انتظار إرسالها وهو ما يساهم في تحسين األدائية بشكل آبير Bufferالـ لتخزين البيانات NetworkStreamالـفي برمجيات الشبكات مع عادتا BufferedStreamالـ

آما Backing storageالمراد إرسالها عبر الشبكة في الذاآرة حيث ال يستخدم هذا الكالس .. ذآرنا سابقا

ويمكن زيادتها أو BufferedStreamالـ عند استخدام bytes 4096بشكل افتراضي يتم حجز

: آمثال آما يليBufferedStreamالـيستخدم و.. تقليلها حسب الحاجة

#C

using System; using System.Text; using System.IO; namespace Network_Buffering { class Program { static void Main(string[] args) { ASCIIEncoding asen = new ASCIIEncoding(); byte[] xx = asen.GetBytes("Hello Buffering");

Page 50: Ip معلومات حول

50

MemoryStream ms = new MemoryStream(xx); readBufStream(ms); } public static void readBufStream(Stream st) { // Compose BufferedStream BufferedStream bf = new BufferedStream(st); byte[] inData = new Byte[st.Length]; // Read and display buffered data bf.Read(inData, 0, Convert.ToInt32(st.Length)); Console.WriteLine(Encoding.ASCII.GetString(inData)); } } } VB.NET: Imports System Imports System.Text Imports System.IO Namespace Network_Buffering Class Program Shared Sub Main(ByVal args As String()) Dim asen As ASCIIEncoding = New ASCIIEncoding Dim xx As Byte() = asen.GetBytes("Hello Buffering") Dim ms As MemoryStream = New MemoryStream(xx) readBufStream(ms) End Sub Public Shared Sub readBufStream(ByVal st As Stream) Dim bf As BufferedStream = New BufferedStream(st) Dim inData(st.Length) As Byte bf.Read(inData, 0, Convert.ToInt32(st.Length)) Console.WriteLine(Encoding.ASCII.GetString(inData)) End Sub End Class End Namespace

وتحميله في عبر ASCIIEncoding الـ باستخدام Byte Arrayحيث قمنا بتحويل نص إلى والتي انشأناها حيث استقبلنا readBufStream ثم ارسلناه إلى الميثود MemoryStreamالـ

ثم BufferedStreamالـ وحملناه في ذاآرة مؤقتة بستخدام الكالس Streamالـمن خاللها وطباعته Encoding.ASCIIقمنا بطباعة محتوياته بعد تحويله إلى نص مرة اخرى بستخدام ال

.. 2- MemoryStream Class : الـوهو شبيه بعمليةBuffring السابقة إذ يعتبر آحل جيد

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

:لتخزين صورة في الذاآرة

Page 51: Ip معلومات حول

51

#C

MemoryStream ms = new MemoryStream(); pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] arrImage = ms.GetBuffer(); ms.Close(); VB.NET: Dim ms As MemoryStream = New MemoryStream pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Dim arrImage As Byte() = ms.GetBuffer ms.Close

3- NetworkStream Class : الـحيث تقوم بتعامل مع ، وآما قمنا باستخدامها سابقاStream

Name Spaces ويتم استدعائها من Socketالـإلرساله عبر الشبكة باستخدام System.Net.Sockets الكالس ويعتبرNetworkStream بأنه unbuffered إذ ال يحتوي على

Backing Storage الـ ويفضل استخدام BufferedStream Class معه لتحسين األداء وتستخدم آما يلي آمثال حيث نريد إرسال الصورة التي قمنا بتخزينها في المثال السابق

:Socketالـبذاآرة إلى جهاز أخر عبر

#C

TcpClient myclient = new TcpClient (“localhost”,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 ();

VB.NET: Dim myclient As TcpClient = New TcpClient(localhost, 5020) Dim myns As NetworkStream = myclient.GetStream Dim mysw As BinaryWriter = New BinaryWriter(myns) mysw.Write(arrImage) mysw.Close myns.Close myclient.Close

4- FileStream : يتم استدعائها باستخدامName Spaces System.IO وتستخدم بشكل

اساسي في التعامل مع الملفات سواء للكتابة إلى ملف أو القراءة من ملف وتعتبر هذه لتحزين البيانات بشكل مؤقت Buffer حيث تستخدم ذاآرة Backing Storage Classالكالس

ابة أو القراءة ومن األمور الهامة فيها تحديد مسار في الذاآرة لحين اإلنتهاء من عملية الكت :الملف المراد القراءة منه أو الكتابة عليه وتستخدم آما يلي

Page 52: Ip معلومات حول

52

#C

FileStream FS = new FileStream(@"C:\MyStream.txt", FileMode.CreateNew);// Any Action For Example CreateNew to Create Folder

VB.NET: Dim FS As FileStream = New FileStream("C:\MyStream.txt", FileMode.CreateNew)

:FileModeالـ التالية مع Enumerationالـيمكننا استخدام

1- Append إلضافة نص ما إلى الملف الموجود اصال 2- Create إلنشاء ملف جديد ويقوم بعمل overwriting في حالى إذا آان الملف موجود

ل مسبقبشك3- CreateNew الـ وهو آما فيCreate إال انه يعطي Exception في حالة وجود الملف

بشكل مسبق4- Open لقراءة ملف ما حيث يعطي Excptionفي حالة عدم وجود الملف المحدد 5- OpenOrCreate في حالة إذا وجد الملف يقوم بقراءته وفي حالة عدم وجوده يقوم

.بإنشائه6- Truncate ويستخدم لحذف محتويات الملف وجعله فارغا

:Stream Members: ثانيا وهي آما يلي Streamالـهنالك مجموعة من الخواصو و المييثودس التي تشترك بها مكتبات

:

1- CanRead و CanWrite الـ وتستخدم لمعرفة إذا آانStream المستخدم يقبل عملية في حالة أنه ال False في حالة إذا آان يقبل و Trueحيث ترجع قيمة القراءة أو الكتابة أم ال

يقبل ويستخدم عادة قبل إجراء عملية القراءة أو الكتابة لفحص مدى الصالحية قبل المحاولة .. 2- CanSeek الـ حيث يستخدمSeeking الـ عادة لتحديد موقعCurrent Stream والعادة تدعم

وعندها ترجع FileStreamالـ هذه العملية مثل Backing Storageالكالسات التي تستخدم Backing ال يحتوي على Stream Classالـ في حالة إذا آان false وترجع قيمة Trueقيمة

Storage.

Page 53: Ip معلومات حول

53

3- CanTimeout وترجع قيمة True الـ في حالة إذا آانstream الـ يحتوي على خاصية Timeoutوالتي تعطي وقت محدد للعملية .

4- Length الـ وتستخدم لمعرفة حجمStreamالـ بByte ويمكن االستفادة منها لمعرفة نهاية .Streamالـ أو لتحديد حجم المصفوفة بناء على حجم Streamالـ5- Position الـ وتستخدمGet و Set لمعرفة أو تحديد الموقع ل Stream

: آما يلي بمجموعة من الميثودس وهيStreamالـوتشترك مكتبات

: MethodsSynchronousالميثودس المتزامنة - 1

I. Read و ReadByte وتستخدم لقراءة Stream Data الـ وتخزينه فيBuffer آما ReadByteالـويمكن تحديد عدد البايتات التي سيتم قراءتها باستخدام

0 قيمة Readالـ حيث ترجع Streamالـنستطيع من خاللها معرفة نهاية .Streamالـ في حالة انتهاء 1- قيمة ReadByteالـو

II. Writeالـ وWriteByte الـ وتستخدم لعملية اإلرسال عبرStream ويمكن تحديد .WriteByteالـعدد البايتات التي سيتم آتابتها في آل مرة باستخدام

: MethodsAsynchronousالميثودس غير المتزامنة - 2

I. BeginReadالـ وBeginWriteملية القراءة أو الكتابة باستخدام وتستخدم لع : الغير المتزامن وتأخذ خمسة باروميترات آما في الشكل التالي Streamالـ

والتي سوف تستخدم لعملية القراءة منه أو الكتابة عليه Byte Bufferالـ -1 والذي سوف يحدد فيه موقع القراءة أو الكتابة offsetالـ -2تحديد الحد األقصى من البايتات التي سيتم والذي سوف يتم فيه numByteالـ -3

آتابتها أو قراءتها حيث يتم استدعائه عند االنتهاء من Optional Delegate وهو AsyncCallbackالـ -4

عملية القراءة أو الكتابة Read & Writeالـ وتستخدم لتميز User Provided Object وهي Stateobjectالـ -5

Request الـ عن غيرهRequests . .Stream Operationالـ والذي يمثل حالة IAsyncResultالـ Begin Methodsالـترجع

II .EndReadالـ وEndWrite الـ وتستخدم في حالة إذا أردنا تنفيذStream Operation

حيث يبقى بانتظار انتهاء العملية ، الحاليStream Operationالـبعد االنتهاء من المطلوبة السابقة ثم ينفذ العملية

: وهي Streamالـوهناك بعض الميثود والتي تستخدم إلدارة

1- Flush الـ وتستخدم لتفريغ محتوياتBuffer بعد إتمام العملية المحددة حيث يتم نقل

. Stream Object الذي تم تحديده في Destinationالـ إلى Bufferالـمحتويات 2- Close الـ وتستخدم إلغالقStream الـوتحريرResources الـ المحجوزة من قبلStream

Object وينصح باستخدامها في الجزء الخاص ب Finally block الـ ولتأآد من أنStream إثناء التنفيذ ولضمان عدم Exceptionسيتم إغالقه وتحرير آافة الموارد في حالة حدوث أي

.بقاء هذه الموارد في الذاآرة بعد إغالق البرنامج 3- SetLength الـ وتستخدم لتحديد حجمStream والذي نريد إرساله أو استقباله الآن في

سوف يؤدي ذالك إلى انقطاع SetLengthالـ أقل من المحدد في Streamالـحالة إذا آان لن تستطيع استخدام هذه الخاصية إال إذا تأآدت انك ، وعدم وصوله بشكل سليم Streamالـ

Page 54: Ip معلومات حول

54

لذا ينصح بفحص الصالحية CanSeek و CanWriteك من خالل الخاصية تملك الصالحية لذل .Streamالـأوال قبل تحديد حجم

: Stream Manipulation: ثالثا

وفي العادة يتم استخدام Text أو Binary Data لنقل Streamالـيمكن استخدام مكتبات

ويتم استخدام Binary Dataالـ لتعامل مع BinaryWriterالـ و BinaryReaderالـ ،Textالـ لتعامل مع StreamWriterالـ وStreamReaderالـ

عند Text إلى Stream لتحويل من UnicodeEncoding أو ASCIIEncodingالـويتم استخدام عند اإلرسال حيث تستخدم مجموعة من الميثودس Stream إلى Textاالستقبال ومن

:وهي آما في الشكل التالي

1- GetByteCount وهي Overloaded Method حيث تأخذ Character Array أو String وترجع ..عدد البايتات التي سوف نحتاجها لنقل نص معين

2- GetBytes الـ لتحويلString إلى Byte Array حتى نستطيع إرسالها باستخدام .Streamالـ3- GetCharCount حيث تأخذ Byte Arrayف التي سوف تكون في وترجع عدد األحر .Character Arrayالـ أو في Stringالـ4- GetChars وتستخدم لتحويل من Byte Array إلى String وتستخدم عند استقبال البيانات

. حيث نحولها إلى نص مرة أخرى Streamالـمن

يجب أوال استدعائها Text لنقل StreamWriterالـ و StreamReaderالـولتعامل مع : نيم سبيسس وتستخدم آما يليSystem.IOالـ من

StreamReader للقراءة من ملف:

#C StreamReader str = File.OpenText(openFileDialog1.FileName); textBox1.Text = str.ReadToEnd(); VB.NET: Dim str As StreamReader = File.OpenText(openFileDialog1.FileName) textBox1.Text = str.ReadToEnd

Page 55: Ip معلومات حول

55

StreamWriterللكتابة إلى ملف : #C

string fname = saveFileDialog1.FileName; StreamWriter fsave = new StreamWriter(fname); fsave.WriteLine(textBox1.Text);

VB.NET: Dim fname As String = saveFileDialog1.FileName Dim fsave As StreamWriter = New StreamWriter(fname) fsave.WriteLine(textBox1.Text)

يتم Binary Data لنقل BinaryWriterالـ وBinaryReaderالـو لتعامل مع

: نيم سبيسس وتستخدم آما يليSystem.IOالـاستدعائها من

BinaryReader لقراءةBinary Data الـ منStream: #C

NetworkStream myns = new NetworkStream(mysocket); BinaryReader br = new BinaryReader(myns);

BinaryWriterr إلرسالBinaryData الـ إلىStream الـ عبرSocket:

TcpClient myclient = new TcpClient("localhost", 5020); NetworkStream myns = myclient.GetStream(); BinaryWriter mysw = new BinaryWriter(myns); mysw.Write(arrImage); VB.NET: Dim myns As NetworkStream = New NetworkStream(mysocket) Dim br As BinaryReader = New BinaryReader(myns) Dim myclient As TcpClient = New TcpClient("localhost", 5020) Dim myns As NetworkStream = myclient.GetStream Dim mysw As BinaryWriter = New BinaryWriter(myns) mysw.Write(arrImage)

والفرق ، في الدوت نيت وطرق التعامل معها Streamوهكذا بينا أهم مكتبات الـ

نطبق في سوف ، المتزامن والغير متزامن في بيئة الدوت نيت Streamsبين الـ في بيئة الدوت نيت األول إلرسال رسائل Steamingالفصل التالي مثالين على الـ

. SQL وAccessتحكم والثاني لتخزين صورة في قاعدة بيانات

Page 56: Ip معلومات حول

56

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 5 Applied Streaming in Dot Net

- Create a Simple Remote Control Application Using StreamReader & StreamWriter Classes

- Create a Remote Desktop Application By Using TCP Streaming Connection + (Control in Full Version Book)

- Create an Advanced Remote Web Camera Monitoring System By Using TCP Streaming Connection & Image Processing.

- Create a Simple Application to Store & Read Images (Binary Data) in Microsoft Access & Microsoft SQL Server Database Management System By Using Streams Library & ADO.NET

Page 57: Ip معلومات حول

57

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

حيث TCP Streamingسوف نناقش في هذا الفصل مجموعة من التطبيقات باستخدام الـ سنبني نظام لتحكم عن بعد بإطفاء وتشغيل البرامج وإطفاء وتشغيل األجهزة ونظام آخر

ية عن بعد حيث يقوم بعملالمراقبة سطح المكتب عن بعد ونظام لمراقبة المكان عبر الكامير بشخص صاحب لمقارنة لصور الملتقطة وفي حالة وجد أي اختالف يقوم النظام باالتصا

في قواعد Binary Dataوأخيرا طريقة تخزين الـ ، TAPI IP Telephonyالنظام باستخدام الـ .SQL Server Database و Accessالبيانات

5.1 Remote Control Exampleباستخدام الـ Writer& ader Stream Re:

يتم الآن سChatting ـمثال تطبيقي بسيط سوف نستخدم فيه برنامج شبيه ب

حيث يفترض إذا قمنا بإرسال آلمة Serverالـمه إلعطاء أوامر إلى استخداnotepad الـ إلىserver الـ بأن يقوم بفتحnotepad فيه وإذا قمنا مثال بكتابة Calc

:تح اآللة الحاسبة فيه وهكذا سوف يفServerـوإرسالها إلى ال

Client Chatالـال يختلف برنامج اإلرسال عن برنامج : Clientإنشاء برنامج اإلرسال : أوال TCP Connection ويستخدم فيه آل من Chapter1الـالذي قمنا بإنشائه في

د إلجراء عملية اإلرسال فباستخدام الميثوStreamWriterالـ و NetworkStreamالـوWriteLine الـ الموجودة ضمنStreamWriter Object تتم عملية تحويل النص المكتوب في

عبر NetworkStreamالـ ليتم إرسالها باستخدام Bytesالـ إلى مجموعة من Textboxالـ وللبدء قم بإنشاء مشروع جديد آما في Serverـ إلى برنامج الTCP Socket Connectionالـ

:الشكل التالي

: التالية Name Spacesثم قم بإضافة #C

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

: قم بكتابة الكود التاليSend Buttonفي try { TcpClient myclient = new TcpClient (txt_host.Text,5020); // التعريف Socket NetworkStream myns = myclient.GetStream (); // ده إلى اللستريم اوبجكتإسنا StreamWriter mysw = new StreamWriter (myns); mysw.WriteLine(txt_msg.Text); mysw.Close (); myns.Close (); myclient.Close (); }

Page 58: Ip معلومات حول

58

catch (Exception ex) {MessageBox.Show (ex.Message );} VB.NET: imports System.Net.Sockets ; imports System.IO; Try Dim myclient As TcpClient = New TcpClient(txt_host.Text, 5020) Dim myns As NetworkStream = myclient.GetStream Dim mysw As StreamWriter = New StreamWriter(myns) mysw.WriteLine(txt_msg.Text) mysw.Close myns.Close myclient.Close Catch ex As Exception Msgbox(ex.Message) End Try

مرة أخرى Text وتحويله إلى Streamالـ والذي يعمل على استقبال Serverالـوإلنشاء برنامج

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

: التالية Name Spacesقم بإضافة #C

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

:لتالية ثم إضافة التعاريف اTcpListener mytcpl;// Objects Declaration Socket mysocket; NetworkStream myns; StreamReader mysr;

:ثم نقوم بإنشاء ميثود جديدة آما يلي void our_Server () { mytcpl = new TcpListener (5020);// Open The Port mytcpl.Start ();// Start Listening on That Port mysocket = mytcpl.AcceptSocket ();// Accept Any Request From Client and Start a Session myns = new NetworkStream (mysocket);// Receives The Binary Data From Port mysr = new StreamReader (myns);// Convert Received Data to String string order = mysr.ReadLine(); // you can add any order and Response Here if (order=="notepad") System.Diagnostics.Process.Start("notepad");

Page 59: Ip معلومات حول

59

else if (order=="calc") System.Diagnostics.Process.Start("calc"); else MessageBox.Show("Sorry Sir Your Request is not in my hand",order); mytcpl.Stop();// Close TCP Session if (mysocket.Connected ==true)// Looping While Connected to Receive Another Message { while (true) { our_Server ();// Back to First Method }

} } VB.NET: Private mytcpl As TcpListener Private mysocket As Socket Private myns As NetworkStream Private mysr As StreamReader Sub our_Server() mytcpl = New TcpListener(5020) mytcpl.Start() mysocket = mytcpl.AcceptSocket myns = New NetworkStream(mysocket) mysr = New StreamReader(myns) Dim order As String = mysr.ReadLine If order = "notepad" Then System.Diagnostics.Process.Start("notepad") Else If order = "calc" Then System.Diagnostics.Process.Start("calc") Else Msgbox("Sorry Sir Your Request is not in my hand", order) End If End If mytcpl.Stop() If mysocket.Connected = True Then While True our_Server() End While End If End Sub

يقوم بالموافقة Request في حالة ورود أي Socketالـحيث تقوم هذه الميثود بتصنت على

يتسلمها Socketال جديدة معه وفي حالة ورود أي بيانات عبر Sessionعليه وإنشاء ثم نقوم بفحص الرسالة باستخدام الجمل Text ويحولها إلى StreamReaderالـباستخدام

Start يتم استدعائها باستخدام الميثود notepadالرسالة هي الشرطية فمثال إذا آانت ...Name Spaces System.Diagnostics والموجودة في Processالموجودة ضمن الكالس

Page 60: Ip معلومات حول

60

للـ في حدث بدأ التشغيل Threadالـ جديد البد من وضع تعريف Threadولتشغيلها ضمن Form آما يلي :

#C private void Form1_Load(object sender, System.EventArgs e) { Thread myth; myth= new Thread (new System.Threading .ThreadStart(our_Server)); myth.Start (); }

Streamالـ وSocketال وذلك لتأآد من إغالق Form Closingالـثم قم بإضافة التالي في حدث ..في البرنامج

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

VB.NET:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim myth As Thread myth = New Thread(New System.Threading.ThreadStart(our_Server)) myth.Start() End Sub Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Try mytcpl.Stop() Application.ExitThread() Application.Exit() Catch ex As Exception

Msgbox(ex.Message) End Try End Sub

عن بعد Clients Computerآما يمكننا بنفس الخطوات السابقة إنشاء برنامج يقوم بإطفاء الـ

أو Shutdownعند ورود آلمة ) المرفق مع الكتابو (Shutdown.EXEوذلك بتنفيذ الملف Windows والذي يأتي مع نظام التشغيل RPC – Remote Procedure Callتنفيذ أمر الـ

2000/XP... ،في المثال التالي سنستخدم الـStream Library لتخزين صورة في قاعدة ...Microsoft SQL Server وقاعدة بيانات Accessبيانات

Page 61: Ip معلومات حول

61

إلرسال صورة سطح المكتب إلى Remote Desktopإلنشاء نظام مثال 5.2 :Serverالـ

بسيط لنقل صورة سطح المكتب Remote Desktopفي هذا المثال سنقوم بإنشاء برنامج

:Stream Library والـ TCPمن جهاز إلى اخر باستخدام الـ

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

: التاليةNamespacesسوف نستخدم الـ System.Net System.Net.Sockets System.IO

إذ انه ال يوجد مكتبة معينة API تتم عملية إلتقاط صورة سطح المكتب بإستخدام دوال الـ

الملف في الدوت نيت إلجراء هذه العملية وقد قمت بكبسلة هذه الدوال فيCaptureScreen.dllوإللتقاط صورة سطح المكتب نستخدم ، الحقا لتسهيل استخدامها

، Image حيث ترجع صورة سطح المكتب آـ ()CaptureScreen.GetDesktopImageالدالة قبل عملية Buffer ووضعها في الـ Streamوإلرسالها البد من تحويل هذه الصورة إلى

والذي شرحناه سابقا MemoryStream Classملية باستخدام الـ وتتم هذه الع، اإلرسال :وآما يلي

:#C MemoryStream ms = new MemoryStream(); Image img = CaptureScreen.GetDesktopImage(); img.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg); byte[] arrImage = ms.GetBuffer();

:NET.VB

Dim ms As MemoryStream = New MemoryStream() Dim img As Image = CaptureScreen.GetDesktopImage() img.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg( Dim arrImage As Byte = ()ms.GetBuffer()

: وآما يليSocketوإلرسال الصور الملتقطة إلى الجهاز اآلخر البد من تعريف

:TCP Socket استخدامفي حالة

Page 62: Ip معلومات حول

62

:#C TcpClient myclient; MemoryStream ms; NetworkStream myns; BinaryWriter mysw; myclient = new TcpClient (Server_IP.Text,5020);//Connecting with server myns = myclient.GetStream (); mysw = new BinaryWriter (myns); mysw.Write(arrImage);//send the stream to above address ms.Close(); mysw.Close (); myns.Close (); myclient.Close ();

:NET.VB

Dim myclient As TcpClient Dim ms As MemoryStream Dim myns As NetworkStream Dim mysw As BinaryWriter myclient = New TcpClient (Server_IP.Text,5020) 'Connecting with server myns = myclient.GetStream () mysw = New BinaryWriter (myns) mysw.Write(arrImage) 'send the stream to above address ms.Close() mysw.Close () myns.Close () myclient.Close ()

فيه بناء على سرعة اإلرسال التي Interval ويحدد الـ Timerوبتأآيد نضع هذا الكود في . تعتبر ممتازةMS 100 فإن LANوآشبكة ، نحتاجها من جهة ومقدرة الشبكة من جهة اخرى

:Server إنشاء برنامج الـ ثانيا

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

Page 63: Ip معلومات حول

63

: التاليةNamespacesتخدم الـ سوف نسSystem.Net System.Net.Sockets System.IO

:آما يلي TCP Listener والـ Threadوالـ TCP Socketثم نعرف الـ

:#C Thread myth; TcpListener mytcpl = new TcpListener (5020); Socket mysocket; NetworkStream myns;

:NET.VB Dim myth As Thread Dim mytcpl As TcpListener = New TcpListener(5020) Dim mysocket As Socket Dim myns As NetworkStream

: اإلستقبال آما يليMethodثم نقوم بتعريف

:#C void ServerMethod () { try { mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); pictureBox1.Image = Image.FromStream(myns); mytcpl.Stop(); if (mysocket.Connected ==true) { while (true) { ServerMethod (); } } myns.Flush(); } catch (Exception){}

}

Page 64: Ip معلومات حول

64

:NET.VB Private Sub ServerMethod() Try mytcpl.Start() mysocket = mytcpl.AcceptSocket() myns = New NetworkStream(mysocket) pictureBox1.Image = Image.FromStream(myns) mytcpl.Stop() If mysocket.Connected = True Then Do While True ServerMethod() Loop End If myns.Flush() Catch e1 As Exception End Try End Sub

:Form نضع الكود التالي في حدث بدأ التشغيل للـ Threadولتشغيل الـ

:#C myth= new Thread (new System.Threading .ThreadStart(ServerMethod)); myth.Start ();

:NET.VB

myth= New Thread (New System.Threading.ThreadStart(AddressOf ServerMethod)) myth.Start ()

سوف نبين في ، وهكذا بينا طريقة إرسال صورة سطح المكتب من جهاز إلى آخر التحكم مع إضافة خاصيةRemote Desktopالنسخة الورقية طريقة عمل برنامج

.API وذلك باستخدام دوال الـ Kayborad والـ Mouseعبر الـ

Page 65: Ip معلومات حول

65

في حالة TAPI Telephony واالتصال عبر امثال نظام المراقبة عبر الكامير 5.3 :ورود تغيير في الصور الملتقطة

ستجد آافة تفاصيل هذا الموضوع في النسخة الورقية من الكتاب

لعناوين استفسار أو التوزيع يرجى االتصال على احد لطلب أ واال التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

الموقع الرسمي للكتاب

1Hwww.fadidotnet.org

Page 66: Ip معلومات حول

66

باستخدام SQL Server و Accessمثال لتخزين صورة في قاعدة بيانات 5.4 :Stream ومكتبات الـNET.ADOالـ

شكل لتمثيل صورة بالذاآرة على Memory Stream Classسنستخدم في هذا المثال الـStream Data حيث يمكننا تحويلها إلى Bytesستخدام الحقا باGetBuffer Method وآما

:يلي:#C

try { MemoryStream stream = new MemoryStream(); pictureBox.Image.Save(stream,System.Drawing.Imaging.ImageFormat.Jpeg);

byte[] arr = stream.GetBuffer(); Store_it (arr);

} catch(Exception ex) { MessageBox.Show(ex.Message); } } VB.NET Try Dim stream As MemoryStream = New MemoryStream pictureBox.Image.Save(stream,System.Drawing.Imaging.ImageFormat.Jpeg) Dim arr As Byte() = stream.GetBuffer() Store_it (arr) Catch ex As Exception MessageBox.Show(ex.Message) End Try

:Microsoft Access استخدام أوال والتي سنستخدم Method Store_it الـ سنرسلها إلىByte Arrayبعد تحويل الصورة إلى

: وآما يليDatabase إلى الـByte Array الـ لتمريرOleDbParameterمن خاللها الـ:#C

public void Store_it (byte[] content) { try { oleDbConnection1.Open(); OleDbCommand insert = new OleDbCommand( "insert into img values (?)",oleDbConnection1); insert.Parameters.Add(new OleDbParameter("@pic", OleDbType.Binary)).Value = content; insert.ExecuteNonQuery(); } catch(Exception ex) { MessageBox.Show(ex.Message);

Page 67: Ip معلومات حول

67

} finally {oleDbConnection1.Close();} } VB.NET Public Sub Store_it(ByVal content As Byte()) Try oleDbConnection1.Open() Dim insert As OleDbCommand = New OleDbCommand("insert into img values (?)", oleDbConnection1) insert.Parameters.Add(New OleDbParameter("@pic", OleDbType.Binary)).Value = content insert.ExecuteNonQuery() Catch ex As Exception MessageBox.Show(ex.Message) Finally oleDbConnection1.Close() End Try End Sub

ة الصورة من قاعدة باستخدام الطريقة المعتادة لقراءة البيانات الآن يجب أن وتتم عملية قراء مرة أخرى وتتم Stream إلى Dataset والتي سيتم وضعها في الـBinary Dataيتم تحويل الـ

:هذه العملية آما يلي:#C

oleDbDataAdapter1.SelectCommand.CommandText = "select * from img"; oleDbDataAdapter1.Fill(dsPictures1); byte[] arrPicture = ((byte[]) (dsPictures1.Tables[0].Rows[0]["pic"])); MemoryStream ms = new MemoryStream(arrPicture); pictureBox2.Image = Image.FromStream(ms);

VB.NET oleDbDataAdapter1.SelectCommand.CommandText = "select * from img" oleDbDataAdapter1.Fill(dsPictures1) Dim arrPicture As Byte() = (CType(dsPictures1.Tables(0).Rows(0)("pic"), Byte())) Dim ms As MemoryStream = New MemoryStream(arrPicture) pictureBox2.Image = Image.FromStream(ms)

وبعد ذلك وبتمرير Byte Array وتخزينها في Dataset لمخرجات الـCastingحيث قمنا بعمل

مرة أخرى Stream إلى Byte Array سيتم تحويل الـMemoryStream Class إلى الـArrayالـ ...FromStream Method باستخدام الـPictureBoxوعندها يمكننا عرضها على

Page 68: Ip معلومات حول

68

:SQL Serverrosoft Mic استخدام ثانيا

سوى انه يتم Microsoft Access عن الـSQL Serverالتختلف عملية التخزين بقاعدة بيانات Connectionآما أن صيغة الـ ، OleDbParameter بدال من SqlParameterاستخدام الـ

Stringستختلف بين الـ Access Databaseوالـ SQL Server Databaseسار حيث يمرر لألول م SQLالملف الخاص بقاعدة البيانات أما الثاني فيمرر له اسم الجهاز الذي يحتوي على الـ

Serverوآما يلي آمثال :

:Connection Streingإلنشاء الـ :#C

string SQL_CONNECTION_STRING = "Server=SQL_SERVER_NAME;DataBase=DB_NAME;Integrated Security=SSPI"; VB.NET Dim SQL_CONNECTION_STRING As String = "Server=SQL_SERVER_NAME;DataBase=DB_NAME;Integrated Security=SSPI"

: آما يليConnection Objectثم يمرر إلى الـ :#C

SqlConnection My_Connection = new SqlConnection(connectionstring); VB.NET Dim My_Connection As SqlConnection = New SqlConnection(connectionstring)

:SQL Serverلتخزين الصورة في قاعدة البيانات

:#C

public void Store_it (byte[] content) { try { My_Connection.Open(); SqlCommand insert = new SqlCommand( "insert into img values (?)",My_Connection); insert.Parameters.Add(new SqlParameter("@pic", SqlDbType.Binary)).Value = content; insert.ExecuteNonQuery();

} catch(Exception ex) { MessageBox.Show(ex.Message); } finally {My_Connection.Close();} }

Page 69: Ip معلومات حول

69

VB.NET Public Sub Store_it(ByVal content As Byte()) Try My_Connection.Open() Dim insert As SqlCommand = New SqlCommand("insert into img values (?)", My_Connection) insert.Parameters.Add(New SqlParameter("@pic", SqlDbType.Binary)).Value = content insert.ExecuteNonQuery() Catch ex As Exception MessageBox.Show(ex.Message) Finally My_Connection.Close() End Try End Sub

: مرة أخرى Picture Boxولعرض الصورة في

:#C SqlDataAdapter.SelectCommand.CommandText = "select * from img"; SqlDataAdapter.Fill(dsPictures1); byte[] arrPicture = ((byte[]) (dsPictures1.Tables[0].Rows[0]["pic"])); MemoryStream ms = new MemoryStream(arrPicture); pictureBox2.Image = Image.FromStream(ms); VB.NET SqlDataAdapter.SelectCommand.CommandText = "select * from img" SqlDataAdapter.Fill(dsPictures1) Dim arrPicture As Byte() = (CType(dsPictures1.Tables(0).Rows(0)("pic"), Byte())) Dim ms As MemoryStream = New MemoryStream(arrPicture) pictureBox2.Image = Image.FromStream(ms)

إلرسال أوامر إلى الـ Streamوهكذا بينا في المثال األول آيفية استخدام الـServer وفي المثال الثاني آيفية استخدام الـ MemoryStream لتخزين Binary

Dataفي الـ SQL Server والـ Microsoft Access Database...

Transport Layer & Networkسيتم الحديث في الجزء التالي عن استخدام Layer Programmingوبرمجة بروتوآوالتها في بيئة الدوت نيت .

Page 70: Ip معلومات حول

70

Chapter6 Transport TCP & UDP (Classes & Members) Chapter7 Synchronous Sockets Programming Chapter8 Asynchronous Sockets Programming Chapter9 Advanced Multicasting Systems Chapter10 Voice Over IP Programming

Part 3 Transport & Network Layer Programming

Page 71: Ip معلومات حول

71

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 6 Transport TCP & UDP (Classes & Members)

- TCP Classes Members - UDP Classes Members

Page 72: Ip معلومات حول

72

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

6 :UDP Classes Members& TCP :

Members واهم الـ UDP Classes والـ TCP Classesسوف نتحدث في هذا الفصل عن الـ ومن المعروف أن في هذه ، Transport Layerلكل منهما والتي يتم التعامل معها في الـ

بإلضافة إلى وضع وتحديد Flags والـ Offsetالطبقة يمكن التحكم بخصائص اإلرسال ومنها الـ لدى الطرف المرسل والمستقبل الحظ الشكل التالي Destenation Port و الـSourceالـ

.UDP الخاص بالـHeader والـTCP الخاصة بالـHeaderوالذي يوضح الـ

للبكت الواحد حيث يتم فيه تخزين عنوان البورت Bits 32 ويتكون من TCP Headerأوال الـ ورقم التحقق Bits 32 والرقم التسلسلي في Bits 16 والمستقبل في Bits 16سل في المر

: وفي النهاية يتم وضع الجزء الخاص بالبياناتChecksum إلى الـةباإلضاف

TCP Header Data Offset: 4 bits the number of 32 bit words in the TCP Header. This indicates where the data begins. The TCP header (even one including options) is an integral number of 32 bits long. Window: The number of data octets beginning with the one indicated in the acknowledgment field which the sender of this segment is willing to accept.

من البيانات للبكت الواحد ويحتوي على عنوان Bits 32 ويتكون من UDP Header الـثانيا

فهما اختياريان وبشكل افتراضي ال يتم Checksum أما المستلم و الـBits 16المرسل : استخدامهم في عملية اإلرسال

UDP Header

Page 73: Ip معلومات حول

73

:Oriented Protocol onTCP Connectiـ الخاصة بالClassesالـأوال

1-Class TcpClient : ـتحتوي على مجموعة من الحيث Methodsـ وال Properties وهي

:آما يلي :TCPClient Methodsأهم الميثود الخاصة بها : أوال

Connect :وتستخدم ألجراء عملية االتصال مع الـserverحيث نمرر فيها عنوان الـ IP الخاص

:يلي وآما Port و رقم الServerبالـ:#C

TcpClient tcp = new TcpClient(); tcp.Connect(IPAddress.Parse("192.168.1.1"),5020); VB.NET: Dim tcp As TcpClient = New TcpClient tcp.Connect(IPAddress.Parse("192.168.1.1"), 5020)

Close :إلنهاء االتصال مع الـTCP Socket. EndConnect: إلنهاءAsynchronies Connection حيث ترجع Asynchronies Result .

GetStream :ويستخدم لقراءة الـStreamمن الـ Socketفي عملية اإلرسال و االستقبال .

:TCPClient Propertiesأهم الخصائص : ثانيا

LingerState : وتأخذget أو Set الـ لتحديد أو معرفةLinger Time NoDelay : وتأخذgetأو Set إذا آان هناك وقت معين لتأخير أم ال لتحديد أو معرفة

ExclusiveAddressUse : وتأخذget أو Set ال لتحديد أو معرفةSocket يسمح باستخدام . أم الClient Portالـ

SendBufferSize و ReceiveBufferSize : وتأخذget أو Set حجم لتحديد أو معرفة .TCP Client Object والمعرف في stream المستخدم في الـBufferالـ

SendTimeout و ReceiveTimeout : وتأخذget أو Set الوقت المتاح لتحديد أو معرفة في حالة أنه لم يجد الطرف األخر خالل Time Outلعملية اإلرسال أو اإلستقبال حيث يعطي

.فترة زمنية معينة

Page 74: Ip معلومات حول

74

2-Class TcpListener : الـ تحتوي على مجموعة منحيثMethodsالـ وProperties وهي :آما يلي

:MethodsTcpListener أهم الميثود الخاصة بها : أوال

AcceptSocket : الـوتستخدم لقبول عملية االتصال معClient.

Start : وهيOverloaded Method حيث انه في حالة تمرير رقم إليها يتم تحديد عدد وبدون تحديد رقم معين يصيح Qoueeالـالطابور أو األجهزة التي تسمح بوجودها في

. غير محددQoueeالـStop : وتستخدم إلغالق عملية التصنت ويفضل وضعها في الـFinallyعند استخدام الـ Try و

.Exception حتى يتم إنهاء عملية التصنت في حالة حدوث أي Catchالـ

:TcpListenerأهم الخصائص في : ثانيا

LocalEndpoint : الـحيث يرجعIPورقم ال Port الـ المستخدم فيLocalEndpointالمحدد . Server : الـومن خاللها نستطيع الوصول إلى آل الخصائص و الميثود فيTCP Server والتي

وغيرهاListenو Receiveالـ وSendtoالـ وAcceptالـشرحناها سابقا مثل

Page 75: Ip معلومات حول

75

:Protocol UDP Connectionlessالـلخاصة ب اClassesالـثانيا 1-Class UdpClient: وتستخدم لتعريفUDP Datagram Protocol Connection قمنا

:وفي هذا الجزء سنبين أهم محتوياتها وهي آما يلي سابقا بتعريفها والتعامل معها

:ومن أهم الميثود والخصائص الخاصة بها

JoinMulticastGroup و DropMulticastGroup : عنوان أو مجموعة من أو إلغاء لضم .Multicast Groupمن الـالعناوين

EnableBroadcast : وتأخذGet أو Set الـ لتفعيلBroadcasting الـ فيsocket. MulticastLoopback : وتأخذGet أو Set لمعرفة أو تحديد الـMlticast Loopback.

2-Class MulticastOption :يستخدم في الـوMulticasting تخزين حيث يتمIP Address

List لتعامل معها في Multicast Group لعمل Join و Drop ألي Multicast Group وتستخدم : Multicast رسائل لآما يلي آمثال إلضافة عضوية الستقبا

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

:#C mcastSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); VB.NET: mcastSocket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

Page 76: Ip معلومات حول

76

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

:#C IPAddress localIPAddr = IPAddress.Parse(Console.ReadLine()); mcastSocket.Bind(IPlocal); VB.NET: Dim localIPAddr As IPAddress = IPAddress.Parse(Console.ReadLine) mcastSocket.Bind(IPlocal)

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

MulticastOption mcastOption; mcastOption = new MulticastOption(localIPAddr); VB.NET: Dim mcastOption As MulticastOption mcastOption = New MulticastOption(localIPAddr)

األول لتحديد مستوى تومن ثم نضيف التغير على الـحيث تأخذ هذه الميثود ثالثة باروميترا وفي حالتنا هذه سوف UDP أو TCP أو Socket أو على IPv6 أو على IPالتغيير على

وفي الباروميتر الثاني Multicast Group إلى IP إذ ما نريده هو ضم IPنستخدم التغير على لتغيير حيث نريد إضافة عضوية ويمكن االختيار بين إضافة عضويه نحدد نوع ا

AddMembership أو إلغاء عضوية DropMembershipوأخيرا نسند إليه الـ MulticastOption Objectوالذي قمنا بإنشائه و آما يلي :

C#: mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,mcastOption);

VB.NET: mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, mcastOption)

وهكذا بينا اهم الخصائص والتي يمكن التحكم بها في بيئة الدوت نيت والخاصة الي سيتم الحديث التالفصلفي ، Network Layerو الـ Transport Layerبالـ

Networkوالتي يتم التعامل معها في الـ Membersبشكل مفصل عن بقية الـ Layer وطرق التعامل مع الـ Synchronous Sockets

.Asynchronous Socketsوالـ

Page 77: Ip معلومات حول

77

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 7 Network Layer & Synchronous Sockets Programming

- Introduction to Socket Programming - Synchronous Socket Programming - Synchronous Socket Classes & Members

Page 78: Ip معلومات حول

78

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

7 :Synchronous Sockets Programming& Network Layer :

والـ Network Layerسوف نبين بشكل أآثر تفصيال عن برمجة طبقة الـفي هذا الجزء Socket وهي التي يتم التعامل معها إلرسال واستقبال البيانات بعد تحويلها من و إلى Streamقمنا سابقا باستخدام الـ، عبر الشبكةTCP و UDP لإلرسال ولالستقبال وبينا الفرق

..Socket Programmingعن الـبينهما وفي هذا الجزء سوف نتحدث

.17 :Introduction to Socket Programming

هي األداة التي يتم نقل البيانات من خاللها من جهاز إلى أخر Socketـ ال أن من المعروف حيث يحتوي هذا Name Space System.Net.Socketsوالستخدامها يلزم في البداية تعريف

Name Space الـمن على عدد ضخمClassesوالتي يتم استخدامها في برمجيات الشبكة أو مع UDP أو الـTCP إذ يمكننا من التعامل مع الـSocket Classوسوف نتحدث عن أهما وهو

من ثالثة Socket Object Methodأي نوع أخر من البرتوآوالت بشكل مباشر ويتكون الـ : آما يليتباروميترا

:#C Socket MySocket = new Socket(AddressFamily. , SocketType., ProtocolType.); VB.NET: Dim MySocket As Socket = New Socket(AddressFamily, SocketType, ProtocolType)

والذي سوف تتعامل معه ويعطيك IP Addressالـحيث يتم في الباروميتر األول تحديد نوعية

والمستخدم في ATM أو Novelالـوالمستخدم في شبكات IPXعدد آبير من الخيارات ومنها ومن أهم هذه الخيارات ... وغيرها NetBIOS Address أو ATM Networksالـشبكات

وهو ما نستخدمه بشكل دائم مع البرمجيات الخاصة بالشبكات ويعرف InterNetworkالفت وأغلب أنظمة وهو المعتاد مع نظام مايكروسوIPv4 هو من النوع IPعلى أن نوع

التشغيل المعروفة حاليا وفي المستقبل القريب جدا سيتم اإلستغناء عنه وليحل محله Stream أي هل سوف نستخدم Socketالـفي الباروميتر الثاني يتم تحديد نوع ، IPv6الـ

لهذه المهمة حيث اننا Streamالـإلرسال البيانات أو شيء اخر وعادة ما يتم استخدام وأخيرا نحدد نوع البروتوآول المستخدم لإلتصال ، Streamنمطية التراسل من النوع سنعتمد

ICMP Internet Control Message أو بروتوآوالت أخرى مثلTCP أو UDPفهل هو من النوع Protocol أو IGMP Internet Group Management Protocol الـ أو اننا نريد مثال إنشاءSocket وغيرها وسوف نأتي IPSecAuthenticationHeader بإختيار IP Security Headerلتعريف

ومن المعروف UDP أو TCPالـوهنا سوف نختار ، على شرح مثل هذه األمور الحقا إنشاء اهللا هو برتوآول موجه وهذا يعني إجراء عملية التحقق من الوصول والتوصيل TCPأن برتوآول الـ

فهو برتوآول سريع نسبيا و الآنه ال يدعم عملية UDPلـإلى شخص ما محدد أما برتوآول االتحقق من الوصول السليم للبيانات المرسلة وهو مفيد جدا إلجراء عملية البث اإلذاعي

Broadcast وإنشاء مجموعات البث Multicast Group وهو ما شرحناه في الفصل األول .والثاني والثالث

Page 79: Ip معلومات حول

79

TCP إلنشاء ronous Socket Programming Synch استخدام الـ27. Connection:

بمجموعة من المراحل وهي آما TCP Socket Connectionتمر عملية االتصال باستخدام الـ

:في الشكل التالي

: آما يلي Socket بإنشاء الـserver و الـClientإذ تبدأ العملية في الـ:#C

Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); VB.NET: Dim MySocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

وتستخدم فقط عند Bind مع الكمبيوتر الحالي باستخدام الميثود Socketثم ربط الـ : وآما يلي االستقبال

:#C IPEndPoint ip = new IPEndPoint(IPAddress.Any, 5020); MySocket.Bind(ip);

VB.NET: Dim ip As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020) MySocket.Bind(ip)

د ويمكنك تحدد عدlisten المحدد باستخدام الميثود Portثم القيام بعملية التصنت على ال ثم نقوم بالموافقة على 1-األجهزة التي سيتم قبولها ولوضع عدد غير محدد نمرر له الرقم

: وآما يلي acceptاالتصال باستخدام الميثود :#C

MySocket.Listen(-1); MySocket.Accept(); VB.NET: MySocket.Listen(-1) MySocket.Accept

Page 80: Ip معلومات حول

80

حيث تعبئ البيانات في مصفوفة من النوع Receiveيثود ويتم استقبال البيانات من خالل المByte وآما يلي :

:#C byte[]Received=new byte[1024]; MySocket.Receive(Received); VB.NET: Dim Received(1024) As Byte MySocket.Receive(Received)

حيث ) آمثالPort)5020 وبتعريفها على الTCP من النوع Connection وهنا قمنا بإنشاء ..1- ال نهائي العدد Listen وقمنا بتعريف Bind الميثود م باستخداSocketيتم ربطها بالـ

مرة Socket البد من تعريف الSocket باستخدام الـTCP Clientولتعريف برنامج اإلرسال ل البيانات ثم إرساIPEndPoint بنقطة الهدف Port ورقم الServerأخرى وإسناد عنوان ال

حيث سنستخدم socket وتتم عملية اإلرسال بما تم تعريفه في الـSend الميثود مباستخداStream Socket وآما يلي :

:#C String str = Console.ReadLine(); ASCIIEncoding asen = new ASCIIEncoding(); byte[] msg = asen.GetBytes(str); Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint remote = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 5020); MySocket.Connect(remote); MySocket.Send(msg); MySocket.Close();

VB.NET: Dim str As String = Console.ReadLine Dim asen As ASCIIEncoding = New ASCIIEncoding Dim msg As Byte() = asen.GetBytes(str) Dim MySocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Dim remote As IPEndPoint = New IPEndPoint(IPAddress.Parse("192.168.1.101"), 5020) MySocket.Connect(remote) MySocket.Send(msg) MySocket.Close

Page 81: Ip معلومات حول

81

UDPإلنشاء Socket Programming Synchronousاستخدام الـ 7.3Connectionless:

بمجموعة من المراحل وهي آما UDP Socket Connectionتمر عملية االتصال باستخدام الـ

:في الشكل التالي

بإنشاء server و الـClient إذ تبدأ العملية في الـTCPوتتشابه عملية االتصال آما في الـ : آما يلي Socketالـ

:#C Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp); VB.NET: Dim MySocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Udp)

وتستخدم فقط عند Bind مع الكمبيوتر الحالي باستخدام الميثود Socketثم ربط الـ :االستقبال وآما يلي

:#C IPEndPoint sender = new IPEndPoint(IPAddress.Any, 5020); MySocket.Bind(sender); VB.NET: Dim sender As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020) MySocket.Bind(sender)

End Point حيث نعرف في البداية ReceiveFromوالستقبال البيانات نستخدم الميثود Referenceونمرره ك بناء على ما تم تعريفه في السابقة referenceمع مصفوفة الـ Byte

من خالل الميثود Stringومن ثم نستطيع تحويل المصفوفة إلى ReceiveFromإلى الميثود GetString الموجودة ضمن Class ASCIIوآما يلي :

:#C int recv; byte[] data = new byte[1024]; EndPoint Remote = (EndPoint) (sender); recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

Page 82: Ip معلومات حول

82

VB.NET: Dim recv As Integer Dim data(1024) As Byte Dim Remote As EndPoint = CType((sender), EndPoint) recv = newsock.ReceiveFrom(data, Remote) Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv))

String حيث نمرر لها البيانات بعد تحويلها من SendToيتم في اإلرسال استخدام الميثود و

ونوع Length وحجم البيانات المرسلة إذ يمكننا معرفته من خالل الميثود Byte Arrayإلى EndPoint Object لرسالة المرسلة واخيرا نمرر له الـBroadcast حيث نريد عمل Flagsالـ

:وآما يلي:#C

string welcome = "Hello All"; data = Encoding.ASCII.GetBytes(welcome); newsock.SendTo(data, data.Length, SocketFlags.Broadcast, Remote); VB.NET: Dim welcome As String = "Hello All" data = Encoding.ASCII.GetBytes(welcome) newsock.SendTo(data, data.Length, SocketFlags.Broadcast, Remote)

بحيث ال تنتهي أو يمكن تحديدها بعدد Infinity While Loop يمكن وضع هذا األآواد في ..معين من عمليات اإلرسال واالستقبال

.47Socket Classes Members Synchronous: 1 - IPAddress Class: ويستخدم لتعريف IP Address إسناده إلى حيث يمكن :لعامة له آما يليآمثال والصيغة ا IPEndPointالـ

:#C IPAddress newaddress = IPAddress.Parse("192.168.1.1"); VB.NET: Dim newaddress As IPAddress = IPAddress.Parse("192.168.1.1")

:ويمكن اإلختيار بين اربعة خيارات في تحديد العنوان وهي آما يلي

Anyويستخدم لتمثيل أي عنوان متاح على الشبكة Broadcastويستخدم لتمثيل البث اإلذاعي لجميع األجهزة على الشبكة Loopback ويستخدم لتمثيل العنوان المعروف لل loopback 127.0.0.1 وهو

None ويستخدم في حالة عدم وجود Network Interfaseفي النظام

:آما يدعم مجموعة من الميثود وأهمها

Equals عام للمقارنة بين يستخدم هذا الميثود بشكل tow Objects وهنا سيستخدم . إذا آانا مختلفينFalse إذا آانا متشابهين و Trueللمقارنة بين عنوانين ويرجع

GetHashCode وتستخدم إلرجاع العنوان إلى صيغة Hash Code

HostToNetworkOrder الـ ويرجع الجزء الخاص بNetwork من العنوان

NetworkToHostOrder الـ ويرجع الجزء الخاص بHostمن العنوان

Page 83: Ip معلومات حول

83

1- IPEndPoint Class: حيث استخدمناه لتحديد العنوان والـ Port للـ Host والذي نريد :االتصال به والصيغة العامة له آما يلي

:#C IPEndPoint end = new IPEndPoint(IPAddress.Parse("192.168.1.1"), 5020); VB.NET: Dim end As IPEndPoint = New IPEndPoint(IPAddress.Parse("192.168.1.1"), 5020)

: وهي آما يليSocket Classالـمجموعة الخواص التي تدعم في

AddressFamily الـ ويرجع مجموعة العناوين المعرفة علىSocket

Available الـ ويرجع حجم البيانات الجاهزة للقراءة منSocket

Blocking ويعطي Get أو Set الـ لمعرفة إذا آانsocket الـ يستخدمBlocking Modeأم ال

Connected الـ وتستخدم هذه الخاصية بكثرة لمعرفة إذا آانSocket الـ متصل معRemote Host أم ال

Handle الـ ويستخدم لمعرفة نظام التشغيل الذي يتعامل معSocket

ProtocolType الـ الذي يستخدم في ويستخدم لمعرفة البروتوآولSocket

RemoteEndPoint الـ ويرجع معلومات عنSocket الـ الذي يستخدم معRemote Host

:الستخداماتهاوآمثال :#C

using System; using System.Net; using System.Net.Sockets; class Socket_ Properties { public static void Main() { IPAddress ia = IPAddress.Parse("127.0.0.1"); IPEndPoint ie = new IPEndPoint(ia, 8000); Socket fmo = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Console.WriteLine("AddressFamily: {0}", fmo.AddressFamily); Console.WriteLine("SocketType: {0}", fmo.SocketType); Console.WriteLine("ProtocolType: {0}", fmo.ProtocolType); Console.WriteLine("Blocking: {0}", fmo.Blocking); fmo.Blocking = false; Console.WriteLine("new Blocking: {0}", fmo.Blocking); Console.WriteLine("Connected: {0}", fmo.Connected); fmo.Bind(ie); IPEndPoint iep = (IPEndPoint)fmo.LocalEndPoint; Console.WriteLine("Local EndPoint: {0}", iep.ToString()); fmo.Close(); }}

Page 84: Ip معلومات حول

84

VB.NET: imports System imports System.Net imports System.Net.Sockets Public Shared Sub Main() Dim ia As IPAddress = IPAddress.Parse("127.0.0.1") Dim ie As IPEndPoint = New IPEndPoint(ia, 8000) Dim fmo As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Console.WriteLine("AddressFamily: {0}", fmo.AddressFamily) Console.WriteLine("SocketType: {0}", fmo.SocketType) Console.WriteLine("ProtocolType: {0}", fmo.ProtocolType) Console.WriteLine("Blocking: {0}", fmo.Blocking) fmo.Blocking = False Console.WriteLine("new Blocking: {0}", fmo.Blocking) Console.WriteLine("Connected: {0}", fmo.Connected) fmo.Bind(ie) Dim iep As IPEndPoint = CType(fmo.LocalEndPoint, IPEndPoint) Console.WriteLine("Local EndPoint: {0}", iep.ToString) fmo.Close()

End Sub

:حيث سترجع المعلومات التالية

AddressFamily: InterNetwork SocketType: Stream ProtocolType: Tcp Blocking: True new Blocking: False Connected: False Local EndPoint: 127.0.0.1:8000 Press any key to continue . . .

سوف ، في بيئة الدوت نيت Synchronous Socketوهكذا بينا آيفية برمجة الـ في بيئة الدوت Asynchronous Socketنتحدث في الفصل التالي عن برمجة

.نيت

Page 85: Ip معلومات حول

85

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 8 Asynchronous Sockets

- Asynchronous Socket Class and its members - Applied Asynchronous Socket in Dot Net

Page 86: Ip معلومات حول

86

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

8 :rogramming PAsynchronous Sockets:

بشكل أآثر تفصيال Asynchronous Socketسوف نتحدث في هذا الجزء عن استخدام الـ عما تحدثنا به سابقا وسوف نطبق مجموعة من األمثلة العملية على استخدام االتصال الغير

...متزامن في برمجيات الشبكات ي تحتاج إلى العمل في الزمن من المعروف أن االتصال المتزامن مهم جدا في البرمجيات الت

الحقيقي حيث ال يسمح باستخدام االتصال ألمر آخر إلى بعد انتهاء العملية الجارية مهم جدا في العمليات التي تتطلب مثل هذه األمور ال آن ال ينصح أبدا هواستخدام

Slow Connectionاستخدامه في حالة إذا آانت الجهة المستقبلة للبيانات تستخدم لربط الجهازين المرسل مع المستقبل أو في حالة إذا آان Dialupتماد الشبكة على الـآاع

حيث يمنع األسلوب المتزامن Serverهنالك مجموعة آبيرة من المستخدمين تستخدم ال يستقبل Serverبقية المستخدمين على الشبكة من إجراء عملية اإلرسال في حالة آون الـ

ي هذه الحالة ينصح باستخدام االتصال الغير المتزامن إذ يعتبر مهم وف، بيانات من جهاز آخر نفس م وباستخداThreadجدا في حالة إذا أردنا من البرنامج القيام بعدة مهام وعلى نفس الـ

أو آما ذآرنا سابقا في حالة إذا آان االتصال بطيء نسبيا أو انه يوجد عدد ، Connectionالـ ..Serverلـمستخدمين يستخدمون نفس ا

:Asynchronous Socket Class and its members أوال

Socket الموجودة ضمن الـmethodsتدعم الدوت نيت االتصال غير المتزامن بمجموعة من الـ

Classوالتي يتم استدعائها من الـ System.Net.Socket Namespaces وقد ميزت الدوت نيت Method يوجد Begin Methodولكل ، بداية أسم الميثود فيBeginهذه الميثودس بوجود الـ

End مقابلة لها والتي تستخدم إلرجاع callback resultعند انتهاء الـ Begin Method من :التنفيذ وهي آما يلي

1- BeginAcceptو تستخدم لقبول الـ Client Requestوإسناده إلى ال Object AsyncCallback الطريقة سوف يتمكن الـ وباستخدام هذهServer من استقبال عدد من

في نفس الوقت وبدون الحاجة النتظار االنتهاء من العملية الجارية حيث Clients Requestsالـ وتستخدم آما يلي AsyncCallback Delegateيتم في آل مرة استدعاء الميثود باستخدام الـ

:آما يلي

Page 87: Ip معلومات حول

87

:#C m_mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); IPEndPoint ipLocal = new IPEndPoint (IPAddress.Any, 5020); m_mainSocket.Bind (ipLocal); m_mainSocket.Listen (10); m_mainSocket.BeginAccept (new AsyncCallback (Client_request_method), null);

VB.NET: m_mainSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Dim ipLocal As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020) m_mainSocket.Bind(ipLocal) m_mainSocket.Listen(10) m_mainSocket.BeginAccept(New AsyncCallback(Client_request_method), Nothing)

منفصل عن السابق وهنا Reference Callback فيClient Requestحيث سيتم إضافة الـ

Client Accepted Object وإنهاء الـClient Request الستقبال الـmethodالبد من إنشاء : EndAcceptباستخدام الميثود

C#: public void Client_request_method(IAsyncResult ar) { Socket listener = (Socket)ar.AsyncState; Myclient = listener.EndAccept(ar); Myclient.Send(/* data to be send*/ ); listener.BeginAccept(new AsyncCallback(Client_request_method), listener); Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString()); } VB.NET: Dim listener As Socket = CType(ar.AsyncState, Socket) Myclient = listener.EndAccept(ar) Myclient.Send listener.BeginAccept(New AsyncCallback(Client_request_method), listener) Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString)

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

State Object و AsyncCallBack Delegate وتأخذ 2005 و 2003الشكل األول في الدوت نيت : وآما يليSocket في ال Requestإلرجاع معلومات عن حالة ال

MySocket.BeginAccept(AsyncCallback , object state)

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

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

Page 88: Ip معلومات حول

88

2- BeginConnect وتستخدم لبدأ Asynchronous Connection الـ علىSocket ورقم State Object والـAsynchronous Callback والـIPEndPoint حيث يسند لها الـ المحددPortال

:وآما يليMySocket.BeginConnect(EndPoint IP,Syncallback Result,object state)

:وتستخدم آما يلي آمثال:#C

Socket MySocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipend = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 5020); MySocket.BeginConnect(ipend, new AsyncCallback(Connected), MySocket);

VB.NET: Dim MySocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Dim ipend As IPEndPoint = New IPEndPoint(IPAddress.Parse("192.168.1.101"), 5020)

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

:#C public static void Connected(IAsyncResult iar) { Socket sock = (Socket)iar.AsyncState; try { sock.EndConnect(iar); } catch (SocketException) { Console.WriteLine("Unable to connect to host"); }} VB.NET: Public Shared Sub Connected(ByVal iar As IAsyncResult) Dim sock As Socket = CType(iar.AsyncState, Socket) Try sock.EndConnect(iar) Catch generatedExceptionVariable0 As SocketException Console.WriteLine("Unable to connect to host") End Try End Sub

Page 89: Ip معلومات حول

89

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

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

:ويستخدم آما يلي آمثال:#C

byte[] data = new byte[1024]; MySocket.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ReceivedData), MySocket); void ReceivedData(IAsyncResult iar) { Socket remote = (Socket)iar.AsyncState; int recv = remote.EndReceive(iar); string receivedData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(receivedData); } VB.NET: Dim data(1024) As Byte MySocket.BeginReceive(data, 0, data.Length, SocketFlags.None, New AsyncCallback(ReceivedData), MySocket) Sub ReceivedData(ByVal iar As IAsyncResult) Dim remote As Socket = CType(iar.AsyncState, Socket) Dim recv As Integer = remote.EndReceive(iar) Dim receivedData As String = Encoding.ASCII.GetString(data, 0, recv) Console.WriteLine(receivedData) End Sub

باستخدام إلستقبال البيانات من موقع محدد BeginReceiveFromآما تستخدم الميثود .IPEndPoint Refrance Object السابق الترآيبحيث يضاف إلى UDPالـ 4- BeginSend الـ وتستخدم إلرسال بيانات إلى الطرف المستقبل عبرAsynchronous

Socket والصيغة العامة لها آما يلي: MySocket.BeginSend (Byte[] buffer,int offset, SocketFlags,AsyncCallback, object sate)

:وتستخدم آما يلي آمثال:#C

private static void SendData(IAsyncResult iar) { Socket server = (Socket)iar.AsyncState; int sent = server.EndSend(iar); } byte[] data = Encoding.ASCII.GetBytes("Hello Word"); MySocket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendData), MySocket);

Page 90: Ip معلومات حول

90

VB.NET: Private Shared Sub SendData(ByVal iar As IAsyncResult) Dim server As Socket = CType(iar.AsyncState, Socket) Dim sent As Integer = server.EndSend(iar) End Sub Dim data As Byte() = Encoding.ASCII.GetBytes("Hello Word") MySocket.BeginSend(data, 0, data.Length, SocketFlags.None, AddressOf SendData, MySocket)

باستخدام محدد Remote Host إلى البيانات إلرسال BeginSendtoآما تستخدم الميثود

.IPEndPoint Refrance Object السابق الترآيبحيث يضاف إلى UDPالـ

: وهي2005 آما تم إضافة مجموعة من الميثود الجديدة في الدوت نيت - 5BegonDiconnect إلنهاء االتصال و BeginSendFileرسال ملف و إل

والتي تستخدم إلستقبال عدد محدد من البيانات BeginReceiveMessageFromالـ ..Buferالـوتخزينها في مكان محدد في

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

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

: الترآيب التاليBeginReceiveMessageFromوالـ

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

:الترآيب التالي BegonDiconnectوالـ

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

Page 91: Ip معلومات حول

91

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

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

بعد Clientول الجلسة وإمكانية البدء لإلرسال و يستطيع الـ ليعلمه فيها بقبClientإلى الـ Server ويستقبل الـBeginSend باستخدام الميثود لالموافقة على الجلسة البدء باإلرسا

وآما ذآرنا سابقا فإن لكل عملية BeginReceive باستخدام الميثود Clientالرسالة من الـBegin تقابلها الميثود Endجراء عملية أخرى على نفس الـ إلد لالستعداThread في البرنامج

.وهو ما ميز االتصال الغير متزامن عن االتصال المتزامن

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

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

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

Page 92: Ip معلومات حول

92

:#C using System.Net; using System.Net.Sockets; using System.Text; VB.NET: Imports System.Net Imports System.Net.Sockets Imports System.Text

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

:#C public class Form1 : System.Windows.Forms.Form {

Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 5020); private byte[] data = new byte[1024]; private int size = 1024; VB.NET: Public Class Form1 Inherits System.Windows.Forms.Form Private server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Private iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020) Private data As Byte() = New Byte(1024) {} Private size As Integer = 1024

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

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

Page 93: Ip معلومات حول

93

VB.NET: Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) server = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020) server.Bind(iep) server.Listen(5) server.BeginAccept(New AsyncCallback(AcceptConn), server) End Sub

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

آما BeginSend Methodالـ تخبره فيها بقبول الطلب وترسل باستخدام Clientالـ :يلي

:#C void AcceptConn(IAsyncResult iar) { Socket oldserver = (Socket)iar.AsyncState; Socket client = oldserver.EndAccept(iar); conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString(); string stringData = "Welcome to my server"; byte[] message1 = Encoding.ASCII.GetBytes(stringData); client.BeginSend(message1, 0, message1.Length, SocketFlags.None,new AsyncCallback(SendData), client); } VB.NET: Sub AcceptConn(ByVal iar As IAsyncResult) Dim oldserver As Socket = CType(iar.AsyncState, Socket) Dim client As Socket = oldserver.EndAccept(iar) conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString Dim stringData As String = "Welcome to my server" Dim message1 As Byte() = Encoding.ASCII.GetBytes(stringData) client.BeginSend(message1, 0, message1.Length, SocketFlags.None, New AsyncCallback(SendData), client) End Sub

: وآما يليBeginSend إلنهاء الـSend Callback methodثم إنشاء :#C

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

Page 94: Ip معلومات حول

94

VB.NET: Sub SendData(ByVal iar As IAsyncResult) Dim client As Socket = CType(iar.AsyncState, Socket) Dim sent As Integer = client.EndSend(iar) client.BeginReceive(data, 0, size, SocketFlags.None, New AsyncCallback(ReceiveData), client) End Sub

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

:#C

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

} VB.NET: Sub ReceiveData(ByVal iar As IAsyncResult) Dim client As Socket = CType(iar.AsyncState, Socket) Dim recv As Integer = client.EndReceive(iar) If recv = 0 Then client.Close() conStatus.Text = "Waiting for client..." server.BeginAccept(New AsyncCallback(AcceptConn), server) Return End If Dim receivedData As String = Encoding.ASCII.GetString(data, 0, recv) results.Items.Add(receivedData) Dim message2 As Byte() = Encoding.ASCII.GetBytes(receivedData) client.BeginSend(message2, 0, message2.Length, SocketFlags.None, New AsyncCallback(SendData), client) End Sub

Page 95: Ip معلومات حول

95

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

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

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

VB.NET: imports System.Net imports System.Net.Sockets imports System.Text

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

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

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

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

VB.NET: Private client As Socket Private data As Byte() = New Byte(1024) {} Private size As Integer = 1024

Page 96: Ip معلومات حول

96

conStatus.Text = "Connecting..." Dim newsock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse(textBox1.Text), 5020) newsock.BeginConnect(iep, New AsyncCallback(Connected), newsock)

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

:#C

void Connected(IAsyncResult iar) { client = (Socket)iar.AsyncState; try { client.EndConnect(iar); conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString(); client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client); } catch (SocketException) { conStatus.Text = "Error connecting"; } } VB.NET: Sub Connected(ByVal iar As IAsyncResult) client = CType(iar.AsyncState, Socket) Try client.EndConnect(iar) conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString client.BeginReceive(data, 0, size, SocketFlags.None, New AsyncCallback(ReceiveData), client) Catch generatedExceptionVariable0 As SocketException conStatus.Text = "Error connecting" End Try End Sub

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

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

Page 97: Ip معلومات حول

97

VB.NET: Sub ReceiveData(ByVal iar As IAsyncResult) Dim remote As Socket = CType(iar.AsyncState, Socket) Dim recv As Integer = remote.EndReceive(iar) Dim stringData As String = Encoding.ASCII.GetString(data, 0, recv) results.Items.Add(stringData) End Sub

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

try { byte[] message = Encoding.ASCII.GetBytes(newText.Text); newText.Clear(); client.BeginSend(message, 0, message.Length, SocketFlags.None,new AsyncCallback(SendData), client); newText.Focus(); } catch(Exception ex){MessageBox.Show(ex.Message);} VB.NET: Try Dim message As Byte() = Encoding.ASCII.GetBytes(newText.Text) newText.Clear client.BeginSend(message, 0, message.Length, SocketFlags.None, New AsyncCallback(SendData), client) newText.Focus Catch ex As Exception Msgbox(ex.Message) End Try

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

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

Page 98: Ip معلومات حول

98

VB.NET: Sub SendData(ByVal iar As IAsyncResult) Try Dim remote As Socket = CType(iar.AsyncState, Socket) Dim sent As Integer = remote.EndSend(iar) remote.BeginReceive(data, 0, size, SocketFlags.None, New AsyncCallback(ReceiveData), remote) Catch ex As Exception Msgbox(ex.Message) End Try End Sub

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

:#C void ReceiveData(IAsyncResult iar) { try { Socket remote = (Socket)iar.AsyncState; int recv = remote.EndReceive(iar); string stringData = Encoding.ASCII.GetString(data, 0, recv); results.Items.Add(stringData); } catch(Exception ex){MessageBox.Show(ex.Message);} } VB.NET: Sub ReceiveData(ByVal iar As IAsyncResult) Try Dim remote As Socket = CType(iar.AsyncState, Socket) Dim recv As Integer = remote.EndReceive(iar) Dim stringData As String = Encoding.ASCII.GetString(data, 0, recv) results.Items.Add(stringData) Catch ex As Exception Msgbox(ex.Message) End Try End Sub

حيث نعرف Serverالـ ال يختلف آثيرا عن برنامج Clientالـوآما الحظنا فإن برنامج Clientالـ أما في BeginAccept Methodالـ وSocket Connectionالـ Serverالـفي

وتبقى عملية BeginConnect Methodالـ و Socket Connectionالـفنعرف ...Clientلـا وServerاإلرسال واالستقبال هي نفسها في

Page 99: Ip معلومات حول

99

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 9 Advanced Multicasting Systems

- Architecture of Multicast Sockets

- Using Multicast Sockets with .NET

- Multicast Conferencing Systems:

1. Full/Half Duplex Multicast Video Conferencing System.

2. Full/Half Duplex Multicast Desktop Conferencing System.

3. Full/Half Duplex Multicast Text Conferencing System

Page 100: Ip معلومات حول

100

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

9: Advanced Multicasting Systems :

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

وذلك ألهميتها الكبيرة في برمجيات الشبكات وخاصة برمجيات ...Conferencingالـ

: Architecture of Multicast Sockets: أوال

Class D وباستخدام الـUDP عبر برتوآول الـMulticastingانه يتم التعامل مع الـمن المعروف Subnet Maskوتتم عملية إدارة المجموعات باستخدام برتوآول الـ IGMP – Internet Group

Management Protocolوالذي هو جزء من الـ Internet Protocol Model وآما يتضح من يحتوي على عمليات التحقق من الوصول السليم IGMP الـالشكل التالي فإن برتوآول

حيث يتم إرسال حجم البيانات الكلي لرسالة وهي اختيارية إذ يمكن إلغائها بوضع (للبيانات والذي يحدد فيه العمر االفتراضي TTL Time to Liveو تحتوي أيضا على الـ، ) الرقم صفرأو إرجاع ، إلغاء من مجموعة ، ى مجموعة ضم إل( ونوع العملية اإلدارية ، لكل رسالة

وأخيرا عنوان المجموعة التي يتم تحديدها ) Membership Queryمعلومات عن المجموعة . Class D المحدد لل Rangeبرمجيا ضمن الـ

239.255.255.255 إلى 224.0.0.0من Multicastingفي الـ Rangeوتم تخصيص الـ

على أساس أوDynamic أو Static فإما بشكل يدويطرقونستطيع تحديده بثالثة :وبشكل عام تستخدم هذه التوزيعات آما يلي آمثال Scope-Relativeالـ

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

... في الشبكات األخرى Subnet الآن بشرط استخدام نفس الـو 224.0.0.2التخصيص : انظر الرابط التاليMulticastingولمعرفة جميع التخصيصات لل

H2addresses-icastmult/assignments/org.iana.www://http

حيث Unicast Tunnel باستخدام الـBackbone Tunnels بين الـMulticast Packetsيتم نقل الـ

Backbone إلى أخر عبر الـRouter و ترسل من Routerيتم إرسالها من داخل الشبكة إلى الـTunnelأسلوب الـم باستخدا Unicastوهو ما يوفر الكثير من الـ Bandwidthلشبكة حيث في ا

Unicast ويقوم هو بتوزيعها على األجهزة باستخدام الـRouterترسل نسخة واحدة إلى الـ UDP هو انه يعتمد بشكل آامل على استخدام الـMulticastالمشكلة الوحيدة في الـ

Connectionless Protocol.

Peer to Peerت الـ في ثالثة أنواع من الشبكات وهي شبكاMulticastingويمكننا استخدام الـوالنوع ، الذي هو فيهGroup والكل يستقبل و يرسل من و إلى الـServerحيث ال وجود لجهاز

ويقوم Server حيث يتم إرسال رسالة واحدة إلى الـServer Based Networkالثاني

Page 101: Ip معلومات حول

101

Routerأما النوع الثالث فيتم من خالل الـ، بتوزيعها على بقية األجهزة في الشبكة Serverالـ إلى المجموعة Clientوآما يتضح من الشكل التالي فإن عملية اإلرسال تتم بعد انضمام الـ،

حيث يقوم Router رسالة واحدة إلى الـClient ويرسل الـIP Multicastالتي تملك الـ .Routing Table الـا بتوزيعها على األجهزة في المجموعة مستخدمRouterالـ

من Multicasting يتم اإلرسال في Broadcastingل في اإلرسال باستخدام الـوآما آان الحاحيث ُتكون آل ، Broadcastجهاز محدد إلى مجموعة معينة وليس إلى الكل آما في الـ

IP Multicasting خاص ويتم التخصيص آما ذآرنا سابقا وفق الـGroupمجموعة من األجهزة ومن Multicastingويوجد عدة أشكال لل IP Multicastحيث تمتلك آل مجموعة نفس الـ

one to و اإلرسال إلى أآثر من مجموعة one to Groupاألمثلة عليها اإلرسال إلى مجموعة Multi Group :

:to GroupOne من واحد إلى مجموعة اإلرسال– 1

ويتم Receiver Users الذي يملكه الـIP Multicasting نفس الـUser Senderوفيه يملك الـ Access Point إلى الـUnicast إلى جميع أعضائه حيث ترسل ك Groupاإلرسال من داخل الـ

وآما في Broadcastحيث يقوم بتوزيعها على آافة األعضاء في المجموعة بأسلوب الـ : الشكل التالي

Page 102: Ip معلومات حول

102

:sGroup- to MultiOne إلى أآثر من مجموعة اإلرسال-2

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

... للمجموعات التي نريد اإلرسال لها Address Listويتم تحديدها باستخدام ،

Page 103: Ip معلومات حول

103

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

Members في الدوت نيت وتعرفنا على الـMulticastingشرحنا سابقا آيفية التعامل مع الـوهنا سوف نبين بشيء من التفصيل هذه العمليات ونطبق عليها الخاصة بها Classesوالـ

معتمدا على Conference Systemمجموعة من األمثلة وبعد ذلك سنقوم ببناء نظام .. . Multicastingالـ

:Multicastingمن العمليات األساسية في التعامل مع الـ : GroupDrop || Joiningمجموعة الخروج من أو االنضمام -1

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

JoinMulticastGroup Methodيتم تعريف الـ IP Multicasting وآما الذي سوف ننضم إليه :يلي

:#C UdpClient sock = new UdpClient(5020); sock.JoinMulticastGroup(IPAddress.Parse("225.100.0.1"), 50); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); VB.NET: Dim sock As UdpClient = New UdpClient(5020) sock.JoinMulticastGroup(IPAddress.Parse("225.100.0.1"), 50) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0)

: وآما يلي إللغاء عملية االنضمام من مجموعة :#C

sock.DropMulticastGroup(IPAddress.Parse("225.100.0.1")); VB.NET: sock.DropMulticastGroup(IPAddress.Parse("225.100.0.1"))

أو إلغاء لضم DropMulticastGroup و Methods JoinMulticastGroupإذ تستخدم ال Class مباستخداو ، Multicast Groupمن الـعنوان أو مجموعة من العناوين

MulticastOption :تخزين ننايمكIP Address List لتعامل معها في Multicast Group لعمل Join و Drop ألي Multicast Groupل وتستخدم آما يلي آمثال إلضافة عضوية الستقبا

: Multicastرسائل

: وآما يلي UDP Socket نعرف الـأوال:#C

mcastSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); VB.NET: mcastSocket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

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

Page 104: Ip معلومات حول

104

:#C IPAddress localIPAddr = IPAddress.Parse(Console.ReadLine()); mcastSocket.Bind(IPlocal); VB.NET: Dim localIPAddr As IPAddress = IPAddress.Parse(Console.ReadLine) mcastSocket.Bind(IPlocal)

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

MulticastOption mcastOption; mcastOption = new MulticastOption(localIPAddr); VB.NET: Dim mcastOption As MulticastOption

mcastOption) = New MulticastOption(localIPAddr

األول ت حيث تأخذ هذه الميثود ثالثة باروميتراSetSocketOptionومن ثم نضيف التغير على وفي حالتنا UDP أو TCP أو Socket أو على IPv6 أو على IPلتحديد مستوى التغيير على

وفي Multicast Group إلى IP إذ ما نريده هو ضم IPهذه سوف نستخدم التغير على ة ويمكن االختيار بين إضافة عضويه الباروميتر الثاني نحدد نوع التغيير حيث نريد إضافة عضوي

AddMembership أو إلغاء عضوية DropMembershipوأخيرا نسند إليه الـ MulticastOption Objectوالذي قمنا بإنشائه و آما يلي :

:#C mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,mcastOption); VB.NET: Dim mcastOption As MulticastOption mcastOption = New MulticastOption(localIPAddr)

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

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

:#C

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

Page 105: Ip معلومات حول

105

VB.NET: Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse("225.100.0.1"), 5020) Dim data As Byte() = Encoding.ASCII.GetBytes(msg.Text) server.SendTo(data, iep) server.Close msg.Clear msg.Focus

لتخزين Memory Stream آإرسال صورة مثال البد من استخدام الـBinary Dataوإلرسال

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

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

VB.NET: Dim ms As MemoryStream = New MemoryStream PictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Dim arrImage As Byte() = ms.GetBuffer ms.Close Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse("225.100.0.1"), 5020) server.SendTo(arrImage, iep)

:a Multicast GroupFromData ng Receivi مجموعة من االستقبال -3

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

:list Boxالستقبال رسالة نصية وعرضها في :#C

UdpClient sock = new UdpClient(5020); sock.JoinMulticastGroup(IPAddress.Parse(“225.100.0.1”), 50); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); byte[] data = sock.Receive(ref iep); string stringData = Encoding.ASCII.GetString(data, 0, data.Length); listBox1.Items.Add(iep.Address.ToString() +" :_ "+stringData ); VB.NET: Dim sock As UdpClient = New UdpClient(5020) sock.JoinMulticastGroup(IPAddress.Parse("225.100.0.1"), 50) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0)

Page 106: Ip معلومات حول

106

Dim data As Byte() = sock.Receive(iep) Dim stringData As String = Encoding.ASCII.GetString(data, 0, data.Length) listBox1.Items.Add(iep.Address.ToString + " :_ " + stringData)

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

: وآما يليimage.FromStream Methodالـ :#C

UdpClient sock = new UdpClient(5020); sock.JoinMulticastGroup(IPAddress.Parse(“225.100.0.1”)); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); byte[] data = sock.Receive(ref iep); MemoryStream ms = new MemoryStream(data); pictureBox1.Image = Image.FromStream(ms); sock.Close(); VB.NET: Dim sock As UdpClient = New UdpClient(5020) sock.JoinMulticastGroup(IPAddress.Parse("225.100.0.1"), 50) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim data As Byte() = sock.Receive(iep) Dim stringData As String = Encoding.ASCII.GetString(data, 0, data.Length) listBox1.Items.Add(iep.Address.ToString + " :_ " + stringData)

: في برمجيات الشبكات Multicastingالـفي استخدام هامة مالحظات Multicasting لعملية إرسال الـNetwork Stream من المالحظ أننا ال نستطيع استخدام الـ-1

Multicasting وهو غير متاح في الـTCP Socket Connectionإذ يتطلب استخدامها وجود sendto عبر الـBinary Stream إلرسال memory Streamويستعاض عنها باستخدام الـ

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

.ة في حالة عدم اتصالك بالشبكMulticastingلذلك لن تستطيع تجربة أي من تطبيقات الـ آذلك ، بحيث يستقبل من جهات متعددة يمكن لكل جهاز أن ينضم إلى أآثر من مجموعة -3

.يستطيع اإلرسال إلى عدة مجموعات sendto Method عبر الـMulticasting Data في العادة تكون السعة المسموحة إلرسال الـ-4

Stream Reader & Writer والـBinary Reader & Writerمحدودة لذلك يمكنك استخدام الـ .. .إلرسال واالستقبال بدال منها

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

..التقيد بالعناوين المحددة وهو ما بينته سابقا

Page 107: Ip معلومات حول

107

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

يث يقوم المحاضر بإلقاء المحاضرة عن في هذا التطبيق سوف نفترض وجود غرفة صفية حبعد أمام طالبه إذ نريد هنا جعل الطالب يرون األستاذ وآما يستطيع األستاذ رؤية طالبه

آما يستطيع الطالب Power Point Slides إلى إمكانية عرض المحاضرة على الـةباإلضاف ... Text Chattingالتحدث مع األستاذ باستخدام

تقسيم نظام المؤتمرات إلى ثالثة أنظمة رئيسية وهي نظام مؤتمرات سوف نقوم هنا ب

في البداية سوف نقوم بعمل ، الفيديو ونظام مؤتمرات سطح المكتب ونظام المؤتمرات النصية : الشاشة الرئيسية للبرنامج و آما في الشكل التالي

1 - Duplex Multicast Video Conferencing SystemHalf/Full :

DirectX 9 الخارجية والتي تتعامل مع الـClasses مجموعة من الـMicrosoftوفرت لنا أو الصوت أو أي طرفية Scanner أو الـامباشرة حيث نستطيع استخدامها لتعامل مع الكامير

اللتقاط صورة Classes Direct Show Dot Netفي هذا التطبيق سوف نستخدم الأخرى و Multicast حيث نستطيع إرسالها الحقا إلى الـPicture boxها على الـ وعرضاعبر الكامير

Groupباستخدام الـ memory Streamوالـ Sendto method وهو ما بيناه سابقا ..

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

Page 108: Ip معلومات حول

108

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

using DShowNET; using DShowNET.Device;

VB.NET: imports DShowNET imports DShowNET.Device

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

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

Page 109: Ip معلومات حول

109

:#C DeviceSelector selector = new DeviceSelector( capDevices ); selector.ShowDialog( this ); dev = selector.SelectedDevice; VB.NET: Dim selector As DeviceSelector = New DeviceSelector(capDevices) selector.ShowDialog(Me) dev = selector.SelectedDevice

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

void OnCaptureDone() {

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

catch( Exception){} } VB.NET: Private Sub OnCaptureDone() Try Trace.WriteLine("!!DLG: OnCaptureDone") toolBarBtnGrab.Enabled = True Dim hr As Integer If sampGrabber Is Nothing Then Return End If hr = sampGrabber.SetCallback(Nothing, 0) Dim w As Integer = videoInfoHeader.BmiHeader.Width Dim h As Integer = videoInfoHeader.BmiHeader.Height

Page 110: Ip معلومات حول

110

If ((w And &H3) <> 0) OrElse (w < 32) OrElse (w > 4096) OrElse (h < 32) OrElse (h > 4096) Then Return End If Dim stride As Integer = w * 3 Dim handle As GCHandle = GCHandle.Alloc(savedArray, GCHandleType.Pinned) Dim scan0 As Integer = CInt(handle.AddrOfPinnedObject()) scan0 += (h - 1) * stride Dim b As Bitmap = New Bitmap(w, h, -stride, PixelFormat.Format24bppRgb, New IntPtr(scan0)) handle.Free() savedArray = Nothing Dim old As Image = pictureBox.Image pictureBox.Image = b If Not old Is Nothing Then old.Dispose() End If toolBarBtnSave.Enabled = True Catch e1 As Exception End Try End Sub

: وإضافة الكود التالي فيه الستمرار عملية التقاط الصورةTimerثم عمل :#C

int hr; int size = videoInfoHeader.BmiHeader.ImageSize; savedArray = new byte[ size + 64000 ]; VB.NET: Dim hr As Integer Dim size As Integer = videoInfoHeader.BmiHeader.ImageSize savedArray = New Byte(size + 64000) {}

Timer إرسال الصورة ونضعه في methodوإلرسال الصورة إلى الطرف األخر سوف نستخدم

:وآما يلي:#C

try { MemoryStream ms = new MemoryStream(); pictureBox.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg); byte[] arrImage = ms.GetBuffer(); ms.Close(); Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text), 5020); server.SendTo(arrImage, iep); server.Close();} catch (Exception){}

Page 111: Ip معلومات حول

111

VB.NET: Try Dim ms As MemoryStream = New MemoryStream pictureBox.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Dim arrImage As Byte() = ms.GetBuffer ms.Close Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse(textBox1.Text), 5020) server.SendTo(arrImage, iep) server.Close Catch generatedExceptionVariable0 As Exception End Try

ما سوف يتمكن من رؤية إلى طالبه آاوهنا يستطيع المحاضر إرسال الصورة عبر الكامير وسوف نفترض هنا استخدامه لشبكة ال سلكية حيث سيرسل البيانات اطالبه عبر الكامير

توزيع البيانات إلى Access Point وسوف يتوال الـUnicast بأسلوب الـAccess Pointإلى الـ Broadcast ويرسلها لهم باستخدام الـMulticast Groupجميع األعضاء المنضمين إلى الـ

:وآما في الشكل التالي

وآما نالحظ في الشكل السابق فإن المحاضر ينضم إلى مجموعتين مجموعة األساتذة وهي والتي 224.100.0.1ومجموعة الطالب ، حيث سيستقبل صورة طالبه عليها225.100.1.1

Access Point1وآما نالحظ ايضا فإن عملية اإلرسال بين الـ.. سوف يرسل الصورة إليها ... Unicast تتم باستخدام الـAccess Point2والـ

Page 112: Ip معلومات حول

112

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

: جديد آما في الشكل التاليNew Formقم بعمل

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

:#C using System.Net.Sockets ; using System.Net; using System.IO; using System.Threading;

VB.NET: imports System.Net.Sockets imports System.Net imports System.IO imports System.Threading

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

void Image_Receiver() { UdpClient sock = new UdpClient(5020); sock.JoinMulticastGroup(IPAddress.Parse(textBox1.Text)); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); byte[] data = sock.Receive(ref iep);

Page 113: Ip معلومات حول

113

MemoryStream ms = new MemoryStream(data); pictureBox1.Image = Image.FromStream(ms); sock.Close(); } VB.NET: Sub Image_Receiver() Dim sock As UdpClient = New UdpClient(5020) sock.JoinMulticastGroup(IPAddress.Parse(textBox1.Text)) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim data As Byte() = sock.Receive(iep) Dim ms As MemoryStream = New MemoryStream(data) pictureBox1.Image = Image.FromStream(ms) sock.Close() End Sub

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

:Threadingالـ :#C

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

myth.Start (); VB.NET: Dim myth As Thread myth = New Thread(New System.Threading.ThreadStart(Image_Receiver)) myth.Start

قم JPEG Image File على هيئة اوحتى تتمكن من تخزين الصورة الملتقطة عبر الكامير

: واستدعيه آما يليsaveFileDialogبإنشاء

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

{

string mypic_path = saveFileDialog1.FileName; pictureBox1.Image.Save(mypic_path);

} } catch (Exception){}

Page 114: Ip معلومات حول

114

VB.NET: Try saveFileDialog1.Filter = "JPEG Image (*.jpg)|*.jpg" If saveFileDialog1.ShowDialog = DialogResult.OK Then Dim mypic_path As String = saveFileDialog1.FileName pictureBox1.Image.Save(mypic_path) End If Catch generatedExceptionVariable0 As Exception End Try

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

...مؤتمرات سطح المكتب 2 - Half Duplex Multicast Desktop Conferencing System/Full:

Powerوع هو تمكين األستاذ من عرض المحاضرة باستخدام برنامج الـالهدف من هذا المشرPoint وال تختلف ، حيث سترسل صورة سطح المكتب من جهاز األستاذ إلى أجهزة الطلبة

لتقوم بالتقاط صورة Classesعملية اإلرسال عن البرنامج السابق في شيء سوى إنشاء ومن ثم استقبالها وعرضها على Multicast Groupسطح المكتب ومن ثم إرسالها إلى الـ

...Data Show Projectorالطالب باستخدام

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

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

الآن البد من إنشاء مجموعة جديدة لعملية اإلرسال Full || Half Duplex نجعلها باتجاهي

Page 115: Ip معلومات حول

115

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

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

:التالي

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

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

:#C using System; using System.Runtime.InteropServices; namespace SampleGrabberNET {

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

public class PlatformInvokeGDI32 {

#region Class Variables

public const int SRCCOPY = 13369376; #endregion

#region Class Functions

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

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

[DllImport("gdi32.dll",EntryPoint="BitBlt")]

public static extern bool BitBlt(IntPtr hdcDest,int xDest,int yDest,int wDest,int hDest,IntPtr hdcSource,int xSrc,int ySrc,int RasterOp);

[DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")]

Page 116: Ip معلومات حول

116

public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);

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

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

#endregion

#region Public Constructor public PlatformInvokeGDI32()

{ }

#endregion }}

:NET.VB

Imports System Imports System.Runtime.InteropServices Namespace SampleGrabberNET 'This class shall keep the GDI32 APIs being used in our program. Public Class PlatformInvokeGDI32 #Region "Class Variables" Public Const SRCCOPY As Integer = 13369376 #End Region #Region "Class Functions" <DllImport("gdi32.dll", EntryPoint:="DeleteDC")> _ Public Shared Function DeleteDC(ByVal hDc As IntPtr) As IntPtr End Function <DllImport("gdi32.dll", EntryPoint:="DeleteObject")> _ Public Shared Function DeleteObject(ByVal hDc As IntPtr) As IntPtr End Function <DllImport("gdi32.dll", EntryPoint:="BitBlt")> _ Public Shared Function BitBlt(ByVal hdcDest As IntPtr, ByVal xDest As Integer, ByVal yDest As Integer, ByVal wDest As Integer, ByVal hDest As Integer, ByVal hdcSource As IntPtr, ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal RasterOp As Integer) As Boolean End Function <DllImport("gdi32.dll", EntryPoint:="CreateCompatibleBitmap")> _ Public Shared Function CreateCompatibleBitmap(ByVal hdc As IntPtr, ByVal nWidth As Integer, ByVal nHeight As Integer) As IntPtr End Function <DllImport("gdi32.dll", EntryPoint:="CreateCompatibleDC")> _ Public Shared Function CreateCompatibleDC(ByVal hdc As IntPtr) As IntPtr End Function

Page 117: Ip معلومات حول

117

<DllImport("gdi32.dll", EntryPoint:="SelectObject")> _ Public Shared Function SelectObject(ByVal hdc As IntPtr, ByVal bmp As IntPtr) As IntPtr End Function #End Region #Region "Public Constructor" Public Sub New() End Sub #End Region End Class End Namespace

السابق اللتقاط صورة Class إذ سوف نستخدمها مع الـPlatformInvokeUSER32.csثانيا

:user32 APIسطح المكتب باستخدام الـ:#C

using System; using System.Runtime.InteropServices; namespace SampleGrabberNET { // This class shall keep the User32 APIs being used in our program. public class PlatformInvokeUSER32 { #region Class Variables public const int SM_CXSCREEN=0; public const int SM_CYSCREEN=1; #endregion #region Class Functions [DllImport("user32.dll", EntryPoint="GetDesktopWindow")] public static extern IntPtr GetDesktopWindow(); [DllImport("user32.dll",EntryPoint="GetDC")] public static extern IntPtr GetDC(IntPtr ptr); [DllImport("user32.dll",EntryPoint="GetSystemMetrics")] public static extern int GetSystemMetrics(int abc); [DllImport("user32.dll",EntryPoint="GetWindowDC")] public static extern IntPtr GetWindowDC(Int32 ptr); [DllImport("user32.dll",EntryPoint="ReleaseDC")]

public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc); #endregion #region Public Constructor public PlatformInvokeUSER32()

Page 118: Ip معلومات حول

118

{ } #endregion } //This structure shall be used to keep the size of the screen. public struct SIZE { public int cx; public int cy; } } VB.NET: Imports System Imports System.Runtime.InteropServices Namespace SampleGrabberNET ' This class shall keep the User32 APIs being used in our program. Public Class PlatformInvokeUSER32 #Region "Class Variables" Public Const SM_CXSCREEN As Integer = 0 Public Const SM_CYSCREEN As Integer = 1 #End Region #Region "Class Functions" <DllImport("user32.dll", EntryPoint:="GetDesktopWindow")> _ Public Shared Function GetDesktopWindow() As IntPtr End Function <DllImport("user32.dll", EntryPoint:="GetDC")> _ Public Shared Function GetDC(ByVal ptr As IntPtr) As IntPtr End Function <DllImport("user32.dll", EntryPoint:="GetSystemMetrics")> _ Public Shared Function GetSystemMetrics(ByVal abc As Integer) As Integer End Function <DllImport("user32.dll", EntryPoint:="GetWindowDC")> _ Public Shared Function GetWindowDC(ByVal ptr As Int32) As IntPtr End Function <DllImport("user32.dll", EntryPoint:="ReleaseDC")> _ Public Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDc As IntPtr) As IntPtr End Function #End Region #Region "Public Constructor" Public Sub New() End Sub #End Region End Class

Page 119: Ip معلومات حول

119

'This structure shall be used to keep the size of the screen. Public Structure SIZE Public cx As Integer Public cy As Integer End Structure End Namespace

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

:#C using System; using System.Drawing; namespace SampleGrabberNET { //This class shall keep all the functionality for capturing the desktop. public class CaptureScreen { #region Public Class Functions public static Bitmap GetDesktopImage() { //In size variable we shall keep the size of the screen. SIZE size; //Variable to keep the handle to bitmap. IntPtr hBitmap; //Here we get the handle to the desktop device context. IntPtr hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow()); //Here we make a compatible device context in memory for screen device context. IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC); //We pass SM_CXSCREEN constant to GetSystemMetrics to get the X coordinates of screen. size.cx=PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN); //We pass SM_CYSCREEN constant to GetSystemMetrics to get the Y coordinates of screen. size.cy=PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CYSCREEN); //We create a compatible bitmap of screen size using screen device context. hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy); //As hBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used. if (hBitmap!=IntPtr.Zero) { //Here we select the compatible bitmap in memory device context and keeps the reference to Old bitmap. IntPtr hOld = (IntPtr) PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap); //We copy the Bitmap to the memory device context.

Page 120: Ip معلومات حول

120

PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY); //We select the old bitmap back to the memory device context. PlatformInvokeGDI32.SelectObject(hMemDC, hOld); //We delete the memory device context. PlatformInvokeGDI32.DeleteDC(hMemDC); //We release the screen device context. PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC);//Image is created by Image bitmap handle and stored in local variable. Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap); //Release the memory to avoid memory leaks. PlatformInvokeGDI32.DeleteObject(hBitmap); //This statement runs the garbage collector manually. GC.Collect();//Return the bitmap return bmp; }//If hBitmap is null return null. return null; } #endregion } } VB.NET: Imports System Imports System.Drawing Namespace SampleGrabberNET 'This class shall keep all the functionality for capturing the desktop. Public Class CaptureScreen #Region "Public Class Functions" Public Shared Function GetDesktopImage() As Bitmap 'In size variable we shall keep the size of the screen. Dim size As Size 'Variable to keep the handle to bitmap. Dim hBitmap As IntPtr 'Here we get the handle to the desktop device context. Dim hDC As IntPtr = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow()) 'Here we make a compatible device context in memory for screen device context. Dim hMemDC As IntPtr = PlatformInvokeGDI32.CreateCompatibleDC(hDC) 'We pass SM_CXSCREEN constant to GetSystemMetrics to get the X coordinates of screen. size.cx = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SMCXSCREEN) _ 'We pass SM_CYSCREEN constant to GetSystemMetrics to get the Y coordinates of screen. size.cy = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SMCYSCREEN) _

Page 121: Ip معلومات حول

121

'We create a compatible bitmap of screen size using screen device context. hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy) 'As hBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used. If Not hBitmap.Equals(IntPtr.Zero) Then 'Here we select the compatible bitmap in memory device context and keeps the reference to Old bitmap. Dim hOld As IntPtr = CType(PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap), IntPtr) 'We copy the Bitmap to the memory device context. PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY) 'We select the old bitmap back to the memory device context. PlatformInvokeGDI32.SelectObject(hMemDC, hOld) 'We delete the memory device context. PlatformInvokeGDI32.DeleteDC(hMemDC) 'We release the screen device context. PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC) 'Image is created by Image bitmap handle and stored in local variable. Dim bmp As Bitmap = System.Drawing.Image.FromHbitmap(hBitmap) 'Release the memory to avoid memory leaks. PlatformInvokeGDI32.DeleteObject(hBitmap) 'This statement runs the garbage collector manually. GC.Collect() 'Return the bitmap Return bmp End If 'If hBitmap is null return null. Return Nothing End Function #End Region End Class End Namespace

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

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

VB.NET: Public Function ResizeBitmap(ByVal b As Bitmap, ByVal nWidth As Integer, ByVal nHeight As Integer) As Bitmap Dim result As Bitmap = New Bitmap(nWidth, nHeight) ' Using

Page 122: Ip معلومات حول

122

Dim g As Graphics = Graphics.FromImage(CType(result, Image)) Try g.DrawImage(b, 0, 0, nWidth, nHeight) Finally CType(g, IDisposable).Dispose() End Try Return result End Function

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

:#C using System.Net; using System.Net.Sockets; using System.IO;

VB.NET: imports System.Net imports System.Net.Sockets imports System.IO

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

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

VB.NET: Dim bt As Bitmap = New Bitmap(CaptureScreen.GetDesktopImage) picScreen.Image = ResizeBitmap(bt, 600, 400) Dim ms As MemoryStream = New MemoryStream picScreen.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Dim arrImage As Byte() = ms.GetBuffer ms.Close Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse(textBox1.Text), 5020) server.SendTo(arrImage, iep) server.Close

Page 123: Ip معلومات حول

123

3 - Conferencing SystemTextlex Multicast DupHalf /Full:

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

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

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

VB.NET: imports System.Net imports System.Net.Sockets imports System.Text imports System.Threading

التالية إلجراء عملية اإلرسال حيث سترسل الرسالة عند الضغط methodسوف نستخدم الـ

: المخصص Textbox بعد آتابة الرسالة في الـEnterعلى الـ

:#C private void msg_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) {if(e.KeyChar == '\r'){ try{

Page 124: Ip معلومات حول

124

Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(txt_host.Text), 5020); byte[] data = Encoding.ASCII.GetBytes(msg.Text); server.SendTo(data, iep); server.Close(); msg.Clear(); msg.Focus(); } catch(Exception){}}}

VB.NET: Private Sub msg_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) If e.KeyChar = Microsoft.VisualBasic.Chr(13) Then Try Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse(txt_host.Text), 5020) Dim data As Byte() = Encoding.ASCII.GetBytes(msg.Text) server.SendTo(data, iep) server.Close() msg.Clear() msg.Focus() Catch generatedExceptionVariable0 As Exception End Try End If End Sub

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

list Boxمخصص :

:#C public void server() { try { UdpClient sock = new UdpClient(5020); sock.JoinMulticastGroup(IPAddress.Parse(txt_host.Text), 50); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); byte[] data = sock.Receive(ref iep); string stringData = Encoding.ASCII.GetString(data, 0, data.Length); listBox1.Items.Add(iep.Address.ToString() +" :_ "+stringData ); sock.Close(); listBox1.Focus(); msg.Focus(); myth.Abort(); }catch(Exception){} }

Page 125: Ip معلومات حول

125

VB.NET: Public Sub server() Try Dim sock As UdpClient = New UdpClient(5020) sock.JoinMulticastGroup(IPAddress.Parse(txt_host.Text), 50) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim data As Byte() = sock.Receive(iep) Dim stringData As String = Encoding.ASCII.GetString(data, 0, data.Length) listBox1.Items.Add(iep.Address.ToString + " :_ " + stringData) sock.Close() listBox1.Focus() msg.Focus() myth.Abort() Catch generatedExceptionVariable0 As Exception End Try End Sub

method واستدعي فيه الـTimerقم بعمل ، Threadingوالستدعائها البد من استخدام الـ : وآما يليThreadالسابقة باستخدام الـ

:#C

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

VB.NET: Dim myth As Thread myth = New Thread(New System.Threading.ThreadStart(server)) myth.Start

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

:#C timer1.Enabled = false; txt_host.ReadOnly = false; msg.Enabled=false; try { Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(txt_host.Text), 5020); byte[] data = Encoding.ASCII.GetBytes("has Left the Room"); server.SendTo(data, iep); server.Close(); msg.Clear(); msg.Focus(); } catch(Exception){}

Page 126: Ip معلومات حول

126

VB.NET: timer1.Enabled = False txt_host.ReadOnly = False msg.Enabled = False Try Dim server As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse(txt_host.Text), 5020) Dim data As Byte() = Encoding.ASCII.GetBytes("has Left the Room") server.SendTo(data, iep) server.Close msg.Clear msg.Focus Catch generatedExceptionVariable0 As Exception End Try

في Multicast Conference Systemsقمنا بهذا الفصل بتعرف على آيفية عمل

. وغيره Video Conference Systemوطرق إنشاء الـ بيئة الدوت نيت

Voice Over IP Programmingسيتم الحديث في الفصل التالي عن الـ API’sلـ باستخدام اVoice Conference System و Voice Chatواستخدامه لعمل

. في بيئة الدوت نيتDirect Play 9والـ

Page 127: Ip معلومات حول

127

FADI Abdel-qader Dot Net Networks & TCP/IP Programming

Chapter 10 Voice Over IP Programming

- The Concept & Requirements of Voice Communication Systems

- How to Create a Voice Chat Throw Dot Net Using Unmanaged API’s Functions

- Testing UDP Multicasting, TCP and Thinking in SCTP to Transfer Voice Throw Networks

- How to Create a Voice Conference System Using Microsoft Direct Play 9

Page 128: Ip معلومات حول

128

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

10 Voice Over IP Programming:

بتحويل الصوت إلى IPتتلخص الفكرة األساسية من نقل الصوت عبر بروتوآول اإلنترنت Datagram Packets ثم آبسلته ليتم نقله ك Byte Array تجمع في Bitsمجموعة من الـ

مرة أخرى في Packetsولالستقبال الصوت في الطرف األخر يتم تجميع ال ، عبر الشبكة أي القادم FIFO – First In First Outوتتم عملية القراءة وفق مبدأ الـ ، Byte Arrayمصفوفة

...أوال يعرض أوال

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

Dot Net من العزوف عن دعم الـ Microsoft من أهم ما دعا Transport Layerبروتوآوالت ال ومن المعروف أن نظام التشغيل ، لعملية نقل الصوت وخاصة في بيئة النظام الحالي

Windows XP يدعم االتصال باستخدام بروتوآول TCP أو UDP فقط وهذا يعني انك إذا آنت فإن أي عملية اتصال لن تكون إال باستخدام Windows XPتعمل تحت منصة نظام التشغيل

... واحد من هذه البروتوآوالت

The Requirements of Voice Communication Systems: أوال سوف نناقش في هذا الجزء متطلبات نقل الصوت عبر الشبكة ومشاآل نقل الصوت

...UDP و الـ TCPباستخدام بروتوآول الـ : متطلبات نقل الصوت المثلى –

Stream أسلوب النقل - 1 Delivered on Sequence البروتوآول المستخدم لنقل الصوت يجب أن يدعم – 2 Voice Compression تعتمد سرعة النقل على مدى حجم الضغط المستخدم – 3

بمعدل ال يقل KB\S 31لة أن ال تقل سرعة النقل عن والجودة المطلوبة ويفضل في هذه الحا . آحد أدنى لجودة الصوتKHz 8.000عن

هذه األمور ؟UDP والـ TCPهل وفر بروتوآول الـ ، السؤال الذي يطرح نفسه اآلن -

آل هذه األمور وبكفاءة عالية الآن المشكلة TCPيدعم بروتوآول ال : TCPأوال بروتوآول ال في هذا البروتوآول هو عدم إمكانية استخدامه لعملالوحيدة

Conference System Multicast إذ انه من المعروف أن ال Multicasting وال Broadcasting بينته في أي من هذه األمور وهو ماTCP وال يدعم ال UDPمن األمور الخاصة ببروتوآول ال

يمكن االعتماد لذلك الOriented Protocolه بروتوآول موجTCPإذ يعتر الـ ، الفصل السابق أو في حالة البث اإلذاعي Multicast Conference Systemعليه في حالة حاجتنا لعمل

Broadcasting .. إذا الحل األخر والوحيد هو بروتوآول الـUDPفي حالة حاجتنا لهذه األمور .

العالية بالكفاءةل جيد لعملية نقل الصوت يعتبر هذا البروتوآول ح ال : UDPثانيا بروتوآول ال وهو ما سبب من استحالة عمل Delivered on Sequenceإذ أنه ال يدعم عملية

Fragmented للـ Packets المرسل ومن المعروف أن حجم Ethernet Encapsulation ال يزيد الخاص Datagram Encapsulation الواحد وهو الحجم األقصى للـ Packet ـ للKB 1500عن لصوت فإننا لن نضمن وصول الصوت Fragmented لذلك في حالة قمنا بعمل Ethernetبالـ

Fragmentsوفق الترتيب المرسل وهو ما يسبب مشكلة آبيرة في عملية إعادة ترتيب الـ المرسل ومن هذه النقطة قدمت الكثير من الشرآات والمنظمات العالمية حلول خاصة

ITU- International Telecommunications منها منظمة الـ UDPصوت عبر ال لعملية نقل الUnion بتقديمها أسلوب النقل H.323 ومنظمة IETF Internet Engineering Task Force

حيث أضاف هذا المعيار ، RTP – Real Time Transport Protocolبتقديمها أسلوب النقل ية نقل الصوت في الزمن الحقيقي إذ يستخدم لعملUDPتحسينات على بروتوآول ال

وقد حل هذا المعيار بعض UDP الآن تحت منصة ال TCP المستخدم في Streamأسلوب ال

Page 129: Ip معلومات حول

129

إذ أن الحاجة أصبحت ملحة لوجود بروتوآول يدعم عملية ، هذه المشاآل الآن ليس جميعها Streamدعم االتصال ك باإلضافة إلى Delivered on Sequenceالنقل وفق الترتيب الصحيح

SCTPوآان الحل بإنشاء بروتوآول أخر وهو الـ ، Broadcasting وال IP Multicasting ـودعم لل– Stream Control Transmission Protocol الآن المشكلة أن منصة Windows ال تدعم هذا

Microsoftآما وعدت ، Linuxالبروتوآول وقد تم دعمه بشكل آامل في نظام التشغيل والذي سآتي على Windowsبدعم هذا البروتوآول في اإلصدار التالي من نظام التشغيل

.شرحه في الجزء التالي من هذا الفصل

:The Concept Of Voice Communication :ثانيا

تمر عملية التقاط الصوت بمجموعة من المراحل تبدأ بالتقاط الصوت من المايكروفون وتمثيل لذبذبات Sampling وذلك بعمل Bitsات الصوتية ثم تحويلها إلى مجموعة من الـ الذبذب

الصوتية الملتقطة وبعد هذه العملية يمكننا نقل الصوت عبر الشبكة وتمر عملية نقل الصوت :عبر الشبكة بمجموعة من المراحل وهي

، وهو ما ذآرته سابقا Bitsطريقة التقاط الصوت وتحويله إلى ، Application Layer في الـ -1

وحتى يمكن إرساله عبر Audio Compression Teachingsو استخدام تقنيات لضغط الصوت .اإلمكانيات المحدودة لشبكة االتصال

وهو من أهم األمور التي يجب أخذها بعين االعتبار إذ أن ، Transport Layer في الـ -2

تعتمد على مدى الحاجة التي نريدها ودقة TCPو الـ أUDPالمفاضلة بين اختيار بروتوآول الـ الآن Streamالصوت من جهة أخرى إذ أن أفضل طريقة لنقل الصوت هي استخدام تقنيات الـ

آونه ال يدعم التوصيل Stream ال يدعم عملية النقل ك UDPمن المعروف أن بروتوآول الـلحالة لن نتمكن من عمل الـ إذ أننا في هذه اDelivered on Sequenceوفق الترتيب

Fragmentation للـ Buffer حيث لن نضمن وصول الـ Fragments وفق الترتيب الذي أرسل للـ KB 1500 وهي Packet للـ Ethernetعليه وسوف نضطر إلى التقيد بمحدوديات الـ

Packet الواحد ولحل هذه المشكلة سوف نلجأ إلى تبني بعض التقنيات الجديدة والتي H.323 ومنها أسلوب النقل Stream وحتى يتم نقل الصوت ك UDPتعتمد على بروتوآول الـ

لذلك عندما نريد نقل ، الآن لم تدعم الدوت نيت أي من هذه التقنيات ، والذي ذآرته سابقا الآن آما ذآرنا TCP البد لنا من استخدام بروتوآول الـ Streamصوت من جهاز إلى آخر ك

Broadcasting و الـ IP Multicasting يدعم الـ سابقا فإنه ال فإننا سوف UDP وإذا ما قررنا اعتماد الـ Packets يتم عنونة الـ Network Layer في الـ -3

Multicasting ومجموعات البث Broadcastingنتمكن من عمل البث اإلذاعي أو Ethernet باستخدام الـ سيتم تحديد طبيعة وإلرسال سواءData Link Layer في الـ -4

الآن مشكلته آما ذآرتها سابقا Ethernetغيره وفي هذه الحالة سيتم االعتماد على الـ KB 1500 إذ ال تتجاوز الـ Frameبمحدودية حجم الـ

طبعا المشاآل التي قد تحدث إثناء عملية النقل آثيرة جدا وقد Physical Layer في الـ -5

إثناء اإلرسال لذلك البد من وجود Bits لسبب أو آلخر أو قد تضيع بعض الـ Delayيحدث تأخير .بروتوآوالت تدعم التصحيح لكل هذه المشاآل والتي قد تحدث إثناء عملية اإلرسال

Data Link Layer وتمر عبر الـ Physical Layer من طبقة الـ Bitsيستقبل الطرف المقابل الـ

قد يكون هو Packets وفي إثناء هذه المرحلة فإن مستقبل الـ Network Layerومن ثم الـ أو قد يكون جزء من مجموعة Unicastالشخص المعني في حالة آان أسلوب البث

لذلك Broadcast أو قد يكون من ضمن الشبكة التي تم اإلرسال لها ك Multicastاالستقبال عنية بالجهة التي سوف تستقبل الـ في حالة آونه جزء من مجموعة فإن جهة اإلرسال غير م

Packets وفي هذه الحالة فإنه غير معني سواء استقبلت جزء من الـ Packets أو آلها حيث إلى المرسل لذلك قد تحدث الكثير من المشاآل إثناء Acknowledgmentلن يتم إرسال أي

صول الصوت المرسل والذي سوف يسبب وPacketsهذه المرحلة منها ضياع جزء من الـ

Page 130: Ip معلومات حول

130

وطبعا سوف يكون االعتماد في هذه الحالة على بروتوآوالت الطبقة األعلى ، بشكل متقطع فإن آل هذه TCP فإذا آان المرسل والمستقبل يستخدم الـ Transport Layerوهي هنا

حيث ال يوجد حل إال UDPالمشاآل سوف تحل الآن المشكلة تكمن في آونه يستخدم الـ بترتيب الذي أرسل عليه وبدون ضياع Packetsساند يضمن وصول آافة الـ بإتباع معيار م . المرسلPacketsأجزاء من الـ

Ethernet إثناء اإلرسال باستخدام شبكة Packetsالشكل التالي يوضح عملية ضياع بعض الـ

Wireless LAN و IP Multicasting UDPمما سوف يسبب تقطيع في الصوت :

How to Create a Voice Chat Throw Dot Net Using Unmanaged API’s: الثاث

Functions:

الآن إلجراء ، آما قلنا سابقا فإن الدوت نيت لم تدعم أي من عمليات التقاط وعرض الصوت والتي تأتي مع نظام التشغيل DLLهذه العمليات البد من استخدام مجموعة ملفات الـ

في نظام Multimediaوالخاص بالتعامل مع وسائل الـ ، الشهير winmm.dllومنها ملف اللتقاط الصوت عبر المايكروفون Methodsحيث يدعم هذا الملف مجموعة من الـ ، التشغيل

: هي Method وهذه الـ أخرى ومن ثم عرضه مرة Byte Array Bufferوتخزينه في

waveInGetNumDevsدد أجهزة اإلدخال والمربوطة مع الـ والتي تستخدم لتحديد عSound Cardوال تأخذ أي باروميترات .

waveInAddBufferوتستخدم لتخزين الـ Bits الواردة من جهاز اإلدخال في Byte Array

Bufferوتأخذ هذه الـ Methodثالثة باروميترات وهي :

waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, int cbwh)

لموقع تخزين Referenceيث يمرر لألول جهاز اإلدخال والذي تم اختياره و يحدد في الثاني ح المستلمBuffer وفي الثالث يحدد حجم الـ Bufferالـ

. لفتح وإغالق االتصال مع جهاز اإلدخالwaveInOpen و waveInCloseالـميثود وتأخذ نفس الباروميترات الموجودة Buffer لتجهيز وحجز الـ waveInPrepareHeaderالميثود

.waveInAddBufferفي حتى يتم إرسال الـ Buffer ويتم استدعائها بعد تعبئة الـ waveInUnprepareHeaderالميثود Bufferومن ثم تفريغه لالستعداد لتعبئته مرة أخرى .

إلى صفرBuffer الخاص بالـ Pointer إلرجاع مؤشر الـwaveInResetالميثود . بدأ وإغالق عملية اإلدخال من المايكروفونwaveInStop و الميثود waveInStartلميثود ا

Page 131: Ip معلومات حول

131

: وآما يليDllImportوالستخدام هذه الميثود في الدوت نيت نقوم بتعريفها أوال باستخدام C#: [DllImport(winmm.dll)] public static extern int waveInGetNumDevs(); [DllImport(winmm.dll)] public static extern int waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, int cbwh); [DllImport(winmm.dll)] public static extern int waveInClose(IntPtr hwi); [DllImport(winmm.dll)] public static extern int waveInOpen(out IntPtr phwi, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags); [DllImport(winmm.dll)] public static extern int waveInPrepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize); [DllImport(winmm.dll)] public static extern int waveInUnprepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize); [DllImport(winmm.dll)] public static extern int waveInReset(IntPtr hwi); [DllImport(winmm.dll)] public static extern int waveInStart(IntPtr hwi); [DllImport(winmm.dll)] public static extern int waveInStop(IntPtr hwi); VB.NET <DllImport(winmm.dll)> _ Public Shared Function waveInGetNumDevs() As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveInAddBuffer(ByVal hwi As IntPtr, ByRef pwh As WaveHdr, ByVal cbwh As Integer) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveInClose(ByVal hwi As IntPtr) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveInOpen(<System.Runtime.InteropServices.Out()> ByRef phwi As IntPtr, ByVal uDeviceID As Integer, ByVal lpFormat As WaveFormat, ByVal dwCallback As WaveDelegate, ByVal dwInstance As Integer, ByVal dwFlags As Integer) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveInPrepareHeader(ByVal hWaveIn As IntPtr, ByRef lpWaveInHdr As WaveHdr, ByVal uSize As Integer) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveInUnprepareHeader(ByVal hWaveIn As IntPtr, ByRef lpWaveInHdr As WaveHdr, ByVal uSize As Integer) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveInReset(ByVal hwi As IntPtr) As Integer

Page 132: Ip معلومات حول

132

End Function <DllImport(winmm.dll)> _ Public Shared Function waveInStart(ByVal hwi As IntPtr) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveInStop(ByVal hwi As IntPtr) As Integer End Function

إلى صوت Byte Array Buffer التالية لتحويل الـ Methodsوآما سوف نستخدم مجموعة الـ :مرة أخرى وعرضه على جهاز اإلخراج

C#: [DllImport(winmm.dll)] public static extern int waveOutGetNumDevs(); [DllImport(winmm.dll)] public static extern int waveOutPrepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize); [DllImport(winmm.dll)] public static extern int waveOutUnprepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize); [DllImport(winmm.dll)] public static extern int waveOutWrite(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize); [DllImport(winmm.dll)] public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags); [DllImport(winmm.dll)] public static extern int waveOutReset(IntPtr hWaveOut); [DllImport(mmdll)] public static extern int waveOutClose(IntPtr hWaveOut); [DllImport(mmdll)] public static extern int waveOutPause(IntPtr hWaveOut); [DllImport(mmdll)] public static extern int waveOutRestart(IntPtr hWaveOut); [DllImport(mmdll)] public static extern int waveOutGetPosition(IntPtr hWaveOut, out int lpInfo, int uSize); [DllImport(mmdll)] public static extern int waveOutSetVolume(IntPtr hWaveOut, int dwVolume); [DllImport(mmdll)] public static extern int waveOutGetVolume(IntPtr hWaveOut, out int dwVolume);

VB.NET <DllImport(winmm.dll)> _ Public Shared Function waveOutGetNumDevs() As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveOutPrepareHeader(ByVal hWaveOut As IntPtr, ByRef lpWaveOutHdr As WaveHdr, ByVal uSize As Integer) As Integer End Function <DllImport(winmm.dll)> _

Page 133: Ip معلومات حول

133

Public Shared Function waveOutUnprepareHeader(ByVal hWaveOut As IntPtr, ByRef lpWaveOutHdr As WaveHdr, ByVal uSize As Integer) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveOutWrite(ByVal hWaveOut As IntPtr, ByRef lpWaveOutHdr As WaveHdr, ByVal uSize As Integer) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveOutOpen(<System.Runtime.InteropServices.Out()> ByRef hWaveOut As IntPtr, ByVal uDeviceID As Integer, ByVal lpFormat As WaveFormat, ByVal dwCallback As WaveDelegate, ByVal dwInstance As Integer, ByVal dwFlags As Integer) As Integer End Function <DllImport(winmm.dll)> _ Public Shared Function waveOutReset(ByVal hWaveOut As IntPtr) As Integer End Function <DllImport(mmdll)> _ Public Shared Function waveOutClose(ByVal hWaveOut As IntPtr) As Integer End Function <DllImport(mmdll)> _ Public Shared Function waveOutPause(ByVal hWaveOut As IntPtr) As Integer End Function <DllImport(mmdll)> _ Public Shared Function waveOutRestart(ByVal hWaveOut As IntPtr) As Integer End Function <DllImport(mmdll)> _ Public Shared Function waveOutGetPosition(ByVal hWaveOut As IntPtr, <System.Runtime.InteropServices.Out()> ByRef lpInfo As Integer, ByVal uSize As Integer) As Integer End Function <DllImport(mmdll)> _ Public Shared Function waveOutSetVolume(ByVal hWaveOut As IntPtr, ByVal dwVolume As Integer) As Integer End Function <DllImport(mmdll)> _ Public Shared Function waveOutGetVolume(ByVal hWaveOut As IntPtr, <System.Runtime.InteropServices.Out()> ByRef dwVolume As Integer) As Integer End Function

: نستخدم التعريف التاليBufferوحتى نتمكن من عرض محتويات الـ

C#: using System; using System.Runtime.InteropServices; using System.Resources; using System.IO; public class Winmm { public const UInt32 SND_ASYNC = 1; public const UInt32 SND_MEMORY = 4;

Page 134: Ip معلومات حول

134

[DllImport("Winmm.dll")] public static extern bool PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags); public Winmm() {} public static void PlayWavResource(byte[] buffer) { PlaySound(buffer, IntPtr.Zero, SND_ASYNC | SND_MEMORY); } }

VB.NET Imports System Imports System.Runtime.InteropServices Imports System.Resources Imports System.IO Public Class Winmm Public Const SND_ASYNC As UInt32 = System.Convert.ToUInt32(1) Public Const SND_MEMORY As UInt32 = System.Convert.ToUInt32(4) <DllImport("Winmm.dll")> _ Public Shared Function PlaySound(ByVal data As Byte(), ByVal hMod As IntPtr, ByVal dwFlags As UInt32) As Boolean End Function Public Sub New() End Sub Public Shared Sub PlayWavResource(ByVal buffer As Byte()) PlaySound(buffer, IntPtr.Zero, SND_ASYNC Or SND_MEMORY) End Sub End Class

االستقبال Method والمستلم من Byte Buffer الـ PlaySound Methodحيث نمرر للـ

: وآما يليSocketالخاصة بالـ

C#: void Voice_Receiver() { UdpClient sock = new UdpClient(5020); sock.JoinMulticastGroup(IPAddress.Parse(multicast_IP.Text)); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); byte[] voice_Come = sock.Receive(ref iep); Winmm.PlayWavResource(voice_Come); sock.Close(); } VB.NET Private Sub Voice_Receiver() Dim sock As UdpClient = New UdpClient(5020) sock.JoinMulticastGroup(IPAddress.Parse(multicast_IP.Text))

Page 135: Ip معلومات حول

135

Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim voice_Come As Byte() = sock.Receive(iep) Winmm.PlayWavResource(voice_Come) sock.Close() End Sub

:Voice Chat Systemالبدء بإنشاء برنامج المحادثة الصوتية

ثم عرضه مرة أخرى في مجموعة Bufferسوف نجزئ عملية التقاط الصوت وتخزينه في الـ Microsoft وهو تقسيم تم استخدامه في الكثير من البرمجيات الخاصة ب Classesمن الـ

في ملف واحد Classesجمع هذه الـ وسوف نWindows Sound Recorderومنها برنامج ، في ملحقات هذا الفصل Classes وسوف أرفق محتويات هذه الـ Voice Libraryنسميه

: هيClassesوهذه الـ

WaveIn Class وسوف نستخدمه لوضع آافة الـ Methods الخاصة بالتقاط الصوت وتخزينه Byte Arrayفي

WaveOut Clasas الصوت األتي من الـ وسوف نستخدمه لعرضBufferثم عرضه WaveStream Class والذي سوف نستخدمه لتحويل الصوت إلى Stream حيث يسهل

المستخدمة في الدوت نيتMemoryStreamإرساله عبر الشبكة ويشبه عمله عمل بحيث يتم عرض الداخل أوال خارج أوال Stream لتنظيم الـ FifoStreamالميثود winmm.dl الخاصة بالملف Methods ويتم فيها وضع آافة التعريفات للـ WaveNativeالميثود

.والتي شرحناها سابقّا

لعملية النقل ومعتمدا على أسلوب البث UDPسوف نستخدم في هذا المثال بروتوآول الـ Full Diplex Unicast Voice Chat System وللبدء سوف يكون الشكل العام لبرنامج االتصال

:ا يلي آم

:وهنا صورة برنامج الطرف المقابل

وسوف نضعه في الـ Voice.dll السابقة في ملف Classesوسوف نقوم بكبسلة الـ References الخاصة بالبرنامج وحتى نستطيع استخدام هذا الملف في جميع البرامج التي

Page 136: Ip معلومات حول

136

Usingلف باستخدام الـ سوف تستخدم عملية االتصال الصوتي بعد هذه العملية سنقوم الم :وآما يلي

C#: using System.Net; using System.Net.Sockets; using System.Threading; using Voice; VB.NET Imports System.Net Imports System.Net.Sockets Imports System.Threading Imports Voice

سوف نستخدمه في البرنامج ويفضل وضع والذي Thread والـSocket ثم نقوم بتعريف الـ الرئيسي والهدف من هذه العملية Classهذه التعريفات في بداية البرنامج أي بعد تعريف الـ

عند إطفاء البرنامج وحتى ال تبقى في Thread والـ Socketهي القدرة على إغالق الـ :ويتم ذلك آما يلي، الذاآرة عند إغالق برنامج االتصال

C#: public class Form1 : System.Windows.Forms.Form { private Socket socket;

private Thread thread; VB.NET Public Class Form1 : Inherits System.Windows.Forms.Form Private socket As Socket Private thread As Thread

الذي سيتم تسجيل الصوت Bufferبقة ونعرف الـ الساClasses من الـObjectوسوف نعرف

Socket الذي سيتم عرض الصوت المستلم من الـBufferالمراد إرساله والـ

C#: private WaveOutPlayer m_Player; private WaveInRecorder m_Recorder; private FifoStream m_Fifo = new FifoStream(); private byte[] m_PlayBuffer; private byte[] m_RecBuffer; VB.NET Private m_Player As WaveOutPlayer Private m_Recorder As WaveInRecorder Private m_Fifo As FifoStream = New FifoStream Private m_PlayBuffer As Byte() Private m_RecBuffer As Byte()

قم بكتابة التعريف Form Load Event الـ الخاص بالبرنامج أو فيConstructureفي الـ Thread والـ Socketالخاص بالـ

Page 137: Ip معلومات حول

137

C#: public Form1() { InitializeComponent(); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); thread = new Thread(new ThreadStart(Voice_In)); } VB.NET socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) thread = New Thread(AddressOf Voice_In)

Socketعملية استقبال الصوت من الـالكود الخاص بVoice_In Method سوف نضع في الـ :وآما يلي

C#: private void Voice_In() { byte[] br; socket.Bind(new IPEndPoint(IPAddress.Any, 5020)); while (true) { br = new byte[16384]; socket.Receive(br); m_Fifo.Write(br, 0, br.Length); } } VB.NET Private Sub Voice_In() Dim br As Byte() socket.Bind(New IPEndPoint(IPAddress.Any, 5020)) Do While True br = New Byte(16383) {} socket.Receive(br) m_Fifo.Write(br, 0, br.Length) Loop End Sub

ثم نمرر الصوت Receive Method حيث يتم استقبال الصوت من الشبكة باستخدام الـ . تنفيذه وتحويله إلى صوت مرة أخرى وحتى يتمm_Fifo.Write Methodالمستقبل إلى الـ

: التي تقوم بتسجيل الصوت وإرساله إلى الجهاز األخر فهيMethodأما الـ

Page 138: Ip معلومات حول

138

C#: private void Voice_Out(IntPtr data, int size) { //for Recorder if (m_RecBuffer == null || m_RecBuffer.Length < size) m_RecBuffer = new byte[size]; System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size); //Microphone ==> data ==> m_RecBuffer ==> m_Fifo socket.SendTo(m_RecBuffer, new IPEndPoint(IPAddress.Parse(Peer_IP.Text),5030)); } VB.NET Private Sub Voice_Out)ByVal data As IntPtr ،ByVal size As Integer( 'for Recorder If m_RecBuffer Is Nothing OrElse m_RecBuffer.Length < size Then m_RecBuffer = New Byte)size - 1 ({} End If System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size( 'Microphone ==> data ==> m_RecBuffer ==> m_Fifo socket.SendTo(m_RecBuffer ،New IPEndPoint(IPAddress.Parse(Peer_IP.Text),5030(( End Sub

بحيث يرسل ويستقبل في نفس Full Duplexالحظ أنه في حالة إذا ما أردنا عمل برنامج واحد لإلرسال وأخرى لالستقبال وفي الطرف Tow Portsالوقت فإننا بحاجة إلى تعريف

... االستقبال لديه والعكس صحيح Port اإلرسال لديك هي Portألخر تكون ا

:في زر البدء يتم تنفيذ الميثود التالية

C#: private void Start() { Stop(); try { WaveFormat fmt = new WaveFormat(44100, 16, 2); m_Player = new WaveOutPlayer(-1, fmt, 16384, 3, new BufferFillEventHandler(Filler)); m_Recorder = new WaveInRecorder(-1, fmt, 16384, 3, new BufferDoneEventHandler(Voice_Out)); } catch { Stop(); throw; } }

Page 139: Ip معلومات حول

139

VB.NET Private Sub Start() Stop() Try Dim fmt As WaveFormat = New WaveFormat(44100, 16, 2) m_Player = New WaveOutPlayer(-1, fmt, 16384, 3, New BufferFillEventHandler(AddressOf Filler)) m_Recorder = New WaveInRecorder(-1, fmt, 16384, 3, New BufferDoneEventHandler(AddressOf Voice_Out)) Catch Stop() Throw End Try End Sub

:أما في زر اإليقاف فيتم تنفيذ الميثود التالية

C#: private void Stop() { if (m_Player != null) try { m_Player.Dispose(); } finally { m_Player = null; } if (m_Recorder != null) try { m_Recorder.Dispose(); } finally { m_Recorder = null; } m_Fifo.Flush(); // clear all pending data } VB.NET Private Sub [Stop]() If Not m_Player Is Nothing Then Try m_Player.Dispose() Finally m_Player = Nothing End Try End If If Not m_Recorder Is Nothing Then

Page 140: Ip معلومات حول

140

Try m_Recorder.Dispose() Finally m_Recorder = Nothing End Try End If m_Fifo.Flush() ' clear all pending data End Sub

:ة على السماعSocket والمستلم من Voice Bufferالميثود التي تقوم بعرض الـ

C#: private void Filler(IntPtr data, int size) { if (m_PlayBuffer == null || m_PlayBuffer.Length < size) m_PlayBuffer = new byte[size]; if (m_Fifo.Length >= size) m_Fifo.Read(m_PlayBuffer, 0, size); else for (int i = 0; i < m_PlayBuffer.Length; i++) m_PlayBuffer[i] = 0; System.Runtime.InteropServices.Marshal.Copy(m_PlayBuffer, 0, data, size); // m_Fifo ==> m_PlayBuffer==> data ==> Speakers } VB.NET Private Sub Filler(ByVal data As IntPtr, ByVal size As Integer) If m_PlayBuffer Is Nothing OrElse m_PlayBuffer.Length < size Then m_PlayBuffer = New Byte(size - 1) {} End If If m_Fifo.Length >= size Then m_Fifo.Read(m_PlayBuffer, 0, size) Else Dim i As Integer = 0 Do While i < m_PlayBuffer.Length m_PlayBuffer(i) = 0 i += 1 Loop End If System.Runtime.InteropServices.Marshal.Copy(m_PlayBuffer, 0, data, size) ' m_Fifo ==> m_PlayBuffer==> data ==> Speakers End Sub

Page 141: Ip معلومات حول

141

sfer Voice Throw UDP and Thinking in SCTP to Tran,Testing TCP: رابعاNetworks:

نقوم بإضافة التعريفات التاليةMulticast Half Duplex Voice Chat Systemإلنشاء برنامج

وسوف نعتمد على وجود ، والتي شرحناها في الفصل السابق Multicastingوالخاصة بالـ تمع فيه برنامجين واحد للمحاضر يتم من خالله تسجيل الصوت وآخر لطالب حيث يس

:لمحاضرة المعلم وآما في الشكل التالي

ال يختلف الكود بشيء فقط عند اإلرسال يتم ذلك ) برنامج المعلم(في برنامج اإلرسال : وآما يليIP Multicastingباستخدام الـ

C#: private void Voice_Out(IntPtr data, int size) { //for Recorder if (m_RecBuffer == null || m_RecBuffer.Length < size) m_RecBuffer = new byte[size]; System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size); //Microphone ==> data ==> m_RecBuffer ==> m_Fifo socket.SendTo(m_RecBuffer, new IPEndPoint(IPAddress.Parse("224.0.1.7"), 5020)); }

Page 142: Ip معلومات حول

142

VB.NET Private Sub Voice_Out(ByVal data As IntPtr, ByVal size As Integer) 'for Recorder If m_RecBuffer Is Nothing OrElse m_RecBuffer.Length < size Then m_RecBuffer = New Byte(size - 1) {} End If System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size) 'Microphone ==> data ==> m_RecBuffer ==> m_Fifo socket.SendTo(m_RecBuffer, New IPEndPoint(IPAddress.Parse("224.0.1.7"), 5020)) End Sub

من ثم االستقبال من وIP Multicast Group إلى الـمفي الطرف المستقبل نقوم باالنضما

:خالله وآما يليC#: private void Voice_In() { UdpClient sock = new UdpClient(5000); sock.JoinMulticastGroup(IPAddress.Parse("224.0.1.7")); IPEndPoint iep = new IPEndPoint(IPAddress.Any,0); while (true)

{ m_Fifo.Write(sock.Receive(ref iep), 0,sock.Receive(ref iep).Length); }

} VB.NET Private Sub Voice_In() Dim sock As UdpClient = New UdpClient(5000) sock.JoinMulticastGroup(IPAddress.Parse("224.0.1.7")) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Do While True m_Fifo.Write(sock.Receive(iep), 0, sock.Receive(iep).Length) Loop End Sub

...اآلن نفذ البرنامج الحظ أن الصوت قد يتقطع أحيانا وبتأآيد السبب واضح وهو أنه في حالة استخدام بروتوآول

قد يسبب ضياع واحد فإن عملية اإلرسال ستكون عشوائية وهذا Multicasting والـ UDPالـ ال يدعم أي UDP المرسلة عبر الشبكة آل فترة وبما أن بروتوآول الـ Packetsأو أآثر من الـ

من عمليات التحقق من الوصول وعمليات التوصيل على الترتيب فإن حدوث واحد أو أآثر من ...هذه المشاآل أمر محتمل

الحظ أن هذا البروتوآول هو ، TCP دعنا اآلن نجرب عملية اإلرسال باستخدام بروتوآول

ة آما يدعم جميع عمليات التحقق من الوصول باإلضافOriented Protocolبروتوآول موجه وهو ما يميز هذا Streamإلى آونه يدعم االتصال بين الطرفين باستخدام أسلوب الـ

لبيانات المرسلة البروتوآول عن غيره إذ أننا في حالة استخدامه لن نضطر إلى األخذ بحجم ا إلى سهولة تجميعها مرة أخرى ة لها بكل سهولة باإلضافFragmentationحيث يتم عمل

...Delivered Out on Sequenceوبدون الخوف من مشاآل الـ : السابق وجعله آما يلي Socketآل ما علينا تغييره هو تعريف الـ

Page 143: Ip معلومات حول

143

C#: socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream , ProtocolType.Tcp);

VB.NET socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

: وآما يليNetwork Stream Classأما في عملية اإلرسال فيمكننا استخدام الـ

C#: private void Voice_Out(IntPtr data, int size) { //for Recorder if (m_RecBuffer == null || m_RecBuffer.Length < size) m_RecBuffer = new byte[size]; System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size); //Microphone ==> data ==> m_RecBuffer ==> m_Fifo sock.Connect(new IPEndPoint(IPAddress.Parse("10.0.0.10"),5020)); NetworkStream ns = new NetworkStream (socket); ns.Write (m_RecBuffer,0,m_RecBuffer.Length); } VB.NET Private Sub Voice_Out(ByVal data As IntPtr, ByVal size As Integer) 'for Recorder If m_RecBuffer Is Nothing OrElse m_RecBuffer.Length < size Then m_RecBuffer = New Byte(size - 1) {} End If System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size) 'Microphone ==> data ==> m_RecBuffer ==> m_Fifo sock.Connect(New IPEndPoint(IPAddress.Parse("10.0.0.10"), 5020)) Dim ns As NetworkStream = New NetworkStream(socket) ns.Write(m_RecBuffer, 0, m_RecBuffer.Length) End Sub

: مرة أخرى الآن لالستقبالNetwork Streamفي الطرف المستقبل نقوم باستخدام الـ

C#: private void Voice_In() {

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream , ProtocolType.Tcp); sock.Bind(new IPEndPoint(IPAddress.Parse("10.0.0.10"),5020)); NetworkStream ns = new NetworkStream (sock);

while (true){ byte[] buffer = new byte [16384]; ns.Read (buffer,0,16384); m_Fifo.Write(buffer, 0, buffer.Length); } }

Page 144: Ip معلومات حول

144

VB.NET Private Sub Voice_In() Dim sock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) sock.Bind(New IPEndPoint(IPAddress.Parse("10.0.0.10"), 5020)) Dim ns As NetworkStream = New NetworkStream(sock) Do While True Dim buffer As Byte() = New Byte(16383) {} ns.Read(buffer, 0, 16384) m_Fifo.Write(buffer, 0, buffer.Length) Loop End Sub

متازة آما أنه ال يوجد أي تقطيع في الصوت الآن المشكلة الحظ أن دقة الصوت أصبحت م أو Multicastingتكمن في أننا لن نستطيع االستفادة من هذه اإلمكانيات الرائعة في الـ

...Broadcastingالـ أو استخدام بروتوآول UDP والحل الوحيد هو إما استخدام المعايير السابقة مع بروتوآول الـ

بروتوآول Microsoft حتى تدعم Long Hornر لحين االنتهاء من مشروع أو االنتظاTCPالـ ...SCTPالـ

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

إذ أصبح لدينا اآلن Multicasting لعمليات الـUDPن قبل الـ والدعم المقدم مTCPميزات الـ إلى ة وإعادة ترتيبها بكل سهولة باإلضافFragmentationمنصة قوية يعتمد عليها في عمل الـ

الخاصة بهذا Header وهذا واضح من بنية الـDelivered on Sequenceدعمه عملية :البروتوآول انظر إلى الشكل التالي

Page 145: Ip معلومات حول

145

How to Create a Voice Conference System Using Microsoft Direct: خامسا9 Play :

Direct Play9ر الخاص ب تقنيات رائعة جدا للنقل الصوت في اإلصداMicrosoftدعمت وآان الهدف DirectX وهو جزء من مجموعة الـDirectPlay Transport Protocolويسمى أيضا

وتعتمد هذه ، Network Gamesمن إطالقها وجود معيار موحد لمبرمجين األلعاب فيما يخص الـعملية المكتبة على مجموعة من المعايير الخاصة بتشبيك حيث آان الهدف منها هو جعل TCP/IPاالتصال ممكنة تحت جميع البيئات المختلفة و سواء آان البروتوآول المستخدم هو الـ

، فإن عملية االتصال ممكنة وبدون أي اختالفات من النواحي البرمجيةNovel الخاص بIPXأو :DirectPlay Transport Protocolومن أهم ميزات الـ

- Reliable delivery of messagesث يدعم عملية التحقق التوصيل للجهة المعنية حي - Sequential a delivery of messagesحيث يدعم التوصيل وفق الترتيب الصحيح - Send prioritizationحيث يدعم عملية وضع أولويات لإلرسال بناء على األهمية - Streaming Sessionحيث تدعم عملية النقل ك Stream Data ،

وقد حلت جميع ، المنتظر SCTP هذه الحلول آبدائل لدعم بروتوآول الـMicrosoftقدمت وحل UDP أو الـTCPالمشكالت التي آانت تواجه المبرمجين لنقل الصوت عبر بروتوآول الـ

Direct Playوتحتوي الـ ، Transport Layerمحله أسلوب آخر لربط ضمن مستوى طبقة الـ : ومن أهمها Classesعلى مجموعة ضخمة من الـ

: والخاصة بعملية الربطConnect Classesالـ : أوال ، حيث تستخدم عند إنشاء االتصال مع الطرف األخر Address , Guido , Peer Classes الـ

خاص بكل برنامج Hash Code طريقة لتمييز البرنامج عن األخر بتوليد DirectPlayوتستخدم ويتم تمرير الكود المولد وعنوان الجهاز المقابل إلى الـ Guido Classذلك باستخدام الـ ويتم

Peer Class وهذه العملية شبيهة بشكل آبير لعملية الربط باستخدام الـ Socket في :ويتم استخدامها آما يلي آمثال ، TCP/IPبروتوآول

C#: using Microsoft.DirectX.DirectPlay; . . . Address hostAddress = new Address(); hostAddress.ServiceProvider = Address.ServiceProviderTcpIp; // Select TCP/IP service provider ApplicationDescription dpApp = new ApplicationDescription(); appGuid = Guid.NewGuid(); // Create a GUID for the application dpApp.GuidApplication = appGuid; // Set the application GUID dpApp.SessionName = "My Session"; // Optional Session Name myPeer.Host(dpApp, hostAddress); // Begin hosting VB.NET Imports Microsoft.DirectX.DirectPlay . . .

Private Address hostAddress = New Address() Private hostAddress.ServiceProvider = Address.ServiceProviderTcpIp ' Select TCP/IP service provider

Page 146: Ip معلومات حول

146

Private dpApp As ApplicationDescription = New ApplicationDescription Private appGuid = Guid.NewGuid() ' Create a GUID for the application Private dpApp.GuidApplication = appGuid ' Set the application GUID Private dpApp.SessionName = "My Session" ' Optional Session Name myPeer.Host(dpApp, hostAddress) ' Begin hosting

وحتى نستطيع IPX أو TCP/IPطبعا يجب االختيار طبيعة البروتوآول المستخدم سواء آان : ويتم ذلك آما يليIP Addressوضع العنوان المقابل أو الـ

C#: using Microsoft.DirectX.DirectPlay; ServiceProviderInfo[] mySPInfo; Peer myPeer; System.Windows.Forms.ListBox listBox1; ApplicationDescription myAppDesc; . . myPeer = new Peer(); hostAddress = new Address(); peerAddress = new Address(); // Set the service provider to TCP/IP peerAddress.ServiceProvider = Address.ServiceProviderTcpIp; hostAddress.ServiceProvider = Address.ServiceProviderTcpIp; // Attach FindHostResponseEventHandler to receive FindHostResponseMessages myPeer.FindHostResponse += new FindHostResponseEventHandler(myEnumeratedHosts); // Call FindHosts to start the enumeration myPeer.FindHosts(myAppDesc, hostAddress, peerAddress, null, 10, 0, 0, FindHostsFlags.OkToQueryForAddressing); VB.NET Imports Microsoft.DirectX.DirectPlay Private mySPInfo As ServiceProviderInfo() Private myPeer As Peer Private listBox1 As System.Windows.Forms.ListBox Private myAppDesc As ApplicationDescription Private myPeer = New Peer Private hostAddress = New Address Private peerAddress = New Address ' Set the service provider to TCP/IP Private peerAddress.ServiceProvider = Address.ServiceProviderTcpIp Private hostAddress.ServiceProvider = Address.ServiceProviderTcpIp

Page 147: Ip معلومات حول

147

' Attach FindHostResponseEventHandler to receive FindHostResponseMessages Private myPeer.FindHostResponse += New FindHostResponseEventHandler(myEnumeratedHosts) ' Call FindHosts to start the enumeration myPeer.FindHosts(myAppDesc, hostAddress, peerAddress, Nothing, 10, 0, 0, FindHostsFlags.OkToQueryForAddressing)

ويتم البحث عن الطرف األخر في TCP/IP حيث تم تعريف نوع البروتوآول المستخدم وهو

وتتم عملية الربط ، Peer Class والموجودة ضمن الـFindHosts Methodالشبكة باستخدام الـ : وآما يليPeer Class والموجودة ضمن الـ Connect Methodمباشرة باستخدام الـ

C#: using Microsoft.DirectX.DirectPlay; // Structure for FindHostResponseMessages public struct HostInfo { public ApplicationDescription appdesc; public Address deviceAddress; public Address senderAddress; } . . . Peer myPeer = new Peer(); HostInfo hostinfo = new HostInfo(); // The FindHostResponseEventHandler public void myEnumeratedHosts(object o, FindHostResponseEventArgs args) { hostinfo.appdesc = args.Message.ApplicationDescription; hostinfo.deviceAddress = args.Message.AddressDevice; hostinfo.senderAddress = args.Message.AddressSender; } // Attach the ConnectCompleteEventHandler to receive ConnectCompleteMessages myPeer.ConnectComplete += new ConnectCompleteEventHandler(OnConnectComplete); // Call connect passing the Host information returned in the FindHostResponse event myPeer.Connect(hostinfo.appdesc, hostinfo.deviceAddress, hostinfo.senderAddress, null, ConnectFlags.OkToQueryForAddressing);

Page 148: Ip معلومات حول

148

VB.NET Imports Microsoft.DirectX.DirectPlay ' Structure for FindHostResponseMessages Public Structure HostInfo Public appdesc As ApplicationDescription Public deviceAddress As Address Public senderAddress As Address End Structure Private myPeer As Peer = New Peer Private hostinfo As HostInfo = New HostInfo ' The FindHostResponseEventHandler Public Sub myEnumeratedHosts(ByVal o As Object, ByVal args As FindHostResponseEventArgs) hostinfo.appdesc = args.Message.ApplicationDescription hostinfo.deviceAddress = args.Message.AddressDevice hostinfo.senderAddress = args.Message.AddressSender End Sub ' Attach the ConnectCompleteEventHandler to receive ConnectCompleteMessages Private myPeer.ConnectComplete += New ConnectCompleteEventHandler(OnConnectComplete) ' Call connect passing the Host information returned in the FindHostResponse event myPeer.Connect(hostinfo.appdesc, hostinfo.deviceAddress, hostinfo.senderAddress, Nothing, ConnectFlags.OkToQueryForAddressing)

Page 149: Ip معلومات حول

149

عمليات تسجيل ونقل وعرض والخاصة بكل Voice.DirectPlay.DirectX.Microsoft: ثانيا :الصوت

: التاليلتمر عملية تسجيل ونقل وعرض الصوت بمجموعة من المراحل ونلخصها بالشك

، حسب الوظيفة لكل منها Classesوسوف نقسمها إلى مجموعة من الـ :Sessions إلنشاء وإدارة الـ Server الخاصة بطرف الـ Classes الـ -1 Server Classخدم آما يلي آمثال ويست:

C#: Server server = new Voice.Server(peerObject); VB.NET Dim server As Server = New Voice.Server(peerObject)

Serverويحتوي الـ ، Peer Classوالذي تم اشتقاقه من الـ Peer Objectحيث نسند له ال

Object على الـ Methodsإلى مجموعة من ة وإنهاء الجلسة باإلضاف الخاصة بعملية بدأ :العمليات األخرى

Page 150: Ip معلومات حول

150

حيث يتم StartSession Methodولبدأ الجلسة يجب أوال إسناد خصائص الجلسة إلى الـ :آما يلي و SessionDescriptionتعريفها من خالل الـ

C#: //set up session description for the voice server Voice.SessionDescription sessionDesc = new Voice.SessionDescription(); sessionDesc.BufferAggressiveness = Voice.BufferAggressiveness.Default; sessionDesc.BufferQuality = Voice.BufferQuality.Default; sessionDesc.Flags = 0; sessionDesc.SessionType = type; sessionDesc.GuidCompressionType = compressionType; VB.NET 'set up session description for the voice server Dim sessionDesc As Voice.SessionDescription = New Voice.SessionDescription sessionDesc.BufferAggressiveness = Voice.BufferAggressiveness.Default sessionDesc.BufferQuality = Voice.BufferQuality.Default sessionDesc.Flags = 0 sessionDesc.SessionType = type sessionDesc.GuidCompressionType = compressionType

Voice Session والـ Peer Object نمرر لها ال Method نقوم بإنشاء Voice Sessionوإلنشاء

Type ونوع الضغط المستخدم Compression Typeويتم ذلك آما يلي :

C#: protected void CreateVoiceSession(Peer dpp, Voice.SessionType type, Guid compressionType) { try { //set up session description for the voice server Voice.SessionDescription sessionDesc = new Voice.SessionDescription(); sessionDesc.BufferAggressiveness = Voice.BufferAggressiveness.Default; sessionDesc.BufferQuality = Voice.BufferQuality.Default; sessionDesc.Flags = 0; sessionDesc.SessionType = type; sessionDesc.GuidCompressionType = compressionType;

Page 151: Ip معلومات حول

151

//start the session try

{ server.StartSession(sessionDesc); mIsHost = true; mInSession = true; } catch(DirectXException dxe) { throw dxe; } } catch(Exception e) { throw e; } } VB.NET Protected Sub CreateVoiceSession(ByVal dpp As Peer, ByVal type As Voice.SessionType, ByVal compressionType As Guid) Try 'set up session description for the voice server Dim sessionDesc As Voice.SessionDescription = New Voice.SessionDescription sessionDesc.BufferAggressiveness = Voice.BufferAggressiveness.Default sessionDesc.BufferQuality = Voice.BufferQuality.Default sessionDesc.Flags = 0 sessionDesc.SessionType = type sessionDesc.GuidCompressionType = compressionType 'start the session Try server.StartSession(sessionDesc) mIsHost = True mInSession = True Catch dxe As DirectXException Throw dxe End Try Catch e As Exception Throw e End Try End Sub

:ويتم استدعائها آما يلي

C#: CreateVoiceSession(host, Voice.SessionType.Peer, mConfigForm.CompressionGuid);

Page 152: Ip معلومات حول

152

VB.NET CreateVoiceSession(host, Voice.SessionType.Peer, mConfigForm.CompressionGuid)

:Server التي أنشئها الـSessions لالتصال مع الـ Client الخاصة بطرف الـ Classes الـ -2 :Client Class الموجودة في الـ Methods ومن أهم الـClient Classالـ

رقم Server حيث يرسل الـ Voice Sessionمع ال وتستخدم لربط Connectالميثود

:ويتم ذلك آما يلي، من الدخول إلى الجلسة Client وعندها يتمكن الـ Client للـ Sessionال

C#: protected void ConnectToVoiceSession(Peer dpp, Form wnd) { try { Voice.SoundDeviceConfig soundConfig = new Voice.SoundDeviceConfig(); //Set sound config to defaults soundConfig.GuidPlaybackDevice = DSoundHelper.DefaultVoicePlaybackDevice; soundConfig.GuidCaptureDevice = DSoundHelper.DefaultVoiceCaptureDevice; soundConfig.Window = wnd; //TODO: add error message for specific failures? //Connect to voice session client.Connect(soundConfig, mClientConfig, Voice.VoiceFlags.Sync); //set state mInSession = true; //set transmit targets to all players int[] xmitTargets = new int[1]; xmitTargets[0] = (int) PlayerID.AllPlayers; client.TransmitTargets = xmitTargets; //get sound device config to check for half-duplex soundConfig = client.SoundDeviceConfig; mHalfDuplex = ((soundConfig.Flags & Voice.SoundConfigFlags.HalfDuplex) != 0); } catch(Exception e) {throw e;} }}

Page 153: Ip معلومات حول

153

VB.NET Protected Sub ConnectToVoiceSession(ByVal dpp As Peer, ByVal wnd As Form) Try Dim soundConfig As Voice.SoundDeviceConfig = New Voice.SoundDeviceConfig 'Set sound config to defaults soundConfig.GuidPlaybackDevice = DSoundHelper.DefaultVoicePlaybackDevice soundConfig.GuidCaptureDevice = DSoundHelper.DefaultVoiceCaptureDevice soundConfig.Window = wnd 'TODO: add error message for specific failures? 'Connect to voice session client.Connect(soundConfig, mClientConfig, Voice.VoiceFlags.Sync) 'set state mInSession = True 'set transmit targets to all players Dim xmitTargets As Integer() = New Integer(0) {} xmitTargets(0) = CInt(PlayerID.AllPlayers) client.TransmitTargets = xmitTargets 'get sound device config to check for half-duplex soundConfig = client.SoundDeviceConfig mHalfDuplex = ((soundConfig.Flags And Voice.SoundConfigFlags.HalfDuplex) <> 0) Catch e As Exception Throw e End Try End Sub

الآن DirectPlay قد تم حلها في الـ UDP والـTCPالحظ أن المشاآل في البروتوآولين الـ

لم يكن سوى لدعم برمجة األلعاب Direct Playوآما هو معروف فإن الهدف من إنشاء الـ ية االتصال الصوتي إال أنها تفتقر في عملDirect Playومع المرونة الكبيرة التي تقدمها الـ

...Linux الخاص بالـ SCTP والتي يقدمها بروتوآول الـ Voice Over IPلميزات الـ

وهكذا بينا ملخص عن أهم الطرق التصال الصوتي عبر الشبكة وطرق برمجة الـ Voice Chatتحت منصة الدوت نيت واهم ميزات وعيوب بروتوآوالت الـ Transport

Layer ومدى إمكانياتها لنقل الصوت عبر الشبكة وأخيرا شرح ألهم الـClasses DirectPlay Transportوالمستخدمة في االتصال الصوتي باستخدام الـ

Protocol.

في Application Layerسيتم الحديث في الجزء التالي عن برمجة بروتوآوالت الـ .بيئة الدوت نيت

Page 154: Ip معلومات حول

154

Advanced Voice Over IP Programming

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

التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

الموقع الرسمي للكتاب3Hwww.fadidotnet.org

Page 155: Ip معلومات حول

155

Chapter11 DNS Programming Chapter13 Web Services & XML Programming Chapter14 SMTP & POP3 Programming Chapter15 FTP Programming

Part 4 Application Layer Programming

Page 156: Ip معلومات حول

156

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 11 DNS Programming

- Synchronous DNS Members - Asynchronous DNS Members

Page 157: Ip معلومات حول

157

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

11 :DNS Programming :

احدة من أهم الخدمات التي تستخدم في اإلنترنت والشبكات بشكل وDNSتعتبر خدمة من وإلى Domain IP إلى Domain Nameالـ بالقيام بعملية ترجمة DNSوتختصر وظيفة ، عام

والتي تقوم بتحديث ( DNSالعكس ويتم ذلك من خالل مجموعة آبيرة جدا من مزودات بطلب A Clientبدأ هذه العملية بقيام الت، ) قاعدة البيانات الخاصة بها آل فترة معينة

حيث تم مسبقا - الخاص به Domain Name وذلك بإدخال Client Bالـ الخاص بDomainالـ آما يحتوي آل - DNS Server بتعريف نفسه في قاعدة البيانات الخاصة ب Client Bالـقيام

Client الـ على قاعدة بيانات تحتوي على عناوينDomainsالـمى ب وتسlocal DNS حيث فإذا لم يجده يقوم Domain Name من خالل Domainيقوم بالبحث بداخلها على عنوان

بإرسال العنوان DNS Serverالـ وبعد إيجاده يقوم DNS Serverالـبطلب عنوان الدومين من لشكل انظر إلى ا، الخاص به Local DNS ويقوم بدوره بتخزين العنوان في Clientالـإلى :التالي

والتي تحتوي Name Space System.Net باستخدام DNSفي الدوت نيت يمكننا التعامل مع وتقسم DNS الخاصة ب Methodsالـ والتي تحتوي على آل Classes DNSالـعلى جميع

Asynchronous و غير متزامن Synchronous Methodsهذه الميثودس إلى قسمين متزامن Methodsي آما يلي وه:

: وهي Synchronous Methodsأوال الميثودس المتزامنة

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

:يلي :#C

string hostname = Dns.GetHostName(); VB.NET: Private hostname As String = Dns.GetHostName

Page 158: Ip معلومات حول

158

: وتستخدم آل منها آما يليGetHostByAddress و الميثود GetHostByNameالميثود

:#C IPHostEntry host_ip = Dns.GetHostByName(Computer_Name); // لجلب العنوان باستخدام االسمIPHostEntry host_name = Dns.GetHostByAddress(IP_Address); // لجلب االسم باستخدام العنوان

VB.NET: Private host_ip As IPHostEntry = Dns.GetHostByName(Computer_Name) Private host_name As IPHostEntry = Dns.GetHostByAddress(IP_Address)

IP إذا أرسلت لها Host Nameترجع حيث Overloaded Method وهي Resolveالميثود Address وترجع Host Address إذا أرسلت لها Host Name الـ فيIPHostEntry وال يختلف

.استخدامها عن استخدام الميثودس السابقة :وهذا المثال يبين طريقة استخدامها

:#C

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]);}}} VB.NET: Imports System Imports System.Net Class FMO_DNS Public Shared Sub Main() Dim IPHost As IPHostEntry = Dns.Resolve("www.yahoo.com") Console.WriteLine(IPHost.HostName) Dim addr As IPAddress() = IPHost.AddressList Dim i As Integer = 0 While i < addr.Length Console.WriteLine(addr(i)) System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) End While End Sub End Class 0

Page 159: Ip معلومات حول

159

:Asynchronous Methodsثانيا الميثودس غير المتزامنة : ومن األمثلة عليها End أو Beginوتبدأ عادة بكلمة

BeginGetHostByName و BeginResolve و EndGetHostByName و EndResolve متزامنة لكنها تختلف بكون انه ال يشترط طبيعة عملها آما هو الحال في الميثودس ال

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

___Begin: تستخدم آما يلي في البرنامج لذلك ينصح باستخدام الطريقة الغير متزامنة وpublic static IAsyncResult BeginResolve(string hostname, AsyncCallback requestCallback, object stateObject)

delegateالـ الثاني يعرف فيه ميتروراالب األول و ميتروراالبحيث يتم وضع الهوست نيم في

: آما يلي ____Endويستخدم ، delegateوتسمح لك بتمرير مدخالت إال

public static IPHostEntry EndResolve(IasyncResult ar)

الموجودة على الشبكة حيث يعمل على IP’sالـوهنا مثال شامل و بسيط يقوم بجلب جميع حيث يتم StandardOutput من خالل الخاصية ProcessStartInfo من host namesالـجلب

ثم GetMachineNamesFromProcessOutput من خالل الميثود host nameتحويله إلى .. Dns.Resolve ثم يتم تحويل األسماء إلى عناوين من خالل الميثود Collicaionتخزينها في

وهذا ProcessStartInfoالـ الخاص بcollectionالـ لقراءة StreamReaderالـطبعا يتم استخدام :هو المثال

:#C

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;

Page 160: Ip معلومات حول

160

} 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(); } }

Page 161: Ip معلومات حول

161

:NET.VB Imports System Imports System.IO Imports System.Diagnostics Imports System.Net Imports System.Collections.Specialized Public Class Names Public Function GetNames() As StringCollection Dim _startInfo As ProcessStartInfo = New ProcessStartInfo("net", "view") _startInfo.CreateNoWindow = True _startInfo.UseShellExecute = False _startInfo.RedirectStandardOutput = True Dim _process As Process = Process.Start(_startInfo) Dim _reader As StreamReader = _process.StandardOutput Dim _machineNames As StringCollection = GetMachineNamesFromProcessOutput(_reader.ReadToEnd()) Dim _machineIPs As StringCollection = New StringCollection For Each machine As String In _machineNames _machineIPs.Add(IPAddresses(machine)) Next machine Return _machineIPs End Function Private Shared Function IPAddresses(ByVal server As String) As String Try Dim ASCII As System.Text.ASCIIEncoding = New System.Text.ASCIIEncoding ' Get server related information. Dim heserver As IPHostEntry = Dns.Resolve(server) 'assumin the machine has only one IP address Return heserver.AddressList(0).ToString() Catch Return "Address Retrieval error for " & server End Try End Function 'string manipulations Private Function GetMachineNamesFromProcessOutput(ByVal processOutput As String) As StringCollection Dim _allMachines As String = processOutput.Substring(processOutput.IndexOf("\")) Dim _machines As StringCollection = New StringCollection Do 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)) Loop

Page 162: Ip معلومات حول

162

Return _machines End Function End Class Public Class Runner Shared Sub Main() Dim _names As Names = New Names Dim names As StringCollection = _names.GetNames() For Each name As String In names Console.WriteLine(name) Next name Console.ReadLine() End Sub End Class

وطرق التعامل معه في بيئة الدوت نيت DNSية الـوهكذا بينا في هذه الفصل أهم . وطرق برمجته في بيئة الدوت نيتHTTPسيتم الحديث في الفصل التالي عن ،

Page 163: Ip معلومات حول

163

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 12 HTTP Programming

- The Concept of HTTP Protocol - Using HTTP in Dot Net

- Advanced HTTP Programming

- Using HttpWebRequest - Using HttpWebResponse

Page 164: Ip معلومات حول

164

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

12 : Hyper Text Transfer Protocol Programming–HTTP

لمستخدم لتوصيل طلب المستخدم بشكل عام على انه البرتوآول اHTTPالـتتلخص وظيفة User Request إلى الويب Server الـ ثم قيامweb server الـ بالرد علىRequest والذي

من النص ) Multimedia (ال وبتأآيد تستطيع نقل جميع أشكServer Responseيسمى ب ستخدام باClient Applicationالـ إلى Web Serverالـمن .. وصورة و صوت و فيديو وغيره

Byte Stream object. وهذا يعني استخدامه بشكل مباشر Application Layerالـ على HTTPالـ يعمل برتوآول

: انظر إلى الشكل التاليDNS,SMTP,POP3,FTPفي المن واجهة المستخدم آما هو الح

Downloading From Web Server: أوال الموجود Class WebClientالـباستخدام لدوت نيت في اWeb Serverالـنستطيع التعامل مع

إذ تقدم لنا جميع اإلمكانيات لتوصيل طلب الزبون و الرد Name Space System.Netفي Methods ثالثة WebClient Classالـ وتدعم User Request & Server Responseعليه

: وهيWeb Serverالـلتحميل البيانات من 1- DownloadData الـووظيفتها جلب البيانات منWeb Server وتخزينها في Byte Array

:الـ وتستخدم آما يلي آمثHTML Codeوتعرض على شكل :#C

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(response)); }

}

Page 165: Ip معلومات حول

165

VB.NET: Imports System Imports System.Net Imports System.Text Class DownloadData_Method Public Shared Sub Main() Dim wc As WebClient = New WebClient Dim response As Byte() = wc.DownloadData("http://www.google.com") Console.WriteLine(Encoding.ASCII.GetString(response)) End Sub End Class

2- DownloadFile الـووظيفتها نقل ملف ما منWeb Serverا مباشرة في وتخزينهLocal

Computer وهو سهل االستخدام جدا إذ ما عليك سوا تمرير موقع الملف والمكان الذي تريد :الـتخزين الملف فيه ويستخدم آما يلي آمث

:#C 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"); }

} VB.NET: Imports System Imports System.Net Imports System.Text Class DownloadData_Method Public Shared Sub Main() Dim wc As WebClient = New WebClient Dim response As Byte() = wc.DownloadData("http://www.google.com") Console.WriteLine(Encoding.ASCII.GetString(response)) End Sub End Class

Page 166: Ip معلومات حول

166

3- OpenRead ووظيفتها إنشاءRead Only Streamبين الزبون وال Server لجلب بيانات من URL محدد وتخزينه في Stream Object الـ بعد تمريرURL للموقع الذي تريد عرضه

على Stream Objectالـ نستطيع عرض البيانات المخزنة في ReadLineوباستخدام الميثود . HTML Codeشكل

.Stream Objectالـ لمعرفة نهاية Peekتستخدم الميثود : مالحظة :#C

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

class OpenRead_Method {

public static void Main () {

WebClient wc = new WebClient(); string response;

Stream strm = wc.OpenRead("http://www.google.com");

StreamReader sr = new StreamReader(strm);

while(sr.Peek() > -1) {

response = sr.ReadLine(); Console.WriteLine(response);

} sr.Close();

} }

VB.NET: Imports System Imports System.IO Imports System.Net Class OpenRead_Method Public Shared Sub Main() Dim wc As WebClient = New WebClient Dim response As String Dim strm As Stream = wc.OpenRead("http://www.google.com") Dim sr As StreamReader = New StreamReader(strm) While sr.Peek > -1 response = sr.ReadLine Console.WriteLine(response) End While sr.Close() End Sub End Class

والتي تستخدم لجلب Propertiesالـعلى مجموعة من WebClient Classالـويحتوي

ذي يستخدم لجلب والproperty ResponseHeaders مثلWeb Hostالـمعلومات عن

Page 167: Ip معلومات حول

167

Serverالـ واسم cash controlالـ ونوع Headersالـ مثل عدد web hostالـمعلومات هامة عن : ويستخدم آما يلي آمثال، المستخدم وغيرها من المعلومات الهامةEncodingالـو نوع

:#C

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)); }

} }

VB.NET: Imports System Imports System.Net Class ResponseHeaders_property Public Shared Sub Main() Dim wc As WebClient = New WebClient Dim response As Byte() = wc.DownloadData("http://www.google.com") Dim whc As WebHeaderCollection = wc.ResponseHeaders Console.WriteLine("header count = {0}", whc.Count) Dim i As Integer = 0 While i < whc.Count Console.WriteLine(whc.GetKey(i) + " = " + whc.Get(i)) System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) End While End Sub End Class

: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

Page 168: Ip معلومات حول

168

Uploading to Web Server: ثانيا : وهي Web Serverالـلبيانات إلى لتحميل اMethods أربعة WebClientالـيدعم

1- OpenWrite الـويستخدم إلرسStream Data الـ إلىWeb Server وذلك بعد تمرير عنوان طبعا يجب أن تملك الصالحيات Web Pageالـ للملف والنص الذي نريد آتابته على URLالـ

:الـلذلك ويستخدم آما يلي آمث:#C

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

class OpenWrite_method {

public static void Main () {

WebClient wc = new WebClient(); string data = "<h1>Welcome to My Page</h1>"; Stream strm = wc.OpenWrite("C:\\mypage.html");

StreamWriter sw = new StreamWriter(strm); sw.WriteLine(data);

sw.Close(); strm.Close();

} }

VB.NET: Imports System Imports System.IO Imports System.Net Class OpenWrite_method Public Shared Sub Main() Dim wc As WebClient = New WebClient Dim data As String = "<h1>Welcome to My Page</h1>" Dim strm As Stream = wc.OpenWrite("C:\mypage.html") Dim sw As StreamWriter = New StreamWriter(strm) sw.WriteLine(data) sw.Close() strm.Close() End Sub End Class

2 – UploadDataفوفة من النوع ويستخدم لنقل محتويات مصByte الـ إلىWeb Server

وهذا يعني انك تستطيع من خاللها رفع أي نوع من البيانات مثل النص الصور الفيديو وغيره : الـ ويستخدم آما يلي آمثByte Array بعد تحويلها إلى web serverالـإلى

:#C using System; using System.Net; using System.Text;

Page 169: Ip معلومات حول

169

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);

} }

VB.NET: Imports System Imports System.Net Imports System.Text Class UploadData_Method Public Shared Sub Main() Dim wc As WebClient = New WebClient Dim data As String = "This is The Text Before Converted it to Byte" Dim dataarray As Byte() = Encoding.ASCII.GetBytes(data) wc.UploadData("C:\mydata.txt", dataarray) End Sub End Class

3- UploadFile الـوتستخدم هذه الميثود لرفع ملف منLocal Computer الـ إلىWeb Host

:الـوهي بسطة االستخدام جدا وتستخدم آما يلي آمث

:#C 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");

} }

VB.NET: Imports System Imports System.Net Class UploadFile_Method Public Shared Sub Main() Dim wc As WebClient = New WebClient wc.UploadFile("http://www.yoursite.com", "C:\myfile.html") End Sub End Class

Page 170: Ip معلومات حول

170

4- UploadValues وتستخدم لرفع Collection والـ من البياناتvalues الخاصة بها إلى Collection ولتعريف Byte Arrayإلى Collection الـ وذلك بعد تحويلServerالويب

Name Space الموجود في NameValueCollectionنستخدم الكالس System.Collections.Specialized وبعد تعريفه نستخدم الميثود addإلضافة الـ Collection

: وتستخدم آما يلي آمثالـ.. جديد:#C

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(response));

} }

VB.NET: Imports System Imports System.Collections.Specialized Imports System.Net Imports System.Text Class UploadValues_Method Public Shared Sub Main() Dim wc As WebClient = New WebClient Dim nvc As NameValueCollection = New NameValueCollection nvc.Add("firstname", "Fadi") nvc.Add("lastname", "Abdel-qader") Dim response As Byte() = wc.UploadValues("http://localhost/mypage.aspx", nvc) Console.WriteLine(Encoding.ASCII.GetString(response)) End Sub End Class

Page 171: Ip معلومات حول

171

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

: : HttpWebRequest Class استخدام - 1

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

Port ورقم الProxy Serverالـوالتي نمرر فيها عنوان : Web Proxyالـ استخدام خاصية -1 Firewall أو Proxy Serverمن خلف HTTP Web Requestsالـحتى نستطيع التعامل مع

:الـ آما يلي آمثProxy Server Prosperityالـويتم تعريف :#C

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; }

} VB.NET: Imports System Imports System.Net Class ProxyServer_Property Public Shared Sub Main() Dim hwr As HttpWebRequest = CType(WebRequest.Create("http://www.google.com"), HttpWebRequest) Dim proxysrv As WebProxy = New WebProxy("http://proxy1.server.net:8080") hwr.Proxy = proxysrv End Sub End Class

Classالـ من WebProxy Object ثم نعرف HttpWebRequest Objectالـنعرف في البداية webProxy الـ ونسند له عنوانProxy Serverـ ورقم الPortى وبعد ذلك نستطيع إسناده إل

التي تكون موجودة عادة في جميع Proxy باستخدام الخاصية Objectأي HttpWebRequest Objects..

Page 172: Ip معلومات حول

172

Streamsالـ باستخدام Server إلى الويب بياناتال إلرس HttpWebrequestالـ استخدام -2 :الوتستخدم آما يلي آمث

:#C HttpWebrequest hwr = (HttpWebRequest)WebRequest.Create("http://localhost"); Stream strm = hwr.GetRequestStream(); StreamWriter sw = new StreamWriter(strm); sw.WriteLine(data);

VB.NET: Dim hwr As HttpWebrequest = CType(WebRequest.Create("http://localhost"), HttpWebRequest) Dim strm As Stream = hwr.GetRequestStream Dim sw As StreamWriter = New StreamWriter(strm) sw.WriteLine(data)

Requestالـ ونسند له Stream Object نقوم بتعريف HttpWebRequest Objectالـبعد تعريف

Stream الميثودل خال من GetRequestStream. : HttpWebResponse Class استخدام - 2

Clientالـ إلى Server إلرجاع بيانات من الويب HttpWebResponse Objectالـ تستخدم لهذه العملية وال BeginGetResponse و الميثود GetResponseحيث نستخدم الميثود

تعتبر BeginGetResponse سوى أن Methodالـيوجد فرق في وظيفة هذه asynchronous Method.

: وهي Propertiesالـعلى عدد من HttpWebResponse Objectالـيحتوي 1- CharacterSet : الـوتستخدم لتحديد نوعCharacter Set 2- ContentEncoding : الـوتستخدم لعمليةencoding 3- ContentLength : معرفة حجم الردوتستخدم ل 4- ContentType : الـلتحديد نوعRespone 5- Cookies : الـلتعامل معCookiesستخدامها يجب أوال إنشاء ملف ولCookie فارغ

:الوتعريفه آما يلي آمث

:#C HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create( 4Hhttp://www.amazon.com); hwr.CookieContainer = new CookieContainer();

:ثم نسنده إليه آما يلي HTTP Requestالـوذلك قبل HttpWebResponse hwrsp = (HttpWebResponse)hwr.GetResponse(); hwrsp.Cookies = hwr.CookieContainer.GetCookies(hwr.RequestUri);

Page 173: Ip معلومات حول

173

VB.NET: Dim hwr As HttpWebRequest = CType(WebRequest.Create("http://www.amazon.com"), HttpWebRequest) hwr.CookieContainer = New CookieContainer Dim hwrsp As HttpWebResponse = CType(hwr.GetResponse, HttpWebResponse) hwrsp.Cookies = hwr.CookieContainer.GetCookies(hwr.RequestUri)

6- Headers : الـلمعرفةHTTP Headers 7- LastModified : تعديل يرجع فيه وقت وتاريخ أخر 8- Method : الـلمعرفة الميثود والتي تستخدم فيHTTP Response 9 – ProtocolVersion : الـلمعرفةHTTP Version

10 – ResponseUri : الـURLالخاص ب Server

11 – Server : ـلمعرفة اسم الServer

12 – StatusCode : الـلمعرفة نوعCodingمستخدمل ا

13 – StatusDescription : إلرجاعText الـ يحتوي على حالةHTTP

في بيئة الدوت نيت وطرق التعامل مع HTTPبينا في هذا الفصل آيفية برمجة الـ سوف ، في بيئة الدوت نيت HttpWebResponse والـHttpWebRequest الـ

وطرق التعامل معه في XML والـ Web Servicesنتحدث في الفصل التالي عن .ئة الدوت نيتبي

Page 174: Ip معلومات حول

174

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 13 Web Services & XML Programming

- Introduction to Web services & XML - Create A Simple Web Service Application - Advanced Remotting & Web Services Programming

Page 175: Ip معلومات حول

175

13 :Web Services Programming

web serverالـ وبينا فيه آيفية التفاعل بين HTTPالـ السابق عن برمجة الجزءتحدثنا في webالـتتلخص وظيفة استخدام ، مكمل لما تحدثنا عنه سابقاالجزء ويعتبر هذا clientالـو

servicesالـة من بإمكانية االستفادMethodsالـ الموجودة بweb server داخل برنامج الزبون يتم نقل Simple Object Access Protocol وهو اختصار ل SOAPالـوباستخدام برتوآول

XML - extensibleالـ بعد تحويلها إلى Clientالـ إلى web Services serverالـ من ResultالـMarkup Languageالـرتوآول حيث تنقل عبر بHTTP إلى جهاز الزبون والهدف من

firewalls من خالل ال Clientالـ إلى web serverالـ من Dataالـاستخدامه هو تسهيل وصول والذي يعمل على HTTPالـوالبيئات المختلفة إذ أن جميع بيئات الشبكات تدعم برتوآول

HTMLالـ نفس القواعد في إذ تستخدمHTMLالـ عن XMLالـوال تختلف لغة . Port 80الالآن تتميز بمرونة اآبر > <> /<الـ مثل Attributes الـ و Elementsوهي مجموعة من ال

:وآمثال عليها <myStuff> <myName>FADI Abdel-qader</myName> <myTelephone>+962796...</myTelephone> <myEmail>[email protected]</myEmail> <myAge>23</myAge> <mySex>M</mySex> </myStuff>

حيث يتم قراءتها Name Spaces System.xml ويتم استدعائها في الدوت نيت باستخدام

: آما يلي XmlDocument Class الـ الموجود في Loadباستخدام الميثود

:#C using System.Xml; // Then you can Read any XML File as Below: XmlDocument xDoc = new XmlDocument(); xDoc.Load(@"C:\myinfo.xml"); XmlNodeList name = xDoc.GetElementsByTagName("myName"); XmlNodeList telephone = xDoc.GetElementsByTagName("myTelephone"); XmlNodeList email = xDoc.GetElementsByTagName("myEmail"); XmlNodeList age = xDoc.GetElementsByTagName("myAge"); XmlNodeList sex = xDoc.GetElementsByTagName("mySex");

MessageBox.Show(

"Name: " + name[0].InnerText +"\n"+ "Telephone: " + telephone[0].InnerText +"\n"+

"Email: "+ email[0].InnerText +"\n"+ "Age: "+ age[0].InnerText +"\n"+

"sex: "+ sex[0].InnerText +"\n"

Page 176: Ip معلومات حول

176

VB.NET: Dim xDoc As XmlDocument = New XmlDocument xDoc.Load("C:\myinfo.xml") Dim name As XmlNodeList = xDoc.GetElementsByTagName("myName") Dim telephone As XmlNodeList = xDoc.GetElementsByTagName("myTelephone") Dim email As XmlNodeList = xDoc.GetElementsByTagName("myEmail") Dim age As XmlNodeList = xDoc.GetElementsByTagName("myAge") Dim sex As XmlNodeList = xDoc.GetElementsByTagName("mySex") Msgbox("Name: " + name(0).InnerText + "" & Microsoft.VisualBasic.Chr(10) & "" + "Telephone: " + telephone(0).InnerText + "" & Microsoft.VisualBasic.Chr(10) & "" + "Email: " + email(0).InnerText + "" & Microsoft.VisualBasic.Chr(10) & "" + "Age: " + age(0).InnerText + "" & Microsoft.VisualBasic.Chr(10) & "" + "sex: " + sex(0).InnerText + "" & Microsoft.VisualBasic.Chr(10) & "")

: بثالثة مراحل وهي web servicesالـتمر عملية استخدام

1- The web service server : والذي يتم من خالله إرسال واستقبال البيانات عبر برتوآول .ASP.NETالـ وIISالـ باستخدام SOAPالـ2- The proxy object : والذي يسمح للClient بإرسال و استقبال البيانات من وإلى من خالل الكالس HttpWebRequestالـ حيث يتم تعريفه في web Services Serverالـ

WebProxy السابقالجزءوهو ما بينته في . 3- The client application : الـوهو الواجهة الخاصة بزبون والتي يتم ربطها بWeb Services

Server :آما في الشكل التالي

Page 177: Ip معلومات حول

177

جديد Web Services ASP.NET نقوم بعمل مشروعweb services serverوإلنشاء WebService ثم نقوم بتوريث الكالس Name Spaces System.Web.Servicesونستدعي

:للكالس الرئيسي للمشروع وآما يلي آمثال:#C

using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols;

[WebService(Namespace = "http://my_url.com/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Service : System.Web.Services.WebService { public Service () {} [WebMethod] public int Add(int a, int b) { return a + b; } }

VB.NET: Imports System Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols <WebService(Namespace="http://my_url.com/")> _ <WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)> _ Public Class Service Inherits System.Web.Services.WebService Public Sub New() End Sub <WebMethod()> _ Public Function Add(ByVal a As Integer, ByVal b As Integer) As Integer Return a + b End Function End Class

Page 178: Ip معلومات حول

178

وبعد ذلك يقوم بإرجاع ناتج جمع القيمة األولى مع القيمة B و Aحيث يتم استقبال قيمتين وآما يظهر في الشكل SOAPالـ باستخدام برتوآول XML على شكلClientالـالثانية إلى

: التالي

Clientالـ و إرفاقه بDll File يجب أوال تحويل الكالس السابق إلى Clientالـوإلنشاء برنامج Resources ويتم استخدامه آما يلي :

:#C using System; class Client_side { public static void Main(string[] argv) { My_main_class mm = new My_main_class(); int x = Convert.ToInt16(argv[0]); int y = Convert.ToInt16(argv[1]); int sum = mm.Add(x, y); Console.WriteLine(sum); } } }

Page 179: Ip معلومات حول

179

VB.NET: Class Client_side Public Shared Sub Main(ByVal argv As String()) Dim mm As My_main_class = New My_main_class Dim x As Integer = Convert.ToInt16(argv(0)) Dim y As Integer = Convert.ToInt16(argv(1)) Dim sum As Integer = mm.Add(x, y) Console.WriteLine(sum) End Sub End Class

، في بيئة الدوت نيت Web services مع الـ وهكذا بينا األساسيات وطرق التعامل وطرق التعامل معه في بيئة SMTP & POP3سيتم الحديث في الفصل التالي عن

.الدوت نيت

Advaced Remotting & Web Services Programming ستجد آافة تفاصيل هذا الموضوع في النسخة الورقية من الكتاب

لعناوين اجى االتصال على احد لطلب أ واالستفسار أو التوزيع ير التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

الموقع الرسمي للكتاب

5Hwww.fadidotnet.org

Page 180: Ip معلومات حول

180

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 14 SMTP & POP3 Programming

- SMTP Protocol

1. SMTP Concept 2. Using SMTP in Dot Net 3. Advanced SMTP Programming

- POP3 Protocol

1. POP3 Concept 2. Using POP3 in Dot Net

Page 181: Ip معلومات حول

181

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

14 :Programming3 POP& SMTP من Domain والمسئول عن عملية ترجمة DNS السابق عن برمجة برتوآول الجزءتحدثنا في

في هذا ، وبالعكس وبينا آيفية القيام بهذه العملية في سي شارب IPاسم نطاق إلى وهما Application Layerلـا سوف نتحدث عن برمجة بعض البروتوآوالت األخرى لطبقة الجزء والمسئول عن POP3الـ والمسئول عن إرسال الرسائل عبر البريد اإللكتروني و SMTPالـهنا

وفي Mail Serverالـ لها من Downloadعملية توصيل الرسالة إلى الزبون من خالل عمل ي والذي يستخدم بشكل أساسHTTP Programming ـ الالحق سوف نتحدث عن الالجزء

مع العلم انه يوجد بروتوآوالت آثيرة سوف آتي على شرحها عند ، Webالـفي تصفح ..الحاجة

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

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

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

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

الرسالةMUA- Message User Agent الرسالة في والمسئول عن عملية قراءة و تخزينDatabase

POP - Post Office Protocol وتتم هذه العملية باستخدام بروتوآول Clientلدى المستقبل :انظر إلى الشكل التالي

Page 182: Ip معلومات حول

182

MTAالـ بشكل أساسي في SMTP Simple Mail Transfer Protocolالـو يستخدم برتوآول . الرسائل Incoming وتوصيل Outgoingأي عمليات إرسال

الخاص بك Internet Providerالـ من SMTPلتطبيق يجب أوال التأآد من أنك تملك حساب

الموجود مع Outlook Expressالـ الخاص بك من خالل برنامج Accountالـتستطيع تجربة Virtual تستطيع تجربة البرنامج من خالل إنشاء SMTP إذا آنت ال تملك حساب Windowsالـ

SMTP Serverالـريق عن طIIS وذلك بتثبيتها من :Control Panel >> Add/Remove Programs الـ تأآد من تفعيل آل منIISالـ وSMTP آما في الشكل التالي :

: آما في الشكل التالي IISالـ من Serverثم إعداد ال

و Name Space System.Web.Mail من خالل SMTPالـ تدعم الدوت نيت استخدام بروتوآول والتي تستخدم Send والتي من خاللها نستخدم الميثود SmtpMailتحتوي على الكالس و تعتبر الميثود SMTP المخصص لبروتوآول Port وهو الPort 25إلرسال الرسالة عبر ال

Send " overloaded Method " حيث تأخذ عدة أشكال إذ بإمكانك استخدامها مع براميتر : وبشكل افتراضي نستخدم البرامترات التالية ، اراميترات واحد إلى أربعة ب

SmtpMail.Send(string from, string to, string subject, string body)

Page 183: Ip معلومات حول

183

البراميتر األول يوضع فيه عنوان المرسل والثاني يوضع فيه عنوان المرسل إليه و البراميتر . الثالث لعنوان الرسالة والرابع لنص الرسالة

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

Name قم بإدراج Mail.إذا لم تظهر لديك ( ، Name Space System.Web.Mailثم قم بإضافة

Space System.Web الـ إلىReferences ( ثم قم بكتابة الكود التالي:

هذا في بداية البرنامجName Spaceال تنسى إضافة :#C

using System.Web.Mail; VB.NET: imports System.Web.Mail;

ثم آتابة الكود هذا في زر اإلرسال

:#C 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); }

Page 184: Ip معلومات حول

184

VB.NET: Try Dim from As String = textBox1.Text Dim to As String = textBox2.Text Dim subject As String = textBox3.Text Dim body As String = textBox4.Text SmtpMail.SmtpServer = textBox5.Text SmtpMail.Send(from, to, subject, body) Catch ex As Exception Msgbox(ex.Message) End Try

:مالحظة هامة جدا آر في آما ذIISالـ من SMTPالـالآن يجب التأآد من تفعيل ، هذا الكود يعمل بشكل جيد

SMTP Virtualوالذي تم تعريفه مسبقا في (SMTPالـ الخاص ب IPالسابق وقم بوضع Server( الـبTextbox SMTP Server ، الـيجب التأآد أيضا منSMTP Server لديك يدعم

وإال سوف CDO2 - Microsoft Collaboration Data Objects Version 2 استخدام المكتبة في العادة يتم ، CDO2 Object يخبرك بأنه ال يستطيع الوصول إلى Exceptionتحصل على

SMTPالـ وتعمل بشكل افتراضي عند تثبيت Windows 2000 و Windows XPاستخدمها مع Virtual Server أو مع Microsoft Exchange Server2003 أما إذا آنت تستخدم Exchange

Version 5 الـ فسوف تحصل على 5.5 أوException السابق الذآر .

SMTP Advanced Programming: الجزء األآثر تقدموفي العادة ، CDO2 باستخدام SMTPيعتبر المثال السابق مثال بسيط إلرسال رسائل عبر

باإلضافة إال إمكانية HTML Formatالـ يتم استخدام Outlookالـعند إنشاء برامج مثل برنامج عطيك عدة خيارات إلرسال و استقبال البريد اإللكتروني هل إرسال ملحقات وطبعا ي

وهنا سوف نقوم بإنشاء برنامج بسيط يقوم بإرسال ... POP3الـ أو HTTPالـباستخدام فيجب أن POP3الـ بنسبة الستخدام POP3 و SMTPالـواستقبال البريد اإللكتروني باستخدام

Microsoft Exchange أن تقوم بتثبيت الخاص بك أوISPالـ من POP3يتوفر لديك حساب Server2003 الـ على جهازك وإعداده بحيث يستخدمPOP3 إذ عندها سوف تحتاج لوجود

Domain Controller مثبت على الجهاز و Windows 2003 Server باإلضافة إلى تثبيت . عليهActive Directoryال

Name Spaceوذلك من خالل قدمت الدوت نيت دعم ممتاز الستخدام هذه الخواص System.Web.Mail وباستخدام الكالس MailMessage الـ لدعمHTML Format و الكالس

MailAttachment الـ لدعم إمكانية إرسال ملحقات مع الرسالة والآن لبرمجةPOP3 يلزم حيث يتم عمل System.IO و System.Net و Name Space System.Net.Socketsاستخدام

Sessionخاص مع ال Server للقيام بعملية تفحص وجود رسائل جديدة وفي حالة وجودها حسب الحاجة وعند الضغط على إحداها يقوم Treelist أو List Boxيقوم بتعبئتها في

Advanced SMTP eMail ولعمل Mail Serverالـ لرسالة من Download بعمل ClientالـSender قم بأخذ Object من الكالس MailMessage آما يلي :

:#C 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;

Page 185: Ip معلومات حول

185

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);} VB.NET: imports System.Web.Mail; Try Dim mm As MailMessage = New MailMessage mm.From = textBox1.Text mm.To = textBox2.Text 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 ex As Exception Msgbox(ex.Message) End Try

وهذا يمكنك من وضع أي لون أو حجم أو أي HTMLالـالحظ أن جسم الرسالة يستخدم آود ولجعل البرنامج قادر على إرسال ملحقات يجب ، HTMLالـشيء يمكن عمله باستخدام

: وإدراج اسم الملف فيه وآما يلي بالكود MailAttachmentاستخدام الكالس :#C

MailAttachment myattach = new MailAttachment("Your_Attached_File_path.extension", MailEncoding.Base64);

وغيرها Designطبعا عملية ال، بشكل آامل SMTPالـوهنا قد انتهينا من عمل برنامج .تعتمد على حسب ذوق وذآاء وخبرة المبرمج

VB.NET: Dim myattach As MailAttachment = New MailAttachment("Your_Attached_File_path.extension", MailEncoding.Base64)

Page 186: Ip معلومات حول

186

Programming 3 Post Office Protocol Version -3POP : ثانيا

MUA - Mail Userالـ والذي يعمل في جزء POP3الـآما تحدثنا سابقا فإن وظيفة برتوآول Agent على Port 110 الـ ضمن برتوآولTCP تكمن في آونه المسئول عن عملية توصيل

حيث تحفظ Mail Serverالـ لها من Download من خالل عمل Clientالرسالة إلى الزبون : أنظر إلى الشكل التاليClientالـ والموجود أساسا في جهاز Mail Folderالـل في الرسائ

فمن خالله Interactive Mail Access Protocol – IMAP برتوآول POP3ومن البدائل لل وليس في Mail serverالـ خاصة به والآن في Mail Folderيستطيع المستخدم إنشاء

وسيئاته بنفس الوقت إذ أن قراءة الرسالة تتم IMAPالـهذه من ميزات جهاز الزبون وتعتبر والآن المشكلة فيه Client حيث تستطيع قراءتها من أآثر من Serverالـمباشرة من خالل

إذ تكون Mail Folderالـ بحجم Mail Server Administratorهي تحكم مدير خادم الرسائل : ى الشكل التالي في العادة سعتها محدودة أنظر إل

من Authentication ويتم قراءته بعد التحقق Mail Server يقع ضمن Mail Folderالـالحظ أن

Mailالـاسم المستخدم وآلمة المرور الآن آما قلنا فإن مشكلته تكمن في محدودية سعة Folder الـ لذا ينصح لشرآات الكبيرة استخدامPOP3يتحكم آونه غير محدود السعة فالذي

. بهاMail Server Administrator وال دخل ل Clientالـفي السعة هو

لعملية قراءة الرسائل سوف نبدأ ببرمجته إذ يلزم األمر POP3الـوبما أننا قررنا اعتماد حيث يتم عمل System.IO و System.Net و Name Space System.Net.Socketsاستخدام

Sessionخاص مع ال Serverالـتخدام باسSocket للقيام بعملية تفحص وجود رسائل جديدة خاص حسب الحاجة وعند Treelist أو List Boxوفي حالة وجودها يقوم بتعبئة عناوينها في

Page 187: Ip معلومات حول

187

Mailالـ إلى Mail Serverالـ لرسالة من Download بعمل Clientالـالضغط على إحداها يقوم Folder ثم عرضها في Textbox.

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

: التالية Name Spacesثم قم بإضافة :#C

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

VB.NET: imports System.Net imports System.Net.Sockets imports System.IO

باستخدام Server مع ال Session إلنشاء Streamالـ وSocketالـالحظ انه يتم التعامل مع

.POP3 Serverالـ وقراءة الرسالة من TCPالـبرتوآول

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

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

Page 188: Ip معلومات حول

188

VB.NET: Public Server As TcpClient Public NetStrm As NetworkStream Public RdStrm As StreamReader Public Data As String Public szData As Byte() Public CRLF As String = "" & Microsoft.VisualBasic.Chr(13) & "" & Microsoft.VisualBasic.Chr(10) & ""

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

// create server POP3 with port 110 Port عبر الServerإلنشاء سيشن مع البوب // 110 المخصص وهو Server = new TcpClient(POPServ.Text,110); try { // initialization NetStrm = Server.GetStream(); RdStrm= new StreamReader(Server.GetStream()); Status.Items.Add(RdStrm.ReadLine()); // Login Process Serverإدخال اسم المستخدم وآلمة المرور وتمريرها إلى البوب //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

STAT األمر م باستخداPOP3 Serverلمعرفة عدد الرسائل الموجودة في 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();

Page 189: Ip معلومات حول

189

VB.NET: Server = New TcpClient(POPServ.Text, 110) NetStrm = Server.GetStream RdStrm = New StreamReader(Server.GetStream) Status.Items.Add(RdStrm.ReadLine) 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) Data = "STAT" + CRLF szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray) NetStrm.Write(szData, 0, szData.Length) Status.Items.Add(RdStrm.ReadLine) Data = "QUIT" + CRLF szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray) NetStrm.Write(szData, 0, szData.Length) Status.Items.Add(RdStrm.ReadLine) NetStrm.Close RdStrm.Close

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

:#C 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());}

Page 190: Ip معلومات حول

190

VB.NET: Dim szTemp As String Message.Clear Try Data = "RETR 1" + CRLF szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray) NetStrm.Write(szData, 0, szData.Length) szTemp = RdStrm.ReadLine If Not (szTemp(0) = "-"C) Then While Not (szTemp = ".") Message.Text += szTemp + CRLF szTemp = RdStrm.ReadLine End While Else Status.Items.Add(szTemp) End If Catch err As InvalidOperationException Status.Items.Add("Error: " + err.ToString) End Try

وبرمجته في الدوت نت وهذا مثال بسيط 3وهنا قد قمت بشرح آيفية عمل البوب

الخاص بميكروسوفت Outlookالـتستطيع البدء منه لعمل مشروع آامل شبيه بائل الخاص باإلنترنت إآسبلورر لعرض الرسDLLالـحيث تستطيع استخدام ملف

Tree List آما تستطيع عمل HTML Codeالواردة بدال من عرضها على شكل لوضع الرسائل الواردة حيث يكون لكل رسالة رقم تسلسلي يتم وضعه في الكود

بشكل افتراضي والذي يقوم بقراءة 1السابق لقراءتها حيث استخدمت الرقم ، الرسالة األخيرة الواردة

وطرق التعامل معه في بيئة الدوت FTPالتالي عن الـ سيتم الحديث في الفصل

.نيت

Page 191: Ip معلومات حول

191

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 15 FTP Programming

- Introduction to FTP – File Transfer Protocol

- Create a Simple Application to Transfer Files By Using COM Components

- Create a Simple Application to Transfer Files By Using Web Classes Components

- Create a Simple Application to Transfer Files By Using Socket Programming & Streaming Libraries

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

Page 192: Ip معلومات حول

192

15 File Transfer Protocol Programming–FTP :

FTPالـ وهو برتوآول Application Layerالـسوف نبدأ هنا بشرح برتوآول أخر من برتوآوالت

الملفات uploadingو رفع downloadingوالذي يستخدم بشكل أساسي في عملية تنزيل التي تعتمد على وجود وآالعادة في اغلب برمجيات الشبكات وFTP Serverالـمن و إلى

Client/Serverحيث يقوم ال Serverبتصنت على ال Port المخصص لل FTPوهو ال Port 21 بوضع االنتظار لورود Serverحيث يبقى الTCP Connection Oriented Protocolالـباستخدام والتأآد Authentication معه وبعد إجراء عمليات التحقق Session بإنشاء Clientالـطلب من

والذي سوف Portمن الصالحيات يتم الموافقة على البدء بالجلسة حيث يتم تحديد رقم ال Server في الPort 20يتم استقبال البيانات من خالله ويتم اإلرسال إلى جهاز الزبون عبر ال

: وتتضح هذه العملية آما في الشكل التالي

يجب أوال التأآد من FTP Serverحيث يعمل جهازك ك لديك بFTPالـ لتفعيل خدمة :مالحظة : و آما يظهر في الشكل التالي IISالـ مثبتة لديك مع FTP Servicesالـأن

Page 193: Ip معلومات حول

193

ثم Administrative Tools ثم Control Panel من Servicesومن ثم التأآد من تفعيلها ب Services وآما يظهر في الشكل التالي :

: بحيث يظهر آما في الشكل التالي IISالـه في ثم التأآد من

Page 194: Ip معلومات حول

194

FTP Commands: أوال إلى حد آبير حيث يدعم برتوآول Telnetالـ عملية FTPتشبه عملية االتصال و االستخدام لل

أو مع Server مجموعة من األوامر والتي يتم من خاللها عملية التخاطب مع الFTPالـ :العملية آما في الشكل التالي وتضح هذه Remote Hostالـ

:Commands FTPالـوهنا شرح ألهم

USER <username> & PASS <password>

مطلوبة لعملية التحقق إلنشاء الجلسة

RECV أو RETR <filename> ويستخدم لتنزيل ملف من الServer بعد تحديد اسم الملف

SEND أو STOR <filename> لملف إلى الويستخدم لرفع اServer بعد تحديد اسم الملف

TYPE <type indicator> لتحديد طبيعة أو هيئة البيانات التي يتم :نقلها وآما يلي

-a ASCII –e EBCDIC – I for Binary Data - L<Byte Size>والذي سيتم نقله

Page 195: Ip معلومات حول

195

PASV لتحديد نوع الجلسة سواءPassive أو Active لـا إذ انه في حالةPassive يتم تفعيل

االتصال فقط في حالة ورود أو رفع أي ملف .Serverمن و إلى ال

Status أو STAT لفحص حالة االتصال وuploading & Downloading

Delete , cd , mkdir , rename … وهي آما هو متعارف عليه في التعامل مع DOSالـالملفات و المجلدات في نظام

Close أو QUIT الـإلنهاء الجلسة معRemote Host

:COM Components في الدوت نيت باستخدام FTPالـالتعامل مع : ثانيا وهو جزء من ITC – Internet Transfer Control عبر FTPالـتدعم الدوت نيت استخدام

في آماNew Windows Application وللبدء قم بإنشاء COM Components Controlsالـ :الشكل التالي

: التالية Name Spacesثم قم بإضافة :#C

using System.IO; using System.Reflection;

VB.NET: imports System.IO imports System.Reflection

:Upload Buttonالـثم إضافة الكود التالي إلى :#C

private void button1_Click(object sender, System.EventArgs e) {

FileInfo thisFile = new FileInfo(tbFile.Text); Type ITC;

object[] parameter= new object[2]; object ITCObject;

ITC = Type.GetTypeFromProgID("InetCtls.Inet"); ITCObject = Activator.CreateInstance(ITC);

parameter[0] = (string)tbServer.Text; parameter[1] = (string)"PUT " + thisFile.FullName + " /" + thisFile.Name; ITC.InvokeMember("execute", BindingFlags.InvokeMethod,null, ITCObject, parameter);}

Page 196: Ip معلومات حول

196

VB.NET: Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim thisFile As FileInfo = New FileInfo(tbFile.Text) Dim ITC As Type Dim parameter(2) As Object Dim ITCObject As Object ITC = Type.GetTypeFromProgID("InetCtls.Inet") ITCObject = Activator.CreateInstance(ITC) parameter(0) = CType(tbServer.Text, String) parameter(1) = CType("PUT ", String) + thisFile.FullName + " /" + thisFile.Name ITC.InvokeMember("execute", BindingFlags.InvokeMethod, Nothing, ITCObject, parameter) End Sub

Name Spaceموجود ضمن والType Class من خالل ال ITCالـتم في البداية تعريف

System.Reflection ثم عرفنا Array من النوع Object وذلك الستخدامها في تمرير اسم ITC Controlالـ والموجودة ضمن InvokeMember إلى الميثود FTP Serverالـالملف و Object ...

:سوف تجد الملف الذي سيتم رفعه في المجلد C:\Inetpub\ftproot

Page 197: Ip معلومات حول

197

: Web Classالـ في الدوت نيت باستخدامFTPالـالتعامل مع : ثالثا Name Spaces System.Net والموجودة ضمن web Class باستخدام FTPالـيمكن برمجة

webResponseالـ و WebRequestوتشبه عملية التعامل معه آما في التعامل مع الClasses الـي تعاملنا معها في برمجة التوHTTP حيث يمكننا االستفادة منها لتعامل مع

: وهي آما يلي FTP Protocolالـ - WebClient إذ تم دعم dot net Framework 2 استخدام الكالس WebClient والذي يدعم

آما ويتم تعريفه Name Spaces System.Net والذي يتم استدعائه من FTPالـالتعامل مع :يلي

:#C using System; using System.Net;

namespace Web_Client { class Program { public static void Main(string[] args) { string filename = "ftp://ms.com/files/dotnetfx.exe"; WebClient client = new WebClient(); client.DownloadFile(filename, "dotnetfx.exe");

}

} }

VB.NET: Imports System Imports System.Net Namespace Web_Client Class Program Public Shared Sub Main(ByVal args As String()) Dim filename As String = "ftp://ms.com/files/dotnetfx.exe" Dim client As WebClient = New WebClient client.DownloadFile(filename, "dotnetfx.exe") End Sub End Class End Namespace

Page 198: Ip معلومات حول

198

- FtpRequestCreator الـلتسجيل وبدأ العمل مع ويستخدمFTP ويعرف آما يلي :

:#C using System; using System.Net;

namespace FTP { public class FtpRequestCreator : IWebRequestCreate { public FtpRequestCreator() { }

public System.Net.WebRequest Create(System.Uri uri) { return new FtpWebRequest(uri); } } }

VB.NET: Imports System Imports System.Net Namespace FTP Public Class FtpRequestCreator Implements IWebRequestCreate Public Sub New() End Sub Public Function Create(ByVal uri As System.Uri) As System.Net.WebRequest Return New FtpWebRequest(uri) End Function End Class End Namespace

- FtpWebRequest ويستخدم لعمل download or upload a file on an FTP server ويتم

:تعريفها آما يلي

:#C using System; using System.Net;

namespace FTP { public class FtpWebRequest : WebRequest { private string username = "Fadi"; internal string password = "fff";

Page 199: Ip معلومات حول

199

private Uri uri; private bool binaryMode = true; private string method = "GET";

internal FtpWebRequest(Uri uri) { this.uri = uri; }

public string Username { get { return username; } set { username = value; } }

public string Password { set { password = value; } }

public bool BinaryMode { get { return binaryMode; } set { binaryMode = value; } }

public override System.Uri RequestUri { get { return uri; } }

public override string Method { get { return method; } set { method = value; } }

public override System.Net.WebResponse GetResponse() { FtpWebResponse response = new FtpWebResponse(this); return response; } } }

Page 200: Ip معلومات حول

200

VB.NET: Imports System Imports System.Net Namespace FTP Public Class FtpWebRequest Inherits WebRequest Private username As String = "Fadi" Friend password As String = "fff" Private uri As Uri Private binaryMode As Boolean = True Private method As String = "GET" Friend Sub New(ByVal uri As Uri) Me.uri = uri End Sub Public Property Username() As String Get Return username End Get Set(ByVal value As String) username = value End Set End Property Public WriteOnly Property Password() As String Set(ByVal value As String) password = value End Set End Property Public Property BinaryMode() As Boolean Get Return binaryMode End Get Set(ByVal value As Boolean) binaryMode = value End Set End Property Public Overloads Overrides ReadOnly Property RequestUri() As System.Uri Get Return uri End Get End Property Public Overloads Overrides Property Method() As String Get Return method End Get

Page 201: Ip معلومات حول

201

Set(ByVal value As String) method = value End Set End Property Public Overloads Overrides Function GetResponse() As System.Net.WebResponse Dim response As FtpWebResponse = New FtpWebResponse(Me) Return response End Function End Class End Namespace

- FtpWebResponseويستخدم لعملية الرد من قبل ال Server ويتم تعريفها آما يلي :

:#C using System; using System.IO; using System.Net; using System.Net.Sockets;

namespace FTP { public class FtpWebResponse : WebResponse { private FtpWebRequest request; private FtpClient client;

internal FtpWebResponse(FtpWebRequest request) { this.request = request; } } }

Page 202: Ip معلومات حول

202

VB.NET: Imports System Imports System.IO Imports System.Net Imports System.Net.Sockets Namespace FTP Public Class FtpWebResponse Inherits WebResponse Private request As FtpWebRequest Private client As FtpClient Friend Sub New(ByVal request As FtpWebRequest) Me.request = request End Sub End Class End Namespace

- FtpWebStream الـ ويستخدم لتعريفStream والذي سوف يستخدم لعملية النقل ويعرف

:بشكل مبدئي آما يلي

:#C using System; using System.IO; using System.Net.Sockets;

namespace FTP { internal class FtpWebStream : Stream { private FtpWebResponse response; private NetworkStream dataStream;

public FtpWebStream(NetworkStream dataStream, FtpWebResponse response) { this.dataStream = dataStream; this.response = response; } } }

Page 203: Ip معلومات حول

203

VB.NET: Imports System Imports System.IO Imports System.Net.Sockets Namespace FTP Friend Class FtpWebStream Inherits Stream Private response As FtpWebResponse Private dataStream As NetworkStream Public Sub New(ByVal dataStream As NetworkStream, ByVal response As FtpWebResponse) Me.dataStream = dataStream Me.response = response End Sub End Class End Namespace

باستخدام Server جهاز إلىClientمثال تطبيقي لرفع ملف من جهاز : رابعا : Socketالـ وStreamالـ

Stream Libraryالـ وبتعامل مع Client / Serverفي هذا الجزء سوف نقوم بإنشاء برنامجين و Socketالـ باستخدام Streamالـ و إرساله عبر Byte Arrayسوف نقوم بتحويل الملف إلى

TCP Connection ، الـل أو ولبرمجة الجزء الخاص باإلرساClientآما قم بإنشاء مشروع جديد :في الشكل التالي

: التالية Name Spacesسوف نستخدم :#C

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

VB.NET: imports System.IO imports System.Net imports System.Net.Sockets imports System.Text

Page 204: Ip معلومات حول

204

: قم بكتابة الكود التالي Send Buttonالـفي :#C

try { Stream fileStream = File.OpenRead(textBox1.Text); // Alocate memory space for the file byte[] fileBuffer = new byte[fileStream.Length]; fileStream.Read(fileBuffer, 0, (int)fileStream.Length); // Open a TCP Connection and send the data TcpClient clientSocket = new TcpClient(textBox2.Text,8880); NetworkStream networkStream = clientSocket.GetStream(); networkStream.Write(fileBuffer,0,fileBuffer.GetLength(0)); networkStream.Close(); } catch (Exception ex){MessageBox.Show(ex.Message);}

VB.NET: Try Dim fileStream As Stream = File.OpenRead(textBox1.Text) Dim fileBuffer(fileStream.Length) As Byte fileStream.Read(fileBuffer, 0, CType(fileStream.Length, Integer)) Dim clientSocket As TcpClient = New TcpClient(textBox2.Text, 8880) Dim networkStream As NetworkStream = clientSocket.GetStream networkStream.Write(fileBuffer, 0, fileBuffer.GetLength(0)) networkStream.Close Catch ex As Exception Msgbox(ex.Message) End Try

وحتى نستطيع Stream Objectملف الذي نود إرساله وتخزينه ب قمنا في البداية بقراءة ال

وقمنا بتسميته ب Byte البد من تحويله إلى مصفوفة من النوع Socketالـإرساله عبر fileBuffer ثم تعبئته باستخدام الميثود Read والموجودة ضمن fileStream وبعد ذلك قمنا

حيث تم إرسال محتويات TCP Connectionالـ باستخدام Serverالـبإنشاء اتصال مع ...NetworkStream Class باستخدام Serverالـ إلى fileBufferالـ

وهو المسئول عن استقبال الملف وتخزينه قم بإنشاء مشروع جديد Serverولبرمجة جزء :آما يظهر في الشكل التالي

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

Page 205: Ip معلومات حول

205

:#C using System.Threading; using System.Net; using System.Net.Sockets; using System.Text; using System.IO;

VB.NET: imports System.Threading imports System.Net imports System.Net.Sockets imports System.Text imports System.IO

:وآما يلي handlerThread وليكن اسمها التالية Methodالـإضافة ثم

:#C public void handlerThread() { Socket handlerSocket = (Socket)alSockets[alSockets.Count-1]; NetworkStream networkStream = new

NetworkStream(handlerSocket); int thisRead=0; int blockSize=1024; Byte[] dataByte = new Byte[blockSize]; lock(this) { // Only one process can access // the same file at any given time Stream fileStream = File.OpenWrite(@"c:\upload");

while(true)

{ thisRead=networkStream.Read(dataByte,0,blockSize); fileStream.Write(dataByte,0,thisRead); if (thisRead==0) break; fileStream.Close();

} lbConnections.Items.Add("File Written");

handlerSocket = null; }

Page 206: Ip معلومات حول

206

VB.NET: Public Sub handlerThread() Dim handlerSocket As Socket = CType(alSockets(alSockets.Count - 1), Socket) Dim networkStream As NetworkStream = New NetworkStream(handlerSocket) Dim thisRead As Integer = 0 Dim blockSize As Integer = 1024 Dim dataByte(blockSize) As Byte SyncLock Me Dim fileStream As Stream = File.OpenWrite("c:\upload") While True thisRead = networkStream.Read(dataByte, 0, blockSize) fileStream.Write(dataByte, 0, thisRead) If thisRead = 0 Then ' break End If fileStream.Close() End While lbConnections.Items.Add("File Written") handlerSocket = Nothing End SyncLock End Sub

وهو Port 8880 على الTCP Connectionثم قم بكتابة ميثود أخرى جديدة وذلك لفتح

:وآما يلي listenerThread وليكن اسمها افتراضي والتصنت عليها

:#C public void listenerThread() {

TcpListener tcpListener = new TcpListener(8880); tcpListener.Start();

while(true) {

Socket handlerSocket = tcpListener.AcceptSocket(); if (handlerSocket.Connected)

{ lbConnections.Items.Add(handlerSocket.RemoteEndPoint.ToString() + "

connected."); lock (this)

{ alSockets.Add(handlerSocket);

} ThreadStart thdstHandler = new

ThreadStart(handlerThread); Thread thdHandler = new Thread(thdstHandler); thdHandler.Start();

} }

}

Page 207: Ip معلومات حول

207

VB.NET: Public Sub listenerThread() Dim tcpListener As TcpListener = New TcpListener(8880) tcpListener.Start() While True Dim handlerSocket As Socket = tcpListener.AcceptSocket If handlerSocket.Connected Then lbConnections.Items.Add(handlerSocket.RemoteEndPoint.ToString + " connected.") SyncLock Me alSockets.Add(handlerSocket) End SyncLock Dim thdstHandler As ThreadStart = New ThreadStart(handlerThread) Dim thdHandler As Thread = New Thread(thdstHandler) thdHandler.Start() End If End While End Sub

:Form Loadثم قم بإضافة الكود التالي إلى حدث بدأ تشغيل البرنامج

:#C private void Form1_Load(object sender, System.EventArgs e) { IPHostEntry IPHost = Dns.GetHostByName(Dns.GetHostName());

lbConnections.Text = "My IP address is " + IPHost.AddressList[0].ToString();

alSockets = new ArrayList();

Thread thdListener = new Thread(new ThreadStart(listenerThread)); thdListener.Start();}

Page 208: Ip معلومات حول

208

VB.NET: Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim IPHost As IPHostEntry = Dns.GetHostByName(Dns.GetHostName) lbConnections.Text = "My IP address is " + IPHost.AddressList(0).ToString alSockets = New ArrayList Dim thdListener As Thread = New Thread(New ThreadStart(listenerThread)) thdListener.Start() End Sub

والتي قمنا فيها بتعريف listenerThread Method الـ تم تنفيذ Threadالـباستخدام Clientالـ حيث سيتم قبول أي طلب يأتي من Port 8880 وتفعيله على الtcpListenerالـ

والتي سيتم فيها استقبال handlerThreadدعاء الميثود وبعد ذلك استPortعلى هذا ال ثم قراءتها وتخزينها في المكان المحدد وباستخدام Byte Array وتخزينها في Stream Dataالـ الـ وthisRead والذي يحتوي على اسم الملف Streamالـ حيث مررنا له fileStream.Writeالـ

dataByte Array ...

، وطرق برمجته في بيئة الدوت نيت FTPقة عمل بروتوآول الـ وهكذا بينا طري .Network Security Programmingسيتم الحديث في الجزء التالي عن الـ

Page 209: Ip معلومات حول

209

Chapter16 Cryptography & Hashing Overview Chapter17 Socket Permissions Chapter18 Packet Sniffer & Row Programming Overview

Part 5 Network Security Programming

Page 210: Ip معلومات حول

210

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 16 Network Security Programming & Cryptography

- Cryptography in Dot Net - Hashing In Dot Net - Digital Signature Algorithms

Page 211: Ip معلومات حول

211

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

16 : Network Security Programming:

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

:باستخدام عدة أساليب وأهمها

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

Securityـباستخدام ال أساليب الحماية التي ذآرناها سابقادعمت في الدوت نيت جميع

Namespaces وهي آما في والتي تحتوي على مجموعة ضخمة من المكتبات الفرعية يالشكل التال

: Overview NamespaceCryptography :أوال

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

ستطيع تقسيم طرق التشفير ون، البيانات قبل عملية اإلرسال وفك تشفيرها عند االستالم :فيها إلى ثالثة أقسام رئيسية هي

A- Symmetric algorithms: وفيه يستخدم المفتاح السري ذاته األسلوب المتماثل

لعملية التشفير وفك التشفير وهي طريقة سريعة إلجراء عملية التشفير وفك التشفير ال وت نيت التشفير المتماثل بمجموعة من آنها ليست آمنة آطريقة الغير المتماثلة ودعمت الد

: وهيClasses Algorithmsالـ : DES-Data Encryption Standard الكالس الذي يدعم التشفير باستخدام ال-

DESCryptoServiceProvider RC2 Algorithms : RC2CryptoServiceProvider الكالس الذي يدعم - Algorithms Rijndael Managed : RijndaelManaged الكالس الذي يدعم-

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

ات لمحاولة فك الشيفرة البيانات مما يؤدي إلى فقد الرسالة أو قد تسرق وتجرى عليها عمليوتم حل هذه ..Network Bandwidthالـناهيك عن الحجم الهائل التي قد تحجزه من

نفسه ويستخدم لهذه Streamالـالمشكلة بجعل عملية التشفير تتم على مستوى حيث يتم استخدام مفتاحين لتشفير مفتاح التشفير CryptoStream Classالـالعملية

Encryption Kayمفتاح لفك التشفير وIV Installation Victor Decryption ويشترط استخدام نفس المفتاحين في عملية التشفير وفك التشفير ويستخدم الكالس السابق مع

ونوع التشفير سواء Stream Dataالـ حيث نمرر له FileStream أو MemoryStreamالـDES أو TripleDES أوRC2 ، ـالوآمثال سوف نستخدمTripleDES إذيجب أن يتكون آال

...Bits 16المفتاحين من

Page 212: Ip معلومات حول

212

Symmetric Stream Encryption Example:

:#C byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16}; byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16}; string phrase = msg.Text; MemoryStream ms = new MemoryStream(); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); CryptoStream csw = new CryptoStream(ms,tdes.CreateEncryptor(Key, IV), CryptoStreamMode.Write); csw.Write(Encoding.ASCII.GetBytes(phrase), 0, phrase.Length); csw.FlushFinalBlock(); byte[] cryptdata = ms.GetBuffer(); textBox1.Text=Encoding.ASCII.GetString(cryptdata, 0, (int)ms.Length);

VB.NET: Dim Key As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16} Dim IV As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16} Dim phrase As String = msg.Text Dim ms As MemoryStream = New MemoryStream() Dim tdes As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() Dim csw As CryptoStream = New CryptoStream(ms, tdes.CreateEncryptor(Key, IV), CryptoStreamMode.Write) csw.Write(Encoding.ASCII.GetBytes(phrase), 0, phrase.Length) csw.FlushFinalBlock() Dim cryptdata As Byte() = ms.GetBuffer() textBox1.Text=Encoding.ASCII.GetString(cryptdata, 0, CInt(ms.Length))

Page 213: Ip معلومات حول

213

Symmetric Stream Decryption Example:

:#C byte[] Keyy = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16}; byte[] IVv = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16}; ms.Position = 0; byte[] data = new byte[1024]; CryptoStream csr = new CryptoStream(ms,tdes.CreateDecryptor(Keyy, IVv),CryptoStreamMode.Read); int recv = csr.Read(data, 0, data.Length); string newphrase = Encoding.ASCII.GetString(data, 0, recv);

textBox1.Text=newphrase; VB.NET: Dim Keyy As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16} Dim IVv As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16} ms.Position = 0 Dim data As Byte() = New Byte(1023) {} Dim csr As CryptoStream = New CryptoStream(ms, tdes.CreateDecryptor(Keyy, IVv), CryptoStreamMode.Read) Dim recv As Integer = csr.Read(data, 0, data.Length) Dim newphrase As String = Encoding.ASCII.GetString(data, 0, recv) textBox1.Text=newphrase

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

Socketالـ إلرسالها عبر Streamاألساليب السابقة لتشفير ثم نحول البيانات المشفرة إلى ثم يقوم الطرف المستقبل باستقبال الرسالة باستخدام ، Network Streamالـباستخدام

مية عملية فك التشفير تكون آما هي الخوارز ، Socketالـ عبر Network Streamالـ عندها يمكن Byte Array وتخزن في memory streamالـالمستخدمة ثم تحمل الرسالة إلى

: أن تحول إلى رسالة مرة أخرى وآما في الشكل التالي

Page 214: Ip معلومات حول

214

B- Asymmetric algorithms: األسلوب الغير متماثل وهو أآثر أمانا من األسلوب ولفك التشفير يستخدم مفتاح Public Kay المتماثل إذ تشفر البيانات باستخدام مفتاح عام

لتشفير وهو أفضل Bits 128ويكون هناك عالقة بين المفتاحين ويستخدم Private Kayخاص أساليب التشفير للبيانات ودعمت الدوت نيت التشفير الغير متماثل والذي يدعم تشفير

:ي وهTow Algorithms Classes باستخدام Private Kayالمفتاح الخاص 1- DSACryptoServiceProvider for Digital Signature Algorithm

وآمثال يقوم التحقق من هوية الشخص مرسل الرسالةوالهدف منها :التواقيع الرقمية وبعد ذلك يقوم بتشفير ملخص Hash Functionالمرسل بتوليد ملخص لرسالة باستخدام اللخاص والذي سيستخدم آتوقيع رقمي للمرسل ثم الرسالة الذي تم توليده لتكوين المفتاح ا

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

لم هي نفسها التي ولدها فإذا آان ملخص الرسالة التي ولدها المست، في تشفير الملخص .المرسل عندها يتحقق من أن الشخص مرسل الرسالة هو نفسه

لتوليد المفتاح العام DSACryptoServiceProviderالـ من instance ننشئفي البداية سوف hash sign ولفحصه نولد Byte Array ونخزنه في Hash sign Valueالـثم نكون والخاص

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

:#C using System; using System.Security.Cryptography; class DSACSPSample { static void Main() { try { //Create a new instance of DSACryptoServiceProvider to generate //a new key pair. DSACryptoServiceProvider DSA = new DSACryptoServiceProvider(); //The hash value to sign. byte[] HashValue = {59,4,248,102,77,97,142,201,210,12,224,93,25,41,100,197,213,134,130,135}; //The value to hold the signed value. byte[] SignedHashValue = DSASignHash(HashValue, DSA.ExportParameters(true), "SHA1"); //Verify the hash and display the results. if(DSAVerifyHash(HashValue, SignedHashValue, DSA.ExportParameters(false), "SHA1")) {Console.WriteLine("The hash value was verified.");} else {Console.WriteLine("The hash value was not verified.");}} catch(ArgumentNullException e) {Console.WriteLine(e.Message);} } public static byte[] DSASignHash(byte[] HashToSign, DSAParameters DSAKeyInfo, string HashAlg)

Page 215: Ip معلومات حول

215

{ try { //Create a new instance of DSACryptoServiceProvider. DSACryptoServiceProvider DSA = new DSACryptoServiceProvider(); //Import the key information. DSA.ImportParameters(DSAKeyInfo); //Create an DSASignatureFormatter object and pass it the //DSACryptoServiceProvider to transfer the private key. DSASignatureFormatter DSAFormatter = new DSASignatureFormatter(DSA); //Set the hash algorithm to the passed value. DSAFormatter.SetHashAlgorithm(HashAlg); //Create a signature for HashValue and return it. return DSAFormatter.CreateSignature(HashToSign); } catch(CryptographicException e) {Console.WriteLine(e.Message);return null;} } VB.NET: Imports System Imports System.Security.Cryptography Friend Class DSACSPSample Shared Sub Main() Try 'Create a new instance of DSACryptoServiceProvider to generate 'a new key pair. Dim DSA As DSACryptoServiceProvider = New DSACryptoServiceProvider() 'The hash value to sign. Dim HashValue As Byte() = {59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135} 'The value to hold the signed value. Dim SignedHashValue As Byte() = DSASignHash(HashValue, DSA.ExportParameters(True), "SHA1") 'Verify the hash and display the results. If DSAVerifyHash(HashValue, SignedHashValue, DSA.ExportParameters(False), "SHA1") Then Console.WriteLine("The hash value was verified.") Else Console.WriteLine("The hash value was not verified.") End If Catch e As ArgumentNullException Console.WriteLine(e.Message)

Page 216: Ip معلومات حول

216

End Try End Sub Public Shared Function DSASignHash(ByVal HashToSign As Byte(), ByVal DSAKeyInfo As DSAParameters, ByVal HashAlg As String) As Byte() Try 'Create a new instance of DSACryptoServiceProvider. Dim DSA As DSACryptoServiceProvider = New DSACryptoServiceProvider() 'Import the key information. DSA.ImportParameters(DSAKeyInfo) 'Create an DSASignatureFormatter object and pass it the 'DSACryptoServiceProvider to transfer the private key. Dim DSAFormatter As DSASignatureFormatter = New DSASignatureFormatter(DSA) 'Set the hash algorithm to the passed value. DSAFormatter.SetHashAlgorithm(HashAlg) 'Create a signature for HashValue and return it. Return DSAFormatter.CreateSignature(HashToSign) Catch e As CryptographicException Console.WriteLine(e.Message) Return Nothing End Try End Function

:#C

public static bool DSAVerifyHash(byte[] HashValue, byte[] SignedHashValue, DSAParameters DSAKeyInfo, string HashAlg) {

try {

//Create a new instance of DSACryptoServiceProvider. DSACryptoServiceProvider DSA = new DSACryptoServiceProvider(); //Import the key information. DSA.ImportParameters(DSAKeyInfo); //Create an DSASignatureDeformatter object and pass it the //DSACryptoServiceProvider to transfer the private key. DSASignatureDeformatter DSADeformatter = new DSASignatureDeformatter(DSA); //Set the hash algorithm to the passed value. DSADeformatter.SetHashAlgorithm(HashAlg); //Verify signature and return the result. return DSADeformatter.VerifySignature(HashValue, SignedHashValue); } catch(CryptographicException e){Console.WriteLine(e.Message);return false;}}}

Page 217: Ip معلومات حول

217

VB.NET: Public Shared Function DSAVerifyHash)ByVal HashValue As Byte () ، ByVal SignedHashValue As Byte () ، ByVal DSAKeyInfo As DSAParameters ،ByVal HashAlg As String (As Boolean Try 'Create a new instance of DSACryptoServiceProvider. Dim DSA As DSACryptoServiceProvider = New DSACryptoServiceProvider() 'Import the key information . DSA.ImportParameters(DSAKeyInfo( 'Create an DSASignatureDeformatter object and pass it the 'DSACryptoServiceProvider to transfer the private key. Dim DSADeformatter As DSASignatureDeformatter = New DSASignatureDeformatter(DSA( 'Set the hash algorithm to the passed value. DSADeformatter.SetHashAlgorithm(HashAlg( 'Verify signature and return the result . Return DSADeformatter.VerifySignature(HashValue, SignedHashValue( Catch e As CryptographicException Console.WriteLine(e.Message( Return False End Try End Function 2- RSACryptoServiceProvider

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

العام والخاص ونرفق المفتاح العام مع الرسالة ومن ثم يقوم المستلم بفك الرسالة : الشكل التاليباستخدام المفتاح الخاص وتتم آما في

Page 218: Ip معلومات حول

218

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

using System; using System.Security.Cryptography; using System.Text; class RSACSPSample { static void Main() { try { //Create a UnicodeEncoder to convert between byte array and string. UnicodeEncoding ByteConverter = new UnicodeEncoding(); //Create byte arrays to hold original, encrypted, and decrypted data. byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt"); byte[] encryptedData; byte[] decryptedData; //Create a new instance of RSACryptoServiceProvider to generate //public and private key data. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); //Pass the data to ENCRYPT, the public key information //(using RSACryptoServiceProvider.ExportParameters(false), //and a boolean flag specifying no OAEP padding. encryptedData = RSAEncrypt(dataToEncrypt,RSA.ExportParameters(false), false); //Pass the data to DECRYPT, the private key information //(using RSACryptoServiceProvider.ExportParameters(true), //and a boolean flag specifying no OAEP padding. decryptedData = RSADecrypt(encryptedData,RSA.ExportParameters(true), false); //Display the decrypted plaintext to the console. Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData)); } catch(ArgumentNullException) {Console.WriteLine("Encryption failed.");} }

Page 219: Ip معلومات حول

219

VB.NET: Imports System Imports System.Security.Cryptography Imports System.Text Friend Class RSACSPSample Shared Sub Main() Try 'Create a UnicodeEncoder to convert between byte array and string. Dim ByteConverter As UnicodeEncoding = New UnicodeEncoding() 'Create byte arrays to hold original, encrypted, and decrypted data. Dim dataToEncrypt As Byte() = ByteConverter.GetBytes("Data to Encrypt") Dim encryptedData As Byte() Dim decryptedData As Byte() 'Create a new instance of RSACryptoServiceProvider to generate 'public and private key data. Dim RSA As RSACryptoServiceProvider = New RSACryptoServiceProvider() 'Pass the data to ENCRYPT, the public key information '(using RSACryptoServiceProvider.ExportParameters(false), 'and a boolean flag specifying no OAEP padding. encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(False), False) 'Pass the data to DECRYPT, the private key information '(using RSACryptoServiceProvider.ExportParameters(true), 'and a boolean flag specifying no OAEP padding. decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(True), False) 'Display the decrypted plaintext to the console. Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData)) Catch e1 As ArgumentNullException Console.WriteLine("Encryption failed.") End Try End Sub

Page 220: Ip معلومات حول

220

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

static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) { try{ //Create a new instance of RSACryptoServiceProvider. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); //Import the RSA Key information. This only needs //to include the public key information. RSA.ImportParameters(RSAKeyInfo); //Encrypt the passed byte array and specify OAEP padding. //OAEP padding is only available on Microsoft Windows XP or //later. return RSA.Encrypt(DataToEncrypt, DoOAEPPadding); } //Catch and display a CryptographicException //to the console. catch(CryptographicException e){Console.WriteLine(e.Message);return null;} } VB.NET: Shared Public Function RSAEncrypt)ByVal DataToEncrypt As Byte () ، ByVal RSAKeyInfo As RSAParameters ،ByVal DoOAEPPadding As Boolean (As Byte() Try 'Create a new instance of RSACryptoServiceProvider. Dim RSA As RSACryptoServiceProvider = New RSACryptoServiceProvider() 'Import the RSA Key information. This only needs 'to include the public key information. RSA.ImportParameters(RSAKeyInfo( 'Encrypt the passed byte array and specify OAEP padding . 'OAEP padding is only available on Microsoft Windows XP or 'later . Return RSA.Encrypt(DataToEncrypt, DoOAEPPadding( 'Catch and display a CryptographicException 'to the console. Catch e As CryptographicException Console.WriteLine(e.Message( Return Nothing End Try End Function

Page 221: Ip معلومات حول

221

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

:#C static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo,bool DoOAEPPadding) { try { //Create a new instance of RSACryptoServiceProvider. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); //Import the RSA Key information. This needs //to include the private key information. RSA.ImportParameters(RSAKeyInfo); //Decrypt the passed byte array and specify OAEP padding. //OAEP padding is only available on Microsoft Windows XP or //later. return RSA.Decrypt(DataToDecrypt, DoOAEPPadding); } //Catch and display a CryptographicException //to the console. catch(CryptographicException e){Console.WriteLine(e.ToString());return null;} }} VB.NET: Shared Public Function RSADecrypt)ByVal DataToDecrypt As Byte () ، ByVal RSAKeyInfo As RSAParameters ،ByVal DoOAEPPadding As Boolean (As Byte() Try 'Create a new instance of RSACryptoServiceProvider. Dim RSA As RSACryptoServiceProvider = New RSACryptoServiceProvider() 'Import the RSA Key information. This needs 'to include the private key information. RSA.ImportParameters(RSAKeyInfo( 'Decrypt the passed byte array and specify OAEP padding . 'OAEP padding is only available on Microsoft Windows XP or 'later . Return RSA.Decrypt(DataToDecrypt, DoOAEPPadding( 'Catch and display a CryptographicException 'to the console. Catch e As CryptographicException Console.WriteLine(e.ToString(() Return Nothing End Try End Function

Page 222: Ip معلومات حول

222

C - Hashing algorithms: أقوى األساليب البرمجية لتشفير البيانات إذ يستخدم فيه وهو algorithm 512 bits 128بدال من آحد أقصى bits باستخدام Message Digest Algorithms

MACك تشفير الرسالة وإرجاعها إلى حالتها السابقة ويستخدم بشكل وهنا لن تستطيع ف وفي اغلب Digital Signature وفي توليد التواقيع الرقمية Passwordsالـأساسي لتوليد

. بشكل امنDatabaseالـ في Passwordالحاالت تستخدم لتخزين آلمة المرور SHA384Managedالـ وSHA256Managedالـ و SHA1Managedالـويستخدم

ComputeHash Methodالـ ومنه نستخدم Hash Objectلتعريف SHA512Managedالـو : آمثال وآما يليbyte Array وتخزينه في hash codeالـ لتوليد

:#C

SHA1Managed shaM1 = new SHA1Managed (); byte[] my_kay1= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code"); byte[] hashed_kay1 = shaM1.ComputeHash(my_kay1); MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay1)); SHA256Managed shaM2 = new SHA256Managed(); byte[] my_kay2= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code"); byte[] hashed_kay2 = shaM2.ComputeHash(my_kay2); MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay2)); SHA384Managed shaM3 = new SHA384Managed (); byte[] my_kay3= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code"); byte[] hashed_kay3 = shaM3.ComputeHash(my_kay3); MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay3)); SHA512Managed shaM4 = new SHA512Managed (); byte[] my_kay4= ASCIIEncoding.ASCII.GetBytes("convert this text to hash code"); byte[] hashed_kay4 = shaM4.ComputeHash(my_kay4);

MessageBox.Show(ASCIIEncoding.ASCII.GetString(hashed_kay4)); VB.NET: Dim shaM1 As SHA1Managed = New SHA1Managed Dim my_kay1 As Byte() = ASCIIEncoding.ASCII.GetBytes("convert this text to hash code") Dim hashed_kay1 As Byte() = shaM1.ComputeHash(my_kay1) Msgbox(ASCIIEncoding.ASCII.GetString(hashed_kay1)) Dim shaM2 As SHA256Managed = New SHA256Managed Dim my_kay2 As Byte() = ASCIIEncoding.ASCII.GetBytes("convert this text to hash code") Dim hashed_kay2 As Byte() = shaM2.ComputeHash(my_kay2) Msgbox(ASCIIEncoding.ASCII.GetString(hashed_kay2)) Dim shaM3 As SHA384Managed = New SHA384Managed Dim my_kay3 As Byte() = ASCIIEncoding.ASCII.GetBytes("convert this text to hash code") Dim hashed_kay3 As Byte() = shaM3.ComputeHash(my_kay3) Msgbox(ASCIIEncoding.ASCII.GetString(hashed_kay3)) Dim shaM4 As SHA512Managed = New SHA512Managed Dim my_kay4 As Byte() = ASCIIEncoding.ASCII.GetBytes("convert this text to hash code") Dim hashed_kay4 As Byte() = shaM4.ComputeHash(my_kay4) Msgbox(ASCIIEncoding.ASCII.GetString(hashed_kay4))

Page 223: Ip معلومات حول

223

إلجراء عمليات Cryptography وهكذا بينا في هذا الفصل آيفية التعامل مع الـ Hashingآما بينا طرق استخدام الـ ، المرسلة عبر الشبكة Dataالتشفير على الـ

سيتم الحديث في الفصل التالي ، في بيئة الدوت نيت Digital Signatureوالـ .ي بيئة الدوت نيت واستخدامها فSocket Permissionعن الـ

ستجد آافة تفاصيل هذا الموضوع في النسخة الورقية من الكتاب

لعناوين الطلب أ واالستفسار أو التوزيع يرجى االتصال على احد التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

Page 224: Ip معلومات حول

224

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 17 Socket Permissions

- Permission Namespace Overview - Security Action - Socket Access property

Page 225: Ip معلومات حول

225

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

71: Permission Namespace Overview :

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

Socket Permission: الـتمكنك من تحديد صالحيات استخدام وSocketجيات في برم

ضمن SocketPermissionAttribute و SocketPermissionالشبكات باستخدام وآمثال نستطيع منع System.Security.Permissions Namespacesالـ وSystem.Netالـ

Client Host Address الـ معين من االتصال معListener Application ، ويتم ذلك بتعريفAttribute SocketPermissionالـدد فيها نوع العملية و نحAccess Kind الـو عنوانHost الذي

TCP سواء موجه أو غير موجه Transportالـ ونوع Portالـ ورقم Permissionالـسيطبق عليه . UDPأو

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

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

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

Assert : وتعني السماحClient Hostلية محددة معين من إجراء عم Demand : الـوتعني تطبيق الصالحيات على جميعClasses الـ التي تقع في منطقةStack

Defined Abstractالـأعلى Deny : الـوتعني منعClient Hostمن إجراء عملية معينة .

InheritanceDemand : الـوفيها تطبق الصالحيات علىClass الـ الذي سيرثClass .الحالي

PermitOnly : الـوفيه يمنع جميعAccess الـ عداClient Userالمحدد . ...

Page 226: Ip معلومات حول

226

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

Accept لمنع أو السماح ل Client Socket من عمل Binding الـ معIP Address الـ وPort .المحدد

Connect لمنع أو السماح لClient Socket من عمل connect الـ معRemote Host .المحدد

Portالـ و رقم Permissionالـ الذي سيطبق عليه Hostالـ نحدد عنوان Portالـ وHostالـفي

لداللة على تطبيق الصالحية allنستطيع تمرير آلمة Port propertyالـفي ( التي يتصل بها )Portsالـعلى جميع

المستخدم وتأخذ Socketالـ والتي سنعرف فيها نوع Transport propertyلـاوأخيرا نحدد

:الخيارات التاليةAll الـ بدون تحديد نوعSocket الـ إذ تطبق هذهPermession الـ على جميعSocket Types.

Connectionless الـإذا آانتSocket تستخدم Datagram Protocols وآمثال بروتوآول UDP.

ConnectionOriented الـ إذا آانتSocket تستخدم Oriented Protocols وآمثال بروتوآول TCP. TCP تحديده مباشرة إذ تستطيع. UDP إذ تستطيع تحديده مباشرة.

سيتم ، نيت الدوت في بيئة Socket Permissionوهكذا بينا طرق التعامل مع الـ واستخدامها في بيئة الدوت Multithreadingالحديث في الجزء التالي عن الـ

.نيت

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

التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

الموقع الرسمي للكتاب

6Hwww.fadidotnet.org

Page 227: Ip معلومات حول

227

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 18 Packet Sniffer & Row Programming

- Introduction to Row Programming - Create a Packet Sniffer Application - Using ARP,RARP in Security Programming.

Page 228: Ip معلومات حول

228

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

هذا الفصل فقط في النسخة الورقيةلعناوين الطلب أ واالستفسار أو التوزيع يرجى االتصال على احد

التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

الموقع الرسمي للكتاب7Hwww.fadidotnet.org

Page 229: Ip معلومات حول

229

Chapter 19: Multithreading Using & Managing

Part 6 Multithreading

Page 230: Ip معلومات حول

230

Fadi Abdel-qader - Dot Net Networks & TCP/IP Programming

Chapter 19 Multithreading Using & Managing

- Introduction to Threading in Dot Net - Threading Classes & Members - Multithreading & Network Applications

Page 231: Ip معلومات حول

231

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

هذا الفصل فقط في النسخة الورقيةلعناوين الطلب أ واالستفسار أو التوزيع يرجى االتصال على احد

التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

الموقع الرسمي للكتاب8Hwww.fadidotnet.org

Page 232: Ip معلومات حول

232

- System.Net Namespace

- System.Net.Socket Namespace

- System.Threading Namespace - System.Runtime.Remoting - System.Runtime.Serialization

Appendixes

Page 233: Ip معلومات حول

233

1- System.Net Namespace Classes

ومن Web Protocols و Transport Layer و Application Layerوتدعم برمجة :واستخداماتها Classesاهم هذه

Class Description Authorization Provides authentication messaging for a web server. Cookie Provides a set of properties and methods used to manage cookies.

This class cannot be inherited. Dns Simple domain name resolution functionality. EndPoint Identifies a network address. This is an abstract class. GlobalProxySelection Global default proxy instance for all HTTP requests. HttpVersion Defines the HTTP version numbers supported by the

HttpWebRequest and HttpWebResponse classes. HttpWebRequest HTTP-specific implementation of the WebRequest class. HttpWebResponse HTTP-specific implementation of the WebResponse class. IPAddress Internet Protocol (IP) address. IPEndPoint A network endpoint consisting of an IP address and a port

number. IPHostEntry Container class for Internet host address information. NetworkCredential Provides credentials for password-based authentication schemes

such as basic, digest, NTLM, and Kerberos authentication. SocketAddress Stores serialized information from EndPoint-derived classes. SocketPermission Controls rights to make or accept socket connections. WebClient Provides common methods for sending data to and receiving data

from a resource identified by a URI. WebException The exception that is thrown when an error occurs while

accessing resources via the HTTP protocol. WebPermission Controls rights to access HTTP Internet resources. WebPermissionAttribute Specifies permission to access Internet resources. WebProxy Contains HTTP proxy settings for the WebRequest class. WebRequest Makes a request to a Uniform Resource Identifier (URI). This

class is abstract. WebResponse Provides a response from a Uniform Resource Identifier (URI).

This class is abstract.

Page 234: Ip معلومات حول

234

2- System.Net.Socket Namespace Classes

TCP & UDP وخاصة Transport Layerالـوترآز بشكل اساسي على برمجة Socket Ptogramming ـال ومن اهمClassesالتي تدعمها :

Class Description LingerOption Contains information about the amount of time it will remain available

after closing with the presence of pending data (the socket's linger time). MulticastOption Contains IP address values for IP multicast packets. NetworkStream Provides the underlying stream of data for network access. Socket Implements the Berkeley sockets interface. SocketException The exception that is thrown when a socket error occurs. TcpClient Provides client connections for TCP network services. TcpListener Listens for connections from TCP network clients. This is essentially the

TCP server class. UdpClient Provides User Datagram Protocol (UDP) network services.

Page 235: Ip معلومات حول

235

3- System.Threading Namespace Classes

المستخدمة في sessionالـ منفصلة عن Session لعمل Threadingالـيستخدم مجموعة System.Threadingوتدعم Asynchronousالبرنامج وهو اسلوب اخر لل

: وهي آما يليThreadingالـ والتي تستخدم في ادارة عمليات Classesالـمن Class Description AutoResetEvent This event notifies one or more waiting threads that an

event has occurred. Interlocked This class protects against errors by providing atomic

operations for variables that are shared by multiple threads.

ManualResetEvent This event occurs when notifying one or more waiting threads that an event has occurred.

Monitor This class provides a mechanism that synchronizes access to objects.

Mutex A synchronization primitive that grants exclusive access to a shared resource to only one thread. It can also be used for inter-process synchronization.

ReaderWriterLock This class defines a lock that allows single-writer and multiple-reader semantics.

RegisteredWaitHandle This class represents a handle that has been registered when calling the RegisterWaitForSingleObject() method.

SynchronizationLockException This exception is thrown when a synchronized method is invoked from an unsynchronized block of code.

Thread This class creates and controls a thread, sets its priority, and gets its status.

ThreadAbortException This exception is thrown when a call is made to the Abort() method.

ThreadExceptionEventArgs This class provides data for the ThreadException event. ThreadInterruptedException This exception is thrown when a thread is interrupted

while it is in a waiting state. ThreadPool This class provides a pool of threads that can be used to

post work items, process asynchronous I/O, wait on behalf of other threads, and process timers.

ThreadStateException This is the exception that is thrown when a thread is in an invalid state for the method call.

Timeout This class simply contains a constant integer used when we want to specify an infinite amount of time.

Timer This class provides a mechanism for executing methods at specified intervals.

WaitHandle This class encapsulates operating system-specific objects that wait for exclusive access to shared resources.

Page 236: Ip معلومات حول

236

: في الدوت نيت Threadingالـ التي تستخدم في ادرارة Methodsالـاهم

Public Method Name Description Abort() This overloaded method raises a ThreadAbortException in the

thread on which it is invoked, to begin the process of terminating the thread. Calling this method usually terminates the thread.

AllocateDataSlot() This static method allocates an unnamed data slot on all the threads.

AllocateNamedDataSlot() This static method allocates a named data slot on all threads. FreeNamedDataSlot() This static method frees a previously allocated named data slot. GetData() This static method retrieves the value from the specified slot on

the current thread, within the current thread's current domain. GetDomain() This static method returns the current domain in which the

current thread is running. GetDomainID() This static method returns a unique application domain

identifier. GetHashCode() This method serves as a hash function for a particular type,

suitable for use in hashing algorithms and data structures like a hash table.

GetNamedDataSlot() This static method looks up a named data slot. Interrupt() This method interrupts a thread that is in the WaitSleepJoin

thread state. Join() This overloaded method blocks the calling thread until a thread

terminates. ResetAbort() This static method cancels an Abort() requested for the current

thread. Resume() This method resumes a thread that has been suspended. SetData() This static method sets the data in the specified slot on the

currently running thread, for that thread's current domain. Sleep() This static and overloaded method blocks the current thread for

the specified number of milliseconds. SpinWait() This static method causes a thread to wait the number of times

defined by the iterations parameter. Start() This method causes the operating system to change the state of

the current instance to ThreadState.Running. Suspend() This method will either suspend the thread, or if the thread is

already suspended, has no effect.

Page 237: Ip معلومات حول

237

:Threadingالـب الخاصة Proparitesالـومن اهم

Public Property Name

Description

ApartmentState Sets or gets the apartment state of this thread. CurrentContext This static property gets the current context in which the thread is

executing. CurrentCulture Sets or gets the culture for the current thread. CurrentPrincipal This static property sets or gets the thread's current principal. It is

used for role-based security. CurrentThread This static property gets the currently running thread. CurrentUICulture Used at run time, this property sets or gets the current culture used

by the Resource Manager to look up culture-specific resources. IsAlive Gets a value that indicates the execution status of the current thread.IsBackground Sets or gets a value that indicates whether a thread is a background

thread or not. IsThreadPoolThread Gets a value indicating whether a thread is part of a thread pool. Name Sets or gets the name of the thread. Priority Sets or gets a value that indicates the scheduling priority of a thread.ThreadState Gets a value that contains the states of the current thread.

Page 238: Ip معلومات حول

238

...تم بحد اهللا

باستخدام TCP/IPول من آتاب احترف برمجة الشبكات وبروتوآول مجموعة فصC#والـ VB.NET ....

آافة الفصول فقط في النسخة الورقية من الكتاب

الموقع الرسمي للكتاب

9Hwww.fadidotnet.org

My online CV: 10Hhttp://spaces.msn.com/members/csharp2005/

لعناوين الطلب أ واالستفسار أو التوزيع يرجى االتصال على احد التالية

Mobile : +962796284475 Pُhone: +96265055999 E-mail: [email protected] BOX: 311 Mail Code 11947 Tariq—Amman—Jordan

2006األردن ، فادي محمد عبدالقادر ) C(جميع الحقوق محفوظة

With My Best Wishs

FADI Abdel-qader Abdel-qader, Jordan Dot Net Networks & TCP/IP Programming