أحترف برمجة الشبكات والنظم الموزعة

Page 1

‫‪2006‬‬

‫أحترف برمجة الشبكات والنظم الموزعة‬ ‫(النسخة الورقية الكاملة – اإلصدار ‪)6002‬‬

‫‪SocketCoder.COM‬‬


‫اٌشخظخ ‪ٚ‬دم‪ٛ‬ق إٌشش ‪:SCPL – SocketCoder Public License‬‬ ‫‪ 1‬رغّ‪٘ ٝ‬زٖ اٌشخظخ ‪ٚ SCPL – SocketCoder Public License‬ل‪١‬بِه ثزذّ‪ ً١‬أ‪ ٚ‬اعزخذاَ‬ ‫أ‪ِٕ ٞ‬زج ِٓ ِٕزجبد ‪٠ SocketCoder.Com‬ؼزجش ِ‪ٛ‬افمخ ِغجمخ ِٓ لجٍه ثبالٌزضاَ ثزؼٍ‪ّ١‬بد ٘زٖ‬ ‫اٌشخظخ‪.‬‬ ‫‪ 2‬ال ‪ٛ٠‬جذ أ‪ ٞ‬شش‪ٚ‬ؽ رم‪١‬ذ ػٍّ‪١‬خ ر‪ٛ‬ص‪٠‬غ إٌّزجبد اٌخبػؼخ ٌ‪ٙ‬زٖ اٌشخظخ اٌىزش‪١ٔٚ‬ب ع‪ٛ‬اء ِٓ خالي‬ ‫اٌجش‪٠‬ذ اإلٌىزش‪ ٟٔٚ‬أ‪ ٚ‬إٌّزذ‪٠‬بد أ‪ِٛ ٚ‬الغ اإلٔزشٔذ ثششؽ روش اٌّظذس ‪ٚ​ٚ‬ػغ اٌشاثؾ اٌشئ‪١‬غ‪ٌٍّٕ ٟ‬زج‪.‬‬ ‫‪ 3‬رؼزجش جّ‪١‬غ اٌّشبس‪٠‬غ ‪ٚ‬اٌّىزجبد ‪ٚ‬األو‪ٛ‬اد ‪ٚ‬اٌ‪ٛ‬صبئك اٌخبػؼخ ٌ‪ٙ‬زٖ اٌشخظخ ِجبٔ‪١‬خ ثبٌىبًِ‬ ‫ٌأل٘ذاف اٌزؼٍ‪١ّ١‬خ فمؾ ٌزٌه ال ‪ّ٠‬ىٕه اعزخذاِ‪ٙ‬ب ثشىً رجبس‪ ٞ‬د‪ ْٚ‬إرْ ‪ِٛٚ‬افمخ ِٓ إٌبشش‪.‬‬ ‫‪ 4‬أثزذء ِٓ ربس‪٠‬خ ‪ 2009/11/1‬رُ أخؼبع وزبة (ادزشف ثشِجخ اٌشجىبد ‪ٚ‬إٌظُ اٌّ‪ٛ‬صػخ ثبٌذ‪ٚ‬د‬ ‫ٔ‪١‬ذ ‪ )2006‬إٌ‪ ٝ‬سخظخ ‪ٚ SCPL‬ثزٌه ع‪١‬ى‪ ْٛ‬وً ِبف‪ ٟ‬اٌىزبة ِجبٔ‪ ٟ‬ثبٌىبًِ ثشىً أٌىزش‪ٟٔٚ‬‬ ‫‪ٚ‬ثزٌه ال ‪٠‬ذك ٌه ث‪١‬ؼٗ أ‪ ٚ‬ث‪١‬غ جضء ِٕٗ أ‪ ٚ‬إػبدح ؽجبػزٗ ث‪ٙ‬ذف ث‪١‬ؼٗ ثشىً ‪ٚ‬سل‪ ,ٟ‬وزٌه ال ‪٠‬ذك ٌه‬ ‫الزجبط أ‪ ٞ‬جضء ِٕٗ د‪ِ ْٚ‬شاعٍخ إٌبشش ثج‪١‬بْ سغجزه ثزٌه ‪ٚ‬روش اٌّظذس ثشىً اٌزبٌ‪( ٟ‬ادزشف‬ ‫ثشِجخ اٌشجىبد ‪ٚ‬إٌظُ اٌّ‪ٛ‬صػخ ثبٌذ‪ٚ‬د ٔ‪١‬ذ ‪ ,2006‬فبد‪ ٞ‬ػجذ اٌمبدس‪ ,‬إٌبشش‬ ‫‪(SocketCoder.Com‬‬

‫~‪~2‬‬


:‫ي حٌّئٌف‬ٛ‫ك‬ Fadi M. Abdelqader Systems Engineer & Developer www.SocketCoder.Com

-

-

-

:)2009( ٝ‫خ دز‬١‫سل‬ٌٛ‫اٌّؤٌفبد ا‬ Professional Network, Distributed Systems & TCP/IP Programming In .NET Framework 1.1 & 2.0 (2006 Release). :)2009( ٝ‫خ دز‬١ٔ‫خ اٌّجب‬١ٔٚ‫أُ٘ اٌّؤٌفبد اإلٌىزش‬ The SocketCoder e-Reference For Network, Distributed Systems And TCP/IP Programming In .NET 3.5, Arabic (SocketCoder.Com 2009) :)2009( ٌٝ‫خ إ‬١ّ١ٍ‫دخ اٌّظذس ٌأل٘ذاف اٌزؼ‬ٛ‫خ اٌّفز‬١ٔ‫غ اٌّجب‬٠‫ اٌّشبس‬ٚ ‫أُ٘ األثذبس‬ (SocketCoder) RTP Multicasting VOIP Library (June-2008)

-

(SocketCoder) Remote Desktop Controlling System (June 2008)

-

Large set of SCOL (SocketCoder Open License) learning Samples in network programming, conferencing, security & E-Learning Check www.SocketCoder.Com

~3~


‫اٌّمذِخ‪:‬‬ ‫‪ٕ٠‬خلش ٘زح حٌىظخد ِعظُ حألِ‪ٛ‬س حٌّظعٍمش رزشِـش حٌشزىخص رخعظخذحَ ٌغخص‬ ‫حٌذ‪ٚ‬ص ٔ‪١‬ض رؤعٍ‪ٛ‬د عٍظ ‪ٚ‬رغ‪١‬ؾ ار ‪ٕ٠‬ظمً ره ِٓ حٌّغظ‪ ٜٛ‬حٌّزظذة اٌ‪ٝ‬‬ ‫حٌّظ‪ٛ‬عؾ اٌ‪ ٝ‬حٌّظمذَ رؤعٍ‪ٛ‬د ؿّ‪ِّٚ ً١‬ظع‪٠ ٚ ،‬زذأ حٌىظخد رّمذِش عخِش عٓ‬ ‫‪ٚ TCP/IP Models‬ططز‪١‬مخص ‪ Client/Server‬رخعظخذحَ ٌغخص حٌذ‪ٚ‬ص ٔ‪١‬ض‬ ‫وّخ ‪٠ٚ‬لظ‪ ٞٛ‬عٍ‪ ٝ‬ششف ِفظً عٓ ‪Socket Programming‬‬ ‫‪ٚ‬حٌـ‪ٚ Transport Layer Protocols‬حٌـ ‪Network Layer‬‬ ‫‪ٚ Programming‬رٕخء أٔظّش ِظمذِش رخعظخذحَ حٌـ‪ Multicasting‬وؤٔظّش‬ ‫حٌّئطّشحص ‪ٚ‬حٌـ ‪٠ٚ Voice Chat Systems‬لظ‪ ٞٛ‬حٌىظخد عٍ‪ ٝ‬ششف ألُ٘‬ ‫حألِ‪ٛ‬س حٌّظعٍمش رخٌـ ‪ٚ Voice Over IP Programming‬حٌـ ‪TAPI‬‬ ‫‪ٚ Telephony‬رشِـ‪١‬خص حٌـ ‪ٚ Remote Desktop‬أٔظّش حٌظلىُ عٓ رعذ‬ ‫‪ٚ‬غ‪١‬ش٘خ رخإلػخفش اٌ‪ ٝ‬ؽشق طلٍ‪ٚ ً١‬حٌظظٕض عٍ‪ ٝ‬حٌـ ‪ Packets‬حٌّشعٍش‬ ‫رخعظخذحَ حٌـ ‪ٚ Raw Programming‬حٌـ‪ ، Packet Sniffing‬وّخ ‪٠ٚ‬لظ‪ٞٛ‬‬ ‫عٍ‪ ٝ‬ششف ِفظً ألُ٘ رشط‪ٛ‬و‪ٛ‬الص حٌـ ‪ٚ Application Layer‬طظّ‪ٚ ُ١‬‬ ‫رٕخء حٌٕظُ حٌّ‪ٛ‬صعش ‪ٚ‬حعظخذحِخط‪ٙ‬خ ف‪ ٟ‬رشِـ‪١‬خص حٌشزىخص‪ٚ ،‬أخ‪١‬شح ششف‬ ‫ِفظً عٓ ؽشق حٌلّخ‪٠‬ش ‪ٚ​ٚ‬ػع حٌظالك‪١‬خص ‪ٚ‬حٌغ‪١‬خعخص ف‪ ٟ‬رشِـ‪١‬خص‬ ‫حٌشزىخص‪.‬‬

‫~‪~4‬‬


‫لجً اٌجذء ثمشاءح اٌىزبة‪:‬‬ ‫‪٠‬غظخذَ حٌىظخد حٌطش‪٠‬مش حٌّظغٍغٍش ف‪ ٟ‬ؽشف ‪ِٕٚ‬خلشش حٌّ‪ٛ‬حػ‪١‬ع ‪ ٚ‬حألو‪ٛ‬حد ٌزٌه الرذ ِٓ‬ ‫حٌزذء رمشحءس حٌّ‪ٛ‬حػ‪١‬ع رشىً ِظغٍغً ار أٔٗ ‪ٚ‬ف‪ ٟ‬وً فظً ‪٠‬ظُ ششف حألو‪ٛ‬حد حٌـذ‪٠‬ذس‬ ‫فمؾ‪ ،‬وّخ ‪٠ٚ‬ـذ أْ ‪ّ٠‬ظٍه حٌمخسة حألعخع‪١‬خص حٌزشِـ‪١‬ش طلض أ‪ٌ ٞ‬غش ِٓ ٌغخص حٌذ‪ٚ‬ص‬ ‫ٔ‪١‬ض لزً حٌزذء رمشحءس حٌىظخد‪.‬‬ ‫ِب ٘‪ ٟ‬األِ‪ٛ‬س اٌجذ‪٠‬ذح ف‪٘ ٟ‬زا اٌىزبة ‪ِٛ ٛ٘ ٌّٓٚ‬جٗ‪:‬‬ ‫‪٠‬طشف حٌىظخد ِعظُ حٌّ‪ٛ‬حػ‪١‬ع حٌّظعٍمش رزشِـش حٌشزىخص ‪ٚ‬حٌٕظُ حٌّ‪ٛ‬صعش رؤعٍ‪ٛ‬د ِزغؾ‬ ‫ٌٍغخ‪٠‬ش ‪٠ٚ ،‬عظزش حٌىظخد حأل‪ٚ‬ي ‪ٚ‬حٌز‪ٕ٠ ٞ‬خلش حٌّ‪ٛ‬حػ‪١‬ع حٌّظعٍمش رزشِـش رشِـ‪١‬خص‬ ‫حٌّلخدػش حٌظ‪ٛ‬ط‪١‬ش حٌـ ‪ٚ Voice Over IP‬حٌّشث‪١‬ش ‪Video Conference Systems‬‬ ‫‪ٚ‬رٕخء أٔظّش حٌظعٍ‪ ُ١‬حإلٌىظش‪ ٟٔٚ‬عٓ رعذ ‪ Remote eLearning Systems‬طلض‬ ‫ِٕظش حٌذ‪ٚ‬ص ٔ‪١‬ض ‪ ،‬خظض ٘زح حٌىظخد ٌطالد ‪ٚ‬حٌّزشِـ‪ ٓ١‬حٌّ‪ٙ‬ظّ‪ ٓ١‬رّـخي رشِـش‬ ‫حٌشزىخص ‪ٚ‬حٌٕظُ حٌّ‪ٛ‬صعش‪.‬‬

‫~‪~5‬‬


:‫ي‬ٛ‫ٍِخض اٌفظ‬ 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 Part3 Transport & Network Layer Programming: Chapter 6: Transport TCP & UDP (Classes & Members) Chapter 7: Synchronous Socket Programming Chapter 8: Asynchronous Socket Programming Chapter 9: Advanced Multicasting Systems (Architecture & Conference Systems) Chapter 10 VOIP - Voice Over IP Programming Chapter 11 Raw Socket & Packet Sniffing Programming Part4 Application Layer Programming: Chapter 12 DNS Programming Chapter 13 HTTP Programming Chapter 14 Web Services & XML Programming Chapter 15 Remoting & Distributed Systems Programming & Design Chapter 16 SMTP & POP3 Programming Chapter 17 FTP Programming Part5 Network Security Programming: Chapter 18 Cryptography Chapter 19 Socket Permissions Part6 Multithreading Chapter 20 Multithreading (Using & Managing)

~6~


:‫بد‬٠ٛ‫شط اٌّذز‬ٙ‫ف‬ Part 1 Networks & TCPIP Programming Overview: Chapter 1: TCP/IP Layers & Message Encapsulation Overview - TCP/IP Layers Encapsulation Overview - TCP / UDP Connection Establishment - TCP & UDP Header Encapsulation - Using TCP Connection Oriented in Dot Net to Send Unicast Messages - Introduction to Binary Streaming in Dot Net - Using UDP Connectionless in Dot Net to Send Uni & Broadcast Messages Chapter 2: IPv4 & IPv6 Architecture Overview - IPv4 Architecture - Classful IP Address - Unicast IP - Broadcast IP - Multicast IP - CIDR Nation Overview - IPv6 Architecture Overview Chapter 3: IP Multicasting Overview - IP Multicasting Overview - Using IP Multicasting in Dot Net to Create a Multicast Groups Part2 Streaming: Chapter 4: Streaming (Classes & Members) - Stream Classes - Stream Members - Stream Manipulation Chapter 5: Applied Streaming in Dot Net - Create a Simple Remote Control Application Using Stream Reader & Writer Classes - Create a Simple Remote Desktop Application - 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

~7~


Part3 Transport & Network Layer Programming: Chapter 6: Transport TCP & UDP (Classes & Members) - TCP Classes Members - UDP Classes Members Chapter 7: Synchronous Socket Programming - Introduction to Socket Programming - Synchronous Socket Programming - Synchronous Socket Classes & Members Chapter 8: Asynchronous Socket Programming - Asynchronous Socket Class and its members - Applied Asynchronous Socket in Dot Net Chapter 9: Advanced Multicasting Systems - Architecture of Multicast Socket - Using Multicast Socket 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 - The Concept & Requirements of Voice Communication Systems - How to Create a Voice Chat Through Dot Net Using Unmanaged API‟s Functions - Testing UDP Multicasting, TCP and Thinking in SCTP to Transfer Voice Through Networks - How to Create a Voice Conference System Using Microsoft Direct Play 9 - Create an Advanced Video/Voice Conference System By Using API & TAPI Telephony & Managed Socket Library in Dot Net. Chapter 11 Raw Socket & Packet Sniffing Programming - Introduction to Raw Socket & Raw Protocols - Raw Socket Programming o ICMP – Internet Control Message Protocol Programming (Ping & Tracing) o Using ARP Protocol to Get The MAC of a Remote Machine in Dot Net - Introduction to Packet Sniffing Applications

~8~


Part 4 Application Layer Programming: Chapter 12 DNS Programming - Synchronous DNS Members - Asynchronous DNS Members Chapter 13 HTTP Programming - The Concept of HTTP Protocol - Using HTTP in Dot Net - Advanced HTTP Programming - Using HttpWebRequest - Using HttpWebResponse Chapter 14 Web Services & XML Programming - Introduction to Web services & XML - Create A Simple Web Service Application - Create A Simple GIS System Using (ADO.NET With Web Services) Chapter 15 Remoting & Distributed Systems Programming & Design - The Distributed Systems Concept & Design  Design a Distributed eCommerce System by Using ASP.NET and Web Services. - Serialization Programming  The Serialization (Classes & Members)  Using BinaryFormatter & SoapFormatter to Serialize Objects & Images Through Network - Remoting Programming  Remoting (Classes & Members)  Using Remoting Applications in Dot Net  Create an Advanced Distributed eLearning System (Remote Class Room)  Create an Advanced Remote Desktop Application With Remote (Mouse/Keyboard) Control Features Chapter 16 SMTP & POP3 Programming - SMTP Protocol - SMTP Concept - Using SMTP in Dot Net - Advanced SMTP Programming - POP3 Protocol Programming Chapter 17 FTP Programming - Introduction to FTP – File Transfer Protocol - Create a Simple Application to Transfer Files By Using COM - Create a Simple Application to Transfer Files By Using Web Classes - Create a Simple Application to Transfer Files By Using Socket Programming & Streaming Libraries

~9~


Part5 Network Security Programming: Chapter 18 Cryptography - Cryptography in Dot Net:  Symmetric Encryption  DES (Data Encryption Standard)  Asymmetric Encryption  RSA (Rivest Shamir Adleman)  Digital Signature Algorithms  Hashing Algorithms  Using Security Encryption Standards With Network Applications  Create an Advanced RSA Client Server Chat System. Chapter 19 Socket Permissions - Permission Namespace Overview - Security Action - Socket Access property

Part6 Multithreading Chapter 20 Multithreading Using & Managing - Introduction to Threading in Dot Net - Threading Classes & Members - Multithreading & Network Applications Appendixes (A): Network Programming Members - System.Net Namespace - System.Net.Socket Namespace - Socket Option Members - System.Threading Namespace - TAPI Telephony Functions - Remoting TCP / HTTP Channels Members Appendixes (B): ASCII Code Table, References

~01~


Part1

Networks & TCP/IP Programming Overview

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

~00~


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 - Introduction to Binary Streaming in Dot Net - Using UDP Connectionless in Dot Net to Send Uni & Broadcast Messages

~02~


‫‪TCP/IP Layers Encapsulation Overview : 1.1‬‬ ‫ِٓ حٌّعش‪ٚ‬ف أْ حٌشزىش ٘‪ِ ٟ‬ـّ‪ٛ‬عش ِٓ حألؿ‪ٙ‬ضس ِظظٍش ِع رعؼ‪ٙ‬خ عزش ‪ٚ‬ع‪ٍ١‬ش حطظاخي ِع‪ٕ١‬اش‬ ‫‪ٕ٘ ِٓٚ‬خ ع‪ٕ١‬ذسؽ ٌذ‪ٕ٠‬خ حٌظمغ‪ ُ١‬حٌّعش‪ٚ‬ف ٌّٕظّش ‪ٌ OSI‬عٍّ‪١‬ش حالطظخي ‪ٚ‬حٌظ‪ ٟ‬طّش رغزعش ؽزماخص‬ ‫ٌىً ؽزمش ِٕ‪ٙ‬خ ‪ٚ‬ظ‪١‬فش ِع‪ٕ١‬ش ‪٠‬ظُ اػخفظ‪ٙ‬خ وـ‪ Headers‬عٍ‪ ٝ‬حٌز‪١‬خٔخص حٌّشعٍش‪ٚ.‬طُ حخظظخس٘خ اٌا‪ٝ‬‬ ‫خّغش ؽزمخص ف‪ ٟ‬رشط‪ٛ‬و‪ٛ‬ي ‪ٚ TCP/IP‬طز‪ ٓ١‬حٌظ‪ٛ‬سس حٌّشفمش ٘زٖ حٌطزمخص‪:‬‬

‫طزاذأ عٍّ‪١‬اش ط‪١ٌٛ‬اف حٌشعاخٌش حٌّشعاٍش فا‪ ٟ‬حٌاـ ‪ٚ​ٚ Application Layer‬ظ‪١‬فظ‪ٙ‬اخ ٕ٘اخ حٌظعخِاً ِاع‬ ‫حٌشعخٌش ٔفغ‪ٙ‬خ ‪ٚ‬طل‪ٍٙ٠ٛ‬خ ِٓ ط‪١‬غش ٔظ‪١‬ش اٌ‪ّ٠ Data ٝ‬ىٓ اسعخٌ‪ٙ‬خ عزش حٌشزىش ‪ ،‬ففا‪ ٟ‬رشِـ‪١‬اخص‬ ‫حٌذسدشش ‪٠ Chat‬ظُ طل‪ ً٠ٛ‬حٌٕض حٌّىظ‪ٛ‬د اٌ‪ ASCII Code ٝ‬ػاُ اٌا‪ِ ٝ‬ـّ‪ٛ‬عاش ِآ ‪Binary‬‬ ‫‪ Code‬أ‪ ٚ‬حٌـ ‪ Bits‬ط‪ٛ‬ػاع فا‪ِ ٟ‬ظاف‪ٛ‬فش ٌظـ‪١ٙ‬ض٘اخ ‪ٚ‬اسعاخٌ‪ٙ‬خ عزاش ‪ٚ Socket‬حٌاز‪٠ ٞ‬اشرؾ ؽزماش‬ ‫حٌاـ‪ِ Transport Layer‬اع حٌاـ ‪ Network Layer‬أ‪ ٚ‬حٌاـ ‪ٛ٠ٚ Internet Layer‬ػاق حٌشاىً‬ ‫حٌظخٌ‪ ٟ‬ؽز‪١‬عش عًّ حٌـ‪: Socket‬‬

‫~‪~03‬‬


‫ك‪١‬اااغ ‪٠‬اااشرؾ سلاااُ حٌاااـ‪ Port‬حٌّلاااذد فااا‪ِ Transport Layer ٟ‬اااع ‪ Destination IP‬فااا‪ٟ‬‬ ‫‪٠ٚ Network Layer‬م‪ َٛ‬حٌـ‪ Server‬رخٌطشف حٌّمخرً رخٌّ‪ٛ‬حفمش عٍ‪ ٝ‬ؽٍذ حٌاـ‪ٚ Client‬طمظظاش‬ ‫‪ٚ‬ظ‪١‬فاش حٌاـ‪ Socket‬فا‪ ٟ‬حٌاـ‪ Server‬عٍا‪ ٝ‬سراؾ سلااُ حٌاـ‪ِ Port‬اع حٌاـ‪ Socket Option‬حٌظا‪٠ ٟ‬ااظُ‬ ‫طلذ‪٠‬ذ٘خ ػُ حٌزذء رعٍّ‪١‬ش حٌظظٕض عٍ‪ ٝ‬حٌـ‪ Port‬حٌاز‪ ٞ‬طاُ طلذ‪٠‬اذٖ‪ّ٠ٚ ،‬ىآ فا‪٘ ٟ‬ازٖ حٌّشكٍاش ‪ٚ‬ػاع‬ ‫شش‪ٚ‬ؽ ِع‪ٕ١‬ش ٌمز‪ٛ‬ي حٌـٍغش ِؼً عٍّ‪١‬اخص حٌظلماك حٌاـ ‪ Authentication‬أ‪ِ ٚ‬اخ شاخرٗ أ‪ ٚ‬حٌّ‪ٛ‬حفماش‬ ‫رشىً ِزخشش‪.‬‬ ‫ف‪ّٛٔ ٟ‬رؽ ‪ OSI‬طُ طمغ‪ ُ١‬حٌـ ‪ upper Layers‬اٌ‪ ٝ‬ػالػش ؽزمخص‪:‬‬ ‫‪ٌ Application‬ظعخًِ ِع حٌزشٔخِؾ ٔفغٗ أ‪ِ ٚ‬خ ‪٠‬غّ‪User Interface ٝ‬‬ ‫‪ Presentation‬طّؼ‪ ً١‬حٌز‪١‬خٔخص حٌّشعاٍش أ‪ ٚ‬حعاظخذحَ أعاخٌ‪١‬ذ ٌؼاغؾ حٌز‪١‬خٔاخص أ‪ ٚ‬طشاف‪١‬ش٘خ‪ ،‬فا‪ٟ‬‬ ‫حٌااذ‪ٚ‬ص ٔ‪١‬ااض طااظُ عٍّ‪١‬ااش طّؼ‪١‬ااً حٌشعااخٌش رخعااظخذحَ أ‪ِ ٞ‬اآ حٌااـ ‪ Classes‬ػاآّ حٌااـ ‪Encoding‬‬ ‫‪ Class‬ػّٓ حٌـ ‪ٚ System.Text Namespace‬وّؼخي حٌــ‪:ASCIIEncoding Class‬‬ ‫‪C#‬‬ ‫;)(‪String str=Console.ReadLine‬‬ ‫;)(‪ASCIIEncoding asen= new ASCIIEncoding‬‬ ‫;)‪byte[] ba=asen.GetBytes(str‬‬ ‫‪VB.NET‬‬ ‫‪Dim str As String = Console.ReadLine‬‬ ‫‪Dim asen As ASCIIEncoding = New ASCIIEncoding‬‬ ‫)‪Dim ba As Byte() = asen.GetBytes(str‬‬ ‫‪ٚ Session‬ف‪ٙ١‬خ حٌزذء رعٍّ‪١‬ش حٌظخخؽذ ر‪ ٓ١‬حٌـ‪ٙ‬خص‪ٚ ٓ٠‬حٌظعش‪٠‬ف رزعؼ‪ ُٙ‬حٌزعغ )فظق حٌـٍغش(‬ ‫‪ٚ‬طظُ عخدس ف‪ ٟ‬حٌـ‪ TCP‬رّـّ‪ٛ‬عش ِٓ حٌّشحكً طغّ‪ Three Way Hand Shake ٝ‬أِخ ف‪ٟ‬‬ ‫حٌـ‪ UDP‬ف‪١‬ظُ حٌزذء رخإلسعخي د‪ ْٚ‬اؿشحء أ‪ ِٓ ٞ‬عٍّ‪١‬خص حٌظلمك حٌغخرمش…‬ ‫أِخ ف‪ ٟ‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ ‪ TCP/IP‬فىظفخ ر‪ٛ‬ؿ‪ٛ‬د ؽزمش ‪ٚ Application Layer‬حٌظ‪ ٟ‬طم‪ َٛ‬رعًّ‬ ‫حٌطزمخص حٌؼالع حأل‪ ٌٝٚ‬ف‪ ، OSI ٟ‬ف‪٠ Session Layer ٟ‬ظُ حٌظعشف ‪ٚ‬فظق حٌـٍغش رعذس‬ ‫خط‪ٛ‬حص ‪ ٟ٘ٚ‬وّخ ‪:ٍٟ٠‬‬ ‫‪ -1‬اؿشحء حالطظخي حٌّزذث‪ ٟ‬رخٌـ ‪ Server‬عزش حٌـ ‪ٚ IP‬حٌـ ‪ Port‬حٌّلذد ‪ٚ‬رٌه رعذ طلذ‪٠‬ذ عٍّ‪١‬ش‬ ‫حالطظخي ع‪ٛ‬حء عزش حٌـ ‪ UDP‬أ‪ ٚ‬عزش حٌـ ‪.TCP‬‬ ‫‪ -2‬حٌظعش‪٠‬ف رٕفغٗ ‪ٚ‬عًّ حٌـ ‪ Authentication‬ارح ططٍذ حٌـ‪ Server‬رٌه‬ ‫‪ -3‬لز‪ٛ‬ي أ‪ ٚ‬سفغ حٌـٍغش ‪٠ٚ‬ظُ رٌه ربسعخي حٌّ‪ٛ‬حفمش عٍ‪ ٝ‬فظق حٌـٍغش أ‪ ٚ‬سفؼ‪ٙ‬خ‬ ‫‪ -4‬رذأ حٌـٍغش ‪ٚ‬ل‪١‬خَ حٌـ‪ Server‬رعًّ ‪ Listening‬عٍ‪ ٝ‬حٌـ‪ Port‬حٌخخص رخٌزشٔخِؾ‬ ‫‪ٕ٘ٚ‬خ ِؼخي ‪ٛ٠‬ػق عًّ ٘زٖ حٌطزمش رخعظخذحَ حٌـ ‪: TCP Protocol‬‬ ‫‪C#:‬‬ ‫;)‪TcpClient tcpclnt = new TcpClient("192.168.0.2",8001‬‬ ‫‪VB.NET:‬‬ ‫)‪Dim tcpclnt As TcpClient = New TcpClient("192.168.0.2", 8001‬‬ ‫عٕذِخ ‪٠‬ظُ حٌّ‪ٛ‬حفمش عٍ‪ ٝ‬فظق حٌـٍغش ‪ٚ‬حٌزذء رعٍّ‪١‬ش حٌظخخؽذ ‪٠‬م‪ َٛ‬ؿ‪ٙ‬خص حٌّشعً حٌـ ‪Client‬‬ ‫رظلّ‪ ً١‬حٌشعخٌش اٌ‪ ٝ‬حٌطزمش حألخش‪ٕ٘ ٟ٘ٚ ٜ‬خ ؽزمش حٌـ ‪ٚ Transport‬ف‪٘ ٟ‬زٖ حٌطزمش ‪٠‬ظُ طلذ‪٠‬ذ‬

‫~‪~04‬‬


UDP-‫ عزش حٌـ‬ٚ‫ أ‬TCP - Connection Protocol ‫حء عزش‬ٛ‫عش حالطظخي ع‬١‫ؽز‬ ً‫ّ٘خ حٌّشع‬ٚ ٓ١‫ذ ؽشف‬٠‫ظُ طلذ‬٠ ‫ي‬ٚ‫ي حأل‬ٛ‫و‬ٛ‫ط‬ٚ‫ حٌزش‬ٟ‫ فف‬Connectionless Protocol ‫ضس‬ٙ‫ْ حٌطشف حٌّغظمزً وً حألؿ‬ٛ‫ى‬٠ ْ‫ّىٓ أ‬١‫ ف‬UDP ‫ حالطظخي أِخ حٌـ‬Portٚ ً‫حٌّغظمز‬ٚ ‫ع حعظمزخي حٌشعخٌش‬١‫غظط‬٠ Port ‫َ رظظٕض عزش ٘زح حٌـ‬ٛ‫م‬٠ ‫ شخض‬ٞ‫ أْ أ‬ٟٕ‫ع‬٠ ‫٘زح‬ٚ Broadcast ‫ػع‬ٛ‫ظُ رٌه ر‬٠ٚ ،(Group ‫عش‬ّٛ‫ ِـ‬ٌٝ‫ )حإلسعخي ا‬Multicasting‫ّىٓ ِٓ عًّ حٌـ‬٠ ‫ وّخ‬، ‫ش‬١‫ف‬١‫ )ٌّعشفش و‬Socket‫ حٌـ‬ٟ‫ ف‬Port‫ ِع سلُ حٌـ‬Multicast IP‫ حٌـ‬ٚ‫ أ‬Broadcast IP‫حٌـ‬ .(ٟٔ‫ أٔظش حٌفظً حٌؼخ‬Multicast IP ‫حٌـ‬ٚ Broadcast IP ‫حعظخشحؽ حٌـ‬ َٛ‫ماا‬٠ ‫ ؿاخ٘ض‬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 (); VB.NET: 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 ‫خ‬ِٕٙ ‫الص‬ٛ‫و‬ٛ‫ط‬ٚ‫عش ِٓ حٌزش‬ّٛ‫ ِـ‬ٍٝ‫ ع‬Network Layer‫حٌـ‬ ...‫خ الكمخ‬ٙ‫ ششك‬ٍٝ‫ ع‬ٟ‫ٕش عٕؤط‬١‫فش ِع‬١‫ظ‬ٚ ‫خ‬ِٕٙ ً‫ٌى‬ٚ Resolution Protocol ‫غ‬١‫ٌىٓ رخٌعىظ ك‬ٚ ‫ ٔفظ حٌطزمخص‬ٍٝ‫س ع‬ٚ‫َ رخٌّش‬ٛ‫م‬١‫ ف‬Server ‫خص حٌّغظمزً حٌـ‬ٙ‫أِخ رٕغزش ٌٍـ‬ ُ‫ ػ‬Network Layer ‫ حٌـ‬ٌٝ‫ ػُ ا‬Data link Layer ٌٝ‫ي ا‬ٛ‫ ٌظل‬Bits‫غظٍُ وشص حٌشزىش حٌـ‬٠ ASCII ٌٝ‫ ا‬Binary ِٓ ‫ي‬ٛ‫خ طل‬ِٕٙٚ Application Layer‫ ػُ حٌـ‬Transport Layer‫حٌـ‬ ً‫ش طظُ رشى‬١ٍّ‫ فبْ ٘زٖ حٌع‬Stream Classes‫ كخٌش حعظخذحَ حٌـ‬ٟ‫ف‬ٚ Text ٌٝ‫ ا‬ASCII ِٓٚ : Server‫ ِزذأ عًّ حٌـ‬ٌٟ‫د حٌظخ‬ٛ‫ػق حٌى‬ٛ٠ٚ .. ٌٟ‫آ‬

~05~


C#: using System.IO; using System.Net.Sockets; using System.Threading; TcpListener mylistener; NetworkStream myntl; public void Listener() { mylistener = new TcpListener(8001); mylistener.Start(); Socket mysocket; StreamReader str; while (true) { mysocket = mylistener.AcceptSocket(); myntl = new NetworkStream(mysocket); str = new StreamReader(myntl); textbox1.Text = str.ReadToEnd(); } } } VB.NET: Imports System.IO Imports System.Net.Sockets Imports System.Threading Private mylistener As TcpListener Private myntl As NetworkStream Public Sub Listener() mylistener = New TcpListener(8001) mylistener.Start() Dim mysocket As Socket Dim str As StreamReader Do While True mysocket = mylistener.AcceptSocket() myntl = New NetworkStream(s) str = New StreamReader(myntl) textbox1.Text = str.ReadToEnd() Loop End If End Sub

~06~


‫ِالدظخ ٘بِخ جذا‪:‬‬ ‫ع‪ٛ‬ف ‪٠‬ئد‪ ٞ‬حٌـ ‪ٚ Infinity Loop‬حٌز‪ٚ ٞ‬ػعٕخٖ اٌ‪ ٝ‬ط‪ٛ‬لف حٌزشٔخِؾ عٓ حالعظـخرش ‪ٚ‬حٌغزذ أْ‬ ‫حٌـ ‪٠ Loop‬عًّ عٍ‪ٔ ٝ‬فظ حٌـ ‪ٚ Thread‬حٌّخظض ٌٍـ ‪ Form‬ار ٌٓ ‪ٕ٠‬فز ا‪ ٞ‬ش‪ٟ‬ء اال رعذ‬ ‫حٔظ‪ٙ‬خء حٌـ ‪ِ ٛ٘ٚ Loop‬خ ٌٓ ‪٠‬لذع أرذح ار حٔٗ ‪ ،Infinity Loop‬لذِض ٌٕخ حٌذ‪ٚ‬ص ٔ‪١‬ض حٌلً‬ ‫ٌ‪ٙ‬زٖ حٌّشىٍش ‪ ٟ٘ٚ‬رخعظخذحَ طىٕ‪ٌٛٛ‬ؿ‪١‬خ حٌـ ‪ٚ Multithreading‬حٌظ‪ ٟ‬طغّق رخٌّعخٌـش حٌّظ‪ٛ‬حص‪٠‬ش‬ ‫عٍ‪ٔ ٝ‬فظ حٌّعخٌؾ ‪ٚ‬رٌه ِٓ خالي طمغ‪ ُ١‬حٌّ‪ٙ‬خَ عٍ‪ ٝ‬حٌّعخٌؾ ‪ٚ‬عًّ ‪ِٕ Session‬فظٍش ٌىً‬ ‫رشٔخِؾ ‪ِ ٛ٘ٚ‬خ ‪٠‬غّ‪ ٝ‬رخٌـ ‪٘ٚ ..Multitasking‬ىزح ٌٓ ‪٠‬ئػش حٌزشٔخِؾ عٍ‪ِٛ ٝ‬حسد حٌٕظخَ وّخ ٌٓ‬ ‫‪٠‬ئػش حٌـ ‪ Infinity Loop‬عٍ‪ ٝ‬حدحء حٌزشٔخِؾ حٌعخَ حٔظش حٌشىً حٌظخٌ‪: ٟ‬‬

‫الكع حٔٗ لزً اػخفش حٌـ ‪ Thread‬وخْ حٌـ ‪٠ Loop‬عًّ عٍ‪ِٕ ٝ‬طمش حٌـ ‪٘ٚ Global Area‬زح ٘‪ٛ‬‬ ‫عزذ عذَ حالعظـخرش ‪ٚ ،‬رعذ حعظخذحَ حٌـ ‪ Thread‬طُ عًّ ‪ Session‬أ‪ Pipe ٚ‬خخص ٌذحٌش حٌظ‪ٟ‬‬ ‫طلظ‪ ٞٛ‬عٍ‪ ٝ‬حٌـ ‪ Loop‬رل‪١‬غ طعًّ رشىً ِظ‪ٛ‬حص‪ِ ٞ‬ع حٌزشٔخِؾ‪ٚ ،‬العظخذحَ حٌـ ‪ٍ٠ Thread‬ضَ‬ ‫أ‪ٚ‬ال طعش‪٠‬ف حٌـ‪: System.Threading Namespace‬‬ ‫‪C#:‬‬ ‫;‪using System.Threading‬‬ ‫‪VB.NET:‬‬ ‫‪imports System.Threading‬‬ ‫ػُ حشظمخق ‪ِٕ Instance‬اٗ ‪ٚ‬ادسحؽ حعاُ حٌذحٌاش حٌظا‪ ٟ‬طش‪٠‬اذ عّاً ‪ٌٙ Thread‬اخ فا‪ ٟ‬حٌاـ ‪Delegate‬‬ ‫حٌخخص ر‪ٙ‬خ وّخ ‪:ٍٟ٠‬‬ ‫‪C#:‬‬ ‫;‪Thread myth‬‬ ‫;))‪myth= new Thread (new System.Threading .ThreadStart(Listener‬‬ ‫;)( ‪myth.Start‬‬ ‫‪VB.NET:‬‬ ‫‪Imports System.Threading‬‬ ‫‪Dim myth As Thread‬‬

‫~‪~07‬‬


myth = New Thread(New System.Threading.ThreadStart(Listener)) myth.Start :ٍٟ٠ ‫ وّخ‬Closing Form ‫ كذع حٌـ‬ٟ‫ ف‬myth.Aport() ‫ْ لُ ربػخفش‬٢‫ح‬ C#: private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { mylistener.Stop(); myth.Abort(); } VB.NET: Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Try mylistener.Stop() myth.Aport() Catch ex As Exception Msgbox(ex.Message) End Try End Sub ‫لاض‬ٌٛ‫ ٔفاظ ح‬ٟ‫ فا‬Thread ٓ‫ادحسس أوؼاش ِا‬ٚ ً١‫ سحثعاش ؿاذح ار طّىٕاه ِآ طشاغ‬Thread ‫ضس حٌاـ‬١ِ ...ْٚ‫ حٔظش حٌفظً حٌعشش‬،Multithreading ‫ رخٌـ‬ّٝ‫غ‬٠ ‫ ِخ‬ٛ٘ٚ ‫ ٔفظ حٌزشٔخِؾ‬ٟ‫ف‬ٚ ‫ حٌخخص‬MAC Address‫حْ حٌـ‬ٕٛ‫َ حٌّشعً رغئحي عٓ ع‬ٛ‫م‬٠ ‫ٔش‬ٕٛ‫ش حٌع‬١ٍّ‫رعذ اؿشحء ع‬ ARP-Address Resolution Protocol‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫ش عزش رش‬١ٍّ‫طظُ ٘زٖ حٌع‬ٚ Server‫رخٌـ‬ ٟ‫ف‬ٚ MAC Table‫ حٌـ‬ٟ‫ ف‬MAC Address‫د حٌـ‬ٛ‫ؿ‬ٚ ِٓ ‫ي رخٌظلمك‬ٛ‫و‬ٛ‫ط‬ٚ‫َ ٘زح حٌزش‬ٛ‫م‬٠ٚ ‫ضس‬ٙ‫ وً حألؿ‬ٌٝ‫ ا‬ARB Broadcast Message Request‫َ ربسعخي‬ٛ‫م‬٠ ٖ‫د‬ٛ‫ؿ‬ٚ َ‫كخٌش عذ‬ ‫خص‬ٙ‫شعً حٌـ‬٠ ٖ‫ؿذ‬ٚ ‫ حٌّشحد حإلسعخي ٌٗ فبرح‬IP Address‫خ عٓ طخكذ حٌـ‬ٙ١‫غؤي ف‬٠ ‫ حٌشزىش‬ٍٝ‫ع‬ MAC Address‫حْ حٌـ‬ٕٛ‫خ رع‬ٙ١‫خزشٖ ف‬٠ Unicast ARP Replay Message ٟٕ‫حٌّع‬ ٚ‫ أ‬MAC Table ‫ حٌـ‬ٟ‫ ف‬ٟٕ‫حْ حٌّع‬ٕٛ‫ٓ حٌع‬٠‫َ رظخض‬ٛ‫م‬٠ ‫رعذ حعظالَ حٌشعخٌش‬ٚ ٗ‫حٌخخص ر‬ ً‫ الكع حٌشى‬، ‫ حٌّشحص حٌالكمش‬ٟ‫ظُ حعظخذحِٗ ف‬٠ ٟ‫ٌى‬ٚ ،‫خص‬ٙ‫ حٌـ‬ٟ‫د ف‬ٛ‫ؿ‬ٌّٛ‫ ح‬MAC Cash‫حٌـ‬ :ٌٟ‫حٌظخ‬

~08~


‫‪ٚ‬رعااااذ ٘اااازٖ حٌّشكٍااااش ‪٠‬ااااظُ طلذ‪٠‬ااااذ ٔاااا‪ ٛ‬حٌااااـ‪٘ Encapsulation‬ااااً عاااا‪١‬ى‪ ْٛ‬وااااـ ‪Internet‬‬ ‫‪ Encapsulation‬أ‪٠ٚ Ethernet Encapsulation ٚ‬اظُ رٌاه فا‪ ٟ‬حٌاـ‪Data Link Layer‬‬ ‫‪ٚ‬حٌشىً حٌظخٌ‪ٛ٠ ٟ‬ػق وً ٘زٖ حٌعٍّ‪١‬خص‪:‬‬

‫‪ٚ‬ف‪ ٟ‬حٌٕ‪ٙ‬خ‪٠‬ش ‪٠‬ى‪ ْٛ‬حٌشىً حٌعخَ ٌٍـ‪ Packet‬وّخ ‪:ٍٟ٠‬‬

‫‪٠ٚ‬ـذ حٌظفش‪٠‬ك ر‪ ٓ١‬عٍّ‪١‬ش حإلسعخي رخعظخذحَ حٌـ‪ٚ Ethernet‬عٍّ‪١‬ش حإلسعخي رخعظخذحَ‬ ‫حٌـ‪ Internet‬أ‪ ٚ‬حٌـ‪ Serial Connection‬ار أٔٗ ف‪ ٟ‬حٌـ‪ Ethernet‬طظُ عٍّ‪١‬ش حإلسعخي رعذ‬ ‫ِعشفش حٌـ‪ٌ MAC Address‬طشف حألخش رخعظخذحَ حٌـ‪ ARP‬أِخ ف‪ ٟ‬حٌـ‪ Internet‬ف‪١‬ظُ حٌ‪ٛ‬ط‪ٛ‬ي‬ ‫‪ٚ‬فك ِزذأ حٌـ‪ PPP – Point to Point Protocol‬الكع حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~09‬‬


‫ف‪ ٟ‬وً ؽزمش ‪٠‬ظُ اػخفش ‪ Header‬عٍ‪ ٝ‬حٌـ‪٠ Data‬لظ‪ ٞٛ‬عٍ‪ِ ٝ‬عٍ‪ِٛ‬خص حٌاظلىُ أ‪ ٚ‬حٌاـ ‪Control‬‬ ‫‪٠ٚ ، Data‬ظاشح‪ٚ‬ف كـاُ حٌاـ‪ Header‬فا‪ ٟ‬حٌاـ ‪ٚ Transport‬حٌاـ ‪ِ Network Layer‬آ ‪ 22‬اٌا‪ٝ‬‬ ‫‪ 62‬رخ‪٠‬ض كغذ حٌـ‪ Options‬حٌظ‪٠ ٟ‬ظُ اػخفظ‪ٙ‬خ اٌ‪ ٝ‬حٌـ ‪.Header‬‬ ‫ف‪ ٟ‬حٌّؼخي حٌظخٌ‪ ٟ‬عإم‪ َٛ‬رخعاظخذحَ رشٔاخِؾ حٌاـ‪٘ٚ Ethereal‬ا‪ ٛ‬رشٔاخِؾ ‪٠‬ما‪ َٛ‬رعٍّ‪١‬اش حٌاـ ‪Packet‬‬ ‫‪ٚ Sniffing‬حٌز‪ّ٠ ٞ‬ىٓ طؼز‪١‬ظٗ ِٓ حٌّ‪ٛ‬لع حٌخخص رٗ ‪:ٛ٘ٚ‬‬ ‫‪http://www.ethereal.com/download.html‬‬ ‫ِضبي ػٍ‪ ٝ‬اعزخذاَ اٌـ‪ٚ ARB‬اٌـ‪ٚ DNS‬اٌـ‪: HTTP‬‬ ‫الكع حٌشاىً حٌظاخٌ‪ ٟ‬فا‪ ٟ‬رشٔاخِؾ حٌاـ‪ٚ Ethereal‬حٌاز‪٠ ٞ‬ما‪ َٛ‬رعٍّ‪١‬اخص حٌظظإض ‪ٚ‬حٌظلٍ‪١‬اً ٌٍز‪١‬خٔاخص‬ ‫حٌّااخسس ِاآ خااالي حٌااـ‪ ، Network Interface Card‬ك‪١‬ااغ لّٕااخ رطٍااذ حٌااذخ‪ٛ‬ي عٍاا‪ِٛ ٝ‬لااع‬ ‫حٌـ‪ Google‬رخعظخذحَ حٌـ‪:Internet Explorer‬‬

‫الكع أْ أ‪ٚ‬ي عٍّ‪١‬ش وخٔاض حٌغائحي عآ حٌاـ‪ MAC Address‬حٌخاخص رخٌاـ‪٘ٚ Gateway‬ا‪ٕ٘ ٛ‬اخ‬ ‫‪ 10.0.0.138‬ك‪١‬اغ أسعااٍض ٘اازٖ حٌشعاخٌش وااـ‪ٚ Broadcast Message‬فا‪ ٟ‬حٌعٍّ‪١‬ااش حٌؼخٔ‪١‬ااش لااخَ‬ ‫حٌـ‪ Router‬رخٌشد عٍ‪ ٝ‬حٌـ‪ٚ ARP Request‬أسعً عٕ‪ٛ‬حْ حٌـ‪ MAC Address‬حٌخخص راٗ رعاذ‬ ‫٘ازٖ حٌعٍّ‪١‬اش عا‪١‬م‪ َٛ‬حٌاـ‪ Client‬رخالعظفغاخس عآ عٕا‪ٛ‬حْ حٌاـ‪ Google‬ربسعاخي ‪DNS Request‬‬ ‫‪ ، Query‬الكاع أٔاٗ فا‪ ٟ‬حٌّؼاخي لاذ ‪ٚ‬ؿاذ حٌاـ‪ IP Address‬حٌخاخص رخٌاـ‪ Google‬فا‪ ٟ‬حٌاـ ‪DNS‬‬

‫~‪~21‬‬


‫‪ٚ Table‬حٌّ‪ٛ‬ؿ‪ٛ‬دس ػآّ ٔظاخَ حٌظشاغ‪٘ٚ ً١‬ازح ‪٠‬عٕا‪ ٟ‬حٔاٗ طاُ حٌاذخ‪ٛ‬ي عٍا‪ ٝ‬حٌاـ‪ِ Google‬آ لزاً‬ ‫‪ٚ‬حٌذٌ‪ ً١‬عٍ‪ ٝ‬رٌه أْ حٌـ‪ IP Address‬حٌخخص رخٌاـ‪ِٛ Google‬ؿا‪ٛ‬د فا‪ ٟ‬حٌاـ‪ٚ DNS Table‬رعاذ‬ ‫٘اازٖ حٌعٍّ‪١‬ااش لااخَ ِ‪ٛ‬لااع حٌااـ‪ Google‬رااخٌشد عٍاا‪ ٝ‬حٌطٍااذ ‪٠‬خزااشٖ ر‪ٛ‬ؿاا‪ٛ‬دٖ ‪ٚ‬ػاآّ حٌعٕاا‪ٛ‬حْ حٌّلااذد‬ ‫الكع أْ حٌعٍّ‪١‬خص ِٓ ‪ 8‬اٌ‪ ٟ٘ 22 ٝ‬عٍّ‪١‬خص ؽٍذ ‪ ٚ‬اسعخي ٌّلظ‪٠ٛ‬خص حٌظفلش حٌخخطش رّ‪ٛ‬لاع‬ ‫حٌـ‪ٚ Google‬طظُ رخعظخذحَ حٌـ ‪.HTTP Protocol‬‬

‫‪TCP / UDP Connection Establishment : 1.2‬‬ ‫طّش عٍّ‪١‬ش أشخء حالطظاخي رّـّ‪ٛ‬عاش ِآ حٌّشحكاً‪ٚ ،‬فا‪ ٟ‬حٌعاخدس ‪٠‬ما‪ َٛ‬حٌطاشف حٌّشعاً ربسعاخي‬ ‫ؽٍذ أشخء حالطظخي اٌ‪ ٝ‬حٌطشف حألخش ‪ٚ‬عٕاذ حٌّ‪ٛ‬حفماش عٍا‪ ٝ‬اؿاشحء حالطظاخي ‪٠‬اظُ حٌزاذء ربسعاخي‬ ‫ِـّ‪ٛ‬عش ِٓ حٌّعٍ‪ِٛ‬خص اٌ‪ ٝ‬حٌطشف حٌّغظمزً‪ ،‬ف‪ ٟ‬رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي حٌاـ ‪ TCP‬طاظُ ٘ازٖ حٌعٍّ‪١‬اش رؼالػاش‬ ‫ِشحكً طغّ‪ٚ Three-way hand-shake ٝ‬وّخ ٘‪ٚ ٛ‬حػق ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ -1‬ك‪١‬غ ‪٠‬م‪ َٛ‬حٌطشف حٌّشعً رظ‪١ٌٛ‬ذ سلُ طغٍغٍ‪٠ٚ Sequence Number ٟ‬شعٍٗ اٌ‪ٝ‬‬ ‫حٌـ‪٠ٚ Server‬ى‪٘ ْٛ‬زح حٌشلُ حٌّ‪ٌٛ‬ذ ٔمطش حٌزذء ٌعٍّ‪١‬ش حإلسعخي رل‪١‬غ ‪٠‬ظُ ص‪٠‬خدطٗ رّمذحس ‪ٚ‬حكذ‬ ‫)‪ ( increment By One‬عٕذ وً عٍّ‪١‬ش اسعخي‪.‬‬ ‫‪٠ -2‬غظٍُ حٌطشف حٌّمخرً حٌـ‪٠ٚ Sequence Number‬ما‪ َٛ‬ربسعاخي ‪ Acknowledgment‬اٌا‪ٝ‬‬ ‫حٌّشعً ِؼخف اٌ‪ ٗ١‬حٌشلُ حٌظغٍغٍ‪ ٟ‬حٌز‪ ٞ‬طُ اسعخٌٗ‪.‬‬ ‫‪ -3‬عٕذ ٘زٖ حٌّشكٍش ‪٠‬ى‪ ْٛ‬لذ طُ حٌّ‪ٛ‬حفمش عٍ‪ ٝ‬رذأ حٌـٍغش ‪ٚ‬عٕذ٘خ ‪٠‬م‪ َٛ‬ربسعخي ؽٍزاٗ ِشفاك ِعاٗ‬ ‫حٌـ‪ Acknowledgment‬حٌز‪ ٞ‬أسعً ِٓ لزً حٌّغظمزً‪.‬‬ ‫أِخ ف‪ ٟ‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ ‪ UDP‬فظظُ رذ‪ ْٚ‬اسعخي ‪ٚ Acknowledgments‬ال ‪٠‬ظلمك حٌـ‪ِ UDP‬آ‬ ‫عٍّ‪١‬خص حٌ‪ٛ‬ط‪ٛ‬ي وّخ ٘‪ ٛ‬حٌلخي ف‪ ٟ‬حٌاـ‪٘ٚ TCP‬ا‪ِ ٛ‬اخ عا‪١‬ظُ ط‪ٛ‬ػا‪١‬لٗ فا‪ ٟ‬حٌـاضء حٌظاخٌ‪ِ ٟ‬آ ٘ازح‬ ‫حٌفظً‪.‬‬

‫~‪~20‬‬


‫‪TCP & UDP Header Encapsulation : 1.3‬‬ ‫ف‪ ٟ‬ؽزمش حٌـ‪٠ Transport Layer‬ظُ حٌظعخًِ ِع اكذ‪ ٜ‬حٌزش‪ٚ‬ط‪ٛ‬و‪ TCP ٓ١ٌٛ‬أ‪ ٚ‬حٌـ‪ UDP‬ك‪١‬غ‬ ‫عٕلذد ف‪ٙ١‬خ ؽز‪١‬عش حإلسعخي فبرح وخْ حٌّطٍ‪ٛ‬د ٘‪ ٛ‬حإلسعخي وـ‪ ٛٔٚ Stream‬حإلسعخي ٘‪ٛ‬‬ ‫‪ Unicast‬ف‪١‬ظُ حخظ‪١‬خس حٌـ‪ TCP‬أِخ ف‪ ٟ‬كخٌش وخْ حٌّطٍ‪ٛ‬د ٘‪ ٛ‬حإلسعخي وـ‪ Broadcast‬أ‪ٚ‬‬ ‫‪ Multicast‬ف‪١‬ظُ حخظ‪١‬خس حٌـ‪ٌ UDP‬عٍّ‪١‬ش حإلسعخي ‪ٚ ،‬ع‪ٛ‬ف ٔز‪ ٓ١‬ف‪ ٟ‬حٌـضء حٌظخٌ‪٘ ِٓ ٟ‬زح‬ ‫حٌفظً ِزذأ عٍّ‪١‬ش حإلسعخي رخعظخذحَ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ‪ٚ TCP‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ‪... UDP‬‬ ‫‪TCP Encapsulation : 1.3.1‬‬ ‫‪٠‬ظّ‪١‬ض ٘زح حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي رذعّٗ ٌىً عٍّ‪١‬خص حٌظلىُ ع‪ٛ‬حء عٍ‪ِ ٝ‬غظ‪ ٜٛ‬حٌـ ‪ Data Flow‬أ‪ ٚ‬كـُ‬ ‫حٌـ‪ Buffer‬وّخ ‪٠‬ذعُ عٍّ‪١‬خص حٌظلمك ِٓ حٌ‪ٛ‬ط‪ٛ‬ي ‪ٚ‬فك حٌظشط‪١‬ذ حٌغٍ‪Delivered on ُ١‬‬ ‫‪٘ٚ Sequence‬زح ‪ٚ‬حػق ِٓ طشو‪١‬ذ حٌـ ‪ Header‬حٌخخطش رٗ أٔظش اٌ‪ ٝ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪: Source & Destination Port 1.3.1.1‬‬ ‫فااا‪ ٟ‬حٌّٕطماااش حٌّخظظاااش راااـ ‪ Port‬حإلسعاااخي ‪ٚ‬حالعاااظمزخي ‪٠ ،‬اااظُ طلذ‪٠‬اااذ حٌاااـ‪Source Port‬‬ ‫‪ٚ‬حٌـ‪ Destination Port‬حٌخخطش رخٌزشٔخِؾ حٌز‪٠ ٞ‬ـش‪ ٞ‬عٍّ‪١‬ش حالطظاخي ‪ِٚ‬آ حٌّعاش‪ٚ‬ف أٔاٗ ال‬ ‫‪ّ٠‬ىٓ ألوؼش ِٓ رشٔخِؾ حعظخذحَ ٔفظ سلُ حٌـ‪ٌ Port‬ىٓ ‪ّ٠‬ىٓ ٌٍزشٔخِؾ حٌ‪ٛ‬حكاذ حعاظخذحَ أوؼاش ِآ‬ ‫‪ٚ ، Port Address‬رظؤو‪١‬ااذ فاابْ عٍّ‪١‬ااش حخظ‪١‬ااخس حٌااـ‪١ٌ Port‬غااض عشاا‪ٛ‬حث‪١‬ش ار ‪٠‬ـااذ حالرظعااخد عاآ‬ ‫حألسلخَ حٌظ‪ ٟ‬طزاذأ راـ ‪ٚ 2‬طٕظ‪ٙ‬ا‪ 1223 ٟ‬ار أٔ‪ٙ‬اخ أسلاخَ ٌزش‪ٚ‬ط‪ٛ‬وا‪ٛ‬الص ِعش‪ٚ‬فاش ‪٠ٚ‬اظُ حعاظخذحِ‪ٙ‬خ فا‪ٟ‬‬ ‫ٔظخَ حٌظشغ‪ ِٓٚ ً١‬حألِؼٍش عٍ‪ٙ١‬خ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ‪ٚ HTTP‬حٌاز‪٠ ٞ‬غاظخذَ حٌاـ‪ٚ 82 Port‬رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي‬ ‫حٌـ ‪ٚ FTP‬حٌز‪٠ ٞ‬غظخذَ حٌاـ‪ٚ 21 Port‬غ‪١‬اشٖ‪٠ٚ ،‬فؼاً عٕاذ حخظ‪١‬اخس حٌاـ‪ Port‬أْ ال ‪٠‬زاذأ راشلُ ‪٠‬ماً‬ ‫عٓ ‪ 49.151‬حٔظش اٌ‪ ٝ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~22‬‬


‫‪: Sequence & Acknowledgment Number 1.3.1.2‬‬ ‫‪٠ٚ‬لظ‪ ٞٛ‬وً ِٕ‪ّٙ‬خ عٍ‪٠ٚ 32 Bits ٝ‬ذي ٘زح حٌشلُ عٍ‪ ٝ‬سلُ حٌظغٍغً ٌٍاـ‪ Packet‬عٕاذ اسعاخٌٗ أ‪ٚ‬‬ ‫حعااظمزخٌٗ ‪٠ٚ‬ااظُ ط‪١ٌٛ‬ااذٖ عشاا‪ٛ‬حث‪١‬خ عٕااذ رذح‪٠‬ااش حالطظااخي أِااخ سلااُ حٌااـ ‪ Acknowledgment‬ف‪١‬لظاا‪ٞٛ‬‬ ‫عٍ‪ ٝ‬حٌشلُ حٌظغٍغاٍ‪ٌٍ ٟ‬اـ ‪ Packet‬حٌاز‪ ٞ‬طاُ حٌظؤواذ ِآ ‪ٚ‬طا‪ٚ ٌٗٛ‬طاظُ ٘ازٖ حٌعٍّ‪١‬اش وّاخ فا‪ ٟ‬حٌشاىً‬ ‫حٌظخٌ‪:ٟ‬‬

‫‪: Header Length & Validation Controls 1.3.1.3‬‬ ‫‪٠ٚ‬لظااا‪ ٞٛ‬حٌـااااضء حٌؼااااخٔ‪ِ ٟ‬اااآ حٌااااـ‪ Header‬حٌخاااخص رخٌااااـ‪ TCP‬عٍاااا‪ِ 32 Bitsٝ‬مغااااّش عٍاااا‪ٝ‬‬ ‫حٌاـ‪ 16Bitsٚ Windows Size 16 Bits‬أخاش‪ٌٍ ٜ‬اـ ‪Header Length + Validation‬‬ ‫‪ Controls‬الكع حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪٠ٚ‬لظاا‪ ٞٛ‬حٌااـ‪ Header Length‬عٍاا‪ ٝ‬كـااُ حٌااـ‪ Header‬حٌخااخص رخٌااـ‪ِ TCP‬مغاا‪ َٛ‬عٍاا‪ 4 ٝ‬أ‪ٞ‬‬ ‫ٌّعشفش كـُ حٌـ‪ٔ Header‬ؼشد حٌـ)‪ HLEN (Header Length‬راـ‪ ، 4‬أِاخ حٌاـ ‪Validation‬‬ ‫‪ Controls‬ف‪ 6 Controls ٟٙ‬طؤخز وً ِٕ‪ٙ‬خ ‪ 1 Bit‬فبرح وخٔض ل‪ّ١‬ظٗ ‪ 2‬ف‪ٙ‬زح ‪٠‬عٕا‪ ٟ‬أْ ٘ازٖ حألدحس‬ ‫غ‪١‬ش ِغظخذِش ‪ٚ‬ارح وخٔض ‪ 1‬ف‪ٙ‬زح ‪٠‬عٕ‪ ٟ‬أْ ٘زٖ حألدحس ِغظخذِش ‪ٚ‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪: Window Size 1.3.1.4‬‬ ‫‪٠ٚ‬عشف ف‪ ٗ١‬كـُ حٌـ‪ Packet‬حٌز‪ّ٠ ٞ‬ىٓ اسعخٌٗ ِٓ خالي حٌشزىش رٕخء عٍ‪ ٝ‬عشعش حٌ‪ٛ‬ط‪ٛ‬ي را‪ٓ١‬‬ ‫واً ‪ ،ACK Packet ٚ SYN Packet‬أ‪ ٞ‬حٌ‪ٛ‬لاض حٌّغاظغشق ٌعٍّ‪١‬اش حٌظ‪ٛ‬طا‪ٌ ً١‬ىاً ‪Packet‬‬ ‫‪ٚ‬لذ طض‪٠‬ذ أ‪ ٚ‬طٕمض رٕخءح عٍ‪ ٝ‬أدحث‪١‬ش حٌشزىش‪.‬‬

‫~‪~23‬‬


‫‪: Check Sum 1.3.1.5‬‬ ‫‪ٚ 16 Bits ٟ٘ٚ‬طغظخذَ ٌعٍّ‪١‬ش حٌظلمك ِآ ‪ٚ‬طا‪ٛ‬ي حٌاـ‪ TCP Header‬رشاىً حٌغاٍ‪ ُ١‬ك‪١‬اغ ‪٠‬اظُ‬ ‫ؿّع وخفش ل‪ ُ١‬حٌـ‪) TCP Header‬وً ‪ٌٛ 16 Bits‬كذ٘خ( ػُ لٍز‪ٙ‬خ ‪ٚ​ٚ‬ػع حٌٕاخطؾ فا‪ ٟ‬حٌاـ ‪Check‬‬ ‫‪ٚ Sum‬ف‪ ٟ‬حٌطشف حٌّغاظمزً ‪٠‬ما‪ َٛ‬رظؤواذ ِآ حٌاـ‪ Checksum‬رؼاشد ل‪ّ١‬اش حٌاـ‪ HLEN‬راـ‪ 4‬ػاُ‬ ‫ِمخسٔااش حٌٕااخطؾ ِااع ِمٍاا‪ٛ‬د حٌااـ‪ٚ Checksum‬وّااخ ٘اا‪ٚ ٛ‬حػااق فاا‪ ٟ‬حٌشااىً حٌظااخٌ‪ٚ ٟ‬حٌااز‪٠ ٞ‬ظ‪ٙ‬ااش‬ ‫حٌـ‪ Checksum‬ف‪ ٟ‬حٌـ ‪ IP Protocol‬ار حٔ‪ٙ‬خ طظُ رٕفظ حٌطش‪٠‬مش رخٌـ ‪ٚ TCP‬حٌـ‪:UDP‬‬

‫‪: Urgent Pointer 1.3.1.6‬‬ ‫ِاآ حٌّعااش‪ٚ‬ف أْ حٌااـ‪ Data‬حٌّشعااٍش عزااش حٌااـ‪٠ TCP‬ااظُ طـّ‪١‬ع‪ٙ‬ااخ فاا‪ ٟ‬حٌااـ‪ Buffer‬لزااً أْ ‪٠‬ااظُ‬ ‫عشػ‪ٙ‬خ ك‪١‬غ ‪٠‬ظُ طلذ‪٠‬ذ ِ‪ٛ‬لع حٌـ‪ Data‬حٌمخدِش حٌـذ‪٠‬ذس ف‪ ٟ‬حٌـ‪ٕ٘ ِٓٚ Buffer‬خ ٔلآ رلخؿاش اٌا‪ٝ‬‬ ‫‪ٚ‬ؿ‪ٛ‬د ‪٠ Pointer‬ئشش عٍ‪ِٛ ٝ‬لع حٌـ‪ Data‬ف‪ ٟ‬حٌـ‪ٕ٘ ٛ٘ٚ Buffer‬خ حٌـ‪ Urgent Pointer‬الكاع‬ ‫حٌشىً حٌظخٌ‪ٚ ٟ‬حٌز‪ٛ٠ ٞ‬ػاق عٍّ‪١‬اش ‪ٚ‬ػاع ‪ Data‬لخدِاش ؿذ‪٠‬اذس اٌا‪ ٝ‬حٌاـ‪ Buffer‬حٌخاخص رخٌـ‪ٙ‬اخص‬ ‫حٌّغظمزً ‪:‬‬

‫~‪~24‬‬


‫‪: Dot Net Binary Streaming Overview : 1.3.2‬‬ ‫‪ّ٠‬ىٓ ِٓ خالي حٌـ‪ٔ Stream Classes‬مً ‪ Text‬أ‪ ٚ، Binary Data ٚ‬ر‪ٕ١‬خ عخرمخ و‪١‬ف‪١‬ش حٌظعخِاً‬ ‫ِآ حٌاـ‪ٌٕ Socket‬ماً ‪ Text‬رخعاظخذحَ حٌاـ ‪ٚ Stream Reader‬حٌاـ ‪ٚ Stream Writer‬فا‪٘ ٟ‬ازح‬ ‫حٌـااضء عاإز‪ ٓ١‬و‪١‬ف‪١‬ااش حٌظعخِااً ِعااٗ ٌٕمااً ‪) Object‬أ‪ٔ ٞ‬اا‪ ٛ‬أخااش ِاآ حٌز‪١‬خٔااخص ‪ّ٠ٚ‬ىاآ أْ ‪٠‬ىاا‪ْٛ‬‬ ‫ط‪ٛ‬سس ‪ Image‬أ‪ ٚ‬طا‪ٛ‬ص ‪ Voice‬أ‪ ٚ‬أ‪ ٞ‬شا‪ٟ‬ء آخاش ‪ّ٠‬ىآ أْ ‪٠‬لا‪ٛ‬ي اٌا‪،(.. Binary Data ٝ‬‬ ‫‪ٚ‬وّخ ٘‪ ٛ‬حٌلخي ف‪ٔ ٟ‬مً حٌـ ‪ Text‬وٕخ ٔل‪ٛ‬ي حٌاـ ‪ Text‬اٌا‪ ASCII Code ٝ‬ػاُ اٌا‪ Binary ٝ‬أِاخ‬ ‫فاا‪ ٟ‬حٌااـ ‪ Object‬ف‪١‬ااظُ ٔمٍااٗ اِااخ وااـ‪) Serialization Object‬حٔظااش حٌفظااً حٌخااخِظ عشااش( أ‪ٚ‬‬ ‫رخعاظخذحَ حٌاـ‪ ٚ Binary Reader‬حٌاـ ‪ٚ Binary Writer‬حٌظا‪ ٟ‬طّىٕاه ِآ حٌظعخِاً ِاع أ‪ٔ ٞ‬ا‪ٛ‬‬ ‫ِٓ حٌز‪١‬خٔخص ‪ ،‬وّخ ‪ٚ‬طغظخذَ حٌاـ‪ٚ Stream Reader‬حٌاـ ‪ٌ Stream Writer‬ظعخِاً ِاع حٌاـ ‪Text‬‬ ‫‪ٚ‬حٌااـ ‪ٌ FileStream‬ظغاا‪ ً١ٙ‬حٌظعخِااً ِااع حٌٍّفااخص رخإلػااخفش اٌاا‪ ٝ‬حٌااـ ‪ٚ MemoryStream‬حٌظاا‪ٟ‬‬ ‫طغاااظخذَ واااـ ‪ٌ Buffer‬لفاااع حٌز‪١‬خٔاااخص لزاااً اسعاااخٌ‪ٙ‬خ أ‪ ٚ‬رعاااذ حعاااظمزخٌ‪ٙ‬خ ‪ٚ ،‬طمااا‪ َٛ‬أ‪٠‬ؼاااخ رظل‪٠ٛ‬اااً‬ ‫حٌـ‪ Stream‬اٌ‪ِ ٝ‬ـّ‪ٛ‬عش ِآ حٌاـ‪ٚ Bits‬حٌاـ‪ Bits‬اٌا‪ِ Stream ٝ‬اشس أخاش‪ ٜ‬الكاع حٌشاىً حٌظاخٌ‪ٟ‬‬ ‫‪ٚ‬حٌز‪ٛ٠ ٞ‬ػق طغٍغً ِىظزخص حٌـ‪ Stream‬ف‪ ٟ‬حٌذ‪ٚ‬ص ٔ‪١‬ض‪:‬‬

‫‪ٚ‬وّؼخي ططز‪١‬م‪ ٟ‬عٍ‪٘ ٝ‬زح ع‪ٛ‬ف ٔم‪ َٛ‬رزٕخء رشٔخِؾ ‪٠‬م‪ َٛ‬رعٍّ‪١‬ش ٔمً ط‪ٛ‬سس ‪ ِٓ Image‬ؿ‪ٙ‬خص‬ ‫اٌ‪ ٝ‬أخش ‪ٌٍٚ Client/Server‬زذء لُ ربٔشخء ِشش‪ ٚ‬ؿذ‪٠‬ذ وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫~‪~25‬‬


:‫ش‬١ٌ‫ حٌظخ‬Namespaces ‫ش لُ ربػخفش حٌـ‬٠‫ حٌزذح‬ٟ‫ف‬ C#: using System.Net.Socket; using System.IO; VB.NET: Imports System.Net.Socket Imports System.IO MemoryStream ‫ ِٓ حٌىالط‬Instance ‫ال ِٓ حشظمخق‬ٚ‫ش حإلسعخي ال رذ أ‬١ٍّ‫ٌإلؿشحء ع‬ ٌٝ‫خ الكمخ ا‬ٌٙٛ‫ ٔل‬ٟ‫سس دحخً حٌزحوشس رشىً ِئلض ٌى‬ٛ‫ٓ حٌظ‬٠‫خ ٌظخض‬ِٙ‫ف ٔغظخذ‬ٛ‫ ع‬ٟ‫حٌظ‬ٚ ٌٝ‫ ا‬Socket ‫ عزش حٌـ‬NetworkStream َ‫خ رخعظخذح‬ٌٙ‫ ػُ اسعخ‬Binary ‫فش‬ٛ‫ِظف‬ :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 The server NetworkStream myns = myclient.GetStream (); BinaryWriter mysw = new BinaryWriter (myns); mysw.Write(arrImage);//send the stream to The above address mysw.Close (); myns.Close (); myclient.Close (); } catch (Exception ex){MessageBox.Show(ex.Message );} 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)

~26~


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 ‫ حٌـ‬ٟ‫ذس ف‬٠‫ض خظخثض ؿذ‬١ٔ ‫ص‬ٚ‫ٕخ حٌذ‬٠‫ٌذ‬ ‫ش عشع‬١ٔ‫ٕخ اِىخ‬١ٍ‫ً ع‬ٙ‫ طغ‬ٟ‫حٌظ‬ٚ Picture Box ‫ حٌخخطش رخٌـ‬Image.FromStream ٍٝ‫سس طعشع ع‬ٛ‫ ط‬ٌٝ‫ ا‬Stream ِٓ ‫خ‬ٍٙ٠ٛ‫ظُ طل‬٠ ٟ‫ ٌى‬Stream ‫سس حٌّشعٍش ِٓ خالي‬ٛ‫حٌظ‬ :ٌٟ‫ حٌّؼخي حٌظخ‬ٟ‫وّخ ف‬ٚ Picturebox‫حٌـ‬ : ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬ٚ ‫ذ‬٠‫ ؿذ‬ٚ‫لُ ربٔشخء ِشش‬

:ٍٟ٠ ‫سس وّخ‬ٛ‫ش حعظمزخي حٌظ‬١ٍّ‫طظُ ع‬ C#: using System.Net.Socket ; using System.IO; TcpListener mytcpl; // Declare TCP Listener Socket mysocket; // Declare an object from Socket Class NetworkStream myns; // StreamReader mysr;

~27~


void Image_Receiver() { mytcpl = new TcpListener (5020);// Open The Port mytcpl.Start ();// Start Listening 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 } } } 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 ‫ حٌخاااخص‬Thread ‫ ِٕفظاااً عااآ حٌاااـ‬Thread ‫ راااـ‬Image_Receiver Method‫اااز حٌاااـ‬١‫ٌظٕف‬ٚ Thread Class ‫ ػآّ حٌاـ‬Thread Delegate Instance ‫ حٌاـ‬ٝ‫ش٘اخ اٌا‬٠‫َ رظّش‬ٛ‫رخٌزشٔخِؾ ٔما‬ :ٍٟ٠ ‫وّخ‬ٚ

~28~


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

VB.NET: Imports System.Threading Dim myth As Thread myth = New Thread(New System.Threading.ThreadStart(Image_Receiver)) myth.Start ‫وّاخ‬ٚ Form ‫ حٌخاخص رخٌاـ‬Closing Event ‫ حٌاـ‬ٟ‫ فا‬Socket ‫حٌاـ‬ٚ Thread ‫ـذ اغالق حٌاـ‬٠ٚ :ٍٟ٠ C#: private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { try { mytcpl.Stop (); thread.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() thread.Aport() 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)

~29~


{ 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 UDP-User Datagram Protocol- Encapsulation : 1.3.3 ‫ي‬ٛ‫و‬ٛ‫ط‬ٚ‫ض ٘زح حٌزش‬١ّ‫ظ‬٠ ‫غ‬١‫ ك‬UDP‫عش حالطظخي رخعظخذحَ حٌـ‬١‫ ٘زح حٌـضء ؽز‬ٟ‫ٓ ف‬١‫ف ٔز‬ٛ‫ع‬ ‫ذعُ حإلسعخي‬٠ ٞ‫ حٌز‬TCP‫ رعىظ حٌـ‬Broadcast ٚ Multicast ‫ش حإلسعخي وـ‬١ٔ‫ربِىخ‬ ٜٛ‫ ِغظ‬ٍٝ‫خص حٌظلىُ ع‬١ٍّ‫ عذَ دعّٗ ٌع‬ٛ٘ ‫ي‬ٛ‫و‬ٛ‫ط‬ٚ‫ ٌىٓ ِشىٍش ٘زح حٌزش‬، ‫ فمؾ‬Unicast‫وـ‬ ‫ذ‬١‫فك حٌظشط‬ٚ ‫ي‬ٛ‫ط‬ٌٛ‫خص حٌظلمك ِٓ ح‬١ٍّ‫ذعُ ع‬٠ ‫ وّخ ال‬Buffer‫ كـُ حٌـ‬ٚ‫ أ‬Data Flow‫حٌـ‬ ٌٟ‫ػق حٌشىً حٌظخ‬ٛ٠ٚ ٗ‫ر‬ٛ١‫س ِٓ أُ٘ ع‬ِٛ‫طعظزش ٘زٖ حأل‬ٚ Delivered on Sequence ُ١ٍ‫حٌغ‬ :‫ي‬ٛ‫و‬ٛ‫ط‬ٚ‫زح حٌزش‬ٌٙ َ‫ذ حٌعخ‬١‫حٌظشو‬

‫ ٌىٓ الكع‬TCP‫ حٌـ‬ٟ‫خ ف‬ٙ‫ ٔفغ‬ٟ٘ Header Length‫ حٌـ‬ٚ‫ أ‬Length‫ حٌـ‬ٚ Check Sum‫حٌـ‬ Delivered On ‫ حٌـ‬ٚ‫ أ‬Buffer Management‫س حٌخخطش رخٌـ‬ِٛ‫ ِٓ حأل‬ٞ‫د أ‬ٛ‫ؿ‬ٚ َ‫عذ‬ ًّ‫ع ع‬١‫حٌّشىٍش ٕ٘خ إٔٔخ ال ٔغظط‬ٚ ، UDP‫ حٌخخص رخٌـ‬Header‫ حٌـ‬ٟ‫ ف‬Sequence ،ّْٛ‫ش ِؼ‬١‫ق أِش غ‬١‫ذ حٌظل‬١‫خ رخٌظشط‬ٙ‫ع‬١ّ‫غ أْ اعخدس طـ‬١‫ ك‬Packets‫ ٌٍـ‬Fragmentation ، ‫خ‬ٌٙٛ‫ط‬ٚ َ‫ عذ‬ٚ‫خٔخص أ‬١‫ي حٌز‬ٛ‫ط‬ٚ ِٓ ‫ ٌظلمك‬Acknowledgment ٞ‫د أل‬ٛ‫ؿ‬ٚ ‫وّخ أٔٗ ال‬ : UDP‫عش حٌظشحعً رخعظخذحَ حٌـ‬١‫ػق ؽز‬ٛ٠ ٞ‫حٌز‬ٚ ٌٟ‫الكع حٌشىً حٌظخ‬

~31~


System.Net Namespace ‫ااااف‬٠‫ال طعش‬ٚ‫ٍااااضَ أ‬٠ ‫ااااض‬١ٔ ‫ص‬ٚ‫ حٌااااذ‬ٟ‫ فاااا‬UDP ‫العااااظخذحَ حٌااااـ‬ ْ‫ح‬ٛ‫حٌعٕا‬ٚ Port‫اف سلاُ حٌاـ‬٠‫ٍاضَ طعش‬٠ ْ‫ واخ‬TCP ‫ حٌاـ‬ٟ‫ الكاع حٔاٗ فا‬System.Net.Socket‫حٌـ‬ٚ ً‫ع عّاا‬١‫طغااظط‬ٚ ‫ وّااخ‬TCP ٟ‫ فاا‬ٛ‫فااٗ وّااخ ٘اا‬٠‫ع طعش‬١‫ فظغااظط‬UDP ‫ حٌااـ‬ٟ‫ااخص حٌّغااظمزً أِااخ فاا‬ٙ‫ٌٍـ‬ ‫ عٕذ حإلسعخي رعاذ حشاظمخق واخثٓ ِآ حٌىاالط‬IPAddress.Broadcast َ‫ رخعظخذح‬Broadcast ٝ‫ اٌاا‬2 ‫ااش حٌااشلُ طاافش‬٠‫رٌااه رظّش‬ٚ Port‫ااذ سلااُ حٌااـ‬٠‫ؼااخ عااذَ طلذ‬٠‫ع أ‬١‫طغااظط‬ٚ IPEndPoint .‫ حٌّخظظش ٌالعظمزخي‬Socket ‫ حٌـ‬ٟ‫ ف‬Bind Method‫حٌـ‬ Port ‫اخ ػاُ حعاظالَ حٌشعاخٌش عزاش ٘ازح حٌاـ‬ٙ١ٍ‫حٌظظإض ع‬ٚ 5020 Port‫ظُ فظق حٌاـ‬٠ ٌٟ‫ حٌّؼخي حٌظخ‬ٟ‫ف‬ :ً‫ حٌى‬ٍٝ‫خ ع‬ٙ‫ع‬٠‫ص‬ٛ‫ط‬ٚ 1) C#: IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5020); VB.NET Dim ipep As IPEndPoint = New IPEndPoint(IPAddress.Any, 5020) :ٍٟ٠ ‫ي حٌّغظخذَ وّخ‬ٛ‫و‬ٛ‫ حٌزشط‬ٛٔ ‫ذ‬٠‫طلذ‬ٚ Socket‫ش أشخء حٌـ‬١ٍّ‫طظُ ع‬ٚ 2) C#: Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) VB.NET Dim newsock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) ... Send ‫ حٌذحٌش‬ٌٝ‫ ا‬IPEndpoint Object ‫ػُ ّٔشس‬ IP ‫خ ٌشرؾ حٌـ‬ِٙ‫ظُ حعظخذح‬٠ ‫ حٌطشف حٌّغظمزً فمؾ‬ٟ‫خ ف‬ٙ‫ػع‬ٚ ُ‫ظ‬٠ ٟ‫حٌظ‬ٚ Bind Method ‫ حٌـ‬ٟ‫ف‬ : Socket ‫ رخٌـ‬Port‫سلُ حٌـ‬ٚ Address 3) C#: newsock.Bind(ipep); VB.NET: newsock.Bind(ipep)

~30~


‫ حٌغااخرمش‬Port ‫ حٌاـ‬ٝ‫ عٍاا‬Server‫ظظاً ِااع حٌاـ‬٠ ٓ‫ وااً ِا‬ٝ‫ااخ اٌا‬ٙ‫اذ رؼ‬٠‫ٔش‬ٚ ‫ْ طاُ حعاظمزخي حٌشعااخٌش‬٢‫ح‬ : ٍٟ٠ ‫ وّخ‬IPEndPoint Object ‫ف‬٠‫ال طعش‬ٚ‫ٍضَ أ‬٠ ‫ٌعًّ رٌه‬ٚ 4) C#: IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)(sender); recv = newsock.ReceiveFrom(data, ref Remote); VB.NET: Dim sender As IPEndPoint = New IPEndPoint(IPAddress.Any, 0) Dim Remote As EndPoint = CType((sender), EndPoint) recv = newsock.ReceiveFrom(data, Remote) :‫خ‬ٙ‫ حٌشعخٌش ٔفغ‬ٚ ‫حْ ِشعً حٌشعخٌش‬ٕٛ‫ٌطزخعش ع‬ٚ 5) 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)) ُ‫اخ حٔاٗ طا‬ٙ‫ ٌٕخزاشٖ ر‬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‫َ حٌـ‬ٛ‫م‬٠ ، ‫خص‬ٙ‫ ؿ‬ٞ‫لض ِٓ لزً أ‬ٚ ٞ‫ أ‬ٟ‫ سعخٌش ف‬ٞ‫أ‬ ‫ حٌاـ‬ٟ‫ فا‬True ‫ش حٌاـ‬١١‫ع طغ‬١‫ٓ ِٓ حٌشعخثً حٌّغظٍّش طغظط‬١‫ذ عذد ِع‬٠‫ ارح أسدص طلذ‬... ‫ حٌشزىش‬ٍٝ‫ع‬ .ٖ‫ذ‬٠‫ سلُ طش‬ٞ‫ أ‬ٌٝ‫ ا‬infinity loop C#: while(true) { data = new byte[1024]; recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

~32~


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 ‫ؽ ِٓ حٌـ‬ٚ‫ظُ حٌخش‬١‫ٕش ع‬١‫ ٔض سعخٌش ِع‬ٚ‫خَ رخعظمزخي سعخٌش أ‬١‫وّؼخي ٌٍم‬ٚ ‫ٔلذدٖ الكمخ‬ ‫ػع‬ٚ ‫ّىٕه‬٠ ‫ عٓ رعذ وّخ‬Server ‫ع اغالق حٌـ‬١‫ حٔه طغظط‬ٟٕ‫ع‬٠ ‫٘زح‬ٚ Socket ‫ظُ اغالق حٌـ‬١‫ع‬ٚ ...‫٘ىزح‬ٚ ٓ١‫د ٔض ِع‬ٚ‫س‬ٚ ‫ كخٌش‬ٟ‫ ف‬Server‫ حٌـ‬ٍٝ‫ ع‬ٞ‫ز‬١‫ ٍِف طٕف‬ٞ‫ً أ‬١‫ؿٍّش طشغ‬ C#: using System; using System.Net; using System.Net.Socket; 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);

~33~


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); } } } VB.NET: Imports System Imports System.Net Imports System.Net.Socket 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

~34~


‫ ربٔشااخء ؿٍغااش ِااع‬Client ‫ااخَ حٌااـ‬١‫ ل‬ٝ‫مظظااش حٌعّااً ٕ٘ااخ عٍاا‬٠ ، Client ‫ااخ حٌـااضء حٌخااخص رخٌااـ‬١ٔ‫ػخ‬ .‫ حٌغخرك‬ٟ‫وّخ طُ ف‬ٚ Port‫سلُ حٌـ‬ٚ IPEndPoint ‫فٗ رخٌـ‬٠‫رٌه رعذ طعش‬ٚ Server‫حٌـ‬ C#: using System; using System.Net; using System.Net.Socket; using System.Text; class SimpleUdpClient { public static void Main() { byte[] data = new byte[1024]; string input, stringData; IPEndPoint ipep = new IPEndPoint( IPAddress.Parse("127.0.0.1"), 5020); Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); string welcome = "Hello, are you there?"; data = Encoding.ASCII.GetBytes(welcome); server.SendTo(data, data.Length, SocketFlags.None, ipep); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)sender; data = new byte[1024]; int recv = server.ReceiveFrom(data, ref Remote); Console.WriteLine("Message received from {0}:", Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); while(true) { input = Console.ReadLine(); Exit ‫خء حٌـٍغش حوظذ‬ٙٔ‫ كخٌش ارح أسدص ا‬ٟ‫ف‬ if (input == "exit") break; server.SendTo(Encoding.ASCII.GetBytes(input), Remote); data = new byte[1024]; recv = server.ReceiveFrom(data, ref Remote); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Stopping client"); server.Close(); } }

~35~


VB.NET: Imports System Imports System.Net Imports System.Net.Socket Imports System.Text Class SimpleUdpClient Public Shared Sub Main() Dim data(1024) As Byte 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 Socket ‫ حٌااـ‬ٝ‫ عٍاا‬Broadcast Address ‫ااك حٌااـ‬١‫ّىاآ ططز‬٠ٚ ‫ أٔظاااش‬SocketOption Class ‫ِاااخص عااآ حٌاااـ‬ٍٛ‫اااذ ِااآ حٌّع‬٠‫ )ٌّض‬Socket Options‫حٌاااـ‬ Broadcast ‫ وّؼااخي إلسعااخي‬ٟ‫ٍاا‬٠ ‫ااش وّااخ‬١ٍّ‫طااظُ حٌع‬ٚ (‫ حٌّشفمااخص‬ٟ‫ فاا‬Appendixes (A) :‫ش‬١ٍ‫ حٌشزىش حٌّل‬ٍٝ‫ضس حٌّظظٍش ع‬ٙ‫ وً حألؿ‬ٌٝ‫ ا‬Message

~36~


C#: - Client using System; using System.Net; using System.Net.Sockets; using System.Text; public class Broadcast { public static void Main() { Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 5000); byte[] data = Encoding.ASCII.GetBytes(“Hello All”); sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); sock.SendTo(data, iep); sock.Close(); } } VB.NET:- Client Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Public Class Broadcast Public Shared Sub Main() Dim sock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Broadcast, 5000) Dim data As Byte() = Encoding.ASCII.GetBytes(“Hello All”) sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1) sock.SendTo(data, iep) sock.Close() End Sub End Class C#: - Server using System; using System.Net; using System.Net.Sockets; using System.Text; public class RecvBroadcst { public static void Main()

~37~


{ Socket sock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 5000); sock.Bind(iep); EndPoint ep = (EndPoint)iep; Console.WriteLine("Ready to receive..."); byte[] data = new byte[1024]; int recv = sock.ReceiveFrom(data, ref ep); string stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("received: {0} from: {1}",stringData, ep.ToString()); } } VB.NET:- Server Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Public Class RecvBroadcst Public Shared Sub Main() Dim sock As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Any, 5000) sock.Bind(iep) Dim ep As EndPoint = CType(iep, EndPoint) Console.WriteLine("Ready to receive...") Dim data As Byte() = New Byte(1023) Dim recv As Integer = sock.ReceiveFrom(data, ep) Dim stringData As String = Encoding.ASCII.GetString(data, 0, recv) Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()) End Sub End Class ‫د‬ٚ‫ اٌتذ‬ٟ‫ فت‬UDP‫اٌتـ‬ٚ TCP‫اعتزخذاَ اٌتـ‬ٚ TCP/IP‫ٕب ِشادً االرظبي ثبعتزخذاَ اٌتـ‬١‫٘ىزا ث‬ٚ ‫تخ‬٠‫ِؼّبس‬ٚ Network Layer Encapsulation ٓ‫ ػت‬ٌٟ‫ اٌفظً اٌزب‬ٟ‫ش ف‬٠‫زُ اٌذذ‬١‫ ع‬,‫ذ‬١ٔ ... IPv6‫اٌـ‬ٚ IPv4‫ي اٌـ‬ٛ‫و‬ٛ‫ر‬ٚ‫ثش‬

~38~


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

~39~


‫‪:The Internet Protocol‬‬ ‫ف‪ ٟ‬حٌـ‪ Network Layer‬طظُ عٍّ‪١‬ش عٕ‪ٔٛ‬ش حٌـ‪ Packet‬رخعظخذحَ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حإلٔظشٔض ‪ٚ ،IP‬طظُ‬ ‫٘زٖ حٌّشكٍش رٕخءح عٍ‪ ٝ‬حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌّغظخذَ ف‪ ٟ‬حٌـ‪ Transport Layer‬فبرح طُ حعظخذحَ‬ ‫حٌـ‪ TCP‬عٕذ٘خ ال ٔغظط‪١‬ع اال أْ ‪٠‬ى‪ ْٛ‬حٌعٕ‪ٛ‬حْ حٌّغظخذَ ٘‪ Unicast ٛ‬أِخ ف‪ ٟ‬كخٌش وخْ‬ ‫حٌـ‪ ٛ٘ UDP‬حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌّغظخذَ عٕذ٘خ ٔغظط‪١‬ع ‪ٚ‬ػع عٕ‪ٛ‬حْ ‪ Unicast‬أ‪ Multicast ٚ‬أ‪ٚ‬‬ ‫‪ٚ Broadcast‬ع‪ٛ‬ف ٔؤط‪ ٟ‬ف‪ ٟ‬حٌـضء حٌظخٌ‪٘ ِٓ ٟ‬زح حٌفظً عٍ‪ ٝ‬ششف طشو‪١‬ذ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي‬ ‫حإلٔظشٔض ‪ٚ IPv4‬ؽشق ‪ٚ‬ػع عٕخ‪ ٓ٠ٚ‬حٌـ‪ٚ Unicast‬حٌـ‪ٚ Multicast‬حٌـ‪ Broadcast‬ف‪:ٗ١‬‬ ‫‪IPv4 Architecture : 2.1‬‬ ‫‪ٛ٠‬ػق حٌشىً حٌظخٌ‪ ٟ‬حٌظشو‪١‬ذ حٌعخَ ٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حإلٔظشٔض ‪: IPv4‬‬

‫‪٠‬ظاشح‪ٚ‬ف كـاُ حٌاـ‪ Header‬حٌخاخص رخٌاـ‪ِ IPv4‬آ ‪ 22‬اٌا‪ 60 Bytes ٝ‬رٕاخءح عٍا‪ ٝ‬حٌاـ‪Options‬‬ ‫حٌّغااظخذَ فاابرح ٌااُ ‪٠‬ااظُ حعااظخذحَ حٌااـ‪ Options‬عٕااذ٘خ عاا‪١‬ى‪ ْٛ‬كـااُ حٌااـ‪ Header‬ػخرااض ‪٘ٚ‬اا‪20 ٛ‬‬ ‫‪ٚ Bytes‬ف‪٘ ٟ‬زٖ حٌلخٌش ‪ّ٠‬ىٕ​ٕخ ِعشفش كـُ حٌـ‪ Data‬حٌّشعٍش عزش حٌـ‪ TCP‬وّخ ‪:ٍٟ٠‬‬ ‫‪Data = total Length – (20 Bytes for IPv4 Header+ 20 Bytes For TCP‬‬ ‫)‪Header‬‬ ‫‪ٚ‬طمغُ حٌـ‪ 20 Bytes‬حٌخخطش رخٌـ‪ IPv4 Header‬وّخ ‪:ٍٟ٠‬‬ ‫‪ٛ٠ 4 Bits‬ػع ف‪ٙ١‬خ حٌـ‪ Version‬حٌّغظخذَ ‪ٕ٘ ٛ٘ٚ‬خ ‪٠ٚ IPv4‬ظُ طّؼ‪ 0100 ٍٗ١‬ف‪ ٟ‬حٌـ‪.Binary‬‬ ‫‪ٌٍ 4 Bits‬ـ‪ٛ٠ٚ Header Length‬ػع ف‪ ٟ‬كـُ حٌـ‪ِ Header‬مغ‪ َٛ‬عٍ‪4 ٝ‬‬ ‫‪ٌٍ 8 Bits‬اـ‪ Type of Services‬ك‪١‬اغ ‪ّ٠‬ؼاً ف‪ٙ١‬اخ ِاذ‪ ٜ‬ؿا‪ٛ‬دس حٌخذِاش حٌّطٍ‪ٛ‬راش ٌٍزش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي‬ ‫حٌّغاظخذَ فا‪ ٟ‬حٌاـ‪ِٕٙٚ ، Application Layer‬اخ ‪ Minimum Delay‬أ‪ ٚ‬حٌاـ ‪Maximum‬‬ ‫‪ٚ Services‬غ‪١‬ش٘خ‪...‬‬ ‫‪ٚ 32 Bits‬طغظخذَ ٌعٍّ‪١‬خص حٌـ‪ٚ Fragmentation‬اعخدس طشط‪١‬ذ حٌـ‪Fragments‬‬ ‫‪ٚ 8 Bits‬طغااظخذَ ٌظلذ‪٠‬ااذ حٌااـ ‪٠ٚ TTL – Time to Live‬عزااش عاآ عااذد حٌااـ‪ Hops‬أ‪ٚ‬‬ ‫حٌـ‪ Routers‬حٌظ‪٠ ٟ‬غّق ٌٍـ‪ Packet‬حٌّش‪ٚ‬س ِآ خالٌ‪ٙ‬اخ اٌا‪ ٝ‬أْ طٕظ‪ٙ‬ا‪ٚ ، ٟ‬حٌعاذد حالفظشحػا‪ٌٙ ٟ‬اخ‬ ‫‪ٚ 16 hops‬عٕذ ِش‪ٚ‬س٘خ رىً ‪٠ Router‬ظُ ؽشف ‪ ِٓ 1‬ل‪ّ١‬ظ‪ٙ‬خ‪.‬‬

‫~‪~41‬‬


‫‪ 8 Bits‬أخااش‪ٌ ٜ‬ظلذ‪٠‬ااذ ٔاا‪ ٛ‬حٌزش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي حٌّغااظخذَ فاا‪ ٟ‬حٌااـ‪ Upper Layer‬عاا‪ٛ‬حء ‪ TCP‬أ‪ٚ‬‬ ‫‪... UDP‬‬ ‫‪ٌٍ 16 Bits‬ـ ‪ٚ Checksum‬ال طخظٍف ؽش‪٠‬مش كغخرٗ عآ حٌطش‪٠‬ماش حٌّغاظخذِش فا‪ ٟ‬حٌاـ‪ TCP‬أ‪ٚ‬‬ ‫حٌـ‪ٚ UDP‬حٌظ‪ ٟ‬ششكٕخ٘خ ف‪ ٟ‬حٌفظً حأل‪ٚ‬ي‪.‬‬ ‫‪ٌ 32 Bits‬ظلذ‪٠‬ذ عٕ‪ٛ‬حْ حٌـ‪ٙ‬خص حٌّشعً‬ ‫‪ 32 Bits‬أخش‪ٌ ٜ‬ظلذ‪٠‬ذ عٕ‪ٛ‬حْ حٌـ‪ٙ‬خص حٌّغظمزً‬ ‫‪ٚ‬عااف ٔزاا‪ ٓ١‬فاا‪ ٟ‬حٌـااضء حٌظااخٌ‪ِ ٟ‬اآ ٘اازح حٌفظااً ؽش‪٠‬مااش ط‪١ٌٛ‬ااذ حٌااـ‪ٚ Unicast‬حٌااـ‪Broadcast‬‬ ‫‪ٚ‬حٌـ‪ Unicast‬رخعظخذحَ حٌـ‪ٚ Classful‬حٌـ ‪: CIDR - Classless InterDomain Routing‬‬ ‫‪Classful IP Address : 2.1.1‬‬ ‫طعظزش عٍّ‪١‬ش حٌعٕ‪ٔٛ‬ش رخعظخذحَ حٌـ‪ Classful‬رغا‪١‬طش ؿاذح ‪٠ٚ‬مغاُ ف‪ٙ١‬اخ حٌعٕا‪ٛ‬حْ اٌا‪ ٝ‬ؿاضأ‪٠ ،ٓ٠‬عزاش‬ ‫حٌـضء حأل‪ٚ‬ي عٓ عٕ‪ٛ‬حْ حٌـ ‪ٚ Network ID‬حٌـضء حٌؼاخٔ‪ ٟ‬عآ حٌاـ‪ٚ Host ID‬وّاخ ٘ا‪ِٛ ٛ‬ػاق‬ ‫ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫ك‪١‬غ ‪٠‬زذأ حٌـ ‪ 1 ِٓ Class A‬اٌ‪٠ٚ 126 ٝ‬ى‪ ْٛ‬ل‪ّ١‬ش حٌـ‪ Bit‬حأل‪ٚ‬ي ف‪ ٟ‬حٌـ‪ Binary‬طفش ‪2‬‬ ‫‪٠ٚ‬زذأ ‪ 128 ِٓ Class B‬اٌ‪٠ٚ 191 ٝ‬ى‪ ْٛ‬ل‪ّ١‬ش حٌـ ‪ Bit‬حأل‪ٚ‬ي ف‪ ٟ‬حٌـ‪ٚ Binary‬حكذ ‪1‬‬ ‫‪٠ٚ‬زذأ ‪ 192 ِٓ Class C‬اٌ‪٠ٚ 223 ٝ‬ى‪ ْٛ‬ل‪ّ١‬ش حٌـ ‪ Bit‬حأل‪ٚ‬ي ‪ٚ‬حٌؼخٔ‪ ٟ‬ف‪ ٟ‬حٌـ‪ٚ Binary‬حكذ‬ ‫‪ٚ‬حكذ ‪ ... 1 1‬أِخ ‪ Class D‬ف‪١‬زذأ ِٓ ‪ٚ 224‬طى‪ ْٛ‬حٌؼالػش ‪ Bits‬حأل‪٠ٚ 111 ِٕٗ ٌٝٚ‬غظخذَ‬ ‫ٌظعز‪١‬ش عٓ حٌـ ‪ٚ... Multicast Group‬حٌشىً حٌظخٌ‪ٛ٠ ٟ‬ػق ٘زٖ حٌظمغ‪ّ١‬خص‪:‬‬

‫‪ٚ‬العظخشحؽ عٕا‪ٛ‬حْ حٌاـ ‪ِ Broadcast‬آ أ‪ِ ٞ‬آ حٌظمغا‪ّ١‬خص حٌغاخرمش ‪٠‬اظُ طعزجاش حٌاـ‪ Bits‬حٌخخطاش‬ ‫رخٌـ‪ Host ID‬ر‪ٛ‬حكذ ‪ٚ‬وّؼخي ٌّعشفش حٌاـ ‪ٌٍ Broadcast Address‬عٕا‪ٛ‬حْ ‪٠ 10.0.0.1‬ـاذ أ‪ٚ‬ال‬ ‫طلذ‪٠‬ذ اٌا‪ ٝ‬أ‪ٕ٠ Class ٞ‬ظّا‪٘ ٟ‬ازح حٌعٕا‪ٛ‬حْ‪ِٚ ،‬آ حٌ‪ٛ‬حػاق أٔاٗ ‪ٕ٠‬ظّا‪ ٟ‬اٌا‪ Class A ٝ‬ألْ حٌـاضء‬ ‫حٌخخص رخٌـ ‪٠ Network ID‬زاذأ راـ‪٘ٚ 10‬ا‪ ٛ‬را‪ٚ 1 ٓ١‬حٌاـ‪ ،126‬ارح حٌـاضء حٌخاخص رخٌاـ‪Host ID‬‬

‫~‪~40‬‬


‫٘‪ٌٚ 0.0.1 ٛ‬ظل‪ ٍٗ٠ٛ‬اٌ‪ٔ Broadcast Address ٝ‬ؼع ل‪ّ١‬ش ‪ 255‬ف‪ ٟ‬حٌـضء حٌخخص رخٌـ ‪Host‬‬ ‫‪٠ٚ ID‬ظزق حٌعٕ‪ٛ‬حْ وّخ ‪ ٛ٘ٚ 10.255.255.255 :ٍٟ٠‬حٌـ ‪ٌٍ Broadcast Address‬ـ ‪Class‬‬ ‫‪ A‬ف‪ ٟ‬حٌـ‪... Classful Nation‬‬ ‫ٌىٓ حٌّشىٍش ف‪ ٟ‬حٌـ‪ Classful Nation‬أٔٗ ِلذ‪ٚ‬د اٌا‪ ٝ‬دسؿاش وز‪١‬اشس فّاؼال حٌم‪ّ١‬اش حٌعظّا‪ٌ ٝ‬عاذد‬ ‫حٌعٕخ‪ٌٍ ٓ٠ٚ‬ـ ‪ٚ ، 2 32-8 Host ٛ٘ Class A‬وخْ حٌلً ربِىخٔ‪١‬ش دِاؾ حٌاـ‪ٌ Subnets‬ـعاً اِىخٔ‪١‬اش‬ ‫ط‪١ٌٛ‬ذ عٕخ‪ ٓ٠ٚ‬أوؼش ٌٍـ‪ِ ٛ٘ٚ Host Part‬خ ‪٠‬غّ‪ ٝ‬رخٌـ‪... Classless‬‬ ‫‪CIDR - Classless InterDomain Routing IP Address : 2.1.2‬‬ ‫‪ٚ‬طااظُ ٘اازٖ حٌعٍّ‪١‬ااش رخعااظجـخس ِـّ‪ٛ‬عااش ِاآ حٌااـ‪ Bits‬حٌخخطااش رخٌااـ‪ٚ Network Part‬ػااّ‪ٙ‬خ اٌاا‪ٝ‬‬ ‫حٌـ‪ٚ Host Part‬وّؼخي ٌظ‪١ٌٛ‬ذ ‪ 1024‬عٕ‪ٛ‬حْ ؿذ‪٠‬ذ ِٓ حٌعٕ‪ٛ‬حْ ‪192.168.1.0/24‬‬ ‫ٔم‪ َٛ‬رخعظجـخس ‪ ِٓ 2 Bits‬حٌاـ‪ 24 Bits‬حٌخخطاش رخٌاـ‪ Network ID‬عٕاذ٘خ ‪٠‬ظازق حٌاـ‪Subnet‬‬ ‫وّااخ ‪ٍ٠‬اا‪٠ٚ 192.168.1.0/22 : ٟ‬ظاازق ٌٍااـ ‪ 32-22 = 10 Bits ، Host ID‬أ‪2 10 ٞ‬‬ ‫‪ٚ Addresses‬وّخ ٘‪ٚ ٛ‬حػق ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٌّٚ‬عشفش حٌـ ‪ Broadcast‬حٌخخص رخٌعٕ‪ٛ‬حْ حٌـذ‪٠‬ذ ‪ٔ 192.168.1.0/22‬م‪ َٛ‬رظمغا‪ ُ١‬حٌاـ ‪22 Bits‬‬ ‫عٍ‪ ٝ‬حٌعٕ‪ٛ‬حْ ك‪١‬غ وً ؿضء ‪٠‬ؤخز ‪ٚ 8 Bits‬وّخ ‪:ٍٟ٠‬‬

‫‪0‬‬ ‫‪00000000‬‬

‫‪8‬‬ ‫‪8‬‬ ‫‪6‬‬ ‫‪192‬‬ ‫‪168‬‬ ‫‪1‬‬ ‫‪11111111 11111111 11111100‬‬

‫ػ اُ ٔلاا‪ٛ‬ي حٌااـ ‪ one‟s‬فاا‪ ٟ‬حٌـااضء حٌؼخٌااغ اٌاا‪ ٝ‬عشااش‪ٚ ٞ‬عاا‪١‬ى‪ ْٛ‬فاا‪ ٟ‬حٌّؼااخي ‪٘ٚ 252‬اازح ‪٠‬عٕاا‪ ٟ‬أْ‬ ‫حٌـ‪ Addresses Range‬عظزذأ رـ ‪ٚ 192.168.252.0‬عظٕ‪ ٟٙ‬رـ‪192.168.255.254‬‬ ‫ارح ع‪١‬ى‪ ْٛ‬حٌـ ‪... 192.168.255.255 : ٛ٘ Broadcast IP‬‬ ‫الكااع أْ ِشااىٍش حٌّلذ‪ٚ‬د‪٠‬ااش ٌٍعٕااخ‪ ٓ٠ٚ‬لااذ كٍااض رشااىً ؿضثاا‪ ٟ‬رخعااظخذحَ حٌااـ‪ٌ CIDR‬ىاآ ِخصحٌااض‬ ‫حإلِىخٔ‪١‬خص ِلذ‪ٚ‬دس ارح أسدٔخ ط‪١ٌٛ‬ذ عٕاخ‪ٌّ ٓ٠ٚ‬ال‪٠‬آ ِآ حألؿ‪ٙ‬اضس ‪ٚ‬واخْ حٌلاً فا‪ ٟ‬حٌاـ‪ IPv6‬ك‪١‬اغ‬ ‫صحد ف‪ ٗ١‬كـُ حٌعٕخ‪ 32 Bits ِٓ ٓ٠ٚ‬اٌ‪ٚ 128 Bits ٝ‬حٌز‪ ٞ‬عا‪١‬ظُ حٌلاذ‪٠‬غ عٕاٗ فا‪ ٟ‬حٌـاضء حٌظاخٌ‪ٟ‬‬ ‫ِٓ ٘زح حٌفظً‪.‬‬ ‫‪IPv6 Architecture : 2.2‬‬ ‫حٌااـ‪٘ٚ IPv6‬اا‪ ٛ‬حٌـ‪١‬ااً حٌظااخٌ‪ ٌٍ ٟ‬اـ‪ IPv4‬كااً حٌااـ‪ IPv6‬حٌىؼ‪١‬ااش ِاآ حٌّشااخوً حٌظاا‪ ٟ‬ط‪ٛ‬حؿااٗ حٌااـ‪IPv4‬‬ ‫‪ٍٔٚ‬خظ‪ٙ‬خ رّـّ‪ٛ‬عش ِٓ حٌٕمخؽ‪:‬‬ ‫ حٌلخؿش اٌ‪ ٝ‬عٕخ‪ ٓ٠ٚ‬أوؼش ك‪١‬غ أْ حٌم‪ّ١‬ش حٌعظّ‪ٌٍ ٝ‬ـ‪ IPv4 Address‬طزما‪ِ ٝ‬لاذ‪ٚ‬دس ِاع ص‪٠‬اخدس‬‫حٌطٍذ عٍ‪ ٝ‬عٕخ‪ ٓ٠ٚ‬حٌـ‪ IP‟s‬ف‪ ٟ‬حٌعخٌُ‪.‬‬ ‫ لذ ‪٠‬ئد‪ ٞ‬حٌـ‪ IPv4‬اٌ‪ِ ٝ‬ـّ‪ٛ‬عش ِٓ حٌّشخوً ‪ٚ‬خخطش ف‪ٚ Routing Table ٟ‬حٌظ‪ ٟ‬لذ طاُ كٍ‪ٙ‬اخ‬‫ف‪ ٟ‬حٌـ‪IPv6‬‬ ‫ ِشىٍش حٌـ‪ Security‬ف‪ ٟ‬حٌـ‪ IPv4‬ك‪١‬غ ٌُ ‪٠‬ذعُ أ‪ ِٓ ٞ‬عٍّ‪١‬خص حٌظشف‪١‬ش ‪ٚ‬حٌظلمك‬‫‪ Authentication‬عٍ‪ِ ٝ‬غظ‪ ٜٛ‬حٌـ‪ٚ Network Layer‬لذ كٍض ٘زٖ حٌّشىٍش ف‪ ٟ‬حٌـ‪IPv4‬‬

‫~‪~42‬‬


‫رخعظخذحَ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ‪ IPSec‬ك‪١‬غ ‪٠‬ظُ طشف‪١‬ش حٌـ‪ٚ IP‬حٌـ‪ Port‬عٍ‪ِ ٝ‬غظ‪ ٜٛ‬حٌـ‪ٌ Socket‬ىٓ‬ ‫أطزلض حٌلخؿش ٍِلش ٌـعً ٘زٖ حٌـ‪ِ Security‬ذِـش عٍ‪ِ ٝ‬غظ‪ ٜٛ‬حٌـ‪. Network Layer‬‬ ‫ طط‪٠ٛ‬ش ِزذأ حٌـ‪ Broadcast‬ك‪١‬غ طُ طط‪٠ٛ‬شٖ اٌ‪ ٝ‬حٌـ‪ any cast‬ار ‪٠‬ظُ اسعخي سعخٌش ‪ٚ‬حكذس اٌ‪ٝ‬‬‫وً ؿ‪ٙ‬خص عٍ‪ ٝ‬حٌشزىش ‪ٚ‬ف‪ ٟ‬كخٌش ‪ٚ‬ؿذ حٌـ‪ٙ‬خص حٌّعٕ‪٠ ٟ‬ظ‪ٛ‬لف حٌـ‪ Router‬عٓ حإلسعخي ‪ٚ ،‬حٌ‪ٙ‬ذف‬ ‫ف‪٘ ٟ‬زٖ حٌطش‪٠‬مش ا‪٠‬ـخد ؽش‪٠‬مش طخفغ ِٓ حٌـ‪ Bandwidth‬حٌّغظخذَ عٕذ حٌزلغ عٓ ؿ‪ٙ‬خص ِخ‬ ‫عٍ‪ ٝ‬حٌشزىش‪.‬‬ ‫كً حٌـ‪ IPv6‬وً ٘زٖ حٌّشخوً ك‪١‬غ دعُ ِخ ‪٠‬عخدي ‪ ٛ٘ٚ 2128 Addresses‬سلُ وز‪١‬ش ؿذح وّخ‬ ‫لًٍ ِٓ كـُ حٌـ‪ِّ Routing Table‬خ عش عٍّ‪١‬خص حٌظ‪ٛ‬ؿ‪ Routing ٗ١‬وّخ دعُ عٍّ‪١‬خص‬ ‫حٌـ‪ٚ Authentication‬حٌظشف‪١‬ش عٍ‪ِ ٝ‬غظ‪ ٜٛ‬حٌـ‪ Network Layer‬وُ طُ كزف حٌـ ‪Type of‬‬ ‫‪ٚ Services‬كً ِلٍ‪ٙ‬خ حٌـ‪ Priority‬أ‪ ٞ‬حأل‪٠ٌٛٚ‬خص‪ٛ٠ٚ ،‬ػق حٌشىً حٌظخٌ‪ ٟ‬حٌـ‪ Header‬حٌخخطش‬ ‫رخٌـ‪: IPv6‬‬

‫‪٠‬غظخذَ حٌـ‪ IPv6‬حٌـ ‪ hexadecimal‬رذال ِٓ حٌـ‪ Decimal‬ف‪ ٟ‬حٌـ‪ٌ IPv4‬ظّؼ‪ ً١‬حٌعٕا‪ٛ‬حْ ‪ٚ‬طىا‪ْٛ‬‬ ‫حٌظ‪١‬غش حٌعخِش ٌٗ وّخ ‪ ٍٟ٠‬وّؼخي‪:‬‬ ‫‪69dc:8864:ffff:ffff:0:1280:8c0a:ffff‬‬ ‫الكع حٔٗ ‪٠‬ظى‪ ِٓ ْٛ‬ػّخٔ‪١‬ش ِٕخصي رذال ِٓ ‪ 4‬رخٌـ‪ ، IPv4‬ف‪ ٟ‬وً ِٕضٌش ‪ٛ٠‬ػع ر‪ٙ‬خ ‪.16 Bits‬‬ ‫‪ٌٚ‬ظّؼ‪ ٍٗ١‬ف‪ ٟ‬حٌـ‪ٔ Hexadecimal‬عط‪ٌ 4 Digits ٟ‬ىً ِٕضٌش ف‪ٚ ٗ١‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٚ‬طمغُ حٌعٕخ‪ ٓ٠ٚ‬ف‪ ٟ‬حٌـ‪ IPv6‬اٌ‪ٛٔ ٝ‬ع‪Geographic- ٚ Provider-Based Addresses ٓ١‬‬ ‫‪ based Addresses‬ك‪١‬غ ‪٠‬م‪ َٛ‬حٌـ‪ ISP‟s‬رظ‪ٛ‬ص‪٠‬ع حٌعٕـخ‪ ٓ٠ٚ‬عٍ‪ ٝ‬حٌـ‪ Clients‬رخعظخذحَ‬ ‫حٌـ‪ Standard‬حٌخخص ‪ٚ Provider-Based Addresses‬أِخ حٌـ ‪Geographic-based‬‬ ‫‪ Addresses‬ف‪ِ ٛٙ‬خظض إلعطخء حٌعٕخ‪ ٓ٠ٚ‬حٌذ‪١ٌٚ‬ش ‪ ،‬أ‪ ٞ‬حٔٗ ع‪١‬ى‪ٌ ْٛ‬ىً د‪ٌٚ‬ش سِض خخص‬ ‫‪٠‬ى‪ ْٛ‬ف‪ ٟ‬رذح‪٠‬ش حٌعٕ‪ٛ‬حْ ‪ٚ‬وّخ ‪:ٍٟ٠‬‬

‫~‪~43‬‬


- 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. :ٌٟ‫الكع حٌشىً حٌظخ‬

Unicast‫ٓ حٌااـ‬٠ٚ‫ااذ عٕااخ‬١ٌٛ‫ااش ط‬١‫ف‬١‫و‬ٚ IPv6‫حٌااـ‬ٚ IPv4‫ ٘اازح حٌفظااً ِزااذأ عّااً حٌااـ‬ٟ‫ٕااخ فاا‬١‫٘ىاازح ر‬ٚ . CIDR Nation ‫حٌـ‬ٚ Classful ‫ رخعظخذحَ حٌـ‬Broadcast‫حٌـ‬ٚ ًّ‫ب ٌؼ‬ِٙ‫اعزخذا‬ٚ IP Multicasting ‫ ػٓ اٌـ‬ٌٟ‫ اٌفظً اٌزب‬ٟ‫ش ف‬٠‫زُ اٌذذ‬١‫ع‬ ... ‫ذ‬١ٔ ‫د‬ٚ‫ اٌذ‬ٟ‫ ف‬Multicast Group‫اٌـ‬

~44~


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

~45~


‫‪: IP Multicasting Overview :3.1‬‬ ‫طلذػٕخ ف‪ ٟ‬حٌفظً حأل‪ٚ‬ي عٓ رشط‪ٛ‬و‪ٛ‬ي حٌـ ‪ٚ UDP‬ششكٕخ و‪١‬ف‪١‬ش حعظخذحِٗ ٌعًّ رش‪ٚ‬د وخعض‬ ‫ك‪١‬غ طغظط‪١‬ع عًّ حٌزش‪ٚ‬د وخعض رطش‪٠‬مظ‪ ٓ١‬اِخ رـ‪ٛ‬د ‪٠ Server‬م‪ َٛ‬رعٍّ‪١‬ش حٌظظٕض عٍ‪ٝ‬‬ ‫حٌـ‪ Port‬حٌّلذد ‪٠ ٚ‬غظمزً ِٓ خالٌٗ أ‪ ٞ‬سعخٌش ػُ ‪٠‬م‪ َٛ‬رزؼ‪ٙ‬خ اٌ‪ ٝ‬وً حألؿ‪ٙ‬ضس أ‪ ٚ‬رخعظخذحَ‬ ‫حٌـ‪ IPAddress.Broadcast‬ف‪ ٟ‬ؽشف حٌّشعً ‪ٚ‬حٌز‪ ِٓ ٞ‬خالٌٗ ‪ّ٠‬ىٓ عًّ رغ اٌ‪ ٝ‬وً‬ ‫حألؿ‪ٙ‬ضس ك‪١‬غ ال ػش‪ٚ‬سس ٌ‪ٛ‬ؿ‪ٛ‬د ؿ‪ٙ‬خص ‪ Server‬رل‪١‬غ أْ حٌىً ‪ّ٠‬ىٕٗ حٌظظٕض عٍ‪ ٝ‬حٌـ ‪Port‬‬ ‫حٌّلذد ‪٠ ٚ‬غظمزً ‪٠ٚ‬شعً ِٓ خالٌ‪ٙ‬خ أ‪ ٞ‬سعخٌش اٌ‪ ٝ‬وً حألؿ‪ٙ‬ضس ‪ٚ‬طشزٗ عٍّ‪١‬ش حٌـ‪Broadcast‬‬ ‫عٍّ‪١‬ش حٌزغ حإلرحع‪ ٟ‬ك‪١‬غ أْ حٌـّ‪١‬ع ‪٠‬غظّع ِٓ حٌىً ‪٠ٚ‬شعً اٌ‪ ٝ‬حٌىً ‪ ،‬أِخ ارح أسدٔخ طمغ‪ُ١‬‬ ‫حإلسعخي اٌ‪ِ ٝ‬ـّ‪ٛ‬عخص عٕذ٘خ ‪٠‬ـذ حعظخذحَ حٌـ ‪ٚ IP Multicasting‬رٌه ر‪ٙ‬ذف حعظخذحِٗ‬ ‫ٌعًّ حٌـ ‪٠ ،Multicast Group‬عظزش ٘زح حٌّ‪ٛ‬ػ‪ ِٓ ٛ‬حٌّ‪ٛ‬حػ‪١‬ع حٌّ‪ّٙ‬ش ؿذح ف‪ ٟ‬رشِـ‪١‬خص‬ ‫حٌشزىخص ‪ٌٙٚ‬زح خظظض ٌٗ فظً ِٕفظً عٓ حٌزم‪١‬ش )حٔظش حٌفظً حٌظخعع( ار أْ حغٍذ‬ ‫رشِـ‪١‬خص حٌـ ‪ Conferences‬طعظّذ عٍ‪ ٗ١‬رشىً وز‪١‬ش ‪٠ٚ‬عشف ‪ Multicast‬عٍ‪ ٝ‬حٔٗ حإلسعخي‬ ‫اٌ‪ِ ٝ‬ـّ‪ٛ‬عش ِٓ حٌّغظخذِ‪ ٓ١‬ع‪ٛ‬حء وخْ ‪ Managed‬رخعظخذحَ ‪ Client/Server‬ك‪١‬غ ‪٠‬ى‪ْٛ‬‬ ‫ٕ٘خٌه ؿ‪ٙ‬خص ‪ Server‬ف‪ ٟ‬حٌشزىش ‪ٚ‬ظ‪١‬فظٗ حعظمزخي حٌشعخثً ِٓ حٌـ ‪ Client‬ػُ اسعخٌ‪ٙ‬خ اٌ‪ ٝ‬وخًِ‬ ‫حٌّـّ‪ٛ‬عش ِشس أخش‪ ٜ‬حٔظش اٌ‪ ٝ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫الكع حٔٗ ‪٠‬ظُ اسعخي ؽٍذ حالٔؼّخَ اٌ‪ ٝ‬حٌّـّ‪ٛ‬عش ِٓ لزً حٌـ ‪ٚ Clients‬ارح ‪ٚ‬حفك حٌـ‪Server‬‬ ‫عٍ‪ ٝ‬حٌطٍذ ‪٠‬م‪ َٛ‬رؼُ عٕ‪ٛ‬حْ حٌـ‪ٙ‬خص اٌ‪ ٝ‬حٌـ ‪ IP Address List‬حٌخخطش رٗ ‪ٚ‬طشظشن وً‬ ‫ِـّ‪ٛ‬عش رٕفظ حٌـ ‪٠ٚ IP Multicast‬ظُ حإلسعخي اٌ‪ ٝ‬ؿّ‪١‬ع أعؼخء حٌّـّ‪ٛ‬عش حٌظ‪ ٟ‬طشظشن‬ ‫رٕفظ حٌـ ‪ٚ IP Multicast‬حٌز‪٠ ٞ‬مع ػّٓ حٌـ ‪ِ ٛ٘ٚ Class D‬خ ر‪ٕ١‬خٖ ف‪ ٟ‬حٌفظً حٌغخرك‪.‬‬ ‫حٌٕ‪ ٛ‬حٌؼخٔ‪٠ٚ ٟ‬غّ‪ ٝ‬رخٌـ ‪ peer-to-peer Technique - unmanaged‬ك‪١‬غ أْ وً ؿ‪ٙ‬خص‬ ‫‪٠‬عًّ وـ ‪ client ٚ server‬ف‪ٔ ٟ‬فظ حٌ‪ٛ‬لض ‪ٚ‬ال ‪ٚ‬ؿ‪ٛ‬د ٌـ‪ٙ‬خص ‪ِ Server‬شوض‪ِ ٞ‬خظض‬ ‫ٌعٍّ‪١‬ش حالعظمزخي ‪ٚ‬حٌظ‪ٛ‬ص‪٠‬ع ك‪١‬غ طظُ حٌّ‪ٛ‬حفمش عٍ‪ ٝ‬ؽٍذ حالٔؼّخَ اٌ‪ ٝ‬حٌّـّ‪ٛ‬عش رشىً طٍمخث‪ٟ‬‬ ‫‪ٚ‬أ‪ ٞ‬ؿ‪ٙ‬خص ف‪ ٟ‬حٌّـّ‪ٛ‬عش ٌٗ حٌلك ف‪ ٟ‬حالٔؼّخَ ػُ حالعظمزخي ‪ٚ‬حإلسعخي اٌ‪ ٝ‬وخًِ حٌّـّ‪ٛ‬عش‬ ‫الكع حٌشىً حٌظخٌ‪: ٟ‬‬

‫~‪~46‬‬


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 ِٓ ٜ‫حٌّذ‬ Multicasting Group ًّ‫ب ٌؼ‬ِٙ‫اعزخذا‬ٚ IP Multicasting :3.2 ُ‫ظ‬٠ ‫غ‬١‫ ك‬Socket Namespace ‫ رخعظخذحَ حٌـ‬IP Multicast ‫ذ ٌٍـ‬١‫ض دعُ ؿ‬١ٔ ‫ص‬ٚ‫لذِض حٌذ‬ IGMP Protocol ‫ ٔعشف ِٓ خالٌٗ حٌـ‬ٞ‫حٌز‬ٚ SetSocketOption ‫خ رخعظخذحَ حٌذحٌش‬ٙ‫ف‬٠‫طعش‬ join) multicast group ‫عش‬ّٛ‫ حٌّـ‬ٌٝ‫ح‬ٚ ِٓ ‫ؽ‬ٚ‫حٌخش‬ٚ َ‫خص حالٔؼّخ‬١ٍّ‫َ ربدحسس ع‬ٛ‫م‬٠ ٞ‫حٌز‬ٚ ٚ AddMembership ‫ش‬٠ٛ‫اٌغخء حٌعؼ‬ٚ ‫غظخذَ إلػخفش‬٠ ‫ ( وّخ‬leave & ٓ‫ّى‬٠ٚ ، Multicast Routing ‫خص حٌّظعٍمش رخٌـ‬١ٍّ‫ حٌع‬ٌٝ‫ رخإلػخفش ا‬DropMembership ٌٗ‫خٔخص ِٓ خال‬١‫ظُ حعظمزخي حٌز‬١‫ ع‬ٞ‫حٌز‬ٚ Port‫ذ سلُ حٌـ‬٠‫ ٌظلذ‬UdpClient Object‫حعظخذحَ حٌـ‬ ً‫ف طغظمز‬ٛ‫ ع‬ٟ‫خص حٌظ‬ٙ‫ ِٓ خالٌٗ طلذد حٌـ‬ٞ‫حٌز‬ٚ IP Multicasting ‫ف حٌـ‬٠‫ طعش‬ٌٝ‫رخإلػخفش ا‬ IP Multicast ‫غظخذَ ٔفظ حٌـ‬٠ٚ Port‫ ٘زح حٌـ‬ٍٝ‫ظٕظض ع‬٠ ‫ شخض‬ٞ‫ع أ‬١‫غظط‬٠ ‫غ‬١‫ ك‬، ‫حٌشعخٌش‬ ُ‫غ ٔغظخذَ سل‬١‫خص رل‬ٙ‫ عذس ؿ‬ٌٝ‫ إلسعخي سعخٌش ا‬ٌٟ‫د حٌظخ‬ٛ‫غظخذَ حٌى‬٠ ، ‫حعظمزخي ٘زٖ حٌشعخٌش‬ :‫ وّؼخي‬224.100.0.1 Group ‫ ػّٓ حٌـ‬ٚ 5020 Port‫حٌـ‬ C#: using System; using System.Net; using System.Net.Socket; 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);

~47~


server.Close(); } } VB.NET: Imports System Imports System.Net Imports System.Net.Socket 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 ... َ‫ي حٌّغظخذ‬ٛ‫و‬ٛ‫حٌزشط‬ٚ Socket‫حٌـ‬ UdpClient ‫ف حٌـ‬١‫ٔؼ‬ٚ ٗ‫ ٔفغ‬Socket ‫ف حٌـ‬٠‫ف ٔغظخذَ طعش‬ٛ‫إلٔشخء رشٔخِؾ حالعظمزخي ع‬ٚ TTL‫ذ حٌـ‬٠‫ؼخ طلذ‬٠‫ّىٓ أ‬٠ٚ ، ٗ١ٍ‫ذ حٌظظٕض ع‬٠‫ ٔش‬ٟ‫ حٌظ‬Port ‫ٔغٕذ ٌٗ سلُ حٌـ‬ٚ Object ِٓ ‫س‬ٚ‫ رخٌّش‬Packet‫غّق ٌٍـ‬٠ ٟ‫ حٌظ‬Routers‫عزش عٓ عذد حٌـ‬٠ٚ Multicast Packet‫ٌٍـ‬ :50 Hops ‫ ٘زح حٌّؼخي كذدٔخ٘خ رـ‬ٟ‫ف‬ٚ ‫خ‬ٌٙ‫خال‬ C#: using System; using System.Net; using System.Net.Socket; 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);

~48~


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();}} VB.NET: Imports System Imports System.Net Imports System.Net.Socket 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 ٓ١‫ٓ حٌغخرم‬١٠‫د‬ٛ‫ّىٓ حعظخذحَ حٌى‬٠ ‫خ وّخ‬ٌٙ‫ اسعخ‬ٚ ‫خٔخص‬١‫ؿذ ؽشق ِظعذدس العظمزخي حٌز‬ٛ‫الكع حٔٗ ط‬ ‫ء‬ٟ‫ ش‬ٞ‫ أ‬ٚ‫ ؿخٔذ حٌٕض أ‬ٌٝ‫سس ا‬ٛ‫ّىٕه اسعخي ط‬٠ ‫ حالعظمزخي وّخ‬ٚ ‫ ٔفظ حٌزشٔخِؾ ٌإلسعخي‬ٟ‫ف‬ ً١‫ ٌظّؼ‬memory Stream ‫ اػخفش حٌـ‬ٜٛ‫ه ع‬١ٍ‫ ار ِخ ع‬Binary ٌٝ‫ٍٗ ا‬٠ٛ‫ّىٓ طل‬٠ ‫أخش‬ ‫ّىٕه عًّ رشٔخِؾ إلسعخي‬٠ ‫ حالعظمزخي وّخ‬ٚ ‫د حإلسعخي‬ٛ‫ و‬ٌٝ‫ ا‬Byte Array ‫سس وـ‬ٛ‫حٌظ‬ ٟ‫ضس حٌظ‬ٙ‫ع حألؿ‬١ّ‫ ٌـ‬Shutdown ًّ‫وّؼخي ع‬ٚ ‫ُ عٓ رعذ‬ٙ‫ ٌظلىُ ر‬Clients ‫ حٌـ‬ٌٝ‫حِش ا‬ٚ‫أ‬ ‫سس عزش‬ٛ‫ؼخ عًّ رشٔخِؾ إلسعخي ط‬٠‫ّىٕه أ‬٠ٚ ، Multicast Group ‫ ٔفظ حٌـ‬ٍٝ‫طعًّ ع‬ ‫ حٌفظً حٌظخعع‬ٟ‫خ ف‬ٙ‫ ششك‬ٍٝ‫ ع‬ٟ‫ عآط‬ٟ‫حٌظ‬ٚ ‫ش‬١‫خص ِظعذدس رخعظخذحَ ٔفظ حٌخخط‬ٙ‫ ؿ‬ٌٝ‫شح ا‬١ِ‫حٌىخ‬ ... Advanced Multicast Systems

~49~


Part 2 Streaming in Dot Net

Chapter4 Streaming in Dot Net Chapter5 Applied Streaming in Dot Net

~51~


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

- Stream Classes - Stream Members - Stream Manipulation

~50~


‫‪: Managed I/O: Streams, Readers, and Writers : 2.1‬‬ ‫اْ حٌ‪ٙ‬ذف ِٓ أشخء ِىظزخص حٌـ ‪ Stream‬طغ‪ ً١ٙ‬عٍّ‪١‬ش ٔمً حٌز‪١‬خٔخص ِٓ ِىخْ اٌ‪ ٝ‬آخش ع‪ٛ‬حء‬ ‫عزش حٌشزىش أ‪ ٚ‬ػّٓ حٌـ‪ Local Computer‬وّخ ٘‪ ٛ‬حٌلخي رظعخًِ ِع حٌٍّفخص أ‪ ٚ‬حٌظعخًِ ِع‬ ‫حٌطخرعش أ‪ ٚ‬أ‪ ٞ‬ؽشف‪١‬ش أ‪ ٚ‬ؿ‪ٙ‬خص آخش ِ‪ٛ‬ط‪ٛ‬ي رخٌىّز‪ٛ١‬طش ك‪١‬غ طغ‪ ًٙ‬عٍ‪ٕ١‬خ عٍّ‪١‬ش طل‪ٍٙ٠ٛ‬خ اٌ‪ٝ‬‬ ‫‪ٚ Byte Array‬اسعخٌ‪ٙ‬خ ‪ِ ٛ٘ٚ‬خ كً حٌىؼ‪١‬ش ِٓ حٌّشخوً حٌظ‪ ٟ‬وخٔض ط‪ٛ‬حؿٗ حٌّزشِـ‪ ٓ١‬ف‪ٟ‬‬ ‫حٌظعخًِ ِع ‪.. Binary Data‬‬ ‫‪ّ٠‬ىٓ حٌظعخًِ ِع حٌـ‪ Stream‬رؤعٍ‪ٛ‬ر‪ ٓ١‬حٌّظضحِٓ ‪ٚ Synchronous‬حٌغ‪١‬ش ِظضحِٓ‬ ‫‪ٚ Asynchronous‬رشىً حفظشحػ‪ ٟ‬طعًّ ؿّ‪١‬ع حٌـ‪ IO Streams‬رخألعٍ‪ٛ‬د حٌّظضحِٓ ٌىٓ‬ ‫حٌع‪١‬ذ ف‪ ٛ٘ ٗ١‬طؤػ‪١‬شٖ حٌشذ‪٠‬ذ عٍ‪ ٝ‬أدحث‪١‬ش حٌٕظخَ ار ‪٠‬م‪ َٛ‬ربغالق حٌـ‪ Processing Unit‬ف‪ٟ‬‬ ‫حٌـ‪ Thread‬حٌّخظظش ٌٍزشٔخِؾ رل‪١‬غ ال ‪٠‬غّق رظٕف‪١‬ز أ‪ ٞ‬أِش آخش اال رعذ حالٔظ‪ٙ‬خء ِٓ حٌعٍّ‪١‬ش‬ ‫حٌـخس‪٠‬ش ‪ٚ‬ال ‪ٕ٠‬ظق حرذآ حعظخذحَ حألعٍ‪ٛ‬د حٌّظضحِٓ ف‪ ٟ‬كخٌش ارح وٕض طظعخًِ ِع أؿ‪ٙ‬ضس لشحءس‬ ‫‪ٚ‬وظخرش رط‪١‬جش ٔغز‪١‬خ ِؼً حٌـ‪ Floppy Disk‬أ‪ ٚ‬حٌـ‪ٌ Magnetic Tape‬ىٕ‪ٙ‬خ ِ‪ّٙ‬ش ؿذح‬ ‫رخٌزشِـ‪١‬خص حٌظ‪ ٟ‬طعظّذ عٍ‪ ٝ‬أٔظّش حٌضِٓ حٌلم‪١‬م‪ ٟ‬أ‪ ٚ‬حٌـ‪ Real Time Systems‬ك‪١‬غ أٔ‪ٙ‬خ‬ ‫طعظّذ حألعٍ‪ٛ‬د حٌّظضحِٓ ف‪ ٟ‬عٍّ‪١‬ش اسعخي ‪ٚ‬حعظمزخي حٌز‪١‬خٔخص ‪ِ ٛ٘ٚ‬خ ‪ّٕ٠‬ع حٌم‪١‬خَ رؤ‪ ٞ‬عٍّ‪١‬ش‬ ‫أخش‪ ٜ‬اٌ‪ ٝ‬ك‪ ٓ١‬حالٔظ‪ٙ‬خء ِٓ طٕف‪١‬ز حألِش ‪ ِٓٚ‬حألِؼٍش عٍ‪ٙ١‬خ أٔظّش حٌغلذ أ‪ ٚ‬حإل‪٠‬ذح ف‪ ٟ‬حٌشط‪١‬ذ‬ ‫حٌزٕى‪ ٟ‬أ‪ ٚ‬أٔظّش كـض حٌظزحوش أ‪ ٚ‬شلٓ رطخلش حٌ‪ٙ‬خطف ‪ٚ‬غ‪١‬ش٘خ ‪ ..‬ؽزعخ ف‪ ٟ‬كخٌش ارح وخْ‬ ‫رشٔخِـه ال ‪٠‬لظخؽ اٌ‪ٚ ٝ‬ؿ‪ٛ‬د حٌخ‪ٛ‬حص حٌغخرمش عٕذ٘خ ‪ٕ٠‬ظق رخعظخذحَ حألعٍ‪ٛ‬د حٌغ‪١‬ش ِظضحِٓ‬ ‫‪ Asynchronous‬ك‪١‬غ طغظط‪١‬ع ِٓ خالٌٗ طٕف‪١‬ز عٍّ‪١‬خص أخش‪ ٜ‬ف‪ٚ ٟ‬كذس حٌّعخٌـش ‪ٚ‬رذ‪ْٚ‬‬ ‫حٌلخؿش الٔظظخس أ‪ٙ‬خء حٌعٍّ‪١‬ش حٌـخس‪٠‬ش ار ‪٠‬ظُ أشخء ‪ٌ Separate thread‬ىً عٍّ‪١‬ش ؽٍذ ادخخي‬ ‫أ‪ ٚ‬اخشحؽ ِّ خ ال ‪٠‬ئػش عٍ‪ ٝ‬أدحث‪١‬ش حٌٕظخَ ‪ٕ٠ٚ‬ظق رخعظخذحِٗ ارح وخٔض عٍّ‪١‬ش حٌمشحءس أ‪ ٚ‬حٌىظخرش‬ ‫طـش‪ ِٓ ٜ‬خالي أؿ‪ٙ‬ضس رط‪١‬جش ٔغز‪١‬خ ‪ّ٠ٚ‬ىٓ طّ‪١‬ض حٌذ‪ٚ‬حي حٌّظضحِٓ عٓ حٌغ‪١‬ش ِظضحِٓ ف‪ ٟ‬حٌذ‪ٚ‬ص‬ ‫ٔ‪١‬ض ر‪ٛ‬ؿ‪ٛ‬د وٍّش ‪ Begin‬أ‪ End ٚ‬ف‪ ٟ‬رذح‪٠‬ش حعُ حٌذحٌش حٌغ‪١‬ش ِظضحِٓ ‪ٚ‬وّؼخي عٍ‪ٙ١‬خ‬ ‫‪ ٚ BeginRead ٚ BeginWrite‬حٌـ‪ ٚ EndWrite‬حٌـ‪.. EndRead‬‬ ‫أ‪ٚ‬ال‪Stream Classes :‬‬ ‫طذعُ حٌذ‪ٚ‬ص ٔ‪١‬ض عٍّ‪١‬خص حٌـ‪ Streams‬رّـّ‪ٛ‬عش ِٓ حٌـ‪ٚ Classes‬حٌّٕذسؿش طلض‬ ‫‪ٚ System.IO Namespace‬حٌظ‪ ٟ‬طغظخذَ ٌعٍّ‪١‬خص حإلدخخي ‪ ٚ‬حإلخشحؽ ٌٕمً حٌز‪١‬خٔخص ‪.‬‬ ‫طغظخذَ رعغ حٌـ‪ ِٓٚ ، Backing storage ، Stream Classes‬حألِؼٍش عٍ‪ٙ١‬خ‬ ‫‪ ٚ FileStream‬حٌـ‪ٚ BufferedStream‬حٌـ‪ٚ MemoryStream‬وزٌه فبْ رعؼ‪ٙ‬خ ال‬ ‫‪٠‬غظخذَ أ‪ ِٓٚ Back Storage ٞ‬حألِؼٍش عٍ‪ٙ١‬خ حٌـ‪ٚ NetworkStream‬حٌظ‪ ٟ‬طغظخذَ ٌٕمً‬ ‫حٌـ‪ Stream‬عزش حٌشزىش ‪ٚ‬رذ‪ ْٚ‬حعظخذحَ ‪ ٚ ، Backing Storage‬طمغُ حٌـ‪Stream Classes‬‬ ‫ف‪ ٟ‬حٌذ‪ٚ‬ص ٔ‪١‬ض وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫~‪~52‬‬


‫‪٠ٚ : BufferedStream Class -1‬غظخذَ رشىً أعخع‪ٌ ٟ‬لـض ِمذحس ِع‪ ِٓ ٓ١‬حٌزحوشس‬ ‫رشىً ِئلض ٌظٕف‪١‬ز عٍّ‪١‬ش ِع‪ٕ١‬ش وّخ طغظخذَ رعغ حٌزشِـ‪١‬خص حٌـ‪ٌ Buffering‬ظلغ‪ ٓ١‬حألدحث‪١‬ش‬ ‫ك‪١‬ض طى‪ ْٛ‬وزحوشس ‪ٚ‬ع‪١‬طش ر‪ ٓ١‬حٌّعخٌـش ‪ٚ‬حإلسعخي أ‪ ٚ‬حالعظمزخي ‪ٚ‬وّؼخي عٍ‪ٙ١‬خ رشِـ‪١‬خص‬ ‫حٌ طزخعش ك‪١‬غ طغظخذَ حٌطخرعش رحوشس ‪ٚ‬ع‪١‬طش ٌظخض‪ ٓ٠‬حٌز‪١‬خٔخص حٌّشحد ؽزخعظ‪ٙ‬خ رشىً ِئلض ‪ٚ ،‬‬ ‫‪٠‬ىّٓ حٌ‪ٙ‬ذف حألعخع‪ ِٓ ٟ‬حعظخذحَ حٌـ‪ Buffering‬ف‪ ٟ‬حٌعٍّ‪١‬خص حٌظ‪٠ ٟ‬ى‪ ْٛ‬ف‪ٙ١‬خ حٌّعخٌؾ أعش‬ ‫ِٓ عٍّ‪١‬خص حإلدخخي ‪ ٚ‬حإلخشحؽ ك‪١‬غ ‪٠‬ظُ ِعخٌـش حٌز‪١‬خٔخص ‪ٚ​ٚ‬ػع‪ٙ‬خ ف‪ ٟ‬حٌـ‪ Buffer‬ف‪ ٟ‬حٔظظخس‬ ‫اسعخٌ‪ٙ‬خ ‪ِ ٛ٘ٚ‬خ ‪٠‬غخُ٘ ف‪ ٟ‬طلغ‪ ٓ١‬حألدحث‪١‬ش رشىً وز‪١‬ش ‪٠ٚ ،‬غظخذَ حٌـ‪ BufferedStream‬عخدطخ‬ ‫ف‪ ٟ‬رشِـ‪١‬خص حٌشزىخص ِع حٌـ‪ٌ NetworkStream‬ظخض‪ ٓ٠‬حٌز‪١‬خٔخص حٌّشحد اسعخٌ‪ٙ‬خ عزش حٌشزىش‬ ‫ف‪ ٟ‬حٌزحوشس ك‪١‬غ ال ‪٠‬غظخذَ ٘زح حٌىالط ‪ Backing storage‬وّخ روشٔخ عخرمخ ‪ ..‬رشىً‬ ‫حفظشحػ‪٠ ٟ‬ظُ كـض ‪ 4096 bytes‬عٕذ حعظخذحَ حٌـ‪ّ٠ٚ BufferedStream‬ىٓ ص‪٠‬خدط‪ٙ‬خ أ‪ٚ‬‬ ‫طمٍ‪ٍٙ١‬خ كغذ حٌلخؿش‪٠ٚ ..‬غظخذَ حٌـ‪ 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‬‬ ‫;)‪MemoryStream ms = new MemoryStream(xx‬‬ ‫;)‪readBufStream(ms‬‬ ‫}‬

‫~‪~53‬‬


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 ‫ رخعظخذحَ حٌـ‬ٜ‫ ٔض ِشس حخش‬ٌٝ‫ٍٗ ا‬٠ٛ‫خطٗ رعذ طل‬٠ٛ‫لّٕخ رطزخعش ِلظ‬ ..ٗ‫ؽزخعظ‬ٚ ‫ذ‬١‫عظزش ولً ؿ‬٠ ‫ حٌغخرمش ار‬Buffring‫ش حٌـ‬١ٍّ‫ٗ رع‬١‫ شز‬ٛ٘ٚ : MemoryStream Class -2 ‫غ‬١‫ حألعظمزخي ك‬ٚ‫ لزً حإلسعخي أ‬Stream Data ‫ حٌزحوشس وـ‬ٟ‫خٔخص رشىً ِئلض ف‬١‫ٓ حٌز‬٠‫ٌظخض‬ ‫ؼخ إلؿشحء‬٠‫غظخذَ ح‬٠ٚ ‫ش‬١‫ش رشىً وز‬١ٍّ‫غش حٌع‬٠ ‫ شىً ٍِف ِّخ‬ٍٝ‫خ ع‬ٕٙ٠‫ه عٓ طخض‬١ٕ‫غ‬٠ ‫خ‬ِٕٙ‫غ حعظخذ‬١‫ وّؼخي ك‬ٍٟ٠ ‫غظخذَ وّخ‬٠ٚ ،‫حٌعىظ‬ٚ Stream ٌٝ‫ ا‬Byte ِٓ ً٠ٛ‫خص حٌظل‬١ٍّ‫ع‬ : ‫ حٌزحوشس‬ٟ‫سس ف‬ٛ‫ٓ ط‬٠‫ٌظخض‬

~54~


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 ‫ إلسعخٌٗ عزش حٌشزىش‬Stream‫غظخذَ ٌظعخًِ ِع حٌـ‬٠ٚ: NetworkStream Class -3 ‫عظزش‬٠ٚ System.Net.Socket Namespaces ِٓ ‫خ‬ٙ‫ظُ حعظذعخث‬٠ٚ Socket‫رخعظخذحَ حٌـ‬ Backing Storage ٍٝ‫ ع‬ٞٛ‫لظ‬٠ ‫ ار ال‬unbuffered ٗٔ‫رؤ‬NetworkStream ‫حٌىالط‬ ‫ وّؼخي‬ٍٟ٠ ‫طغظخذَ وّخ‬ٚ ‫ٓ حألدحء‬١‫ ِعٗ ٌظلغ‬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 ً‫طغظخذَ رشى‬ٚ System.IO Namespaces َ‫خ رخعظخذح‬ٙ‫ظُ حعظذعخث‬٠ : FileStream -4 ‫ؼخ‬٠‫غظخذَ ح‬٠ٚ ‫ حٌمشحءس ِٓ ٍِف‬ٚ‫ ٍِف أ‬ٌٝ‫حء ٌٍىظخرش ا‬ٛ‫ حٌظعخًِ ِع حٌٍّفخص ع‬ٟ‫ ف‬ٟ‫حعخع‬ Backing ‫عظزش ٘زح حٌىالط‬٠ ٚ ‫ً ٔمٍٗ عزش حٌشزىش‬ٙ‫غ‬٠ ٝ‫كظ‬ٚ Byte Array ٌٝ‫ً حٌٍّف ا‬٠ٛ‫ٌظل‬ ٓ١‫ حٌزحوشس ٌل‬ٟ‫خٔخص رشىً ِئلض ف‬١‫ٓ حٌز‬٠‫ ٌظلض‬Buffer ‫غ طغظخذَ رحوشس‬١‫ ك‬Storage Class ‫ذ ِغخس حٌٍّف حٌّشحد حٌمشحءس‬٠‫خ طلذ‬ٙ١‫خِش ف‬ٌٙ‫س ح‬ِٛ‫ِٓ حأل‬ٚ ‫ حٌمشحءس‬ٚ‫ش حٌىظخرش أ‬١ٍّ‫خء ِٓ ع‬ٙ‫حإلٔظ‬ : ٍٟ٠ ‫طغظخذَ وّخ‬ٚ ٗ١ٍ‫ حٌىظخرش ع‬ٚ‫ِٕٗ أ‬

~55~


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‫ّىٕ​ٕخ حعظخذحَ حٌـ‬٠

‫د حطال‬ٛ‫ؿ‬ٌّٛ‫ حٌٍّف ح‬ٌٝ‫ إلػخفش ٔض ِخ ا‬Append -1 ‫د‬ٛ‫ؿ‬ِٛ ‫ ارح وخْ حٌٍّف‬ٌٝ‫ كخ‬ٟ‫ ف‬overwriting ًّ‫َ رع‬ٛ‫م‬٠ٚ ‫ذ‬٠‫ إلٔشخء ٍِف ؿذ‬Create -2 ‫رشىً ِغزك‬ ‫د حٌٍّف‬ٛ‫ؿ‬ٚ ‫ كخٌش‬ٟ‫ ف‬Exception ٟ‫عط‬٠ ٗٔ‫ اال ح‬Create‫ حٌـ‬ٟ‫ وّخ ف‬ٛ٘ٚ CreateNew -3 ‫رشىً ِغزك‬ ‫د حٌٍّف حٌّلذد‬ٛ‫ؿ‬ٚ َ‫ كخٌش عذ‬ٟ‫ ف‬Excption ٟ‫عط‬٠ ‫غ‬١‫ ٌمشحءس ٍِف ِخ ك‬Open -4 َٛ‫م‬٠ ٖ‫د‬ٛ‫ؿ‬ٚ َ‫ كخٌش عذ‬ٟ‫ف‬ٚ ٗ‫َ رمشحءط‬ٛ‫م‬٠ ‫ؿذ حٌٍّف‬ٚ ‫ كخٌش ارح‬ٟ‫ ف‬OpenOrCreate -5 .ٗ‫ربٔشخث‬ .‫ؿعٍٗ فخسغخ‬ٚ ‫خص حٌٍّف‬٠ٛ‫غظخذَ ٌلزف ِلظ‬٠ٚ Truncate -6 FTP ‫ أظتتش اٌفظتتً اٌغتتبثغ ػشتتش‬FileStream‫ي اعتتزخذاَ اٌتتـ‬ٛ‫ِتتبد دتت‬ٍٛ‫تتذ ِتتٓ اٌّؼ‬٠‫ٌّض‬ . Programming

~56~


‫صبٔ‪١‬ب ‪: Stream Members :‬‬ ‫ٕ٘خٌاااه ِـّ‪ٛ‬عاااش ِااآ حٌخااا‪ٛ‬حص ‪ ٚ‬حٌاااـ‪ (Members) Methods‬حٌظااا‪ ٟ‬طشاااظشن ر‪ٙ‬اااخ ِىظزاااخص‬ ‫حٌـ‪ ٟ٘ٚ Stream‬وّخ ‪: ٍٟ٠‬‬

‫‪ٚ CanWrite ٚ CanRead -1‬طغظخذَ ٌّعشفش ارح وخْ حٌـ‪ Stream‬حٌّغظخذَ ‪٠‬مزً عٍّ‪١‬ش‬ ‫حٌمشحءس أ‪ ٚ‬حٌىظخرش أَ ال ك‪١‬غ طشؿع ل‪ّ١‬ش ‪ True‬ف‪ ٟ‬كخٌش ارح وخْ ‪٠‬مزً ‪ False ٚ‬ف‪ ٟ‬كخٌش أٔٗ ال‬ ‫‪٠‬مزً ‪٠ٚ‬غظخذَ عخدس لزً اؿشحء عٍّ‪١‬ش حٌمشحءس أ‪ ٚ‬حٌىظخرش ٌفلض ِذ‪ ٜ‬حٌظالك‪١‬ش لزً حٌّلخ‪ٌٚ‬ش ‪..‬‬ ‫‪ CanSeek -2‬ك‪١‬غ ‪٠‬غظخذَ حٌـ‪ Seeking‬عخدس ٌظلذ‪٠‬ذ ِ‪ٛ‬لع حٌـ‪ٚ Current Stream‬طشؿع‬ ‫٘زٖ حٌخخط‪١‬ش ل‪ّ١‬ش ‪ True‬ف‪ ٟ‬كخٌش وخْ حٌـ‪٠ Stream‬ذعُ حٌـ‪ False ٚ Seeking‬ف‪ ٟ‬كخٌش أٔٗ ال‬ ‫‪٠‬ذعُ حٌـ‪ٚ Seeking‬ف‪ ٟ‬حٌعخدس طذعُ حٌـ‪ Classes‬حٌظ‪ ٟ‬طغظخذَ ‪٘ Backing Storage‬زٖ حٌعٍّ‪١‬ش‬ ‫ِؼً حٌـ‪ٚ FileStream‬عٕذ٘خ طشؿع ل‪ّ١‬ش ‪. True‬‬ ‫‪ٚ CanTimeout -3‬طشؿع ل‪ّ١‬ش ‪ True‬ف‪ ٟ‬كخٌش ارح وخْ حٌـ‪٠ stream‬لظ‪ ٞٛ‬عٍ‪ ٝ‬خخط‪١‬ش‬ ‫حٌـ‪ٚ Timeout‬حٌظ‪ ٟ‬طعط‪ٚ ٟ‬لض ِلذد ٌٍعٍّ‪١‬ش ‪.‬‬ ‫‪ٚ Length -4‬طغظخذَ ٌّعشفش كـُ حٌـ‪ Stream‬رخٌـ‪ّ٠ٚ Byte‬ىٓ حالعظفخدس ِٕ‪ٙ‬خ ٌّعشفش ٔ‪ٙ‬خ‪٠‬ش‬ ‫حٌـ‪ Stream‬أ‪ٌ ٚ‬ظلذ‪٠‬ذ كـُ حٌّظف‪ٛ‬فش رٕخء عٍ‪ ٝ‬كـُ حٌـ‪. Stream‬‬ ‫‪ٚ Position -5‬طغظخذَ حٌـ‪ٌّ Set ٚ Get‬عشفش أ‪ ٚ‬طلذ‪٠‬ذ ِ‪ٛ‬لع حٌـ ‪Stream‬‬ ‫‪ٚ‬رشزشن ِىزجبد اٌـ‪ Stream‬ثّجّ‪ٛ‬ػخ ِٓ اٌـ‪ ٟ٘ٚ Methods‬وّب ‪: ٍٟ٠‬‬ ‫‪ -1‬اٌذ‪ٚ‬اي اٌّزضإِخ ‪: Synchronous Methods‬‬ ‫‪ٚ ReadByte ٚ Read .I‬طغظخذَ ٌمشحءس ‪ٚ Stream Data‬طخض‪ ٕٗ٠‬ف‪ٟ‬‬ ‫حٌـ‪ّ٠ٚ Buffer‬ىٓ طلذ‪٠‬ذ عذد حٌزخ‪٠‬ظخص حٌظ‪ ٟ‬ع‪١‬ظُ لشحءط‪ٙ‬خ رخعظخذحَ‬ ‫حٌـ‪ ReadByte‬وّخ ٔغظط‪١‬ع ِٓ خالٌ‪ٙ‬خ ِعشفش ٔ‪ٙ‬خ‪٠‬ش حٌـ‪ Stream‬ك‪١‬غ طشؿع‬ ‫حٌـ‪ Read‬ل‪ّ١‬ش ‪ٚ 2‬حٌـ‪ ReadByte‬ل‪ّ١‬ش ‪ 1-‬ف‪ ٟ‬كخٌش حٔظ‪ٙ‬خء حٌـ‪.Stream‬‬ ‫‪ٚ Write .II‬حٌـ‪ٚ WriteByte‬طغظخذَ ٌعٍّ‪١‬ش حإلسعخي عزش حٌـ‪ّ٠ٚ Stream‬ىٓ‬ ‫طلذ‪٠‬ذ عذد حٌزخ‪٠‬ظخص حٌظ‪ ٟ‬ع‪١‬ظُ وظخرظ‪ٙ‬خ ف‪ ٟ‬وً ِشس رخعظخذحَ حٌـ‪.WriteByte‬‬ ‫‪ -2‬اٌذ‪ٚ‬اي غ‪١‬ش اٌّزضإِخ ‪: Asynchronous Methods‬‬ ‫‪ٚ BeginRead .I‬حٌـ‪ٚ BeginWrite‬طغظخذَ ٌعٍّ‪١‬ش حٌمشحءس أ‪ ٚ‬حٌىظخرش رخعظخذحَ‬ ‫حٌـ‪ Stream‬حٌغ‪١‬ش حٌّظضحِٓ ‪ٚ‬طؤخز خّغش رخس‪١ِٚ‬ظشحص وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫‪ -1‬حٌـ‪ٚ Byte Buffer‬حٌظ‪ ٟ‬ع‪ٛ‬ف طغظخذَ ٌعٍّ‪١‬ش حٌمشحءس ِٕٗ أ‪ ٚ‬حٌىظخرش عٍ‪ٗ١‬‬ ‫‪ -2‬حٌـ‪ ٛ٘ٚ offset‬حٌّئشش أ‪ ٚ‬حٌـ ‪ٚ Pointer‬حٌز‪ٔ ٞ‬غظط‪١‬ع طلذ‪٠‬ذ ِ‪ٛ‬لع حٌمشحءس أ‪ ٚ‬حٌىظخرش‬ ‫ِٓ ‪ٚ‬عٍ‪ ٝ‬حٌـ‪.Buffer‬‬

‫~‪~57‬‬


‫‪ -3‬حٌـ‪ٚ numByte‬حٌز‪ ٞ‬ع‪ٛ‬ف ‪٠‬ظُ ف‪ ٗ١‬طلذ‪٠‬ذ حٌلذ حأللظ‪ ِٓ ٝ‬حٌزخ‪٠‬ظخص حٌظ‪ ٟ‬ع‪١‬ظُ وظخرظ‪ٙ‬خ‬ ‫أ‪ ٚ‬لشحءط‪ٙ‬خ‪.‬‬ ‫‪ -4‬حٌـ‪ Optional Delegate ٛ٘ٚ AsyncCallback‬ك‪١‬غ ‪٠‬ظُ حعظذعخثٗ إلٔ‪ٙ‬خء عٍّ‪١‬ش‬ ‫حٌمشحءس أ‪ ٚ‬حٌىظخرش رذ‪ ْٚ‬كـض حٌـ ‪ٚ Thread‬كظ‪٠ ٝ‬زم‪ ٝ‬حٌـ ‪ Stream‬ف‪ٚ ٟ‬ػع‪١‬ش‬ ‫حالٔظظخس ‪.‬‬ ‫‪ -5‬حٌـ‪٠ٚ User Provided Object ٛ٘ٚ Stateobject‬غظخذَ ٌظّ‪١‬ض حٌـ & ‪Read‬‬ ‫‪ Write Request‬عٓ غ‪١‬شٖ ِٓ حٌـ‪. Requests‬‬ ‫طشؿع حٌـ‪ Begin Methods‬حٌـ‪ٚ IAsyncResult‬حٌز‪ّ٠ ٞ‬ؼً كخٌش حٌـ ‪Stream‬‬ ‫‪. Operation‬‬ ‫‪ٕ٘ٚ‬بن ثؼغ اٌذ‪ٚ‬اي ‪ٚ‬اٌز‪ ٟ‬رغزخذَ إلداسح اٌـ‪: ٟ٘ٚ Stream‬‬ ‫‪ٚ Flush -1‬طغااظخذَ ٌظفش‪٠‬اات ِلظ‪٠ٛ‬ااخص حٌااـ‪ Buffer‬رعااذ اطّااخَ حٌعٍّ‪١‬ااش حٌّلااذدس ك‪١‬ااغ ‪٠‬ااظُ ٔمااً‬ ‫ِلظ‪٠ٛ‬خص حٌـ‪ Buffer‬اٌ‪ ٝ‬حٌـ‪ Destination‬حٌز‪ ٞ‬طُ طلذ‪٠‬ذٖ ف‪ ٟ‬حٌـ ‪.Stream Object‬‬ ‫‪ٚ Close -2‬طغااااظخذَ إلغااااالق حٌااااـ‪ٚ Stream‬طلش‪٠‬ااااش حٌااااـ‪ Resources‬حٌّلـاااا‪ٛ‬صس ِاااآ لزااااً‬ ‫حٌـ‪ٕ٠ٚ Stream Object‬ظق رخعظخذحِ‪ٙ‬خ ف‪ ٟ‬حٌـضء حٌخخص راـ ‪ٌٚ Finally block‬ظؤواذ ِآ أْ‬ ‫حٌـ‪ Stream‬ع‪١‬ظُ اغاللاٗ ‪ٚ‬طلش‪٠‬اش وخفاش حٌّا‪ٛ‬حسد فا‪ ٟ‬كخٌاش كاذ‪ٚ‬ع أ‪ Exception ٞ‬اػٕاخء حٌظٕف‪١‬از‬ ‫‪ٌٚ‬ؼّخْ عذَ رمخء ٘زٖ حٌّ‪ٛ‬حسد ف‪ ٟ‬حٌزحوشس رعذ اغالق حٌزشٔخِؾ‪.‬‬ ‫‪ٚ SetLength -3‬طغااظخذَ ٌظلذ‪٠‬ااذ كـااُ حٌااـ‪ٚ Stream‬حٌااز‪ٔ ٞ‬ش‪٠‬ااذ اسعااخٌٗ أ‪ ٚ‬حعااظمزخٌٗ ٌىاآ فاا‪ٟ‬‬ ‫كخٌااش ارح وااخْ حٌااـ‪ Stream‬ألااً ِاآ حٌّلااذد فاا‪ ٟ‬حٌااـ‪ SetLength‬عاا‪ٛ‬ف ‪٠‬اائد‪ ٞ‬رحٌااه اٌاا‪ ٝ‬حٔمطااخ‬ ‫حٌـ‪ٚ Stream‬عاذَ ‪ٚ‬طا‪ ٌٗٛ‬رشاىً عاٍ‪ٌ ، ُ١‬آ طغاظط‪١‬ع حعاظخذحَ ٘ازٖ حٌخخطا‪١‬ش اال ارح طؤواذص حٔاه‬ ‫طٍّاااه حٌظاااالك‪١‬ش ٌااازٌه ِااآ خاااالي حٌخخطااا‪١‬ش ‪ٌ CanSeek ٚ CanWrite‬ااازح ‪ٕ٠‬ظاااق رفلاااض‬ ‫حٌظالك‪١‬ش أ‪ٚ‬ال لزً طلذ‪٠‬ذ كـُ حٌـ‪. Stream‬‬ ‫صبٌضب ‪:Stream Manipulation :‬‬ ‫‪ّ٠‬ىاآ حعااظخذحَ ِىظزااخص حٌااـ‪ٌٕ Stream‬مااً ‪ Binary Data‬أ‪ٚ Text ٚ‬فاا‪ ٟ‬حٌعااخدس ‪٠‬ااظُ حعااظخذحَ‬ ‫حٌاااـ‪ ٚ BinaryReader‬حٌاااـ‪ٌ BinaryWriter‬ظعخِاااً ِاااع حٌاااـ‪٠ٚ Binary Data‬اااظُ حعاااظخذحَ‬ ‫حٌااااااـ‪ٚ StreamReader‬حٌااااااـ‪ٌ StreamWriter‬ظعخِااااااً ِاااااااع حٌااااااـ‪٠ٚ ، Text‬ااااااظُ حعاااااااظخذحَ‬ ‫حٌااااـ‪ ASCIIEncoding‬أ‪ٌ UnicodeEncoding ٚ‬ظل‪٠ٛ‬ااااً ِاااآ ‪ Stream‬اٌاااا‪ Text ٝ‬عٕااااذ‬ ‫حالعظمزخي ‪ Text ِٓٚ‬اٌ‪ Stream ٝ‬عٕذ حإلسعخي ك‪١‬غ طغاظخذَ ِـّ‪ٛ‬عاش ِآ حٌاذ‪ٚ‬حي ‪٘ٚ‬ا‪ ٟ‬وّاخ‬ ‫ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫‪٘ٚ GetByteCount -1‬اا‪ Overloaded Method ٟ‬ك‪١‬ااغ طؤخااز ‪ Character Array‬أ‪ٚ‬‬ ‫‪ٚ String‬طشؿع عذد حٌزخ‪٠‬ظخص حٌظ‪ ٟ‬ع‪ٛ‬ف ٔلظخؿ‪ٙ‬خ ٌٕمً ٔض ِع‪.. ٓ١‬‬

‫~‪~58‬‬


َ‫خ رخعاااظخذح‬ٌٙ‫ع اسعاااخ‬١‫ ٔغاااظط‬ٝ‫ كظااا‬Byte Array ٝ‫ اٌااا‬String‫اااً حٌاااـ‬٠ٛ‫ ٌظل‬GetBytes -2 . Stream‫حٌـ‬ ٟ‫ْ فا‬ٛ‫ف طىا‬ٛ‫ عا‬ٟ‫طشؿع عذد حألكشف حٌظا‬ٚ Byte Array ‫غ طؤخز‬١‫ ك‬GetCharCount -3 . Character Array‫ حٌـ‬ٟ‫ ف‬ٚ‫ أ‬String‫حٌـ‬ ‫طغااظخذَ عٕااذ حعااظمزخي‬ٚ String ٝ‫ اٌاا‬Byte Array ٓ‫ااً ِاا‬٠ٛ‫طغااظخذَ ٌظل‬ٚ GetChars -4 . ٜ‫ ٔض ِشس أخش‬ٌٝ‫خ ا‬ٌٙٛ‫غ ٔل‬١‫ ك‬Stream‫خٔخص ِٓ حٌـ‬١‫حٌز‬

ٓ‫خ ِاا‬ٙ‫ال حعااظذعخث‬ٚ‫ـاذ أ‬٠ Text ً‫ ٌٕماا‬StreamWriter‫ حٌااـ‬ٚ StreamReader‫ٌظعخِاً ِااع حٌاـ‬ٚ :ٍٟ٠ ‫طغظخذَ وّخ‬ٚ Namespace 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 :‫ ٍِف‬ٌٝ‫ ٌٍىظخرش ا‬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‫ ٌظعخِااً ِااع حٌااـ‬ٚ Binary Data ‫ ٌماشحءس‬BinaryReader َ‫غ طغاظخذ‬١‫ ك‬، Namespace System.IO‫ِٓ حٌـ‬ ‫ عزااااش‬Stream‫ حٌااااـ‬ٝ‫ اٌاااا‬BinaryData ‫ إلسعااااخي‬BinaryWriterr ‫حٌااااـ‬ٚ Stream‫ِاااآ حٌااااـ‬ :‫ وّؼخي‬ٍٟ٠ ‫وّخ‬ٚ Socket‫حٌـ‬ C# NetworkStream myns = new NetworkStream(mysocket); BinaryReader br = new BinaryReader(myns); TcpClient myclient = new TcpClient("localhost", 5020); NetworkStream myns = myclient.GetStream(); BinaryWriter mysw = new BinaryWriter(myns); mysw.Write(arrImage);

~59~


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‫ اٌـ‬ٍٝ‫خ ػ‬١ٍّ‫اٌؼ‬

~61~


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

~60~


‫اٌّمذِخ‪:‬‬ ‫ع‪ٛ‬ف ٕٔخلش ف‪٘ ٟ‬زح حٌفظً ِـّ‪ٛ‬عش ِٓ حٌظطز‪١‬مخص رخعظخذحَ حٌـ ‪ِٕٙٚ TCP Streaming‬خ‬ ‫ٔظخَ ٌظلىُ عٓ رعذ ربؽفخء ‪ٚ‬طشغ‪ ً١‬حٌزشحِؾ ‪ٚ‬اؽفخء ‪ٚ‬طشغ‪ ً١‬حألؿ‪ٙ‬ضس ‪ٔٚ ،‬ظخَ آخش ٌّشحلزش‬ ‫عطق حٌّىظذ عٓ رعذ ‪ٚ ،‬أخ‪١‬شح ؽش‪٠‬مش طخض‪ ٓ٠‬حٌـ‪ Binary Data‬ف‪ ٟ‬ل‪ٛ‬حعذ حٌز‪١‬خٔخص ‪Access‬‬ ‫‪ SQL Server Database ٚ‬رخعظخذحَ ِىظزخص حٌـ‪.Streams‬‬ ‫‪ Remote Control Example 5.1‬ثبعزخذاَ اٌـ‪:Stream Reader & Writer‬‬ ‫ِضتتبي رطج‪١‬متت‪ ٟ‬ثغتت‪١‬ؾ عتت‪ٛ‬ف ٔغتتزخذَ ف‪١‬تتٗ ثشٔتتبِج شتتج‪ ٗ١‬ثتتـ ‪ٌ Chatting‬ىتتٓ عتت‪١‬زُ اعتتزخذاِٗ‬ ‫إلػطبء أ‪ٚ‬اِش إٌ‪ ٝ‬اٌـ‪ Server‬د‪١‬ش ‪٠‬فزشع إرا لّٕب ثئسعبي وٍّتخ ‪ notepad‬إٌت‪ ٝ‬اٌتـ‪server‬‬ ‫ثأْ ‪٠‬م‪ َٛ‬ثفزخ اٌـ‪ notepad‬ف‪ٚ ٗ١‬إرا لّٕب ِضال ثىزبثخ ‪ٚ Calc‬إسعبٌ‪ٙ‬ب إٌت‪ ٝ‬اٌتـ‪ Server‬عت‪ٛ‬ف‬ ‫‪٠‬فزخ ا‪ٌ٢‬خ اٌذبعجخ ف‪٘ٚ ٗ١‬ىزا ‪:‬‬ ‫أ‪ٚ‬ال ‪ :‬أشااخء رشٔااخِؾ حإلسعااخي ‪ : Client‬ال ‪٠‬خظٍااف رشٔااخِؾ حإلسعااخي عاآ رشٔااخِؾ حٌااـ ‪Client‬‬ ‫‪ Chat‬حٌاااز‪ ٞ‬لّٕاااخ ربٔشاااخثٗ فااا‪ ٟ‬حٌاااـ‪٠ٚ Chapter1‬غاااظخذَ ف‪١‬اااٗ واااً ِااآ ‪TCP Connection‬‬ ‫‪ٚ‬حٌاااـ‪ ٚ NetworkStream‬حٌاااـ‪ StreamWriter‬إلؿاااشحء عٍّ‪١‬اااش حإلسعاااخي فزخعاااظخذحَ حٌذحٌاااش‬ ‫‪ WriteLine‬حٌّ‪ٛ‬ؿ‪ٛ‬دس ػّٓ حٌـ‪ StreamWriter Object‬طاظُ عٍّ‪١‬اش طل‪٠ٛ‬اً حٌإض حٌّىظا‪ٛ‬د‬ ‫ف‪ ٟ‬حٌـ‪ Textbox‬اٌ‪ِ ٝ‬ـّ‪ٛ‬عش ِٓ حٌـ‪١ٌ Bytes‬ظُ اسعخٌ‪ٙ‬خ رخعظخذحَ حٌاـ‪ NetworkStream‬عزاش‬ ‫حٌـ‪ TCP Socket Connection‬اٌ‪ ٝ‬رشٔخِؾ حٌـ‪ٌٍٚ Server‬زاذء لاُ ربٔشاخء ِشاش‪ ٚ‬ؿذ‪٠‬اذ وّاخ‬ ‫ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫ػُ لُ ربػخفش حٌـ ‪ Namespaces‬حٌظخٌ‪١‬ش ‪:‬‬ ‫‪C#‬‬ ‫; ‪using System.Net.Socket‬‬ ‫;‪using System.IO‬‬ ‫‪VB.NET:‬‬ ‫‪imports System.Net.Socket‬‬ ‫‪imports System.IO‬‬ ‫ف‪ Send Button ٟ‬لُ رىظخرش حٌى‪ٛ‬د حٌظخٌ‪:ٟ‬‬ ‫‪C#:‬‬ ‫‪try‬‬ ‫{‬ ‫;)‪TcpClient myclient = new TcpClient (txt_host.Text,5020‬‬ ‫;)( ‪NetworkStream myns = myclient.GetStream‬‬ ‫;)‪StreamWriter mysw = new StreamWriter (myns‬‬ ‫;)‪mysw.WriteLine(txt_msg.Text‬‬

‫~‪~62‬‬


mysw.Close (); myns.Close (); myclient.Close (); } catch (Exception ex) {MessageBox.Show (ex.Message );} VB.NET: 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‫إلٔشااخء رشٔااخِؾ حٌااـ‬ٚ : ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ذ وّخ ف‬٠‫ ؿذ‬ٚ‫ لُ ربٔشخء ِشش‬.. ٜ‫أخش‬

: ‫ش‬١ٌ‫ حٌظخ‬Namespaces ‫ػُ لُ ربػخفش حٌـ‬ C# using System.Net.Socket ; using System.IO; using System.Threading; VB.NET: imports System.Net.Socket imports System.IO imports System.Threading : Global Declaration ‫ ِٕطمش حٌـ‬ٌٝ‫ش ا‬١ٌ‫ف حٌظخ‬٠‫ػُ اػخفش حٌظعخس‬ C#: TcpListener mytcpl; Socket mysocket; NetworkStream myns; StreamReader mysr;

~63~


VB.NET: Private mytcpl As TcpListener Private mysocket As Socket Private myns As NetworkStream Private mysr As StreamReader : Clients‫ ِٓ حٌـ‬Commands‫ عظغظمزً حٌـ‬ٟ‫حٌظ‬ٚ Server‫أشخء دحٌش حٌـ‬ٚ C#: void our_Server () { mytcpl = new TcpListener (5020); mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); mysr = new StreamReader (myns); string order = mysr.ReadLine(); // you can add any order and Response Here if (order=="notepad") System.Diagnostics.Process.Start("notepad"); else if (order=="calc") System.Diagnostics.Process.Start("calc"); else MessageBox.Show("Sorry Sir Your Request is not in my hand",order); mytcpl.Stop(); if (mysocket.Connected ==true) while (true) { our_Server (); } } }

{

VB.NET: 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

~64~


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 ٟ‫فّااؼال ارح وخٔااض حٌشعااخٌش ٘اا‬ ...System.Diagnostics Namespaces ٟ‫دس ف‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ Process ‫حٌىالط‬ ً١‫ كااذع رااذأ حٌظشااغ‬ٟ‫ فاا‬Thread‫ااف حٌااـ‬٠‫ػااع طعش‬ٚ ٓ‫ااذ الرااذ ِاا‬٠‫ ؿذ‬Thread ّٓ‫خ ػاا‬ٍٙ١‫ٌظشااغ‬ٚ : ٍٟ٠ ‫ وّخ‬Form‫ٌٍـ‬ C# Thread myth; private void Form1_Load(object sender, System.EventArgs e) { myth= new Thread (new System.Threading .ThreadStart(our_Server)); myth.Start (); } 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 Socket‫رٌااه ٌظؤواااذ ِاآ اغااالق حٌاااـ‬ٚ Form Closing‫ كااذع حٌاااـ‬ٟ‫ فاا‬ٌٟ‫ػااُ لااُ ربػااخفش حٌظاااخ‬ .. ‫ حٌزشٔخِؾ‬ٟ‫ ف‬Thread‫خء حٌـ‬ٙٔ‫ا‬ٚ Stream‫حٌـ‬ٚ C#: private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { try { mytcpl.Stop (); myth.Aport();

~65~


} 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 ‫ عآ رعاذ‬Clients Computer‫َ ربؽفخء حٌاـ‬ٛ‫م‬٠ ‫حص حٌغخرمش أشخء رشٔخِؾ‬ٛ‫ّىٕ​ٕخ رٕفظ حٌخط‬٠ ‫وّخ‬ ٚ‫ أ‬Shutdown ‫د وٍّاش‬ٚ‫س‬ٚ ‫حٌّشفك ِع حٌىظخد( عٕاذ‬ٚ) Shutdown.EXE ‫ز حٌٍّف‬١‫رٌه رظٕف‬ٚ Windows ً١‫ ِع ٔظخَ حٌظشغ‬ٟ‫ؤط‬٠ ٞ‫حٌز‬ٚ RPC – Remote Procedure Call ‫ز أِش حٌـ‬١‫طٕف‬ . 2000/XP

~66~


:Server ‫ اٌـ‬ٌٝ‫سح عطخ اٌّىزت إ‬ٛ‫ إلسعبي ط‬Remote Desktop َ‫ ِضبي إلٔشبء ٔظب‬5.2 ِٓ ‫سس عطق حٌّىظذ‬ٛ‫ؾ ٌٕمً ط‬١‫ رغ‬Remote Desktop ‫َ ربٔشخء رشٔخِؾ‬ٛ‫ ٘زح حٌّؼخي عٕم‬ٟ‫ف‬ : Stream Library ‫حٌـ‬ٚ TCP ‫ آخش رخعظخذحَ حٌـ‬ٌٝ‫خص ا‬ٙ‫ؿ‬ : Client ‫ال إٔشبء ثشٔبِج اٌـ‬ٚ‫أ‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ذ وّخ ف‬٠‫ ؿذ‬ٚ‫َ ربٔشخء ِشش‬ٛ‫ك عٕم‬١‫ٌظطز‬

:‫ش‬١ٌ‫ حٌظخ‬Namespaces ‫ف ٔغظخذَ حٌـ‬ٛ‫ع‬ System.Net System.Net.Socket 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(); VB.NET: 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 َ‫حعظخذح‬ C#: TcpClient myclient; MemoryStream ms; NetworkStream myns;

~67~


BinaryWriter mysw; myclient = new TcpClient (Server_IP.Text,5020); myns = myclient.GetStream (); mysw = new BinaryWriter (myns); mysw.Write(arrImage); ms.Close(); mysw.Close (); myns.Close (); myclient.Close (); VB.NET: Dim myclient As TcpClient Dim ms As MemoryStream Dim myns As NetworkStream Dim mysw As BinaryWriter myclient = New TcpClient (Server_IP.Text,5020) myns = myclient.GetStream () mysw = New BinaryWriter (myns) mysw.Write(arrImage) ms.Close() mysw.Close () myns.Close () myclient.Close () ‫اخ‬ٌٙ New Thread ‫ِٓ ػُ أشاخء‬ٚ Infinity Loop Method ّٓ‫د ػ‬ٛ‫ػع ٘زح حٌى‬ٚ ‫ّىٕ​ٕخ‬٠ٚ ٓ‫اخ ِا‬ٙ‫ ٔلظخؿ‬ٟ‫ عاشعش حإلسعاخي حٌظا‬ٝ‫اٗ رٕاخء عٍا‬١‫ ف‬Interval ‫لذد حٌـ‬٠ٚ Timer ٟ‫خ ف‬ٙ‫ ٔؼع‬ٚ‫ أ‬، .‫ طعظزش ِّظخصس‬100 MS ْ‫ فب‬LAN ‫وشزىش‬ٚ ، ٜ‫ش أخش‬ٙ‫ِمذسس حٌشزىش ِٓ ؿ‬ٚ ‫ش‬ٙ‫ؿ‬

~68~


: Server ‫ب إٔشبء ثشٔبِج اٌـ‬١ٔ‫صب‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ذ وّخ ف‬٠‫ ؿذ‬ٚ‫َ ربٔشخء ِشش‬ٛ‫مٗ عٕم‬١‫ٌظطز‬ٚ

:‫ش‬١ٌ‫ حٌظخ‬Namespaces ‫ف ٔغظخذَ حٌـ‬ٛ‫ع‬ System.Net System.Net.Socket System.IO :ٍٟ٠ ‫ وّخ‬TCP Listener ‫حٌـ‬ٚ Thread ‫حٌـ‬ٚ TCP Socket ‫ػُ ٔعشف حٌـ‬ C#: Thread myth; TcpListener mytcpl = new TcpListener (5020); Socket mysocket; NetworkStream myns; VB.NET: Dim myth As Thread Dim mytcpl As TcpListener = New TcpListener(5020) Dim mysocket As Socket Dim myns As NetworkStream :ٍٟ٠ ‫وّخ‬ٚ ‫ف دحٌش حالعظمزخي‬٠‫َ رظعش‬ٛ‫ػُ ٔم‬ C#: void ServerMethod () { try { mytcpl.Start ();

~69~


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){} } VB.NET: 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 ();

~71~


VB.NET: myth= New Thread (New System.Threading.ThreadStart(AddressOf ServerMethod)) myth.Start () ‫ اٌجتضء‬ٟ‫ٓ فت‬١‫ف ٔجت‬ٛ‫ عت‬, ‫ ختش‬ٝ‫تبص إٌت‬ٙ‫سح عتطخ اٌّىزتت ِتٓ ج‬ٛ‫مخ إسعبي طت‬٠‫ٕب ؽش‬١‫٘ىزا ث‬ٚ Mouse ‫خ اٌتزذىُ ثبٌتـ‬١‫تخ إػتبفخ خبطت‬١‫ف‬١‫صػتخ (اٌفظتً اٌختبِظ ػشتش) و‬ٌّٛ‫اٌخبص ثبٌٕظُ ا‬ .API‫اي اٌـ‬ٚ‫رٌه ثبعزخذاَ د‬ٚ RemoteServer‫ ٌٍـ‬Keyboard‫اٌـ‬ٚ َ‫ ثبعتتتزخذا‬SQL Server ٚ Access ‫بٔتتتبد‬١‫ لبػتتتذح ث‬ٟ‫سح فتتت‬ٛ‫ٓ طتتت‬٠‫ ِضتتتبي ٌزختتتض‬5.3 : Stream‫ِىزجبد اٌـ‬ٚ ADO.NET‫اٌـ‬ ً‫ شاى‬ٝ‫سس رخٌازحوشس عٍا‬ٛ‫اً طا‬١‫ ٌظّؼ‬Memory Stream Class ‫ ٘ازح حٌّؼاخي حٌاـ‬ٟ‫عٕغاظخذَ فا‬ GetBuffer Method َ‫ الكمااخ رخعااظخذح‬Bytes ٝ‫ااخ اٌاا‬ٍٙ٠ٛ‫ّىٕ​ٕااخ طل‬٠ ‫ااغ‬١‫ ك‬Stream Data :ٍٟ٠ ‫وّخ‬ٚ 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 َ‫ال حعظخذح‬ٚ‫أ‬ َ‫ عٕغاظخذ‬ٟ‫حٌظا‬ٚ Store_it Method ‫ حٌاـ‬ٝ‫خ اٌا‬ٍٙ‫ عٕشعا‬Byte Array ٌٝ‫سس ا‬ٛ‫ً حٌظ‬٠ٛ‫رعذ طل‬ :ٍٟ٠ ‫وّخ‬ٚ Database‫ حٌـ‬ٌٝ‫ ا‬Byte Array‫ش حٌـ‬٠‫ ٌظّش‬OleDbParameter‫خ حٌـ‬ٌٙ‫ِٓ خال‬

~70~


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

~72~


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 ً‫ااغ لّٕااخ رعّاا‬١‫ك‬ ٝ‫ اٌاا‬Byte Array‫ااً حٌااـ‬٠ٛ‫ظُ طل‬١‫ عاا‬، MemoryStream Class‫ حٌااـ‬ٝ‫ اٌاا‬Array‫ااش حٌااـ‬٠‫رظّش‬ٚ FromStream ‫ رخعاظخذحَ حٌاـ‬PictureBox ٍٝ‫خ ع‬ٙ‫ّىٕ​ٕخ عشػ‬٠ ‫عٕذ٘خ‬ٚ ٜ‫ ِشس أخش‬Stream ... Method : Microsoft SQL Server َ‫ب اعزخذا‬١ٔ‫صب‬ ٗ‫ حٔا‬ٜٛ‫ عا‬Microsoft Access‫ عٓ حٌـ‬SQL Server ‫خٔخص‬١‫ٓ رمخعذس ر‬٠‫ش حٌظخض‬١ٍّ‫ال طخظٍف ع‬ ‫غش‬١‫ وّااااااخ أْ طاااااا‬، OleDbParameter ٓ‫ رااااااذال ِاااااا‬SqlParameter ‫ااااااظُ حعااااااظخذحَ حٌااااااـ‬٠ SQL Server ‫حٌااـ‬ٚ Access Database‫ٓ حٌااـ‬١‫ عااظخظٍف راا‬Connection String‫حٌااـ‬ ُ‫ّاشس ٌاٗ حعا‬١‫ ف‬ٟٔ‫خٔاخص أِاخ حٌؼاخ‬١‫ي ِغاخس حٌٍّاف حٌخاخص رمخعاذس حٌز‬ٚ‫ّشس ٌأل‬٠ ‫غ‬١‫ ك‬Database :‫ وّؼخي‬ٍٟ٠ ‫وّخ‬ٚ SQL Server ‫ حٌـ‬ٍٝ‫ ع‬ٞٛ‫لظ‬٠ ٞ‫خص حٌز‬ٙ‫حٌـ‬ :Connection String ‫إلٔشخء حٌـ‬ 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);

~73~


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 (@pic)",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();} } VB.NET Public Sub Store_it(ByVal content As Byte()) Try My_Connection.Open() Dim insert As SqlCommand = New SqlCommand("insert into img values (@picID)", 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);

~74~


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) Transport Layer & Network Layer َ‫ ػٓ اعزخذا‬ٌٟ‫ اٌجضء اٌزب‬ٟ‫ش ف‬٠‫زُ اٌذذ‬١‫ع‬ .‫ذ‬١ٔ ‫د‬ٚ‫ئخ اٌذ‬١‫ ث‬ٟ‫ب ف‬ٙ‫الر‬ٛ‫و‬ٛ‫ر‬ٚ‫ثشِجخ ثش‬ٚ Programming

~75~


Part 3

Transport & Network Layer Programming

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

~76~


Chapter 6 Transport TCP & UDP (Classes & Members)

- TCP Classes Members - UDP Classes Members

~77~


: TCP & UDP Classes Members : 6 ُ‫ح٘ااا‬ٚ UDP Classes ‫حٌاااـ‬ٚ TCP Classes ‫ ٘ااازح حٌفظاااً عااآ حٌاااـ‬ٟ‫ف ٔظلاااذع فااا‬ٛ‫عااا‬ ٓ‫ِا‬ٚ ، Transport Layer Classes ‫ حٌاـ‬ٟ‫خ ف‬ٙ‫ظُ حٌظعخًِ ِع‬٠ ٟ‫حٌظ‬ٚ ‫ّخ‬ِٕٙ ً‫ ٌى‬Members‫حٌـ‬ ‫ااخ‬ِٕٙٚ ‫ّىاآ حٌااظلىُ رخظااخثض حإلسعااخي‬٠ TCP‫ ٘اازٖ حٌطزمااش ارح حعااظخذِٕخ حٌااـ‬ٟ‫ف أْ فاا‬ٚ‫حٌّعااش‬ ٜ‫ ٌاذ‬Destination Port‫ حٌاـ‬ٚ Source ‫ذ حٌـ‬٠‫طلذ‬ٚ ‫ػع‬ٚ ٌٝ‫ رخإلػخفش ا‬Flags ‫حٌـ‬ٚ Offset‫حٌـ‬ .ً‫حٌّغظمز‬ٚ ً‫حٌطشف حٌّشع‬ ْ‫ح‬ٛ‫ٓ عٕا‬٠‫اٗ طخاض‬١‫اظُ ف‬٠ ‫اغ‬١‫حكاذ ك‬ٌٛ‫ ح‬Packet ‫ ٌٍاـ‬32 Bits ِٓ ْٛ‫ظى‬٠ٚ TCP Header‫ال حٌـ‬ٚ‫أ‬ ُ‫سلاا‬ٚ 32 Bits ٟ‫ فاا‬ٍٟ‫حٌااشلُ حٌظغٍغاا‬ٚ 16 Bits ٟ‫حٌّغااظمزً فاا‬ٚ 16 Bits ٟ‫ حٌّشعااً فاا‬Port ُ‫ ِاخ طا‬ٛ٘ٚ ‫خٔخص‬١‫ػع حٌـضء حٌخخص رخٌز‬ٚ ُ‫ظ‬٠ ‫ش‬٠‫خ‬ٌٕٙ‫ ح‬ٟ‫ف‬ٚ 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. ٝ‫ عٍا‬ٞٛ‫لظا‬٠ٚ ‫حكاذ‬ٌٛ‫ ح‬Packet ‫خٔاخص ٌٍاـ‬١‫ ِآ حٌز‬32 Bits ٓ‫ْ ِا‬ٛ‫ظىا‬٠ٚ UDP Header‫خ حٌـ‬١ٔ‫ػخ‬ :Total Length ‫حٌـ‬ٚ Checksum‫ حٌـ‬ٚ 16 Bits ٍُ‫حٌّغظ‬ٚ 16 Bits ً‫حْ حٌّشع‬ٕٛ‫ع‬

UDP Header

~78~


: TCP Connection Oriented Protocol ‫ اٌخبطخ ثبٌـ‬Classes‫ال اٌـ‬ٚ‫أ‬

ٗ‫ّااااشس ٌاااا‬٠ ‫ ار‬Simple TCP Socket ‫ااااف‬٠‫غااااظخذَ ٌظعش‬٠ٚ :TcpClient Class-1 ‫عاش‬ّٛ‫ ِـ‬ٝ‫ ٘ازح حٌىاالط عٍا‬ٞٛ‫لظا‬٠ٚ ‫خ‬ٙ‫ذ حالطظخي ِع‬٠‫ ٔش‬ٟ‫ش حٌظ‬ٙ‫ ٌٍـ‬Port ‫حٌـ‬ٚ IPAddress‫حٌـ‬ :ٌٟ‫خ رخٌظخ‬ٙ‫ٍٔخظ‬ٚ Properties ‫حٌـ‬ٚ Methods‫ِٓ حٌـ‬ : TCPClient Methods :‫ال‬ٚ‫أ‬ IP‫حْ حٌااـ‬ٛ‫ااخ عٕاا‬ٙ١‫ااغ ّٔااشس ف‬١‫ ك‬server‫ااش حالطظااخي ِااع حٌااـ‬١ٍّ‫طغااظخذَ ألؿااشحء ع‬ٚ :Connect :ٍٟ٠ ‫وّخ‬ٚ 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) .TCP Socket‫خء حالطظخي ِع حٌـ‬ٙٔ‫ إل‬:Close ‫ حالعااظمزخي‬ٚ ‫ااش حإلسعااخي‬١ٍّ‫ ع‬ٟ‫ فاا‬Socket‫ ِاآ حٌاـ‬Stream‫غاظخذَ ٌمااشحءس حٌااـ‬٠ٚ :GetStream .NetworkStream Class ‫ ِع حٌـ‬Socket‫طغظخذَ عخدس ٌشرؾ حٌـ‬ٚ : TCPClient Properties ‫ أُ٘ اٌخظبئض‬:‫ب‬١ٔ‫صب‬ Linger Time‫ ِعشفش حٌـ‬ٚ‫ذ أ‬٠‫ ٌظلذ‬Set ٚ‫ أ‬get ‫طؤخز‬ٚ : LingerState ‫ش أَ ال‬١‫ٓ ٌظؤخ‬١‫لض ِع‬ٚ ‫ ِعشفش ارح وخْ ٕ٘خن‬ٚ‫ذ أ‬٠‫ ٌظلذ‬Set ٚ‫ أ‬get ‫طؤخز‬ٚ :NoDelay ‫غاّق‬٠ Socket‫ ِعشفاش ارح واخْ حٌاـ‬ٚ‫اذ أ‬٠‫ ٌظلذ‬Set ٚ‫ أ‬get ‫طؤخز‬ٚ :ExclusiveAddressUse ٓ‫اذ ِا‬٠‫ )ٌّض‬SocketOption Class ‫طغاظخذَ عاخدس ِاع حٌاـ‬ٚ ، ‫ أَ ال‬Client Port‫رخعاظخذحَ حٌاـ‬ (Appendixes (A) ‫ِخص أٔظش حٌـ‬ٍٛ‫حٌّع‬ ُ‫ ِعشفااش كـاا‬ٚ‫ااذ أ‬٠‫ ٌظلذ‬Set ٚ‫ أ‬get ‫طؤخااز‬ٚ :ReceiveBufferSize ٚ SendBufferSize .TCP Client Object ٟ‫حٌّعشف ف‬ٚ stream‫ حٌـ‬ٟ‫ حٌّغظخذَ ف‬Buffer‫حٌـ‬

~79~


‫‪ٚ :ReceiveTimeout ٚ SendTimeout‬طؤخاااااز ‪ get‬أ‪ٌ Set ٚ‬ظلذ‪٠‬اااااذ أ‪ِ ٚ‬عشفاااااش حٌ‪ٛ‬لاااااض‬ ‫حٌّظخف ٌعٍّ‪١‬ش حإلسعخي أ‪ ٚ‬حإلعظمزخي ك‪١‬غ ‪٠‬عط‪ Time Out ٟ‬ف‪ ٟ‬كخٌش أٔٗ ٌُ ‪٠‬ـذ حٌطشف حألخاش‬ ‫خالي فظشس صِٕ‪١‬ش ِع‪ٕ١‬ش‪.‬‬ ‫‪ :TcpListener Class-2‬ك‪١‬غ طلظا‪ ٞٛ‬عٍا‪ِ ٝ‬ـّ‪ٛ‬عاش ِآ حٌاـ‪ٚ Methods‬حٌاـ‪Properties‬‬ ‫‪ ٟ٘ٚ‬وّخ ‪:ٍٟ٠‬‬

‫أ‪ٚ‬ال‪ :‬أُ٘ اٌذ‪ٚ‬اي ف‪ ٟ‬اٌـ ‪:TcpListener‬‬ ‫‪ٚ :AcceptSocket‬طغظخذَ ٌمز‪ٛ‬ي عٍّ‪١‬ش حالطظخي ِع حٌـ‪.Client‬‬ ‫‪٘ٚ : Start‬ا‪ Overloaded Method ٟ‬ك‪١‬اغ حٔاٗ فا‪ ٟ‬كخٌاش طّش‪٠‬اش سلاُ اٌ‪ٙ١‬اخ ‪٠‬اظُ طلذ‪٠‬اذ عاذد‬ ‫حألؿ‪ٙ‬ااضس حٌظاا‪ ٟ‬طغااّق ر‪ٛ‬ؿ‪ٛ‬د٘ااخ فاا‪ ٟ‬حٌااـ‪ٚ ، Qouee‬فاا‪ ٟ‬كخٌااش عااذَ طّش‪٠‬ااش سلااُ ِعاا‪ ٓ١‬طظاازق‬ ‫حٌـ‪ Qouee‬غ‪١‬ش ِلذد‪.‬‬ ‫‪ٚ : Stop‬طغظخذَ إلغالق عٍّ‪١‬ش حٌظظٕض ‪٠ٚ‬فؼً ‪ٚ‬ػع‪ٙ‬خ ف‪ ٟ‬حٌـ‪ Finally‬عٕاذ حعاظخذحَ حٌاـ‪Try‬‬ ‫‪ ٚ‬حٌـ‪ٚ Catch‬كظ‪٠ ٝ‬ظُ أ‪ٙ‬خء عٍّ‪١‬ش حٌظظٕض كظ‪ ٌٛ ٝ‬كذع أ‪.Exception ٞ‬‬ ‫صبٔ‪١‬ب‪ :‬أُ٘ اٌخظبئض ف‪:TcpListener ٟ‬‬ ‫‪ : LocalEndpoint‬ك‪١‬ااغ ‪٠‬شؿااع حٌااـ‪ٚ IP‬سلااُ حٌ اـ‪ Port‬حٌّغااظخذَ فاا‪ ٟ‬حٌااـ‪LocalEndpoint‬‬ ‫حٌّلذد‪.‬‬ ‫‪ِٚ :Server‬آ خالٌ‪ٙ‬اخ ٔغاظط‪١‬ع حٌ‪ٛ‬طا‪ٛ‬ي اٌا‪ ٝ‬واً حٌخظاخثض ‪ ٚ‬حٌاذ‪ٚ‬حي فا‪ ٟ‬حٌاـ‪TCP Server‬‬ ‫‪ٚ‬حٌظ‪ ٟ‬ششكٕخ٘خ عخرمخ ِؼً حٌـ‪ٚ Accept‬حٌـ‪ٚ Sendto‬حٌـ‪ٚ Listen ٚ Receive‬غ‪١‬ش٘خ‬

‫~‪~81‬‬


: UDP Connectionless Protocol ‫ اٌخبطخ ثبٌـ‬Classes‫ب اٌـ‬١ٔ‫صب‬ UDP Datagram Protocol Connection ‫اف‬٠‫طغاظخذَ ٌظعش‬ٚ :UdpClient Class-1 : ٍٟ٠ ‫ وّخ‬ٟ٘ٚ ‫خ‬ٙ‫خط‬٠ٛ‫ٓ أُ٘ ِلظ‬١‫ ٘زح حٌـضء عٕز‬ٟ‫ف‬ٚ ‫خ‬ٙ‫حٌظعخًِ ِع‬ٚ ‫خ‬ٙ‫ف‬٠‫ لّٕخ عخرمخ رظعش‬،

: ‫ب‬ٙ‫اٌخظبئض اٌخبطخ ث‬ٚ ‫اي‬ٚ‫ِٓ أُ٘ اٌذ‬ٚ ٚ‫حْ أ‬ٛ‫ اٌغااااااااخء عٕاااااااا‬ٚ‫ ٌؼااااااااُ أ‬:DropMulticastGroup ٚ JoinMulticastGroup .Multicast Group‫ٓ ِٓ حٌـ‬٠ٚ‫عش ِٓ حٌعٕخ‬ّٛ‫ِـ‬ .socket‫ حٌـ‬ٟ‫ ف‬Broadcasting‫ً حٌـ‬١‫ ٌظفع‬Set ٚ‫ أ‬Get ‫طؤخز‬ٚ :EnableBroadcast .Mlticast Loopback‫ذ حٌـ‬٠‫ طلذ‬ٚ‫ ٌّعشفش أ‬Set ٚ‫ أ‬Get ‫طؤخز‬ٚ :MulticastLoopback IP ٓ٠‫ااظُ طخااض‬٠ ‫ااغ‬١‫ ك‬Multicasting‫ حٌااـ‬ٟ‫غااظخذَ فاا‬٠ٚ :MulticastOption Class-2 Multicast ٞ‫ أل‬Drop ٚ Join ًّ‫ ٌع‬Multicast Group ٟ‫خ ف‬ٙ‫ ٌظعخًِ ِع‬Address List : Multicast ً‫ش العظمزخي سعخث‬٠ٛ‫ وّؼخي إلػخفش عؼ‬ٍٟ٠ ‫طغظخذَ وّخ‬ٚ Group : ٍٟ٠ ‫وّخ‬ٚ 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 ‫ رخعظخذحَ حٌذحٌش‬Socket‫خ رخٌـ‬ٙ‫حْ رٕفغٗ رعذ رٌه ٔشرط‬ٕٛ‫ذخً حٌع‬٠ User‫حٌـ‬

~80~


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) ‫ طؤخاااز ٘ااازٖ حٌذحٌاااش ػالػاااش‬ٚ SocketOptions Method ‫ حٌاااـ‬ٟ‫اااخ فااا‬ٙ‫ف‬٠‫ـاااذ طعش‬٠ ‫اااخ‬ٍٙ١‫ٌظفع‬ٚ TCP ٚ‫ أ‬Socket ٝ‫ عٍاا‬ٚ‫ أ‬IPv6 ٝ‫ عٍا‬ٚ‫ أ‬IP ٝ‫ااش عٍا‬١١‫ حٌظغ‬ٜٛ‫اذ ِغاظ‬٠‫ي ٌظلذ‬ٚ‫ظشحص حأل‬١ِٚ‫راخس‬ ٖ‫ كخٌظٕخ ٘از‬ٟ‫ف‬ٚ ، (‫ حٌّشفمخص‬ٟ‫ ف‬A Appendixes ‫ِخص أٔظش حٌـ‬ٍٛ‫ذ ِٓ حٌّع‬٠‫ )ٌّض‬، UDP ٚ‫أ‬ ٟ‫فااا‬ٚ Multicast Group ٝ‫ اٌاا‬IP ُ‫ ػااا‬ٛ‫ااذٖ ٘اا‬٠‫ ار ِاااخ ٔش‬IP ٝ‫اااش عٍاا‬١‫ف ٔغااظخذَ حٌظغ‬ٛ‫عاا‬ ‫ٓ اػااخفش‬١‫ااخس راا‬١‫ّىاآ حالخظ‬٠ٚ ‫ش‬٠ٛ‫ااذ اػااخفش عؼاا‬٠‫ااغ ٔش‬١‫ااش ك‬١١‫ حٌظغ‬ٛ‫ ٔلااذد ٔاا‬ٟٔ‫ظش حٌؼااخ‬١ِٚ‫حٌزااخس‬ ٗ‫ااا‬١ٌ‫اااشح ٔغااإذ ا‬١‫أخ‬ٚ DropMembership ‫ش‬٠ٛ‫ اٌغاااخء عؼااا‬ٚ‫ أ‬AddMembership ٗ٠ٛ‫عؼااا‬ :ٍٟ٠ ‫ وّخ‬ٚ ٗ‫ لّٕخ ربٔشخث‬ٞ‫حٌز‬ٚ MulticastOption Object‫حٌـ‬ C#: mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,mcastOption); VB.NET: mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, mcastOption) ‫اٌّزؼٍمتتتخ‬ٚ ‫تتتذ‬١ٔ ‫د‬ٚ‫ئتتتخ اٌتتتذ‬١‫ ث‬ٟ‫تتتب فتتت‬ٙ‫ّىتتتٓ اٌتتتزذىُ ث‬٠ ٟ‫اٌزتتت‬ٚ ‫ٕتتتب أ٘تتتُ اٌخظتتتبئض‬١‫٘ىتتتزا ث‬ٚ ً‫ اٌفظت‬ٟ‫ فت‬,Network Layer Protocols ‫ اٌتـ‬ٚ Transport Layer Protocols‫ثبٌـ‬ ٟ‫تتب فتت‬ٙ‫تتزُ اٌزؼبِتتً ِؼ‬٠ ٟ‫اٌزتت‬ٚ Members ‫تتخ اٌتتـ‬١‫ش ثشتتىً ِفظتتً ػتتٓ ثم‬٠‫زُ اٌذتتذ‬١‫ عتت‬ٌٟ‫اٌزتتب‬ Synchronous Socket ‫ؽتتشق اٌزؼبِتتً ِتتغ اٌتتـ‬ٚ Network Layer Protocols‫اٌتتـ‬ .Asynchronous Socket‫اٌـ‬ٚ

~82~


Chapter 7 Network Layer & Synchronous Socket Programming

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

~83~


‫‪: Network Layer & Synchronous Socket Programming :7‬‬ ‫فاا‪٘ ٟ‬اازح حٌـااضء عاا‪ٛ‬ف ٔزاا‪ ٓ١‬رشااىً أوؼااش طفظاا‪١‬ال عاآ رشِـااش ؽزمااش حٌااـ‪Network Layer‬‬ ‫‪ٚ‬حٌااـ‪٘ٚ Socket‬اا‪ ٟ‬حٌظاا‪٠ ٟ‬ااظُ حٌظعخِااً ِع‪ٙ‬ااخ إلسعااخي ‪ٚ‬حعااظمزخي حٌز‪١‬خٔااخص رعااذ طل‪ٍٙ٠ٛ‬ااخ ِاآ ‪ ٚ‬اٌاا‪ٝ‬‬ ‫‪ Stream‬عزااش حٌشاازىش‪ ،‬لّٕااخ عااخرمخ رخعااظخذحَ حٌااـ‪ٚ TCP‬حٌااـ ‪ٌ UDP‬إلسعااخي ‪ٌٚ‬العااظمزخي ‪ٚ‬ر‪ٕ١‬ااخ‬ ‫حٌفاشق ر‪ّٕٙ١‬اخ ‪ٚ‬فا‪٘ ٟ‬ازح حٌـاضء عا‪ٛ‬ف ٔظلاذع عآ حٌاـ‪ٚ Socket Programming‬حٌاـ‪Classes‬‬ ‫‪ٚ‬حٌـ‪ Members‬حٌخخطش رخٌـ‪..Socket Class‬‬ ‫‪Introduction to Socket Programming :7.1‬‬ ‫ِٓ حٌّعش‪ٚ‬ف أْ حٌاـ ‪٘ Socket‬ا‪ ٟ‬حألدحس حٌظا‪٠ ٟ‬اظُ ٔماً حٌز‪١‬خٔاخص ِآ خالٌ‪ٙ‬اخ ِآ ؿ‪ٙ‬اخص اٌا‪ ٝ‬أخاش‬ ‫‪ٚ‬العااظخذحِ‪ٙ‬خ ‪ٍ٠‬ااضَ فاا‪ ٟ‬حٌزذح‪٠‬ااش طعش‪٠‬ااف ‪ System.Net.Socket Namespace‬ك‪١‬ااغ ‪٠‬لظاا‪ٞٛ‬‬ ‫٘زح ‪ Namespace‬عٍ‪ ٝ‬عذد وز‪١‬ش ِٓ حٌاـ‪ٚ Classes‬حٌظا‪٠ ٟ‬اظُ حعاظخذحِ‪ٙ‬خ فا‪ ٟ‬رشِـ‪١‬اخص حٌشازىش‬ ‫‪ٚ‬ع‪ٛ‬ف ٔظلذع عٓ أّ٘‪ٙ‬خ ‪ Socket Class ٛ٘ٚ‬ار ‪ّ٠‬ىٕ​ٕخ ِٓ حٌظعخِاً ِاع حٌاـ‪ TCP‬أ‪ ٚ‬حٌاـ‪UDP‬‬ ‫أ‪ِ ٚ‬ع أ‪ ٛٔ ٞ‬أخش ِٓ حٌزشط‪ٛ‬و‪ٛ‬الص رشىً ِزخشش ‪٠ٚ‬ظىا‪ ْٛ‬حٌاـ‪ِ Socket Object Method‬آ‬ ‫ػالػش رخس‪١ِٚ‬ظشحص وّخ ‪:ٍٟ٠‬‬ ‫‪C#:‬‬ ‫‪Socket MySocket = new Socket(AddressFamily. , SocketType.,‬‬ ‫;)‪ProtocolType.‬‬ ‫‪VB.NET:‬‬ ‫‪Dim MySocket As Socket = New Socket(AddressFamily, SocketType,‬‬ ‫)‪ProtocolType‬‬ ‫ك‪١‬غ ‪٠‬ظُ ف‪ ٟ‬حٌزخس‪١ِٚ‬ظش حأل‪ٚ‬ي طلذ‪٠‬ذ ٔ‪ٛ‬ع‪١‬ش حٌـ‪ٚ IP Address‬حٌز‪ ٞ‬ع‪ٛ‬ف طظعخًِ ِعاٗ ‪٠ٚ‬عط‪١‬اه‬ ‫عذد وز‪١‬ش ِٓ حٌخ‪١‬خسحص ‪ِٕٙٚ‬خ ‪ٚ IPX‬حٌّغظخذَ ف‪ ٟ‬شزىخص حٌـ‪ Novel‬أ‪ٚ ATM ٚ‬حٌّغظخذَ فا‪ٟ‬‬ ‫شزىخص حٌـ‪ ATM Networks‬أ‪ٚ NetBIOS Address ٚ‬غ‪١‬ش٘خ ‪ ِٓٚ ...‬أُ٘ ٘ازٖ حٌخ‪١‬اخسحص‬ ‫حٌاـ‪٘ٚ InterNetwork‬اا‪ِ ٛ‬ااخ ٔغااظخذِٗ رشااىً دحثااُ ِااع حٌزشِـ‪١‬ااخص حٌخخطااش رخٌشاازىخص ‪٠ٚ‬عااشف‬ ‫عٍاا‪ ٝ‬أْ ٔاا‪ ٛ‬حٌااـ ‪٘ IP‬اا‪٘ٚ IPv4 ٛ‬اا‪ ٛ‬حٌّعظااخد ِااع ٔظااخَ ِخ‪٠‬ىش‪ٚ‬عاا‪ٛ‬فض ‪ٚ‬أغٍااذ أٔظّااش حٌظشااغ‪ً١‬‬ ‫حٌّعش‪ٚ‬فش كخٌ‪١‬خ ‪ٚ‬ف‪ ٟ‬حٌّغظمزً حٌمش‪٠‬ذ ؿذح ع‪١‬ظُ حإلعظغٕخء عٕٗ ‪١ٌٚ‬لً ِلٍٗ حٌاـ‪ٌّ) IPv6‬ض‪٠‬اذ ِآ‬ ‫حٌّعٍ‪ِٛ‬خص حٔظش حٌفظً حٌؼخٔ‪ ،(ٟ‬ف‪ ٟ‬حٌزخس‪١ِٚ‬ظش حٌؼخٔ‪٠ ٟ‬ظُ طلذ‪٠‬ذ ٔ‪ ٛ‬حٌاـ‪ Socket‬أ‪٘ ٞ‬اً عا‪ٛ‬ف‬ ‫ٔغاااظخذَ ‪ Stream‬أ‪ Dgram ٚ‬إلسعاااخي حٌز‪١‬خٔاااخص أ‪٠ٚ) Raw Socket ٚ‬غاااظخذَ حٌاااـ ‪Raw‬‬ ‫‪ِ Socket‬ااع حٌزش‪ٚ‬ط‪ٛ‬واا‪ٛ‬الص حٌظاا‪ ٟ‬ال ططٍااذ حٌظعخِااً ِااع ‪ِ Port‬لااذد ‪ِٚ‬اآ حألِؼٍااش عٍ‪ٙ١‬ااخ حٌااـ‬ ‫‪ٌّ ICMP‬ض‪٠‬ذ ِٓ حٌّعٍ‪ِٛ‬خص حٔظش حٌفظً حٌخخِظ عشش( ‪ٚ‬رشىً دحثُ ‪٠‬ظُ حعاظخذحَ حٌاـ‪Stream‬‬ ‫فاا‪ ٟ‬كخٌااش اعااظخذحَ حٌااـ ‪ٚ TCP‬حٌااـ ‪ Dgram‬فاا‪ ٟ‬كخٌااش حعااظخذحَ حٌااـ‪ٚ ، UDP‬أخ‪١‬ااشح ٔلااذد ٔاا‪ٛ‬‬ ‫حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌّغظخذَ ٌإلطظخي ً٘ ٘‪ ِٓ ٛ‬حٌٕ‪ UDP ٛ‬أ‪ TCP ٚ‬أ‪ ٚ‬رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬الص أخاش‪ِ ٜ‬ؼاً‬ ‫حٌاـ‪ Internet Control Message Protocol ICMP‬أ‪ ٚ‬حٌاـ ‪Internet Group IGMP‬‬ ‫‪ Management Protocol‬أ‪ ٚ‬حٕٔااخ ٔش‪٠‬ااذ ِااؼال أشااخء حٌااـ‪ٌ Socket‬ظعش‪٠‬ااف ‪IP Security‬‬ ‫‪ Header‬ربخظ‪١‬خس ‪ٚ IPSecAuthenticationHeader‬غ‪١‬ش٘خ‪ٕ٘ٚ ،‬خ ع‪ٛ‬ف ٔخظاخس حٌاـ‪ TCP‬أ‪ٚ‬‬ ‫‪ِٚ UDP‬اآ حٌّعااش‪ٚ‬ف أْ رشط‪ٛ‬واا‪ٛ‬ي حٌااـ‪٘ TCP‬اا‪ ٛ‬رشط‪ٛ‬واا‪ٛ‬ي ِ‪ٛ‬ؿااٗ ‪٘ٚ‬اازح ‪٠‬عٕاا‪ ٟ‬اؿااشحء عٍّ‪١‬ااش‬ ‫حٌظلمااك ِاآ حٌ‪ٛ‬طاا‪ٛ‬ي ‪ٚ‬حٌظ‪ٛ‬طاا‪ ً١‬اٌاا‪ ٝ‬شااخض ِااخ ِلااذد أِااخ رشط‪ٛ‬واا‪ٛ‬ي حٌااـ‪ UDP‬ف‪ٙ‬اا‪ ٛ‬رشط‪ٛ‬واا‪ٛ‬ي‬ ‫عش‪٠‬ع ٔغز‪١‬خ ‪ٌ ٚ‬ىٕٗ ال ‪٠‬ذعُ عٍّ‪١‬ش حٌظلماك ِآ حٌ‪ٛ‬طا‪ٛ‬ي حٌغاٍ‪ٌٍ ُ١‬ز‪١‬خٔاخص حٌّشعاٍش ‪٘ٚ‬ا‪ِ ٛ‬ف‪١‬اذ ؿاذح‬ ‫إلؿشحء عٍّ‪١‬ش حٌزغ حإلرحعا‪ٚ Broadcast ٟ‬أشاخء ِـّ‪ٛ‬عاخص حٌزاغ ‪٘ٚ Multicast Group‬ا‪ٛ‬‬ ‫ِخ ششكٕخٖ ف‪ ٟ‬حٌفظً حأل‪ٚ‬ي ‪ٚ‬حٌؼخٔ‪ٚ ٟ‬حٌؼخٌغ ‪.‬‬

‫~‪~84‬‬


TCP

‫إلٔشتتتبء‬

Synchronous Socket Programming‫ اعتتتزخذاَ اٌتتتـ‬7.2 :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) ‫ّىٕااه طلااذد عااذد‬٠ٚ listener ‫ حٌّلااذد رخعااظخذحَ حٌذحٌااش‬Port‫ حٌااـ‬ٝ‫ااش حٌظظاإض عٍاا‬١ٍّ‫ااخَ رع‬١‫ػااُ حٌم‬ ٝ‫حفماش عٍا‬ٌّٛ‫َ رخ‬ٛ‫ ػاُ ٔما‬1- ُ‫اش ِلاذد ّٔاشس ٌاٗ حٌاشل‬١‫ػاع عاذد غ‬ٌٛٚ ‫اخ‬ٌٙٛ‫ظُ لز‬١‫ عا‬ٟ‫ضس حٌظا‬ٙ‫حألؿ‬ : ٍٟ٠ ‫وّخ‬ٚ accept ‫حالطظخي رخعظخذحَ حٌذحٌش‬

~85~


C#: MySocket.Listen(-1); MySocket.Accept(); VB.NET: MySocket.Listen(-1) MySocket.Accept ٛ‫فش ِآ حٌٕا‬ٛ‫ ِظاف‬ٟ‫خٔاخص فا‬١‫اغ طعزات حٌز‬١‫ ك‬Receive ‫خٔاخص ِآ خاالي حٌذحٌاش‬١‫ظُ حعاظمزخي حٌز‬٠ٚ : ٍٟ٠ ‫وّخ‬ٚ Byte C#: byte[]Received=new byte[1024]; MySocket.Receive(Received); VB.NET: Dim Received(1024) As Byte MySocket.Receive(Received) (‫ وّؼااخي‬5222)Port‫ حٌ اـ‬ٝ‫ااخ عٍاا‬ٙ‫ف‬٠‫رظعش‬ٚ TCP ٛ‫ ِاآ حٌٕاا‬Connection ‫ٕ٘ااخ لّٕااخ ربٔشااخء‬ٚ ..1- ‫ حٌعذد‬ٟ‫خث‬ٙٔ ‫ ال‬Listen ‫ف‬٠‫لّٕخ رظعش‬ٚ Bind ‫ رخعظخذحَ حٌذحٌش‬Socket‫خ رخٌـ‬ٙ‫ظُ سرط‬٠ ‫غ‬١‫ك‬ Socket‫اف حٌاـ‬٠‫ الرااذ ِآ طعش‬Socket‫ رخعاظخذحَ حٌاـ‬TCP Client ‫اف رشٔاخِؾ حإلسعاخي‬٠‫ٌظعش‬ٚ ‫ ػااُ اسعااخي‬IPEndPoint Instance Object‫ رخٌااـ‬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)

~86~


MySocket.Connect(remote) MySocket.Send(msg) MySocket.Close UDP ‫ إلٔشبء‬Synchronous Socket Programming‫ اعزخذاَ اٌـ‬7.3 : Connectionless ٟ‫٘ا‬ٚ ً‫عاش ِآ حٌّشحكا‬ّٛ‫ رّـ‬UDP Socket Connection‫ش حالطظخي رخعظخذحَ حٌاـ‬١ٍّ‫طّش ع‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬

Server‫ حٌاـ‬ٚ Client‫ حٌاـ‬ٟ‫اش فا‬١ٍّ‫ش ار طزذأ حٌع‬١‫ اال كذ وز‬TCP‫ حٌـ‬UDP‫ش حعظخذحَ حٌـ‬١ٍّ‫طشزٗ ع‬ٚ : ٍٟ٠ ‫ وّخ‬Socket‫ربٔشخء حٌـ‬ C#: Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType. Dgram, ProtocolType.Udp); VB.NET: Dim MySocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType. Dgram, 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) EndPoint ‫اااش‬٠‫ حٌزذح‬ٟ‫اااغ ٔعاااشف فااا‬١‫ ك‬ReceiveFrom ‫خٔاااخص ٔغاااظخذَ حٌذحٌاااش‬١‫العاااظمزخي حٌز‬ٚ ‫فش‬ٛ‫ ِع ِظاف‬Reference Object ‫ّٔشسٖ وـ‬ٚ ‫ حٌغخرك‬ٟ‫فٗ ف‬٠‫ ِخ طُ طعش‬ٍٝ‫ رٕخء ع‬Reference

~87~


‫ ِآ خاالي‬String ٝ‫فش اٌا‬ٛ‫ً حٌّظاف‬٠ٛ‫ع طل‬١‫ِٓ ػُ ٔغظط‬ٚ ReceiveFrom ‫ حٌذحٌش‬ٌٝ‫ ا‬Byte‫حٌـ‬ : ٍٟ٠ ‫وّخ‬ٚ ASCII Class ّٓ‫دس ػ‬ٛ‫ؿ‬ٌّٛ‫ ح‬GetString ‫حٌذحٌش‬ 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)); 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 Port ‫حٌاـ‬ٚ IP Address ‫عاشف حٌاـ‬٠ ٞ‫حٌاز‬ٚ EndPointObject‫اشح ّٔاشس ٌاٗ حٌاـ‬١‫حخ‬ٚ Flags‫حٌـ‬ : Broadcast Message ‫ وّؼخي إلسعخي‬ٍٟ٠ ‫وّخ‬ٚ Socket‫ٌـ‬ 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) :Synchronous Socket Classes Members7.4 ٝ‫ّىااآ اعااإخدٖ اٌااا‬٠ ‫اااغ‬١‫ ك‬IPAddress ‫اااف حٌاااـ‬٠‫غاااظخذَ ٌظعش‬٠ٚ : IPAddress Class -1 ‫ كخٌاش اسعاخي‬ٟ‫ فا‬Array of Address ٗ‫ْ ِآ خالٌا‬ٛ‫ّىآ أْ ٔىا‬٠ٚ ‫ وّؼاخي‬IPEndPoint‫حٌاـ‬ :ٍٟ٠ ‫ وّخ‬ٟٙ‫غش حٌعخِش ٌٗ ف‬١‫عش أِخ حٌظ‬ّٛ‫ ِـ‬ٌٝ‫سعخٌش ِخ ا‬ C#: IPAddress newaddress = IPAddress.Parse("192.168.1.1"); VB.NET: Dim newaddress As IPAddress = IPAddress.Parse("192.168.1.1")

~88~


‫‪ّ٠ٚ‬ىٓ حالخظ‪١‬خس ر‪ ٓ١‬حسرعش خ‪١‬خسحص ف‪ ٟ‬طلذ‪٠‬ذ حٌعٕ‪ٛ‬حْ ‪ ٟ٘ٚ‬وّخ ‪: ٍٟ٠‬‬ ‫‪٠ٚ Any‬غظخذَ ٌظّؼ‪ ً١‬أ‪ ٞ‬عٕ‪ٛ‬حْ ِظخف عٍ‪ ٝ‬حٌشزىش )عٕذ حإلعظمزخي ‪٠ٚ‬عٕ‪ ٟ‬حإلعظمزخي ِٓ حٌىً(‪.‬‬ ‫‪٠ٚ Broadcast‬غظخذَ ٌظّؼ‪١‬اً حٌزاغ حإلرحعا‪ٌ ٟ‬ـّ‪١‬اع حألؿ‪ٙ‬اضس عٍا‪ ٝ‬حٌشازىش )ع‪١‬اغ ‪٠‬ما‪ َٛ‬رعٍّ‪١‬اش‬ ‫كغخد حٌاـ‪ IP Broadcast‬د‪ ْٚ‬طاذخً حٌّغاظخذَ ‪ٌّ ،‬عشفاش و‪١‬ف‪١‬اش كغاخد حٌاـ‪ Broadcast‬أٔظاش‬ ‫حٌفظً حٌؼخٔ‪.(ٟ‬‬ ‫‪٠ٚ Loopback‬غظخذَ ٌظّؼ‪ ً١‬حٌعٕ‪ٛ‬حْ حٌّعش‪ٚ‬ف ٌٍـ ‪127.0.0.1 ٛ٘ٚ loopback‬‬ ‫وّخ ‪٠‬ذعُ ِـّ‪ٛ‬عش ِٓ حٌذ‪ٚ‬حي ‪ٚ‬أّ٘‪ٙ‬خ ‪:‬‬ ‫‪ Equals‬طغظخذَ ٘زٖ حٌذحٌش رشاىً عاخَ ٌٍّمخسٔاش را‪ٕ٘ٚ tow Objects ٓ١‬اخ عظغاظخذَ ٌٍّمخسٔاش‬ ‫ر‪ ٓ١‬عٕ‪ٛ‬حٔ‪ٚ ٓ١‬طشؿع ‪ True‬ارح وخٔخ ِظشخر‪ False ٚ ٓ١ٙ‬ارح وخٔخ ِخظٍف‪.ٓ١‬‬ ‫‪ٚ GetHashCode‬طغظخذَ إلسؿخ حٌعٕ‪ٛ‬حْ اٌ‪ ٝ‬ط‪١‬غش ‪Hash Code‬‬ ‫‪٠ٚ HostToNetworkOrder‬شؿع حٌـضء حٌخخص رخٌـ‪ ِٓ Network‬حٌعٕ‪ٛ‬حْ‬ ‫‪٠ٚ NetworkToHostOrder‬شؿع حٌـضء حٌخخص رخٌـ‪ ِٓ Host‬حٌعٕ‪ٛ‬حْ‬ ‫‪ : 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‬أَ ال‬ ‫‪٠ٚ ProtocolType‬غظخذَ ٌّعشفش حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌز‪٠ ٞ‬غظخذَ ف‪ ٟ‬حٌـ‪Socket‬‬ ‫‪٠ٚ RemoteEndPoint‬شؿااع ِعٍ‪ِٛ‬ااخص عاآ حٌااـ‪ Socket‬حٌااز‪٠ ٞ‬غااظخذَ ِااع حٌااـ ‪Remote‬‬ ‫‪Host‬‬

‫~‪~89‬‬


:‫ب‬ٙ‫وّضبي العزخذاِبر‬ٚ C#: using System; using System.Net; using System.Net.Socket; 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(); } } VB.NET: imports System imports System.Net imports System.Net.Socket 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

~91~


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 ‫ ػٓ ثشِجخ‬ٌٟ‫ اٌفظً اٌزب‬ٟ‫ف‬

~90~


Chapter 8 Asynchronous Socket

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

~92~


‫‪: Asynchronous Socket Programming :8‬‬ ‫ع‪ٛ‬ف ٔظلذع ف‪٘ ٟ‬زح حٌـاضء عآ حعاظخذحَ حٌاـ ‪ Asynchronous Socket‬رشاىً أوؼاش طفظا‪١‬ال‬ ‫عّخ طلذػٕخ راٗ عاخرمخ ‪ٚ‬عا‪ٛ‬ف ٔطزاك ِـّ‪ٛ‬عاش ِآ حألِؼٍاش حٌعٍّ‪١‬اش عٍا‪ ٝ‬حعاظخذحَ حالطظاخي حٌغ‪١‬اش‬ ‫ِظضحِٓ ف‪ ٟ‬رشِـ‪١‬خص حٌشزىخص ‪...‬‬ ‫ِٓ حٌّعش‪ٚ‬ف أْ حالطظخي حٌّظضحِٓ ِ‪ ُٙ‬ؿذح فا‪ ٟ‬حٌزشِـ‪١‬اخص حٌظا‪ ٟ‬طلظاخؽ اٌا‪ ٝ‬حٌعّاً فا‪ ٟ‬حٌاضِٓ‬ ‫حٌلم‪١‬م‪ ٟ‬ك‪١‬غ ال ‪٠‬غّق رخعظخذحَ حالطظخي ألِش آخش اٌ‪ ٝ‬رعاذ حٔظ‪ٙ‬اخء حٌعٍّ‪١‬اش حٌـخس‪٠‬اش ‪ٚ‬حعاظخذحِٗ‬ ‫ِ‪ ُٙ‬ؿذح فا‪ ٟ‬حٌعٍّ‪١‬اخص حٌظا‪ ٟ‬طظطٍاذ ِؼاً ٘ازٖ حألِا‪ٛ‬س ٌىآ ال ‪ٕ٠‬ظاق أراذح حعاظخذحِٗ فا‪ ٟ‬كخٌاش ارح‬ ‫وخٔض حٌـ‪ٙ‬ش حٌّغظمزٍش ٌٍز‪١‬خٔخص طغظخذَ ‪ Slow Connection‬وخعظّاخد حٌشازىش عٍا‪ ٝ‬حٌاـ‪Dialup‬‬ ‫ٌشرؾ حٌـ‪ٙ‬خص‪ ٓ٠‬حٌّشعً ِع حٌّغظمزً أ‪ ٚ‬ف‪ ٟ‬كخٌش ارح وخْ ٕ٘خٌه ِـّ‪ٛ‬عش وز‪١‬شس ِٓ حٌّغاظخذِ‪ٓ١‬‬ ‫طغااظخذَ حٌ اـ‪ Server‬ك‪١‬ااغ ‪ّٕ٠‬ااع حألعااٍ‪ٛ‬د حٌّظااضحِٓ رم‪١‬ااش حٌّغااظخذِ‪ ٓ١‬عٍاا‪ ٝ‬حٌشاازىش ِاآ اؿااشحء‬ ‫عٍّ‪١‬ش حإلسعخي ف‪ ٟ‬كخٌش و‪ ْٛ‬حٌـ‪٠ Server‬غظمزً ر‪١‬خٔخص ِٓ ؿ‪ٙ‬خص آخش ‪ٚ ،‬ف‪٘ ٟ‬زٖ حٌلخٌش ‪ٕ٠‬ظق‬ ‫رخعظخذحَ حالطظخي حٌغ‪١‬ش حٌّظضحِٓ ار ‪٠‬عظزش ِ‪ ُٙ‬ؿذح فا‪ ٟ‬كخٌاش ارح أسدٔاخ ِآ حٌزشٔاخِؾ حٌم‪١‬اخَ رعاذس‬ ‫ِ‪ٙ‬خَ ‪ٚ‬عٍ‪ٔ ٝ‬فظ حٌـ‪ٚ Thread‬رخعظخذحَ ٔفاظ حٌاـ‪ ، Connection‬أ‪ ٚ‬وّاخ روشٔاخ عاخرمخ فا‪ ٟ‬كخٌاش‬ ‫ارح وخْ حالطظخي رط‪ٟ‬ء ٔغز‪١‬خ أ‪ ٚ‬حٔٗ ‪ٛ٠‬ؿذ عذد ِغظخذِ‪٠ ٓ١‬غظخذِ‪ٔ ْٛ‬فظ حٌـ‪.. Server‬‬ ‫أ‪ٚ‬ال ‪: Asynchronous Socket Class and its members‬‬ ‫طاااذعُ حٌاااذ‪ٚ‬ص ٔ‪١‬اااض حالطظاااخي غ‪١‬اااش حٌّظاااضحِٓ رّـّ‪ٛ‬عاااش ِااآ حٌاااـ‪ Methods‬حٌّ‪ٛ‬ؿااا‪ٛ‬دس ػااآّ‬ ‫حٌاـ‪ٚ Socket Class‬حٌظا‪٠ ٟ‬اظُ حعاظذعخث‪ٙ‬خ ِآ حٌاـ‪ٚ System.Net.Socket Namespaces‬لاذ‬ ‫ِ‪١‬اضص حٌاذ‪ٚ‬ص ٔ‪١‬اض ٘ازٖ حٌاـ‪ Methods‬ر‪ٛ‬ؿا‪ٛ‬د حٌاـ‪ Begin‬فا‪ ٟ‬رذح‪٠‬اش أعاُ حٌذحٌاش‪ٌٚ ،‬ىاً ‪Begin‬‬ ‫‪ٛ٠ Method‬ؿااذ ‪ِ End Method‬مخرٍااش ٌ‪ٙ‬ااخ ‪ٚ‬حٌظاا‪ ٟ‬طغااظخذَ إلسؿااخ ‪ callback result‬عٕااذ‬ ‫حٔظ‪ٙ‬خء حٌـ‪ ِٓ Begin Method‬حٌظٕف‪١‬ز ‪ ٟ٘ٚ‬وّخ ‪:ٍٟ٠‬‬

‫‪ ٚ BeginAccept -1‬طغاااظخذَ ٌمزااا‪ٛ‬ي حٌاااـ‪ٚ Client Request‬اعااإخدٖ اٌااا‪ ٝ‬حٌاااـ ‪Object‬‬ ‫‪ٚ AsyncCallback‬رخعااظخذحَ ٘اازٖ حٌطش‪٠‬مااش عاا‪ٛ‬ف ‪٠‬ااظّىٓ حٌااـ‪ِ Server‬اآ حعااظمزخي عااذد ِاآ‬ ‫حٌاـ‪ Clients Requests‬فا‪ٔ ٟ‬فاظ حٌ‪ٛ‬لاض ‪ٚ‬راذ‪ ْٚ‬حٌلخؿاش الٔظظاخس حالٔظ‪ٙ‬اخء ِآ حٌعٍّ‪١‬اش حٌـخس‪٠‬اش‬ ‫ك‪١‬غ ‪٠‬ظُ ف‪ ٟ‬وً ِشس حعظذعخء حٌذحٌش رخعاظخذحَ حٌاـ‪ٚ AsyncCallback Delegate‬طغاظخذَ وّاخ‬ ‫‪ ٍٟ٠‬وّخ ‪:ٍٟ٠‬‬

‫~‪~93‬‬


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) ‫ٕ٘اخ‬ٚ ‫ ِٕفظً عٓ حٌغخرك‬Callback Reference ٟ‫ ف‬Client Request‫ظُ اػخفش حٌـ‬١‫غ ع‬١‫ك‬ Client Accepted ‫ااخء حٌااـ‬ٙٔ‫ا‬ٚ Client Request‫ العااظمزخي حٌااـ‬method ‫الرااذ ِاآ أشااخء‬ :EndAccept ‫ رخعظخذحَ حٌذحٌش‬Object 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)

~94~


:ٍٟ٠ ‫ رأخز ػذح أشىبي وّب‬Begin Accept Method‫ أطجذذ اٌـ‬Dot Net 2005 ٟ‫ف‬ State ٚ AsyncCallBack Delegate ‫طؤخز‬ٚ 2225 ٚ 2223 ‫ض‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ي ف‬ٚ‫حٌشىً حأل‬ :ٍٟ٠ ‫وّخ‬ٚ Socket ‫ حٌـ‬ٟ‫ ف‬Request ‫ِخص عٓ كخٌش حٌـ‬ٍٛ‫ إلسؿخ ِع‬Object MySocket.BeginAccept(AsyncCallback , object state) :‫خٔخص حٌّغظٍّش‬١‫ذ كـُ حٌز‬٠‫ٗ طلذ‬١‫ّىٕه ف‬٠ ‫غ‬١‫ ك‬2225 ‫ض‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ ف‬ٟٔ‫حٌشىً حٌؼخ‬ MySocket.BeginAccept(int Data_ Receive_Size , AsyncCallback , object state) :Accepted Socket ‫ذ حٌـ‬٠‫ٗ طلذ‬١‫غ رّىٓ ف‬١‫ ك‬2225 ‫ض‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫حٌشىً حٌؼخٌغ ف‬ MySocket.BeginAccept(Socket accept_Socket ,int Data_ Receive_Size , AsyncCallback , object state) Remote Machine‫ حٌـ‬ٚ‫ أ‬Server‫ ِع حٌـ‬Client‫طغظخذَ ٌشرؾ حٌـ‬ٚ BeginConnect -2 IPEndPoint Instance Object‫خ حٌـ‬ٌٙ ‫غٕذ‬٠ ‫غ‬١‫ ك‬Asynchronous Connection‫وـ‬ Asynchronous Callback‫ؼخ حٌـ‬٠‫خ أ‬ٌٙ ‫غٕذ‬٠ٚ (Port‫سلُ حٌـ‬ٚ IP Address ‫ٗ حٌـ‬١‫لذد ف‬٠) :ٍٟ٠ ‫وّخ‬ٚ State Object‫حٌـ‬ٚ 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(Connect_him), MySocket);

~95~


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) MySocket.BeginConnect(ipend, new AsyncCallback(Connect_him), MySocket) :ٍٟ٠ ‫ وّخ‬CallBack Socket‫ذ حٌـ‬٠‫ظُ طلذ‬٠ Connect_him Method‫ حٌـ‬ٟ‫ف‬ C#: public static void Connect_him (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 Byte Array ٟ‫ااخ فا‬ٕٙ٠‫طخض‬ٚ Client‫خٔاخص ِاآ حٌاـ‬١‫طغاظخذَ إلعااظمزخي ر‬ٚ BeginReceive -3 :ٍٟ٠ ‫خ وّخ‬ٌٙ ‫غش حٌعخِش‬١‫حٌظ‬ٚ MySocket.BeginReceive(Byte[] SocketFlags,AsyncCallback, object sate)

buffer,int

offset,

:‫ وّؼخي‬ٍٟ٠ ‫طغظخذَ وّخ‬ٚ C#: byte[] data = new byte[1024]; MySocket.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(ReceivedData), MySocket);

~96~


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‫حٌـ‬ Asynchronous ‫ حٌطاشف حٌّغاظمزً عزاش حٌاـ‬ٝ‫خٔاخص اٌا‬١‫طغظخذَ إلسعاخي ر‬ٚ BeginSend -4 :ٍٟ٠ ‫خ وّخ‬ٌٙ ‫غش حٌعخِش‬١‫حٌظ‬ٚ Socket MySocket.BeginSend (Byte[] SocketFlags,AsyncCallback, object sate)

buffer,int

offset,

:‫ وّؼخي‬ٍٟ٠ ‫طغظخذَ وّخ‬ٚ 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); 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)

~97~


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 ‫ذ‬١ٔ ‫د‬ٚ‫ اٌذ‬ٟ‫ذح ف‬٠‫اي اٌجذ‬ٚ‫ػخ ِٓ اٌذ‬ّٛ‫ وّب رُ إػبفخ ِج‬-5 ‫ إلسعااااااااااااخي ٍِااااااااااااف‬BeginSendFile ٚ ‫ااااااااااااخء حالطظااااااااااااخي‬ٙٔ‫ إل‬BegonDiconnect ‫خٔاااخص‬١‫ طغاااظخذَ إلعاااظمزخي عاااذد ِلاااذد ِااآ حٌز‬ٟ‫حٌظااا‬ٚ 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)

~98~


‫صبٔ‪١‬ب‪ :‬رطج‪١‬مبد اٌـ‪ Asynchronous Socket‬ف‪ ٟ‬اٌذ‪ٚ‬د ٔ‪١‬ذ ‪:‬‬ ‫طّش عٍّ‪١‬ش حالطظخي حٌغ‪١‬ش ِظضحِٓ رّـّ‪ٛ‬عش ِٓ حٌّشحكً طزذأ ربٔشخء حٌـ‪ Socket Object‬ف‪ٟ‬‬ ‫‪Asynchronous‬‬ ‫حٌـ‪ Server Side‬رعذ رٌه ‪٠‬ظُ طعش‪٠‬ف حٌـ‪ٌ BeginConnect‬زذأ‬ ‫‪ Connection‬عٍ‪ ٝ‬حٌـ‪ Socket‬ك‪١‬غ ‪٠‬ظُ اعٕخد ‪ٚ IPEndPoint Object‬حٌـ‪Method‬‬ ‫‪ٚ Asynchronous Callback‬حٌـ‪ٌٙ State Object‬خ ‪ٚ‬طزذأ ف‪٘ ٟ‬زٖ حٌلخٌش عٍّ‪١‬ش حالطظخي‬ ‫رخٌـ‪ٚ ، Socket‬رعذ رٌه طّشس اٌ‪ ٝ‬حٌـ‪ٌ BeginAccept‬مز‪ٛ‬ي حٌـ‪ Client Request‬ك‪١‬غ ‪٠‬ظُ‬ ‫لز‪ٛ‬ي حٌطٍذ ‪٠ٚ‬شعً ‪ Acknowledgement‬اٌ‪ ٝ‬حٌـ‪١ٌ Client‬عٍّٗ ف‪ٙ١‬خ رمز‪ٛ‬ي حٌـٍغش ‪ٚ‬اِىخٔ‪١‬ش‬ ‫حٌزذء ٌإلسعخي ‪٠ ٚ‬غظط‪١‬ع حٌـ‪ Client‬رعذ حٌّ‪ٛ‬حفمش عٍ‪ ٝ‬حٌـٍغش حٌزذء رخإلسعخي رخعظخذحَ حٌذحٌش‬ ‫‪٠ٚ BeginSend‬غظمزً حٌـ‪ Server‬حٌشعخٌش ِٓ حٌـ‪ Client‬رخعظخذحَ حٌذحٌش ‪BeginReceive‬‬ ‫‪ٚ‬وّخ روشٔخ عخرمخ فبْ ٌىً عٍّ‪١‬ش ‪ Begin‬طمخرٍ‪ٙ‬خ حٌذحٌش ‪ٌ End‬العظعذحد إلؿشحء عٍّ‪١‬ش أخش‪ٜ‬‬ ‫عٍ‪ٔ ٝ‬فظ حٌـ‪ Thread‬ف‪ ٟ‬حٌزشٔخِؾ ‪ِ ٛ٘ٚ‬خ ِ‪١‬ض حالطظخي حٌغ‪١‬ش ِظضحِٓ عٓ حالطظخي حٌّظضحِٓ‪.‬‬

‫ٔالكع ف‪ ٟ‬حٌشىً حٌغخرك رمخء حٌـ ‪ Server‬ر‪ٛ‬ػع‪١‬ش حإلٔظظخس ار أٔٗ ‪ٚ‬ف‪ ٟ‬وً عٍّ‪١‬ش ؽٍذ‬ ‫ٌٍـ‪ِ Request‬خ ‪٠‬ظُ أ‪ٙ‬خثش رخعظخذحَ حٌـ ‪ٚ Endxxx Method‬طغظذع‪٘ ٝ‬زٖ حٌـ‪Method‬‬ ‫رخعظخذحَ حٌـ ‪ Delegate‬حٌّخظض إلؿشحء عٍّ‪١‬ش حإلطظخي حٌغ‪١‬ش ِظضحِٓ ‪ٟ٘ٚ‬‬ ‫‪ٚ AsyncCallback‬طشزٗ ٘زٖ حٌعٍّ‪١‬ش اٌ‪ ٝ‬كذ وز‪١‬ش عٍّ‪١‬ش حٌذخ‪ٛ‬ي حٌّزخشش اٌ‪ ٝ‬حٌّعخٌـش ار ال‬ ‫طٕظظش أ‪ٙ‬خء حٌـ ‪ٌ Server‬عٍّ‪١‬ش حٌّعخٌـش حٌلخٌ‪١‬ش ف‪ ٟ‬كخٌش ‪ٚ‬س‪ٚ‬د ؽٍذ ؿذ‪٠‬ذ ‪٘ٚ‬ىزح ‪٠‬غٍُ أ‪ ٞ‬ؽٍذ‬ ‫ؿذ‪٠‬ذ اٌ‪ ٝ‬حٌـ ‪ Endxxx Method‬إلٔ‪ٙ‬خثٗ ‪ٚ‬ارمخء كخٌش حٌـ ‪ Server‬ر‪ٛ‬ػع حإلٔظظخس ‪...‬‬ ‫‪ٚ‬رٕخء عٍ‪ ٝ‬حٌّفخ٘‪ ُ١‬حٌغخرمش ع‪ٛ‬ف ٔم‪ َٛ‬ح‪ ْ٢‬ربٔشخء رشٔخِؾ ‪٠ Client/Server Chatting‬عظّذ‬ ‫عٍ‪ ٝ‬حٌـ‪ Asynchronous Socket‬إلسعخي ‪ٚ‬حعظمزخي حٌز‪١‬خٔخص ‪.‬‬

‫~‪~99‬‬


:ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ذ وّخ ف‬٠‫ ؿذ‬ٚ‫ٌٍزذء لُ ربٔشخء ِشش‬ٚ

:‫خ‬١ٌ‫ اٌزب‬Namespaces‫ف ٔغزخذَ اٌـ‬ٛ‫ع‬ C#: using System.Net; using System.Net.Socket; using System.Text; VB.NET: Imports System.Net Imports System.Net.Socket 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

~011~


ٝ‫ؼزّتتذ ػٍتت‬٠ Connection ‫تتش عتتٕؼشف‬١‫ د‬ٌٟ‫د اٌزتتب‬ٛ‫ لتتُ ثئػتتبفخ اٌىتت‬Form Load‫ اٌتتـ‬ٟ‫فتت‬ َ‫ي االرظتتتتبي ثبعتتتتزخذا‬ٛ‫تتتتخ لجتتتت‬١ٍّ‫تتتتف ػ‬٠‫ صتتتتُ رؼش‬5020 Port‫ اٌتتتتـ‬ٝ‫ؼّتتتتً ػٍتتتت‬٠ٚ 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); } 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 ‫تتتبء اٌتتتـ‬ٙٔ‫تتتٗ إ‬١‫زُ ف‬١‫ عتتت‬ٞ‫اٌتتتز‬ٚ Accept Callback Method ‫صتتتُ إٔشتتتبء‬ ‫ثؼتتتتتتتتتتذ رٌتتتتتتتتتته إسعتتتتتتتتتتبي‬ٚ EndAccept Method‫ ثبعتتتتتتتتتتزخذاَ اٌتتتتتتتتتتـ‬Request َ‫رشعتتتتً ثبعتتتتزخذا‬ٚ ‫ي اٌطٍتتتتت‬ٛ‫تتتتب ثمجتتتت‬ٙ١‫ رخجتتتتشٖ ف‬Client‫ اٌتتتتـ‬ٝ‫ إٌتتتت‬Acknowledgement :ٍٟ٠ ‫ وّب‬BeginSend Method‫اٌـ‬ 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"

~010~


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

~012~


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 Client‫َ ثئٔشتتبء ثشٔتتبِج اٌتتـ‬ٛ‫ف ٔمتت‬ٛ‫ْ عتت‬٢‫ا‬ٚ Server‫تتبء ِتتٓ ثشٔتتبِج اٌتتـ‬ٙ‫ٕ٘تتب لتتذ رتتُ االٔز‬ٚ :ٌٟ‫ اٌشىً اٌزب‬ٟ‫ذ وّب ف‬٠‫ع جذ‬ٚ‫ٌٍجذء لُ ثئٔشبء ِشش‬ٚ

:‫خ‬١ٌ‫ اٌزب‬Namespaces‫ف ٔغزخذَ اٌـ‬ٛ‫ع‬ C#: using System.Net; using System.Net.Socket; using System.Text; VB.NET: imports System.Net imports System.Net.Socket imports System.Text ‫ف‬٠‫)لُ ثئػبفخ اٌزؼبس‬Main Class‫ف اٌـ‬٠‫ ثؼذ رؼش‬ٞ‫ (أ‬Global Declaration‫ اٌـ‬ٟ‫ف‬ :‫خ‬١ٌ‫اٌزب‬

~013~


C#: public class Form1 : System.Windows.Forms.Form { private Socket client; private byte[] data = new byte[1024]; private int size = 1024; :ٌٟ‫د اٌزب‬ٛ‫ لُ ثىزبثخ اٌى‬Connect Button‫ اٌـ‬ٟ‫ف‬ . . conStatus.Text = "Connecting..."; Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text), 5020); newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock); VB.NET: Private client As Socket Private data As Byte() = New Byte(1024) Private size As Integer = 1024 . . 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) {

~014~


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

~015~


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

~016~


} 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 ٟ‫ب ف‬ٙ‫ ٔفغ‬ٟ٘ ‫االعزمجبي‬ٚ ‫اإلسعبي‬ Multicasting Conference ‫ ػٓ ؽشق ثشِجخ أٔظّخ اٌـ‬ٌٟ‫ اٌفظً اٌزب‬ٟ‫ش ف‬٠‫زُ اٌذذ‬١‫ع‬ .‫ذ‬١ٔ ‫د‬ٚ‫ئخ اٌذ‬١‫ ث‬ٟ‫ ف‬Systems

~017~


Chapter 9 Advanced Multicasting Systems

- Architecture of Multicast Socket - Using Multicast Socket 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

~018~


‫‪: Advanced Multicasting Systems :9‬‬ ‫لّٕخ عخرمخ رظعش‪٠‬ف حٌـ ‪ٚ Multicasting‬ر‪ٕ١‬خ حٌفشق ر‪ٕٙ١‬خ ‪ٚ‬ر‪ ٓ١‬حٌـ ‪ٚ Broadcasting‬ر‪ٕ١‬خ‬ ‫أٔ‪ٛ‬حع‪ٙ‬خ ‪ٚ‬و‪١‬ف‪١‬ش حٌظعخًِ ِع‪ٙ‬خ ف‪ ٟ‬حٌذ‪ٚ‬ص ٔ‪١‬ض ‪ٚ‬ف‪٘ ٟ‬زٖ حٌفظً ع‪ٛ‬ف ٔظلذع عٕ‪ٙ‬خ رشىً أوؼش‬ ‫طفظ‪١‬ال ‪ٚ‬رٌه ألّ٘‪١‬ظ‪ٙ‬خ حٌىز‪١‬شس ف‪ ٟ‬رشِـ‪١‬خص حٌشزىخص ‪ٚ‬خخطش رشِـ‪١‬خص حٌـ‪.Conferencing‬‬ ‫أ‪ٚ‬ال ‪: Architecture of Multicast Socket :‬‬ ‫ِٓ حٌّعش‪ٚ‬ف حٔٗ ‪٠‬ظُ حٌظعخًِ ِع حٌـ‪ Multicasting‬عزش رشط‪ٛ‬و‪ٛ‬ي حٌـ‪ٚ UDP‬رخعظخذحَ‬ ‫حٌـ‪ٚ Class D Subnet Mask‬طظُ عٍّ‪١‬ش ادحسس حٌّـّ‪ٛ‬عخص رخعظخذحَ رشط‪ٛ‬و‪ٛ‬ي حٌـ – ‪IGMP‬‬ ‫‪ٚ Internet Group Management Protocol‬حٌز‪ ٛ٘ ٞ‬ؿضء ِٓ حٌـ ‪Internet Protocol‬‬ ‫‪ٚ Model‬وّخ ‪٠‬ظؼق ِٓ حٌشىً حٌظخٌ‪ ٟ‬فبْ رشط‪ٛ‬و‪ٛ‬ي حٌـ‪٠ IGMP‬لظ‪ ٞٛ‬عٍ‪ ٝ‬عٍّ‪١‬خص حٌظلمك‬ ‫ِٓ حٌ‪ٛ‬ط‪ٛ‬ي حٌغٍ‪ٌٍ ُ١‬ز‪١‬خٔخص )ك‪١‬غ ‪٠‬ظُ اسعخي كـُ حٌز‪١‬خٔخص حٌىٍ‪ٌ ٟ‬شعخٌش ‪ ٟ٘ٚ‬حخظ‪١‬خس‪٠‬ش ار‬ ‫‪ّ٠‬ىٓ اٌغخث‪ٙ‬خ ر‪ٛ‬ػع حٌشلُ طفش( ‪ ٚ ،‬طلظ‪ ٞٛ‬أ‪٠‬ؼخ عٍ‪ ٝ‬حٌـ‪ٚ TTL Time to Live‬حٌز‪٠ ٞ‬لذد‬ ‫ف‪ ٗ١‬حٌعّش حالفظشحػ‪ٌ ٟ‬ىً سعخٌش رٕخء عٍ‪ ٝ‬عذد حٌـ ‪ Hops‬حٌظ‪ ٟ‬ع‪ّ١‬ش ِٕ‪ٙ‬خ حٌـ ‪ٛٔٚ ،Packet‬‬ ‫حٌعٍّ‪١‬ش حإلدحس‪٠‬ش )ػُ اٌ‪ِ ٝ‬ـّ‪ٛ‬عش ‪ ،‬اٌغخء ِٓ ِـّ‪ٛ‬عش ‪ ،‬أ‪ ٚ‬اسؿخ ِعٍ‪ِٛ‬خص عٓ حٌّـّ‪ٛ‬عش‬ ‫‪ٚ (Membership Query‬أخ‪١‬شح عٕ‪ٛ‬حْ حٌّـّ‪ٛ‬عش حٌظ‪٠ ٟ‬ظُ طلذ‪٠‬ذ٘خ رشِـ‪١‬خ ػّٓ‬ ‫حٌـ‪ Range‬حٌّلذد ٌٍـ ‪. Class D‬‬

‫‪ 224.0.0.0‬اٌ‪ٝ‬‬ ‫‪ٚ‬طُ طخظ‪١‬ض حٌـ‪ Range‬ف‪ ٟ‬حٌـ‪ِٓ IP Multicasting‬‬ ‫‪ٔٚ 239.255.255.255‬غظط‪١‬ع طلذ‪٠‬ذٖ رؼالػش ؽشق اِخ رشىً ‪٠‬ذ‪ Static ٞٚ‬أ‪ Dynamic ٚ‬أ‪ٚ‬‬ ‫عٍ‪ ٝ‬أعخط حٌـ‪ٚ Scope-Relative‬رشىً عخَ طغظخذَ ٘زٖ حٌظ‪ٛ‬ص‪٠‬عخص وّخ ‪ ٍٟ٠‬وّؼخي‪:‬‬ ‫وّؼاخي حٌظخظا‪١‬ض ‪٠ 224.0.0.1‬غاظخذَ فا‪ ٟ‬ؿّ‪١‬اع حٌشازىخص حٌّلٍ‪١‬اش ك‪١‬اغ ال ‪٠‬اظُ طّش‪٠‬اشٖ اٌاا‪ٝ‬‬ ‫شزىش أخاش‪ ٜ‬عزاش حٌاـ‪ٌّ .Router‬عشفاش ؿّ‪١‬اع حٌظخظ‪١‬ظاخص ٌٍاـ ‪ Multicasting‬حٔظاش حٌاشحرؾ‬ ‫حٌظخٌ‪ ٟ‬حٌخخص رّٕظّش حٌـ ‪:Iana‬‬ ‫‪http://www.iana.org/assignments/multicast-addresses‬‬ ‫‪٠‬ظُ ٔمً حٌـ‪ Multicast Packets‬ر‪ ٓ١‬حٌـ‪ Backbone Tunnels‬وـ ‪Unicast‬ك‪١‬غ ‪٠‬اظُ اسعاخٌ‪ٙ‬خ‬ ‫ِٓ دحخً حٌشزىش اٌ‪ ٝ‬حٌـ‪ ٚ Router‬طشعً ِٓ ‪ Router‬اٌ‪ ٝ‬أخش عزاش حٌاـ‪Backbone Tunnel‬‬ ‫رؤعٍ‪ٛ‬د حٌـ‪ِ ٛ٘ٚ Unicast‬اخ ‪٠‬ا‪ٛ‬فش حٌىؼ‪١‬اش ِآ حٌاـ‪ Bandwidth‬فا‪ ٟ‬حٌشازىش ك‪١‬اغ طشعاً ٔغاخش‬ ‫‪ٚ‬حكذس اٌ‪ ٝ‬حٌـ‪٠ٚ Router‬م‪ ٛ٘ َٛ‬رظ‪ٛ‬ص‪٠‬ع‪ٙ‬خ عٍ‪ ٝ‬حألؿ‪ٙ‬اضس واـ‪ ، Broadcast‬حٌّشاىٍش حٌ‪ٛ‬ك‪١‬اذس فا‪ٟ‬‬ ‫حٌااـ‪٘ Multicast‬اا‪ ٛ‬حٔااٗ ‪٠‬عظّااذ رشااىً وخِااً عٍاا‪ ٝ‬حعااظخذحَ حٌااـ ‪UDP Connectionless‬‬ ‫‪.Protocol‬‬ ‫‪ّ٠ٚ‬ىٕ​ٕاخ حعاظخذحَ حٌاـ‪ Multicasting‬فا‪ ٟ‬ػالػاش أٔا‪ٛ‬ح ِآ حٌشازىخص ‪٘ٚ‬ا‪ ٟ‬شازىخص حٌاـ ‪Peer to‬‬ ‫‪ Peer‬ك‪١‬غ ال ‪ٚ‬ؿ‪ٛ‬د ٌـ‪ٙ‬خص ‪ٚ Server‬حٌىً ‪٠‬غظمزً ‪٠ ٚ‬شعً ِٓ ‪ ٚ‬اٌ‪ ٝ‬حٌـ‪ Group‬حٌز‪ ٛ٘ ٞ‬ف‪١‬اٗ‪،‬‬

‫~‪~019‬‬


‫‪ٚ‬حٌٕاا‪ ٛ‬حٌؼااخٔ‪ Server Based Network ٟ‬ك‪١‬ااغ ‪٠‬ااظُ اسعااخي سعااخٌش ‪ٚ‬حكااذس اٌاا‪ ٝ‬حٌااـ‪Server‬‬ ‫‪٠ٚ‬ماا‪ َٛ‬حٌااـ‪ Server‬رظ‪ٛ‬ص‪٠‬ع‪ٙ‬ااخ عٍاا‪ ٝ‬رم‪١‬ااش حألؿ‪ٙ‬ااضس فاا‪ ٟ‬حٌشاازىش‪ ،‬أِااخ حٌٕاا‪ ٛ‬حٌؼخٌااغ ف‪١‬ااظُ ِاآ خااالي‬ ‫حٌـ‪ٚ ،Router‬وّخ ‪٠‬ظؼق ِٓ حٌشىً حٌظخٌ‪ ٟ‬فابْ عٍّ‪١‬اش حإلسعاخي طاظُ رعاذ حٔؼاّخَ حٌاـ‪ Client‬اٌا‪ٝ‬‬ ‫حٌّـّ‪ٛ‬عش حٌظ‪ ٟ‬طٍّه حٌـ‪٠ٚ IP Multicast‬شعً حٌـ‪ Client‬سعاخٌش ‪ٚ‬حكاذس اٌا‪ ٝ‬حٌاـ‪ Router‬ك‪١‬اغ‬ ‫‪٠‬م‪ َٛ‬حٌـ‪ Router‬رظ‪ٛ‬ص‪٠‬ع‪ٙ‬خ عٍ‪ ٝ‬حألؿ‪ٙ‬ضس ف‪ ٟ‬حٌّـّ‪ٛ‬عش ِغظخذِخ حٌـ‪.Routing Table‬‬

‫‪ٚ‬وّخ واخْ حٌلاخي فا‪ ٟ‬حإلسعاخي رخعاظخذحَ حٌاـ‪٠ Broadcasting‬اظُ حإلسعاخي فا‪Multicasting ٟ‬‬ ‫ِٓ ؿ‪ٙ‬خص ِلذد اٌ‪ِ ٝ‬ـّ‪ٛ‬عش ِع‪ٕ١‬ش ‪١ٌٚ‬ظ اٌا‪ ٝ‬حٌىاً وّاخ فا‪ ٟ‬حٌاـ‪ ، Broadcast‬ك‪١‬اغ طكىا‪ ْٛ‬واً‬ ‫ِـّ‪ٛ‬عاااش ِااآ حألؿ‪ٙ‬اااضس ‪ Group‬خاااخص ‪٠ٚ‬اااظُ حٌظخظااا‪١‬ض وّاااخ روشٔاااخ عاااخرمخ ‪ٚ‬فاااك حٌاااـ ‪IP‬‬ ‫‪ Multicasting‬ك‪١‬اااغ طّظٍاااه واااً ِـّ‪ٛ‬عاااش ٔفاااظ حٌاااـ‪ٛ٠ٚ IP Multicast‬ؿاااذ عاااذس أشاااىخي‬ ‫ٌٍـ‪ ِٓٚ Multicasting‬حألِؼٍش عٍ‪ٙ١‬خ حإلسعاخي اٌا‪ِ ٝ‬ـّ‪ٛ‬عاش ‪ ٚ one to Group‬حإلسعاخي اٌا‪ٝ‬‬ ‫أوؼش ِٓ ِـّ‪ٛ‬عش ‪: one to Multi Group‬‬ ‫‪ – 1‬حإلسعخي ِٓ ‪ٚ‬حكذ اٌ‪ِ ٝ‬ـّ‪ٛ‬عش ‪:One to Group‬‬ ‫‪ٚ‬ف‪١‬اٗ ‪ٍّ٠‬اه حٌاـ‪ٔ Sender User‬فاظ حٌاـ‪ IP Multicasting‬حٌاز‪ٍّ٠ ٞ‬ىاٗ حٌاـ‪Receiver Users‬‬ ‫‪٠ٚ‬اااظُ حإلسعاااخي ِااآ دحخاااً حٌاااـ‪ Group‬اٌااا‪ ٝ‬ؿّ‪١‬اااع أعؼاااخثٗ ك‪١‬اااغ طشعاااً واااـ ‪ Unicast‬اٌااا‪ٝ‬‬ ‫حٌاااـ‪ Access Point‬ك‪١‬اااغ ‪٠‬مااا‪ َٛ‬رظ‪ٛ‬ص‪٠‬ع‪ٙ‬اااخ عٍااا‪ ٝ‬وخفاااش حألعؼاااخء فااا‪ ٟ‬حٌّـّ‪ٛ‬عاااش رؤعاااٍ‪ٛ‬د‬ ‫حٌـ‪ٚ Broadcast‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~001‬‬


‫‪ -2‬حإلسعخي اٌ‪ ٝ‬أوؼش ِٓ ِـّ‪ٛ‬عش ‪:One to Multi-Groups‬‬ ‫‪ٚ‬ف‪ ٗ١‬لذ ‪٠‬ى‪ ْٛ‬حٌـ‪ٌٍ IP Multicasting‬ـ ‪ِ Sender User‬خظٍاف عآ ‪٠ٚ Receiver Users‬اظُ‬ ‫حإلسعااخي ِاآ ‪ User‬دحخااً حٌااـ‪ Group‬اٌاا‪ ٝ‬حٌّـّ‪ٛ‬عااش حٌااز‪٘ ٞ‬اا‪ ٛ‬عؼاا‪ِٕٙ ٛ‬ااخ ‪ٚ‬اٌاا‪ِ ٝ‬ـّ‪ٛ‬عااخص‬ ‫أخش‪٠ٚ ،ٜ‬ظُ طلذ‪٠‬ذ٘خ رخعظخذحَ ‪ٌٍّ Address List‬ـّ‪ٛ‬عخص حٌظ‪ٔ ٟ‬ش‪٠‬ذ حإلسعخي ٌ‪ٙ‬خ ‪...‬‬

‫~‪~000‬‬


:Using Multicast Socket with .NET: ‫ب‬١ٔ‫صب‬ Members‫ حٌاـ‬ٝ‫طعشفٕاخ عٍا‬ٚ ‫اض‬١ٔ ‫ص‬ٚ‫ حٌاذ‬ٟ‫ ف‬Multicasting‫ش حٌظعخًِ ِع حٌـ‬١‫ف‬١‫ششكٕخ عخرمخ و‬ ‫ااخ‬ٙ١ٍ‫ٔطزااك ع‬ٚ ‫ااخص‬١ٍّ‫ً ٘اازٖ حٌع‬١‫ء ِاآ حٌظفظاا‬ٟ‫ٓ رشاا‬١‫ف ٔزاا‬ٛ‫ٕ٘ااخ عاا‬ٚ ‫ااخ‬ٙ‫ حٌخخطااش ر‬Classes‫حٌااـ‬ٚ ٝ‫ ِعظّااذح عٍاا‬Conference System َ‫َ رزٕااخء ٔظااخ‬ٛ‫رعااذ رٌااه عاإم‬ٚ ‫عااش ِاآ حألِؼٍااش‬ّٛ‫ِـ‬ . Multicasting‫حٌـ‬ : Multicasting‫ حٌظعخًِ ِع حٌـ‬ٟ‫ش ف‬١‫خص حألعخع‬١ٍّ‫ِٓ حٌع‬ : Joining || Drop Group ‫عش‬ّٛ‫ؽ ِٓ ِـ‬ٚ‫ حٌخش‬ٚ‫ حالٔؼّخَ أ‬-1 ٝ‫ حٌظظاإض عٍاا‬ٜٛ‫ااخص طلمااك عاا‬١ٍّ‫ ع‬ٞ‫ أ‬Multicast Group‫ حٌااـ‬ٝ‫ااش حالٔؼااّخَ اٌاا‬١ٍّ‫ال طٍااضَ ع‬ udpClient Object ‫اااف‬٠‫اااظُ رٌاااه رعاااذ طعش‬٠ٚ ، ‫ حٌّلاااذد‬IP Multicasting‫حٌاااـ‬ٚ port‫حٌاااـ‬ ٞ‫ حٌااز‬IP Multicasting‫ااف حٌااـ‬٠‫ااظُ طعش‬٠ JoinMulticastGroup Method‫رخعااظخذحَ حٌااـ‬ٚ :ٍٟ٠ ‫وّخ‬ٚ ٗ١ٌ‫ف ٕٔؼُ ا‬ٛ‫ع‬ 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 ٚ JoinMulticastGroup Methods ‫ار طغااظخذَ حٌ اـ‬ Class َ‫رخعااظخذح‬ٚ ، Multicast Group‫ٓ ِاآ حٌااـ‬٠ٚ‫عااش ِاآ حٌعٕااخ‬ّٛ‫ ِـ‬ٚ‫حْ أ‬ٛ‫ اٌغااخء عٕاا‬ٚ‫أ‬ Multicast ٟ‫ااخ فاا‬ٙ‫ ٌظعخِااً ِع‬IP Address List ٓ٠‫ّىٕ​ٕااخ طخااض‬٠ :MulticastOption ‫ وّؼااخي إلػااخفش‬ٟ‫ٍاا‬٠ ‫طغااظخذَ وّااخ‬ٚ Multicast Group ٞ‫ أل‬Drop ٚ Join ً‫ ٌعّاا‬Group : Multicast ً‫ش العظمزخي سعخث‬٠ٛ‫عؼ‬ : ٍٟ٠ ‫وّخ‬ٚ UDP Socket‫ال ٔعشف حٌـ‬ٚ‫أ‬ C#: mcastSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);

~002~


VB.NET: mcastSocket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) ٚ‫ أ‬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 MulticastOption(localIPAddr New = mcastOption) ‫ظشحص‬١ِٚ‫ااغ طؤخااز ٘اازٖ حٌذحٌااش ػالػااش رااخس‬١‫ ك‬SetSocketOption ٝ‫ااش عٍاا‬١‫ف حٌظغ‬١‫ِاآ ػااُ ٔؼاا‬ٚ ٟ‫فا‬ٚ UDP ٚ‫ أ‬TCP ٚ‫ أ‬Socket ٍٝ‫ ع‬ٚ‫ أ‬IPv6 ٍٝ‫ ع‬ٚ‫ أ‬IP ٍٝ‫ش ع‬١١‫ حٌظغ‬ٜٛ‫ذ ِغظ‬٠‫ي ٌظلذ‬ٚ‫حأل‬ Multicast Group ٝ‫ اٌا‬IP ُ‫ ػا‬ٛ‫اذٖ ٘ا‬٠‫ ار ِاخ ٔش‬IP ٝ‫اش عٍا‬١‫ف ٔغاظخذَ حٌظغ‬ٛ‫كخٌظٕاخ ٘ازٖ عا‬ ‫ٓ اػاخفش‬١‫اخس را‬١‫ّىٓ حالخظ‬٠ٚ ‫ش‬٠ٛ‫ذ اػخفش عؼ‬٠‫غ ٔش‬١‫ش ك‬١١‫ حٌظغ‬ٛٔ ‫ ٔلذد‬ٟٔ‫ظش حٌؼخ‬١ِٚ‫ حٌزخس‬ٟ‫ف‬ٚ ٗ‫ااا‬١ٌ‫اااشح ٔغااإذ ا‬١‫أخ‬ٚ DropMembership ‫ش‬٠ٛ‫ اٌغاااخء عؼااا‬ٚ‫ أ‬AddMembership ٗ٠ٛ‫عؼااا‬ :ٍٟ٠ ‫ وّخ‬ٚ ٗ‫ لّٕخ ربٔشخث‬ٞ‫حٌز‬ٚ 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 ‫ااف حٌااـ‬٠‫ال ِاآ طعش‬ٚ‫ الرااذ أ‬IP Multicasting‫ع حإلسعااخي رخعااظخذحَ حٌااـ‬١‫ ٔغااظط‬ٝ‫كظاا‬ ٝ‫ اٌا‬Port‫سلاُ حٌاـ‬ٚ IP Multicasting‫اعإخد حٌاـ‬ٚ UDP Connection‫ رخعاظخذحَ حٌاـ‬Object ‫اخ‬ٌٙ ‫غ ٔغإذ‬١‫ ك‬sendto method‫ع حإلسعخي رخعظخذحَ حٌـ‬١‫ٔغظط‬ٚ ... IPEndPoint Object‫حٌـ‬ :‫ش‬١‫ إلسعخي سعخٌش ٔظ‬ٍٟ٠ ‫وّخ‬ٚ IPEndPoint Object‫حٌـ‬ٚ data as Bytes Array‫حٌـ‬

~003~


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(); 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.Jp eg); 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

~004~


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) :Receiving Data From a Multicast Group ‫عش‬ّٛ‫ حالعظمزخي ِٓ ِـ‬-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) 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();

~005~


‫‪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‬ف‪ ٟ‬ثشِج‪١‬بد اٌشجىبد ‪:‬‬ ‫‪ِ -1‬ااااآ حٌّالكاااااع إٔٔاااااخ ال ٔغاااااظط‪١‬ع حعاااااظخذحَ حٌاااااـ‪ٌ Network Stream‬عٍّ‪١‬اااااش اسعاااااخي‬ ‫حٌـ‪ Multicasting‬ار ‪٠‬ظطٍذ حعظخذحِ‪ٙ‬خ ‪ٚ‬ؿ‪ٛ‬د ‪٘ٚ TCP Socket Connection‬ا‪ ٛ‬غ‪١‬اش ِظاخف‬ ‫فا‪ ٟ‬حٌاـ‪٠ٚ Multicasting‬غااظعخع عٕ‪ٙ‬اخ رخعااظخذحَ حٌاـ‪ memory Stream‬إلسعااخي ‪Binary‬‬ ‫‪ Stream‬عزش حٌـ‪... sendto method‬‬ ‫‪ -2‬ال ‪ّ٠‬ىٕااه حعااظخذحَ حٌااـ‪Multicasting‬وااـ‪ loopback‬فاا‪ ٟ‬كخٌااش عااذَ ‪ٚ‬ؿاا‪ٛ‬د شاازىش أ‪ ٚ‬حطظ اخي‬ ‫ٌزٌه ٌٓ طغظط‪١‬ع طـشرش أ‪ ِٓ ٞ‬ططز‪١‬مخص حٌـ‪ Multicasting‬ف‪ ٟ‬كخٌش عذَ حطظخٌه رخٌشزىش‪.‬‬ ‫‪ّ٠ -3‬ىٓ ٌىً ؿ‪ٙ‬اخص أْ ‪ٕ٠‬ؼاُ اٌا‪ ٝ‬أوؼاش ِآ ِـّ‪ٛ‬عاش رل‪١‬اغ ‪٠‬غاظمزً ِآ ؿ‪ٙ‬اخص ِظعاذدس‪ ،‬وازٌه‬ ‫‪٠‬غظط‪١‬ع حإلسعخي اٌ‪ ٝ‬عذس ِـّ‪ٛ‬عخص‪.‬‬ ‫‪ -4‬فاا‪ ٟ‬حٌعااخدس طىاا‪ ْٛ‬حٌغااعش حٌّغااّ‪ٛ‬كٗ إلسعااخي حٌااـ‪ Multicasting Data‬عز اش حٌااـ ‪sendto‬‬ ‫‪ِ Method‬لذ‪ٚ‬دس ‪ٚ‬حٌغزذ حألعخع‪ٌٙ ٟ‬زٖ حٌّشىٍش ٘‪ ٟ‬حعظخذحَ حٌـ ‪ Multicasting‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي‬ ‫حٌـ ‪ٚ UDP‬حٌز‪ ٞ‬ال ‪ّ٠‬ىٓ طـضثش حٌاـ ‪ Data‬حٌّشعاٍش فا‪ ٟ‬كخٌاش حعاظخذحَ ك‪١‬اغ ال ‪٠‬اذعُ حٌظ‪ٛ‬طا‪ً١‬‬ ‫‪Ethernet‬‬ ‫‪ٚ‬فاااااك حٌظشط‪١‬اااااذ ِّاااااخ ‪٠‬لظاااااش اِىخٔ‪١‬اااااخص حإلسعاااااخي راااااخٌلـُ حأللظااااا‪ٌٍ ٝ‬اااااـ‬ ‫‪.Encapsoulation‬‬

‫~‪~006‬‬


‫صبٌضب رطج‪١‬ك ِشش‪ٚ‬ع ٔظبَ اٌّؤرّشاد ‪:Multicasting Conferencing Systems‬‬ ‫ف‪٘ ٟ‬زح حٌظطز‪١‬ك ع‪ٛ‬ف ٔفظشع ‪ٚ‬ؿ‪ٛ‬د غشفش طف‪١‬ش ك‪١‬غ ‪٠‬م‪ َٛ‬حٌّلخػش ربٌمخء حٌّلخػشس عٓ‬ ‫رعذ أِخَ ؽالرٗ ار ٔش‪٠‬ذ ٕ٘خ ؿعً حٌطالد ‪٠‬ش‪ ْٚ‬حألعظخر ‪ٚ‬وّخ ‪٠‬غظط‪١‬ع حألعظخر سإ‪٠‬ش ؽالرٗ‬ ‫)‪ (Full Duplex System‬رخإلػخفش اٌ‪ ٝ‬اِىخٔ‪١‬ش عشع حٌّلخػشس عٍ‪ ٝ‬حٌـ ‪Power Point‬‬ ‫‪(By Get Desktop Screen) Slides‬وّخ ‪٠‬غظط‪١‬ع حٌطالد حٌظلذع ِع حألعظخر رخعظخذحَ‬ ‫‪ٚ Text Chatting‬حٌـ‪...Voice Chatting‬‬ ‫ع‪ٛ‬ف ٔم‪ٕ٘ َٛ‬خ رظمغ‪ٔ ُ١‬ظخَ حٌّئطّشحص اٌ‪ ٝ‬ػالػش أٔظّش سث‪١‬غ‪١‬ش ‪ٔ ٟ٘ٚ‬ظخَ ِئطّشحص حٌف‪١‬ذ‪ٛ٠‬‬ ‫‪ٔٚ‬ظخَ ِئطّشحص عطق حٌّىظذ ‪ٔٚ‬ظخَ حٌّئطّشحص حٌٕظ‪١‬ش ‪ٚ‬عٕؼ‪١‬ف عٍ‪ ٗ١‬الكمخ ٔظخَ حٌّلخدػش‬ ‫حٌظ‪ٛ‬ط‪١‬ش‪ ،‬ف‪ ٟ‬حٌزذح‪٠‬ش ع‪ٛ‬ف ٔم‪ َٛ‬ربٔشخء حٌشخشش حٌشث‪١‬غ‪١‬ش ٌٍزشٔخِؾ ‪ ٚ‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~007‬‬


‫‪: Full/Half Duplex Multicast Video Conferencing System -1‬‬ ‫‪ٚ‬فشص ٌٕخ ‪ِ Microsoft‬ـّ‪ٛ‬عش ِٓ حٌـ‪ Classes‬حٌخخسؿ‪١‬ش ‪ٚ‬حٌظ‪ ٟ‬طظعخِاً ِاع حٌاـ ‪DirectX 9‬‬ ‫ِزخششس ك‪١‬غ ٔغظط‪١‬ع حعظخذحِ‪ٙ‬خ ٌظعخًِ ِاع حٌىاخِ‪١‬شح أ‪ ٚ‬حٌاـ‪ Scanner‬أ‪ ٚ‬حٌظا‪ٛ‬ص أ‪ ٚ‬أ‪ ٞ‬ؽشف‪١‬اش‬ ‫أخااش‪ٚ ٜ‬فاا‪٘ ٟ‬اازح حٌظطز‪١‬ااك عاا‪ٛ‬ف ٔغااظخذَ حٌ اـ‪ Direct Show Dot Net Classes‬الٌظمااخؽ‬ ‫طاا‪ٛ‬سس عزااش حٌىااخِ‪١‬شح ‪ٚ‬عشػاا‪ٙ‬خ عٍاا‪ ٝ‬حٌااـ‪ Picture box‬ك‪١‬ااغ ٔغااظط‪١‬ع اسعااخٌ‪ٙ‬خ الكمااخ اٌاا‪ٝ‬‬ ‫حٌـ‪ Multicast Group‬رخعظخذحَ حٌـ‪ٚ memory Stream‬حٌاـ‪٘ٚ Sendto method‬ا‪ِ ٛ‬اخ ر‪ٕ١‬اخٖ‬ ‫عخرمخ ‪..‬‬ ‫‪ٚ‬كظ‪ٔ ٝ‬غظط‪١‬ع حعظخذحِ‪ٙ‬خ ع‪ٛ‬ف ٔؼُ حٌـ‪ Direct Show Classes‬اٌ‪ ٝ‬حٌّشش‪ٚ ٚ‬وّخ ‪:ٍٟ٠‬‬

‫‪ٚ‬كظ‪ٔ ٝ‬ظعخًِ ِع‪ٙ‬خ ع‪ٛ‬ف ٔغظذع‪ٙ١‬خ رخعظخذحَ ‪:‬‬ ‫‪C#:‬‬ ‫;‪using DShowNET‬‬ ‫;‪using DShowNET.Device‬‬ ‫‪VB.NET:‬‬ ‫‪imports DShowNET‬‬ ‫‪imports DShowNET.Device‬‬ ‫‪ٚ‬ع‪١‬ى‪ ْٛ‬شىً رشٔخِؾ اسعخي حٌىخِ‪١‬شح وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~008‬‬


‫ً حٌزشٔخِؾ‬١‫ش طشغ‬٠‫خص حإلدخخي عٕذ رذح‬ٙ‫خس ؿ‬١‫ الخظ‬DeviceSelector Class‫ف ٔغظخذَ حٌـ‬ٛ‫ع‬ :ٍٟ٠ ‫وّخ‬ٚ 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;

~009~


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 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 ًّ‫ػُ ع‬

~021~


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 َ‫ِٓ خالي حعظخذح‬ C#: try { MemoryStream ms = new MemoryStream(); pictureBox.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpe g); 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){} 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

~020~


‫‪ٕ٘ٚ‬خ ‪٠‬غظط‪١‬ع حٌّلخػش اسعاخي حٌظا‪ٛ‬سس عزاش حٌىاخِ‪١‬شح اٌا‪ ٝ‬ؽالراٗ وّاخ عا‪ٛ‬ف ‪٠‬اظّىٓ ِآ سإ‪٠‬اش‬ ‫ؽالرٗ عزش حٌىخِ‪١‬شح ‪ٚ‬ع‪ٛ‬ف ٔفظشع ٕ٘اخ حعاظخذحِٗ ٌشازىش ال عاٍى‪١‬ش ك‪١‬اغ ع‪١‬شعاً حٌز‪١‬خٔاخص اٌا‪ٝ‬‬ ‫حٌـ‪ Access Point‬رؤعٍ‪ٛ‬د حٌـ‪ٚ Unicast‬ع‪ٛ‬ف ‪٠‬ظ‪ ٌٝٛ‬حٌـ‪ Access Point‬ط‪ٛ‬ص‪٠‬اع حٌز‪١‬خٔاخص اٌا‪ٝ‬‬ ‫ؿّ‪١‬ع حألعؼخء حٌّٕؼّ‪ ٓ١‬اٌ‪ ٝ‬حٌـ‪٠ٚ Multicast Group‬شعٍ‪ٙ‬خ ٌ‪ ُٙ‬وـ‪ٚ Broadcast‬وّاخ فا‪ٟ‬‬ ‫حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٚ‬وّخ ٔالكاع فا‪ ٟ‬حٌشاىً حٌغاخرك فابْ حٌّلخػاش ‪ٕ٠‬ؼاُ اٌا‪ِ ٝ‬ـّا‪ٛ‬عظ‪ِ ٓ١‬ـّ‪ٛ‬عاش حألعاخطزس ‪٘ٚ‬ا‪ٟ‬‬ ‫‪ 225.100.1.1‬ك‪١‬غ ع‪١‬غظمزً ط‪ٛ‬سس ؽالرٗ عٍ‪ٙ١‬اخ‪ِٚ ،‬ـّ‪ٛ‬عاش حٌطاالد ‪ٚ 224.100.0.1‬حٌظا‪ٟ‬‬ ‫ع‪ٛ‬ف ‪٠‬شعً حٌظ‪ٛ‬سس اٌ‪ٙ١‬خ ‪ٚ ..‬وّخ ٔالكع أ‪٠‬ؼاخ فابْ عٍّ‪١‬اش حإلسعاخي را‪ ٓ١‬حٌاـ‪Access Point1‬‬ ‫‪ٚ‬حٌـ‪ Access Point2‬طظُ رخعظخذحَ حٌـ‪... Unicast‬‬ ‫‪ٚ‬كظ‪٠ ٝ‬غظط‪١‬ع حٌطالد سإ‪٠‬ش أعظخرُ٘ ‪ٚ‬حألعظخر سإ‪٠‬اش ؽالراٗ ‪ ،‬الراذ ِآ أشاخء رشٔاخِؾ حالعاظمزخي‬ ‫ك‪١‬غ عٕغظخذَ ٔفظ حٌـ‪ method‬حٌظ‪ ٟ‬ششكٕ‪ٙ‬خ عخرمخ العاظمزخي حٌظا‪ٛ‬سس ‪ٌٍٚ‬زاذء لاُ رعّاً ‪New‬‬ ‫‪ Form‬ؿذ‪٠‬ذ وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~022‬‬


: Multicast Group‫سس ِٓ حٌـ‬ٛ‫ش العظمزخي حٌظ‬١ٌ‫ حٌظخ‬Namespaces ‫ف ٔغظخذَ حٌـ‬ٛ‫ع‬ C#: using System.Net.Socket ; using System.Net; using System.IO; using System.Threading; VB.NET: imports System.Net.Socket imports System.Net imports System.IO imports System.Threading :‫ش ٌالعظمزخي‬١ٌ‫ حٌظخ‬method ‫حٌـ‬ٚ C#: void Image_Receiver() { UdpClient sock = new UdpClient(5020); sock.JoinMulticastGroup(IPAddress.Parse(textBox1.Text)); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); byte[] data = sock.Receive(ref iep); MemoryStream ms = new MemoryStream(data); pictureBox1.Image = Image.FromStream(ms); sock.Close(); } 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)

~023~


Dim data As Byte() = sock.Receive(iep) Dim ms As MemoryStream = New MemoryStream(data) pictureBox1.Image = Image.FromStream(ms) sock.Close() End Sub ‫ػاع‬ٚ Timer ً‫َ رازٌه لاُ رعّا‬ٛ‫ ٔما‬ٝ‫كظا‬ٚ ، Threading‫خ الرذ ِٓ حعاظخذحَ حٌاـ‬ٙ١‫ ٔغظذع‬ٝ‫كظ‬ٚ : 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){} 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‫ع حٌّلخػاش عاشع حٌّلخػااشس رخعاظخذحَ رشٔاخِؾ حٌاـ‬١‫غاظط‬٠ ... ‫ ِئطّشحص عطق حٌّىظذ‬ٚ‫ِشش‬

~024~


‫‪:Full/Half Duplex Multicast Desktop Conferencing System -2‬‬ ‫حٌ‪ٙ‬ذف ِٓ ٘زح حٌّشش‪ ٛ٘ ٚ‬طّى‪ ٓ١‬حألعظخر ِٓ عشع حٌّلخػشس رخعظخذحَ رشٔاخِؾ حٌاـ ‪Power‬‬ ‫‪ Point‬ك‪١‬غ عظشعً ط‪ٛ‬سس عاطق حٌّىظاذ ِآ ؿ‪ٙ‬اخص حألعاظخر اٌا‪ ٝ‬أؿ‪ٙ‬اضس حٌطٍزاش ‪ٚ ،‬ال طخظٍاف‬ ‫عٍّ‪١‬ش حإلسعخي عٓ حٌزشٔخِؾ حٌغخرك ف‪ ٟ‬ش‪ٟ‬ء ع‪ ٜٛ‬أشخء ‪ٌ Classes‬ظم‪ َٛ‬رخٌظمخؽ طا‪ٛ‬سس عاطق‬ ‫حٌّىظذ ‪ ِٓٚ‬ػُ اسعخٌ‪ٙ‬خ اٌ‪ ٝ‬حٌـ‪ِٚ Multicast Group‬آ ػاُ حعاظمزخٌ‪ٙ‬خ ‪ٚ‬عشػا‪ٙ‬خ عٍا‪ ٝ‬حٌطاالد‬ ‫رخعظخذحَ ‪. Data Show Projector‬‬ ‫‪ٛ٠ٚ‬ػق حٌشىً حٌظخٌ‪ِ ٟ‬خطؾ عًّ حٌّشش‪: ٚ‬‬

‫‪ٚ‬وّخ ٔالكع ِٓ حٌشىً حٌظخٌ‪ ٟ‬فبْ حألعظخر ‪٠‬م‪ َٛ‬رششف حٌّلخػشس عٍ‪ ٝ‬ؿ‪ٙ‬خصٖ حٌشخظا‪٠ٚ ٟ‬شعاً‬ ‫حٌظ‪ٛ‬سس اٌ‪ ٝ‬حٌطالد ‪ٚ‬وّخ ٔالكع أ‪٠‬ؼخ فبْ ٘ازٖ حٌعٍّ‪١‬اش ٘ا‪ ٟ‬أكخد‪٠‬اش حالطـاخٖ ‪ٚ‬وّاخ ‪ّ٠‬ىآ ؿعٍ‪ٙ‬اخ‬ ‫رخطـاخ٘‪ٌ Full || Half Duplex ٓ١‬ىآ الراذ ِآ أشاخء ِـّ‪ٛ‬عاش ؿذ‪٠‬اذس ٌعٍّ‪١‬اش حإلسعاخي ِاآ‬ ‫حٌطخٌذ اٌ‪ ٝ‬حألعظخر ك‪١‬غ ‪٠‬عاشع حألعاظخر ِلخػاشطٗ ‪٠ٚ‬شعاٍ‪ٙ‬خ اٌا‪ِ ٝ‬ـّ‪ٛ‬عاش حٌطاالد ‪٠ٚ‬غاظط‪١‬ع‬ ‫أكذ حٌطالد عشع ؿ‪ٙ‬خصٖ عٍ‪ ٝ‬حألعظخر ار ‪٠‬شعً حٌظ‪ٛ‬سس اٌ‪ِ ٝ‬ـّ‪ٛ‬عش حألعظخر ‪...‬‬

‫~‪~025‬‬


ً‫ حٌشااى‬ٟ‫ااذ وّااخ فاا‬٠‫ ؿذ‬New Form ً‫سس عااطق حٌّىظااذ لااُ رعّاا‬ٛ‫إلٔشااخء رشٔااخِؾ اسعااخي طاا‬ٚ :ٌٟ‫حٌظخ‬

GetDesktopWindow ‫اخ حٌاـ‬ِٕٙٚ API ‫حي حٌاـ‬ٚ‫سس عاطق حٌّىظاذ عٕغاظخذَ د‬ٛ‫إلٌظماخؽ طا‬ٚ َٛ‫ ػاُ عإم‬،‫سس‬ٛ‫ ٌشعاُ حٌظا‬BitBlt Method‫حٌاـ‬ٚ user32.dl‫دس ػآّ حٌاـ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ Method ٟ‫ٍا‬٠ ‫اظُ رٌاه وّاخ‬٠ٚ Clients ‫ حٌـ‬ٌٝ‫خ ا‬ٌٙ‫ع اسعخ‬١‫ ٔغظط‬ٝ‫كظ‬ٚ Byte Array ٌٝ‫سس ا‬ٛ‫ً حٌظ‬٠ٛ‫رظل‬ : C#: using System; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.IO; public class ScreenCapture { [DllImport("user32.dll")] private static extern IntPtr GetDesktopWindow(); [DllImport("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, // handle to destination DC int nXDest, // x-coord of destination upper-left corner int nYDest, // y-coord of destination upper-left corner int nWidth, // width of destination rectangle int nHeight, // height of destination rectangle IntPtr hdcSrc, // handle to source DC int nXSrc, // x-coordinate of source upper-left corner int nYSrc, // y-coordinate of source upper-left corner System.Int32 dwRop // raster operation code );

~026~


private const Int32 SRCCOPY = 0xCC0020; [DllImport("user32.dll")] private static extern int GetSystemMetrics(int nIndex); private const int SM_CXSCREEN = 0; private const int SM_CYSCREEN = 1; public Size GetDesktopBitmapSize() { return new Size(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); } public byte[] GetDesktopBitmapBytes() { Size DesktopBitmapSize = GetDesktopBitmapSize(); Graphics Graphic = Graphics.FromHwnd(GetDesktopWindow()); Bitmap MemImage = new Bitmap(DesktopBitmapSize.Width, DesktopBitmapSize.Height, Graphic); Graphics MemGraphic = Graphics.FromImage(MemImage); IntPtr dc1 = Graphic.GetHdc(); IntPtr dc2 = MemGraphic.GetHdc(); BitBlt(dc2, 0, 0, DesktopBitmapSize.Width, DesktopBitmapSize.Height, dc1, 0, 0, SRCCOPY); Graphic.ReleaseHdc(dc1); MemGraphic.ReleaseHdc(dc2); Graphic.Dispose(); MemGraphic.Dispose(); Graphics g = System.Drawing.Graphics.FromImage(MemImage); System.Windows.Forms.Cursor cur = System.Windows.Forms.Cursors.Arrow; cur.Draw(g,new Rectangle(System.Windows.Forms.Cursor.Position.X10,System.Windows.Forms.Cursor.Position.Y10,cur.Size.Width,cur.Size.Height)); MemoryStream ms = new MemoryStream(); MemImage.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg); return ms.GetBuffer(); } } VB.NET Imports System Imports System.Drawing Imports System.Drawing.Imaging Imports System.Runtime.InteropServices Imports System.IO

~027~


Public Class ScreenCapture : Inherits System.MarshalByRefObject <DllImport("user32.dll")> _ Private Shared Function GetDesktopWindow() As IntPtr End Function <DllImport("gdi32.dll")> _ Private Shared Function BitBlt(ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As System.Int32) As Boolean End Function Private Const SRCCOPY As Int32 = &HCC0020 <DllImport("user32.dll")> _ Private Shared Function GetSystemMetrics(ByVal nIndex As Integer) As Integer End Function Private Const SM_CXSCREEN As Integer = 0 Private Const SM_CYSCREEN As Integer = 1 Public Function GetDesktopBitmapSize() As Size Return New Size(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)) End Function Public Function GetDesktopBitmapBytes() As Byte() Dim DesktopBitmapSize As Size = GetDesktopBitmapSize() Dim Graphic As Graphics = Graphics.FromHwnd(GetDesktopWindow()) Dim MemImage As Bitmap = New Bitmap(DesktopBitmapSize.Width, DesktopBitmapSize.Height, Graphic) Dim MemGraphic As Graphics = Graphics.FromImage(MemImage) Dim dc1 As IntPtr = Graphic.GetHdc() Dim dc2 As IntPtr = MemGraphic.GetHdc() BitBlt(dc2, 0, 0, DesktopBitmapSize.Width, DesktopBitmapSize.Height, dc1, 0, 0, SRCCOPY) Graphic.ReleaseHdc(dc1) MemGraphic.ReleaseHdc(dc2) Graphic.Dispose() MemGraphic.Dispose() Dim g As Graphics = System.Drawing.Graphics.FromImage(MemImage)

~028~


Dim cur As System.Windows.Forms.Cursor = System.Windows.Forms.Cursors.Arrow cur.Draw(g, New Rectangle(System.Windows.Forms.Cursor.Position.X - 10, System.Windows.Forms.Cursor.Position.Y - 10, cur.Size.Width, cur.Size.Height)) Dim ms As MemoryStream = New MemoryStream MemImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Return ms.GetBuffer() End Function End Class Graphics ‫حٌـ‬ٚ Bitmap Class ‫سس عٕغظخذَ حٌـ‬ٛ‫ كـُ حٌظ‬ٟ‫ع حٌظلىُ ف‬١‫ ٔغظط‬ٝ‫كظ‬ٚ :ٍٟ٠ ‫وّخ‬ٚ ‫خ‬ّٙ‫ش كـ‬١١‫ذ طغ‬٠‫ ٔش‬ٟ‫سس حٌظ‬ٛ‫حٌظ‬ٚ Width ‫حٌـ‬ٚ Height‫خ حٌـ‬ٌٙ ‫ ار عّٕشس‬Class 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 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 Socket‫ حٌزشٔخِؾ ٌظعخًِ ِع حٌـ‬ٟ‫ش ف‬١ٌ‫ حٌظخ‬Namespaces‫ف ٔغظخذَ حٌـ‬ٛ‫ع‬ C#: using System.Net; using System.Net.Socket; using System.IO; VB.NET: imports System.Net

~029~


imports System.Net.Socket imports System.IO Multicast Group‫ حٌـ‬ٌٝ‫خ ا‬ٌٙ‫ اسعخ‬ٚ ‫سس عطق حٌّىظذ‬ٛ‫ الٌظمخؽ ط‬Timer ًّ‫َ رع‬ٛ‫ػُ ٔم‬ :‫حٌّلذد‬ C#: Bitmap bt = new Bitmap(CaptureScreen.GetDesktopBitmapBytes ()); 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.GetDesktopBitmapBytes) 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

~031~


:Full/Half Duplex Multicast Text Conferencing System -3 Text Chat Multicast ‫ حألعاااظخر رخعاااظخذحَ حٌاااـ‬ٝ‫ع حٌطٍزاااش حٌظلاااذع اٌااا‬١‫غاااظط‬٠ ٝ‫كظااا‬ٚ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬ٚ ‫ذ‬٠‫ ؿذ‬New Form ‫َ ربٔشخء‬ٛ‫ف ٔم‬ٛ‫ ع‬Conference System

:‫ش‬١ٌ‫ حٌظخ‬Namespaces‫ػُ لُ ربػخفش حٌـ‬ C#: using System.Net; using System.Net.Socket; using System.Text; using System.Threading; VB.NET: imports System.Net imports System.Net.Socket 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{ 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);

~030~


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

~032~


catch(Exception){} } 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‫خ الرذ ِٓ حعظخذحَ حٌـ‬ٙ‫العظذعخث‬ٚ :ٍٟ٠ ‫وّخ‬ٚ ThreadStart Delegate‫حٌغخرمش رخعظخذحَ حٌـ‬ 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);

~033~


byte[] data = Encoding.ASCII.GetBytes("has Left the Room"); server.SendTo(data, iep); server.Close(); msg.Clear(); msg.Focus(); } catch(Exception){} 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 ً‫ش عّا‬١‫ف‬١‫ و‬ٍٝ‫ ٘زح حٌفظً ع‬ٟ‫طعشفٕخ ف‬ Desktop Conference ‫حٌااـ‬ٚ Video Conference System‫ؽااشق أشااخء حٌااـ‬ٚ ‫ااض‬١ٔ ‫ ِآ أشاخء‬ٌٟ‫ عظظّىٓ رعذ لشحءس حٌفظاً حٌظاخ‬ٚ ، Text Conference System ‫حٌـ‬ٚ System . Voice Conference System ‫حٌـ‬ ِٗ‫اعتزخذا‬ٚ Voice Over IP Programming ‫ ػتٓ اٌتـ‬ٌٟ‫ اٌفظتً اٌزتب‬ٟ‫ش فت‬٠‫زُ اٌذتذ‬١‫عت‬ Direct ‫اٌـ‬ٚ API’s ‫ ثبعزخذاَ اٌـ‬Voice Conference Systemٚ Voice Chat ًّ‫ٌؼ‬ .‫ذ‬١ٔ ‫د‬ٚ‫ئخ اٌذ‬١‫ ث‬ٟ‫ ف‬TAPI Telephony‫ اعزخذاَ اٌـ‬ٌٝ‫ ثبإلػبفخ إ‬Play 9

~034~


Chapter 10 Voice Over IP Programming - The Concept & Requirements of Voice Communication Systems - How to Create a Voice Chat Through Dot Net Using Unmanaged APIâ€&#x;s Functions - Testing UDP Multicasting, TCP and Thinking in SCTP to Transfer Voice Through Networks - How to Create a Voice Conference System Using Microsoft Direct Play 9 - Design an Advanced Video/Voice Conferencing System By Using API & TAPI Telephony to Transfer Video/Voice Through Networks & Voice Through Analog Telephone Line

~035~


‫‪: Voice Over IP Programming - 10‬‬ ‫طظٍخض حٌفىشس حألعخعا‪١‬ش ِآ ٔماً حٌظا‪ٛ‬ص عزاش رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي حإلٔظشٔاض ‪ IP‬رظل‪٠ٛ‬اً حٌظا‪ٛ‬ص اٌا‪ٝ‬‬ ‫ِـّ‪ٛ‬عش ِٓ حٌـ ‪ Bits‬طـّاع فا‪ Byte Array ٟ‬ػاُ وزغاٍظٗ ٌ‪١‬اظُ ٔمٍاٗ واـ ‪Datagram Packets‬‬ ‫أ‪ ٚ‬وااـ ‪ Stream Data‬عزااش حٌشاازىش ‪ٌٚ ،‬العااظمزخي حٌظاا‪ٛ‬ص فاا‪ ٟ‬حٌطااشف حألخااش ‪٠‬ااظُ طـّ‪١‬ااع حٌ اـ‬ ‫‪ِ Packets‬شس أخش‪ ٜ‬ف‪ِ ٟ‬ظف‪ٛ‬فش ‪ٚ ، Byte Array‬طظُ عٍّ‪١‬ش حٌماشحءس ‪ٚ‬فاك ِزاذأ حٌاـ – ‪FIFO‬‬ ‫‪ First In First Out‬أ‪ ٞ‬حٌمخدَ أ‪ٚ‬ال ‪٠‬عشع أ‪ٚ‬ال ‪...‬‬ ‫طىّٓ حٌّشىٍش حألعخع‪١‬ش رٕمً حٌظ‪ٛ‬ص ف‪ِ ٟ‬ذ‪ ٜ‬ط‪ٛ‬فش حٌشش‪ٚ‬ؽ حٌالصِش كظا‪٠ ٝ‬اظُ ا‪٠‬ظاخي ‪ٚ‬عاشع‬ ‫حٌظااا‪ٛ‬ص رخٌشاااىً حٌغاااٍ‪ٚ ٚ ُ١‬فاااك حٌظشطاااذ حٌاااز‪ ٞ‬أسعاااً عٍ‪١‬اااٗ ‪ٚ ،‬طعظزاااش ِلاااذ‪ٚ‬د‪٠‬خص ‪ِٚ‬شاااخوً‬ ‫رش‪ٚ‬ط‪ٛ‬و‪ٛ‬الص حٌـ ‪ِ Transport Layer‬آ أ٘اُ ِاخ دعاخ ‪ِ Microsoft‬آ حٌعاض‪ٚ‬ف عآ دعاُ حٌاـ‬ ‫‪ٌ Dot Net‬عٍّ‪١‬ااش ٔمااً حٌظاا‪ٛ‬ص ‪ٚ‬خخطااش فاا‪ ٟ‬ر‪١‬جااش حٌٕظااخَ حٌلااخٌ‪ٚ ٟ‬حوظفااض رـعٍ‪ٙ‬ااخ آدحٖ خخسؿ‪١‬ااش‬ ‫رخعااظخذحَ حٌااـ ‪ API‬أ‪ Managed ٚ‬رخعااظخذحَ حٌااـ‪ِٚ ،DirectX‬اآ حٌّعااش‪ٚ‬ف أْ ٔظااخَ حٌظشااغ‪ً١‬‬ ‫‪٠ Windows XP‬ذعُ حالطظخي رخعظخذحَ رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي ‪ TCP‬أ‪ UDP ٚ‬فماؾ ‪٘ٚ‬ازح ‪٠‬عٕا‪ ٟ‬حٔاه ارح‬ ‫وٕااض طعّااً طلااض ِٕظااش ٔظااخَ حٌظشااغ‪ Windows XP ً١‬فاابْ أ‪ ٞ‬عٍّ‪١‬ااش حطظااخي ٌاآ طىاا‪ ْٛ‬اال‬ ‫رخعظخذحَ ‪ٚ‬حكذ ِٓ ٘زٖ حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬الص‪.‬‬ ‫أ‪ٚ‬ال ‪: The Requirements of Voice Communication Systems :‬‬ ‫ع‪ٛ‬ف ٕٔخلش ف‪٘ ٟ‬زح حٌـضء ِظطٍزخص ٔمً حٌظ‪ٛ‬ص عزاش حٌشازىش ‪ِٚ‬شاخوً ٔماً حٌظا‪ٛ‬ص رخعاظخذحَ‬ ‫رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ ‪ ٚ TCP‬حٌـ ‪... UDP‬‬ ‫– ِزطٍجبد ٔمً اٌظ‪ٛ‬د اٌّضٍ‪: ٝ‬‬ ‫‪٠ – 1‬فؼً أْ ‪٠‬ى‪ ْٛ‬أعٍ‪ٛ‬د حٌٕمً وـ ‪٠ٚ ، Stream‬ذعُ ٘زح حألعاٍ‪ٛ‬د فا‪ ٟ‬واال حٌزش‪ٚ‬ط‪ٛ‬وا‪ٓ١ٌٛ‬‬ ‫حٌـ‪ٚ TCP‬حٌـ‪ SCTP‬أِخ حٌـ‪ UDP‬فمؾ ف‪ ٟ‬كخٌش حعظخذحِٗ ِع حٌـ‪RTP‬‬ ‫‪ – 2‬حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌّغظخذَ ٌٕمً حٌظ‪ٛ‬ص ‪٠‬ـذ أْ ‪٠‬ذعُ ‪Delivered on Sequence‬‬ ‫‪ – 3‬طعظّاااذ عاااشعش حٌٕماااً عٍااا‪ِ ٝ‬اااذ‪ ٜ‬كـاااُ حٌؼاااغؾ حٌّغاااظخذَ ‪Voice Compression‬‬ ‫‪ٚ‬حٌـ‪ٛ‬دس حٌّطٍ‪ٛ‬رش ‪٠ٚ‬فؼً ف‪٘ ٟ‬زٖ حٌلخٌش أْ ال طماً عاشعش حٌٕماً عآ ‪ 31 KB\S‬رّعاذي ال ‪٠‬ماً‬ ‫عٓ ‪ 8.000 KHz‬ولاذ أدٔا‪ٌ ٝ‬ـا‪ٛ‬دس حٌظا‪ٛ‬ص ‪ِٚ‬آ حٌّ​ّىآ أعظّاخد حعاخٌ‪١‬ذ ػاغؾ أخاش‪ِ ٜ‬ؼاً‬ ‫‪ٌّ G.711‬عشفش و‪١‬ف‪ ٟ‬أعظخذحِٗ رخٌذ‪ٚ‬ص ٔ‪١‬ض أٔظش حٌشحرؾ حٌظخٌ‪ٟ‬‬ ‫‪http://www.codeproject.com/KB/audio‬‬‫‪video/VoiceChatApplicationInCS.aspx‬‬ ‫ اٌغؤاي اٌز‪٠ ٞ‬طشح ٔفغٗ ا‪ٚ ً٘ , ْ٢‬فش ثش‪ٚ‬ر‪ٛ‬و‪ٛ‬ي اٌـ ‪ٚ TCP‬اٌـ ‪٘ UDP‬زٖ األِ‪ٛ‬س ؟‬‫أ‪ٚ‬ال ثش‪ٚ‬ر‪ٛ‬وتت‪ٛ‬ي اٌ تـ ‪٠ : TCP‬ااذعُ رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي حٌ اـ ‪ TCP‬وااً ٘اازٖ حألِاا‪ٛ‬س ‪ٚ‬رىفااخءس عخٌ‪١‬ااش ٌىاآ‬ ‫حٌّشااىٍش فاا‪٘ ٟ‬اازح حٌزش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي ٘اا‪ ٛ‬أٔااٗ ٌاا‪١‬ظ ‪ Real Time‬واازٌه عااذَ اِىخٔ‪١‬ااش حعااظخذحِٗ ٌعّااً‬ ‫‪ Multicast Conference System‬ار حٔااااٗ ِاااآ حٌّعااااش‪ٚ‬ف أْ حٌااااـ‪ٚ Multicasting‬حٌااااـ‬ ‫‪ِ Broadcasting‬اآ حألِاا‪ٛ‬س حٌخخطااش رزش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي حٌااـ ‪ٚ UDP‬ال ‪٠‬ااذعُ حٌااـ ‪ TCP‬أ‪ِ ٞ‬اآ ٘اازٖ‬ ‫حألِاا‪ٛ‬س ‪٘ٚ‬اا‪ِ ٛ‬ااخ ر‪ٕ١‬ظااٗ فاا‪ ٟ‬حٌفظااً حٌغااخرك ‪ّ٠ٚ‬ىاآ أْ ‪٠‬ىاا‪٘ ْٛ‬اازح حٌزش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي ‪Real Time‬‬ ‫‪ Protocol‬فاا‪ ٟ‬كخٌااش لّٕااخ ربٌغااخء حٌااـ‪ Acknowledgment‬فاا‪ ٟ‬حٌااـ‪ ، TCP Header‬ار ‪٠‬عظااش‬ ‫حٌـ‪ TCP‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي ِ‪ٛ‬ؿٗ ‪ٌ Oriented Protocol‬زٌه ال ‪ّ٠‬ىٓ حالعظّخد عٍ‪ ٗ١‬فا‪ ٟ‬كخٌاش كخؿظٕاخ‬ ‫ٌعًّ ‪ Multicast Conference System‬أ‪ ٚ‬ف‪ ٟ‬كخٌش حٌزغ حإلرحع‪. Broadcasting ٟ‬‬ ‫صبٔ‪١‬تب ثش‪ٚ‬ر‪ٛ‬وتت‪ٛ‬ي اٌتـ ‪ : UDP‬ال ‪٠‬عظزااش ٘اازح حٌزش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي كااً ؿ‪١‬اذ ٌعٍّ‪١‬ااش ٔمااً حٌظاا‪ٛ‬ص رخٌىفااخءس‬ ‫حٌعخٌ‪١‬ش )فمؾ ف‪ ٟ‬كخٌش ِخ أسدٔخ ٔماً طا‪ٛ‬ص عاخٌ‪ ٟ‬حٌذلاش( ار أٔاٗ ال ‪٠‬اذعُ عٍّ‪١‬اش ‪Delivered on‬‬ ‫‪٘ٚ Sequence‬اا‪ِ ٛ‬ااخ عاازذ ِاآ حعااظلخٌش عّااً ‪ٌٍ Fragmentation‬ااـ ‪ Packets‬حٌّشعااً ‪ِٚ‬اآ‬ ‫حٌّعااش‪ٚ‬ف أْ كـااُ ‪ Ethernet Encapsulation‬ال ‪٠‬ض‪٠‬ااذ عاآ ‪ٌٍ 1500 Bytes‬ااـ ‪Packet‬‬

‫~‪~036‬‬


‫حٌ‪ٛ‬حكاذ ‪٘ٚ‬ا‪ ٛ‬حٌلـاُ حأللظا‪ٌٍ ٝ‬اـ ‪ Datagram Encapsulation‬حٌخاخص رخٌاـ ‪ٌ Ethernet‬ازٌه‬ ‫ف‪ ٟ‬كخٌش لّٕخ رعًّ ‪ٌ Fragmentation‬ظا‪ٛ‬ص فبٕٔاخ ٌآ ٔؼآّ ‪ٚ‬طا‪ٛ‬ي حٌظا‪ٛ‬ص ‪ٚ‬فاك حٌظشط‪١‬اذ‬ ‫حٌّشعً ‪ِ ٛ٘ٚ‬خ ‪٠‬غزذ ِشىٍش وز‪١‬شس ف‪ ٟ‬عٍّ‪١‬ش اعخدس طشط‪١‬ذ حٌـ ‪ Fragments‬حٌّشعاً ‪ِٚ‬آ ٘ازٖ‬ ‫حٌٕمطش لذِض حٌىؼ‪١‬ش ِٓ حٌششوخص ‪ٚ‬حٌّٕظّخص حٌعخٌّ‪١‬ش كٍ‪ٛ‬ي خخطش ٌعٍّ‪١‬ش ٔمً حٌظا‪ٛ‬ص عزاش حٌاـ‬ ‫‪ِٕٙ UDP‬خ ششوش أد‪ٚ‬ر‪ ٟ‬رظماذ‪ّٙ٠‬خ رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي حٌٕماً ‪–Real Time Messaging Protocol‬‬ ‫‪IETF Internet‬‬ ‫‪ِٕٚ http://www.adobe.com/devnet/rtmp RTMP‬ظّاااااش‬ ‫‪ Engineering Task Force‬رظمذ‪ّٙ٠‬خ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌٕماً ‪RTP – Real Time Transport‬‬ ‫‪ ، Protocol‬ك‪١‬غ أػخف ٘زح حٌّع‪١‬خس طلغ‪ٕ١‬خص عٍ‪ ٝ‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ ‪ٌ UDP‬عٍّ‪١‬اش ٔماً حٌظا‪ٛ‬ص‬ ‫ف‪ ٟ‬حٌضِٓ حٌلم‪١‬م‪ ٟ‬ار ‪٠‬غظخذَ أعٍ‪ٛ‬د حٌـ ‪ Stream‬حٌّغظخذَ ف‪.TCP ٟ‬‬ ‫صبٔ‪١‬ب ‪: The Concept Of Voice Communication:‬‬ ‫طّش عٍّ‪١‬ش حٌظمخؽ حٌظ‪ٛ‬ص رّـّ‪ٛ‬عش ِٓ حٌّشحكً طزذأ رخٌظمخؽ حٌظ‪ٛ‬ص ِٓ حٌّاخ‪٠‬ىش‪ٚ‬ف‪ٚ ْٛ‬طّؼ‪١‬اً‬ ‫حٌزراازرخص حٌظاا‪ٛ‬ط‪١‬ش ػااُ طل‪ٍٙ٠ٛ‬ااخ اٌاا‪ِ ٝ‬ـّ‪ٛ‬عااش ِاآ حٌااـ ‪ٚ Bits‬رٌااه رعّااً ‪ٌ Sampling‬زراازرخص‬ ‫حٌظ‪ٛ‬ط‪١‬ش حٌٍّظمطش ‪ٚ‬رعذ ٘زٖ حٌعٍّ‪١‬اش ‪ّ٠‬ىٕ​ٕاخ ٔماً حٌظا‪ٛ‬ص عزاش حٌشازىش ‪ٚ‬طّاش عٍّ‪١‬اش ٔماً حٌظا‪ٛ‬ص‬ ‫عزش حٌشزىش رّـّ‪ٛ‬عش ِٓ حٌّشحكً ‪: ٟ٘ٚ‬‬ ‫‪ -1‬ف‪ ٟ‬حٌـ ‪ ، Application Layer‬ؽش‪٠‬ماش حٌظماخؽ حٌظا‪ٛ‬ص ‪ٚ‬طل‪ٍ٠ٛ‬اٗ اٌا‪٘ٚ Bits ٝ‬ا‪ِ ٛ‬اخ روشطاٗ‬ ‫عااخرمخ ‪ ٚ ،‬حعااظخذحَ طمٕ‪١‬ااخص ٌؼااغؾ حٌظاا‪ٛ‬ص ‪ٚ Audio Compression Teachings‬كظاا‪ٝ‬‬ ‫‪ّ٠‬ىٓ اسعخٌٗ عزش حإلِىخٔ‪١‬خص حٌّلذ‪ٚ‬دس ٌشزىش حالطظخي‪.‬‬ ‫‪ -2‬ف‪ ٟ‬حٌاـ ‪٘ٚ ، Transport Layer‬ا‪ِ ٛ‬آ أ٘اُ حألِا‪ٛ‬س حٌظا‪٠ ٟ‬ـاذ أخاز٘خ رعا‪ ٓ١‬حالعظزاخس ار أْ‬ ‫حٌّفخػااٍش راا‪ ٓ١‬حخظ‪١‬ااخس رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي حٌااـ ‪ UDP‬أ‪ ٚ‬حٌااـ‪ TCP‬طعظّااذ عٍاا‪ِ ٝ‬ااذ‪ ٜ‬حٌلخؿااش حٌظاا‪ٔ ٟ‬ش‪٠‬ااذ٘خ‬ ‫‪ٚ‬دلش حٌظ‪ٛ‬ص ِٓ ؿ‪ٙ‬ش أخش‪ ٜ‬ار أْ أفؼً ؽش‪٠‬مش ٌٕمً حٌظ‪ٛ‬ص ٘‪ ٟ‬حعظخذحَ طمٕ‪١‬اخص حٌاـ‪Stream‬‬ ‫ٌىاآ ِاآ حٌّعااش‪ٚ‬ف أْ رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي حٌااـ‪ UDP‬ال ‪٠‬ااذعُ عٍّ‪١‬ااش حٌٕمااً و اـ ‪ Stream‬و‪ٔٛ‬ااٗ ال ‪٠‬ااذعُ‬ ‫حٌظ‪ٛ‬ط‪ٚ ً١‬فك حٌظشط‪١‬ذ ‪ Delivered on Sequence‬ار إٔٔخ ف‪٘ ٟ‬زٖ حٌلخٌش ٌآ ٔاظّىٓ ِآ عّاً‬ ‫حٌـ ‪ٌٍ Fragmentation‬ـ ‪ Buffer‬ك‪١‬غ ٌٓ ٔؼّٓ ‪ٚ‬ط‪ٛ‬ي حٌـ ‪ٚ Fragments‬فك حٌظشط‪١‬ذ حٌاز‪ٞ‬‬ ‫أسعااً عٍ‪١‬ااٗ ‪ٚ‬عاا‪ٛ‬ف ٔؼااطش اٌاا‪ ٝ‬حٌظم‪١‬ااذ رّلااذ‪ٚ‬د‪٠‬خص حٌااـ ‪ٌٍ Ethernet‬ااـ ‪٘ٚ Packet‬اا‪1500 ٟ‬‬ ‫‪ٌٍ BYTES‬ـ ‪ Packet‬حٌ‪ٛ‬حكذ ‪ٌٚ‬لً ٘زٖ حٌّشاىٍش عا‪ٛ‬ف ٍٔـاؤ اٌا‪ ٝ‬طزٕا‪ ٟ‬رعاغ حٌظمٕ‪١‬اخص حٌـذ‪٠‬اذس‬ ‫‪ٚ‬حٌظ‪ ٟ‬طعظّذ عٍ‪ ٝ‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ ‪ٚ UDP‬كظ‪٠ ٝ‬ظُ ٔمً حٌظ‪ٛ‬ص واـ ‪ِٕٙٚ Stream‬اخ أعاٍ‪ٛ‬د حٌٕماً‬ ‫‪ٚ H.323‬حٌز‪ ٞ‬روشطٗ عخرمخ ‪ٌ ،‬ىٓ ٌُ طذعُ حٌذ‪ٚ‬ص ٔ‪١‬اض أ‪ِ ٞ‬آ ٘ازٖ حٌظمٕ‪١‬اخص ‪ٌ ،‬ازٌه عٕاذِخ ٔش‪٠‬اذ‬ ‫ٔمً ط‪ٛ‬ص ِآ ؿ‪ٙ‬اخص اٌا‪ ٝ‬آخشواـ‪ Stream‬الراذ ٌٕاخ ِآ حعاظخذحَ رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي حٌاـ ‪ٌ TCP‬ىآ وّاخ‬ ‫روشٔخ عخرمخ فبٔٗ ال ‪٠‬ذعُ حٌـ ‪ ٚ IP Multicasting‬حٌـ ‪Broadcasting‬‬ ‫‪ -3‬فاا‪ ٟ‬حٌااـ ‪٠ Network Layer‬ااظُ عٕ‪ٔٛ‬ااش حٌااـ ‪ٚ Packets‬ارح ِااخ لشسٔااخ حعظّااخد حٌااـ ‪ UDP‬فبٕٔااخ‬ ‫ع‪ٛ‬ف ٔظّىٓ ِٓ عًّ حٌزغ حإلرحع‪ِٚ Broadcasting ٟ‬ـّ‪ٛ‬عخص حٌزغ ‪Multicasting‬‬ ‫‪ -4‬ف‪ ٟ‬حٌـ ‪ Data Link Layer‬ع‪١‬ظُ طلذ‪٠‬اذ ؽز‪١‬عاش ‪ٚ‬إلسعاخي عا‪ٛ‬حء رخعاظخذحَ حٌاـ ‪ Ethernet‬أ‪ٚ‬‬ ‫غ‪١‬ااشٖ ‪ٚ‬فاا‪٘ ٟ‬اازٖ حٌلخٌااش عاا‪١‬ظُ حالعظّااخد عٍاا‪ ٝ‬حٌااـ ‪ٌ Ethernet‬ىاآ ِشااىٍظٗ وّااخ روشط‪ٙ‬ااخ عااخرمخ‬ ‫رّلذ‪ٚ‬د‪٠‬ش كـُ حٌـ ‪ Frame‬ار ال طظـخ‪ٚ‬ص حٌـ ‪1500 BYTES‬‬ ‫‪ -5‬ف‪ ٟ‬حٌـ ‪ Physical Layer‬ؽزعخ حٌّشاخوً حٌظا‪ ٟ‬لاذ طلاذع اػٕاخء عٍّ‪١‬اش حٌٕماً وؼ‪١‬اشس ؿاذح ‪ٚ‬لاذ‬ ‫‪٠‬لذع طؤخ‪١‬ش ‪ٌ Delay‬غزذ أ‪٢ ٚ‬خش أ‪ ٚ‬لذ طؼا‪١‬ع رعاغ حٌاـ ‪ Bits‬اػٕاخء حإلسعاخي ٌازٌه الراذ ِآ‬ ‫‪ٚ‬ؿ‪ٛ‬د رش‪ٚ‬ط‪ٛ‬و‪ٛ‬الص طذعُ حٌظظل‪١‬ق ٌىً ٘زٖ حٌّشخوً ‪ٚ‬حٌظ‪ ٟ‬لذ طلذع اػٕخء عٍّ‪١‬ش حإلسعخي‪.‬‬ ‫‪٠‬غظمزً حٌطشف حٌّمخرً حٌاـ ‪ِ Bits‬آ ؽزماش حٌاـ ‪ٚ Physical Layer‬طّاش عزاش حٌاـ ‪Data Link‬‬ ‫‪ِٚ Layer‬آ ػاُ حٌاـ ‪ٚ Network Layer‬فا‪ ٟ‬اػٕاخء ٘ازٖ حٌّشكٍاش فابْ ِغاظمزً حٌاـ ‪ Packets‬لاذ‬ ‫‪٠‬ى‪ ٛ٘ ْٛ‬حٌشخض حٌّعٕ‪ ٟ‬ف‪ ٟ‬كخٌش وخْ أعٍ‪ٛ‬د حٌزغ ‪ Unicast‬أ‪ ٚ‬لذ ‪٠‬ىا‪ ْٛ‬ؿاضء ِآ ِـّ‪ٛ‬عاش‬ ‫حالعظمزخي ‪ Multicast‬أ‪ ٚ‬لذ ‪٠‬ى‪ ِٓ ْٛ‬ػّٓ حٌشزىش حٌظ‪ ٟ‬طُ حإلسعاخي ٌ‪ٙ‬اخ واـ ‪ٌ Broadcast‬ازٌه‬

‫~‪~037‬‬


‫فاا‪ ٟ‬كخٌااش و‪ٔٛ‬ااٗ ؿااضء ِاآ ِـّ‪ٛ‬عااش فاابْ ؿ‪ٙ‬ااش حإلسعااخي غ‪١‬ااش ِعٕ‪١‬ااش رخٌـ‪ٙ‬ااش حٌظاا‪ ٟ‬عاا‪ٛ‬ف طغااظمزً‬ ‫حٌـ‪ٚ Packets‬ف‪٘ ٟ‬زٖ حٌلخٌش فبٔٗ غ‪١‬ش ِعٕ‪ ٟ‬ع‪ٛ‬حء حعظمزٍض ؿضء ِٓ حٌـ ‪ Packets‬أ‪ ٚ‬وٍ‪ٙ‬اخ ك‪١‬اغ‬ ‫ٌٓ ‪٠‬ظُ اسعخي أ‪ Acknowledgment ٞ‬اٌ‪ ٝ‬حٌّشعً ٌزٌه لاذ طلاذع حٌىؼ‪١‬اش ِآ حٌّشاخوً اػٕاخء‬ ‫٘زٖ حٌّشكٍش ِٕ‪ٙ‬خ ػ‪١‬خ ؿضء ِآ حٌاـ ‪ Packets‬حٌّشعاً ‪ٚ‬حٌاز‪ ٞ‬عا‪ٛ‬ف ‪٠‬غازذ ‪ٚ‬طا‪ٛ‬ي حٌظا‪ٛ‬ص‬ ‫رشىً ِظمطع ‪ٚ ،‬ؽزعخ عا‪ٛ‬ف ‪٠‬ىا‪ ْٛ‬حالعظّاخد فا‪٘ ٟ‬ازٖ حٌلخٌاش عٍا‪ ٝ‬رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬الص حٌطزماش حألعٍا‪ٝ‬‬ ‫‪٘ٚ‬اا‪ٕ٘ ٟ‬ااخ ‪ Transport Layer‬فاابرح وااخْ حٌّشعااً ‪ٚ‬حٌّغااظمزً ‪٠‬غااظخذَ حٌااـ ‪ TCP‬فاابْ وااً ٘اازٖ‬ ‫حٌّشخوً ع‪ٛ‬ف طلً ٌىٓ حٌّشىٍش طىّٓ ف‪ ٟ‬و‪٠ ٗٔٛ‬غظخذَ حٌـ ‪ UDP‬ك‪١‬غ ال ‪ٛ٠‬ؿاذ كاً اال ربطزاخ‬ ‫ِع‪١‬خس ِغخٔذ ‪٠‬ؼّٓ ‪ٚ‬ط‪ٛ‬ي وخفش حٌـ ‪ Packets‬رظشط‪١‬ذ حٌز‪ ٞ‬أسعاً عٍ‪١‬اٗ ‪ٚ‬راذ‪ ْٚ‬ػا‪١‬خ أؿاضحء‬ ‫ِٓ حٌـ ‪ Packets‬حٌّشعً‪.‬‬ ‫حٌشىً حٌظخٌ‪ٛ٠ ٟ‬ػق عٍّ‪١‬ش ػ‪١‬خ رعغ حٌـ ‪ Packets‬اػٕخء حإلسعخي رخعظخذحَ شزىش ‪Ethernet‬‬ ‫‪ِّ UDP IP Multicasting ٚ Wireless LAN‬خ ع‪ٛ‬ف ‪٠‬غزذ طمط‪١‬ع ف‪ ٟ‬حٌظ‪ٛ‬ص‪:‬‬

‫صبٌضب‪How to Create a Voice Chat Through Dot Net Using :‬‬ ‫‪: Unmanaged API’s Functions‬‬ ‫وّخ ر‪ٕ١‬خ عخرمخ فبْ حٌذ‪ٚ‬ص ٔ‪١‬ض ٌاُ طاذعُ أ‪ِ ٞ‬آ عٍّ‪١‬اخص حٌظماخؽ ‪ٚ‬عاشع حٌظا‪ٛ‬ص ‪ٌ ،‬ىآ إلؿاشحء‬ ‫٘زٖ حٌعٍّ‪١‬خص الرذ ِٓ حعظخذحَ حٌـ‪ٚ API‟s‬حٌّغٍفش ػّٓ ٍِفاخص حٌاـ ‪ٚ DLL‬حٌظا‪ ٟ‬طاؤط‪ِ ٟ‬اع ٔظاخَ‬ ‫حٌظشغ‪ِٕٙٚ ً١‬خ ٍِف ‪ winmm.dll‬حٌشا‪١ٙ‬ش ‪ٚ ،‬حٌخاخص رخٌظعخِاً ِاع ‪ٚ‬عاخثً حٌاـ ‪Multimedia‬‬ ‫ف‪ٔ ٟ‬ظاخَ حٌظشاغ‪ ، ً١‬ك‪١‬اغ ‪٠‬اذعُ ٘ازح حٌٍّاف ِـّ‪ٛ‬عاش ِآ حٌاـ ‪ Methods‬الٌظماخؽ حٌظا‪ٛ‬ص عزاش‬ ‫حٌّااخ‪٠‬ىش‪ٚ‬ف‪ٚ ْٛ‬طخض‪ٕ٠‬اااٗ فااا‪ِٚ Byte Array Buffer ٟ‬ااآ ػاااُ عشػااٗ ِاااشس أخاااش‪٘ٚ ٜ‬ااازٖ‬ ‫حٌـ‪: ٟ٘ Method‬‬ ‫‪ٚ waveInGetNumDevs‬حٌظ‪ ٟ‬طغظخذَ ٌظلذ‪٠‬ذ عذد أؿ‪ٙ‬ضس حإلدخخي ‪ٚ‬حٌّشر‪ٛ‬ؽش ِع‬ ‫حٌـ‪ٚ Sound Card‬ال طؤخز أ‪ ٞ‬رخس‪١ِٚ‬ظشحص‪.‬‬ ‫‪ٚ waveInAddBuffer‬طغااظخذَ ٌظخااض‪ ٓ٠‬حٌااـ‪ Bits‬حٌاا‪ٛ‬حسدس ِاآ ؿ‪ٙ‬ااخص حإلدخااخي فاا‪Byte ٟ‬‬ ‫‪ٚ Array Buffer‬طؤخز ٘زٖ حٌـ‪ Method‬ػالػش رخس‪١ِٚ‬ظشحص ‪:ٟ٘ٚ‬‬ ‫)‪waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, int cbwh‬‬ ‫ك‪١‬ااغ ‪ّ٠‬ااشس ٌااأل‪ٚ‬ي ؿ‪ٙ‬ااخص حإلدخااخي ‪ٚ‬حٌااز‪ ٞ‬طااُ حخظ‪١‬ااخسٖ ‪٠ ٚ‬لااذد فاا‪ ٟ‬حٌؼااخٔ‪ٌّٛ Reference ٟ‬لااع‬ ‫طخض‪ ٓ٠‬حٌـ ‪ٚ Buffer‬ف‪ ٟ‬حٌؼخٌغ ‪٠‬لذد كـُ حٌـ ‪ Buffer‬حٌّغظٍُ‬ ‫حٌـذحٌش ‪ٌ waveInOpen ٚ waveInClose‬فظق ‪ٚ‬اغالق حالطظخي ِع ؿ‪ٙ‬خص حإلدخخي‪.‬‬ ‫حٌذحٌااش ‪ٌ waveInPrepareHeader‬ظـ‪١ٙ‬ااض ‪ٚ‬كـااض حٌااـ ‪ٚ Buffer‬طؤخااز ٔفااظ حٌزااخس‪١ِٚ‬ظشحص‬ ‫حٌّ‪ٛ‬ؿ‪ٛ‬دس ف‪.waveInAddBuffer ٟ‬‬ ‫حٌذحٌش ‪٠ٚ waveInUnprepareHeader‬ظُ حعظذعخث‪ٙ‬خ رعذ طعزجش حٌـ ‪ Buffer‬كظ‪٠ ٝ‬ظُ اسعاخي‬ ‫حٌـ ‪ ِٓٚ Buffer‬ػُ طفش‪٠‬غٗ ٌالعظعذحد ٌظعزجظٗ ِشس أخش‪.ٜ‬‬ ‫حٌذحٌش ‪ waveInReset‬إلسؿخ ِئشش حٌـ‪ Pointer‬حٌخخص رخٌـ ‪ Buffer‬اٌ‪ ٝ‬طفش‬ ‫حٌذحٌش ‪ ٚ waveInStart‬حٌذحٌش ‪ waveInStop‬رذأ ‪ٚ‬اغالق عٍّ‪١‬ش حإلدخخي ِٓ حٌّخ‪٠‬ىش‪ٚ‬ف‪.ْٛ‬‬

‫~‪~038‬‬


:ٍٟ٠ ‫وّخ‬ٚ 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

~039~


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

~041~


[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)> _ 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

~040~


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; [DllImport("Winmm.dll")] public static extern bool PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags); public static void PlayWavResource(byte[] buffer) { PlaySound(buffer, IntPtr.Zero, SND_ASYNC | SND_MEMORY); } } VB.NET Imports System Imports System.Runtime.InteropServices

~042~


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

~043~


‫اٌجذء ثئٔشبء ثشٔبِج اٌّذبدصخ اٌظ‪ٛ‬ر‪١‬خ ‪: Voice Chat System‬‬ ‫ع‪ٛ‬ف ٔـضة عٍّ‪١‬ش حٌظمخؽ حٌظ‪ٛ‬ص ‪ٚ‬طخض‪ ٕٗ٠‬ف‪ ٟ‬حٌـ ‪ Buffer‬ػُ عشػٗ ِشس أخش‪ ٜ‬ف‪ِ ٟ‬ـّ‪ٛ‬عش‬ ‫ِاآ حٌااـ‪٘ٚ Classes‬اا‪ ٛ‬طمغاا‪ ُ١‬طااُ حعااظخذحِٗ فاا‪ ٟ‬حٌىؼ‪١‬ااش ِاآ حٌزشِـ‪١‬ااخص حٌخخطااش راـ ‪Microsoft‬‬ ‫‪ِٕٙٚ‬اخ رشٔاخِؾ ‪ٚ Windows Sound Recorder‬عاا‪ٛ‬ف ٔـّاع ٘ازٖ حٌاـ ‪ Classes‬فا‪ٍِ ٟ‬ااف‬ ‫‪ٚ‬حكذ ٔغّ‪ٚ Voice Library ٗ١‬ع‪ٛ‬ف طـاذ ِلظ‪٠ٛ‬اخص ٘ازٖ حٌاـ ‪ ، Classes‬فا‪ ٟ‬حٌماشص حٌّاذِؾ‬ ‫‪ٚ‬حٌّشفك ِع حٌىظخد ‪٘ٚ ،‬زٖ حٌـ ‪:ٟ٘ Classes‬‬ ‫‪ٚ WaveIn Class‬عاا‪ٛ‬ف ٔغااظخذِٗ ٌ‪ٛ‬ػااع وخفااش حٌااـ ‪ Methods‬حٌخخطااش رخٌظمااخؽ حٌظاا‪ٛ‬ص‬ ‫‪ٚ‬طخض‪ ٕٗ٠‬ف‪Byte Array ٟ‬‬ ‫‪ٚ WaveOut Clasas‬ع‪ٛ‬ف ٔغظخذِٗ ٌعشع حٌظ‪ٛ‬ص حألط‪ ِٓ ٟ‬حٌـ ‪ Buffer‬ػُ عشػٗ‬ ‫‪ٚ WaveStream Class‬حٌااز‪ ٞ‬عاا‪ٛ‬ف ٔغااظخذِٗ ٌظل‪٠ٛ‬ااً حٌظاا‪ٛ‬ص اٌاا‪ Stream ٝ‬ك‪١‬ااغ ‪٠‬غاا‪ًٙ‬‬ ‫اسعخٌٗ عزش حٌشزىش ‪٠ٚ‬شزٗ عٍّٗ عًّ ‪ MemoryStream‬حٌّغظخذِش ف‪ ٟ‬حٌذ‪ٚ‬ص ٔ‪١‬ض‬ ‫حٌذحٌش ‪ٌ FifoStream‬ظٕظ‪ ُ١‬حٌـ ‪ Stream‬رل‪١‬غ ‪٠‬ظُ عشع حٌذحخً أ‪ٚ‬ال خخسؽ أ‪ٚ‬ال‬ ‫حٌذحٌاااش ‪٠ٚ WaveNative‬اااظُ ف‪ٙ١‬اااخ ‪ٚ‬ػاااع وخفاااش حٌظعش‪٠‬فاااخص ٌٍاااـ ‪ Methods‬حٌخخطاااش راااخٌٍّف‬ ‫‪ٚ winmm.dl‬حٌظ‪ ٟ‬ششكٕخ٘خ عخرمخّ‪.‬‬ ‫ع‪ٛ‬ف ٔغظخذَ ف‪٘ ٟ‬زح حٌّؼخي رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ ‪ٌ UDP‬عٍّ‪١‬ش حٌٕمً ‪ِٚ‬عظّذح عٍ‪ ٝ‬أعٍ‪ٛ‬د حٌزغ ‪Full‬‬ ‫‪ٚ Diplex Unicast Voice Chat System‬ع‪١‬ى‪ ْٛ‬حٌشىً حٌعخَ ٌزشٔخِؾ حالطظخي وّخ ‪: ٍٟ٠‬‬

‫‪ٚ‬عاااا‪ٛ‬ف ٔماااا‪ َٛ‬رىزغااااٍش حٌااااـ ‪ Classes‬حٌغااااخرمش فاااا‪ٍِ ٟ‬ااااف ‪ٚ Voice.dll‬عاااا‪ٛ‬ف ٔؼااااعٗ فاااا‪ٟ‬‬ ‫حٌـ‪ References‬حٌخخطش رخٌزشٔخِؾ ‪ٚ‬كظ‪ٔ ٝ‬غظط‪١‬ع حعاظخذحَ ٘ازح حٌٍّاف فا‪ ٟ‬ؿّ‪١‬اع حٌزاشحِؾ حٌظا‪ٟ‬‬ ‫ع‪ٛ‬ف طغظخذَ عٍّ‪١‬ش حالطظاخي حٌظا‪ٛ‬ط‪ ٟ‬رعاذ ٘ازٖ حٌعٍّ‪١‬اش ‪ّ٠‬ىآ حعاظخذحَ حٌٍّاف رخعاظذعخثٗ واؤ‪ٞ‬‬ ‫‪ Managed Library Class‬ف‪ ٟ‬حٌذ‪ٚ‬ص ٔ‪١‬ض ‪ٚ‬وّخ ‪:ٍٟ٠‬‬ ‫‪C#:‬‬ ‫;‪using System.Net‬‬ ‫;‪using System.Net.Socket‬‬ ‫;‪using System.Threading‬‬ ‫;‪using Voice‬‬ ‫‪VB.NET‬‬ ‫‪Imports System.Net‬‬ ‫‪Imports System.Net.Socket‬‬ ‫‪Imports System.Threading‬‬ ‫‪Imports Voice‬‬

‫~‪~044‬‬


‫ػاع‬ٚ ً‫فؼا‬٠ٚ ‫ حٌزشٔاخِؾ‬ٟ‫ف ٔغظخذِٗ فا‬ٛ‫ ع‬ٞ‫حٌز‬ٚ 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 ‫ حٌاـ‬ٟ‫ فا‬ٚ‫ حٌخاخص رخٌزشٔاخِؾ أ‬Constructor ‫ حٌاـ‬ٟ‫ف‬ : Thread ‫حٌـ‬ٚ Socket ‫حٌخخص رخٌـ‬ C#: public Form1() { InitializeComponent(); socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); thread = new Thread(new ThreadStart(Voice_In)); }

~045~


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‫أِخ حٌـ‬ 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);

~046~


//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 ْٛ‫حألخش طى‬ ‫ص‬ٛ‫دس حٌظ‬ٛ‫ذ ؿ‬٠‫ ٌظلذ‬WaveFormat ‫غ حعظخذِٕخ حٌـ‬١‫ش ك‬١ٌ‫ز حٌذحٌش حٌظخ‬١‫ظُ طٕف‬٠ ‫ صس حٌزذء‬ٟ‫ف‬ WaveOutPlayer Class‫ حٌـ‬ٌٝ‫أعٕذص ا‬ٚ , 2 Channels & 44100 KHz 16 Bits‫رـ‬ Voice_Out Method ‫ حٌـ‬ٌٝ‫ظُ اسعخٌٗ ا‬٠ ٗ‫ كخي طعزجظ‬ٟ‫ف‬ٚ Buffer‫غظخذَ ٌظعزجش حٌـ‬١‫ ع‬ٞ‫حٌز‬ٚ : ‫خش‬٢‫خص ح‬ٙ‫ حٌـ‬ٌٝ‫إلسعخٌٗ عزش حٌشزىش ا‬ 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;} } VB.NET Private Sub Start() Stop() Try

~047~


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 ‫مخف‬٠‫ا‬ٚ Buffer ‫خص حٌـ‬٠ٛ‫ت ِلظ‬٠‫ظُ طفش‬١‫غ ع‬١‫ش ك‬١ٌ‫ز حٌذحٌش حٌظخ‬١‫ظُ طٕف‬١‫مخف ف‬٠‫ صس حإل‬ٟ‫أِخ ف‬ :‫ص‬ٛ‫ً حٌظ‬١‫طغـ‬ 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 Try m_Recorder.Dispose() Finally m_Recorder = Nothing End Try

~048~


End If m_Fifo.Flush() ' clear all pending data End Sub ٍٝ‫ش عشػٗ ع‬١ٍّ‫إلطّخَ ع‬ٚ Buffer ‫ حٌـ‬ٟ‫ص ف‬ٛ‫ ٌظعزجش حٌظ‬Filler Method ‫طغظخذَ حٌـ‬ٚ :( Output Device )‫حٌغّخعخص‬ 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

~049~


Testing TCP,UDP and Thinking in SCTP to Transfer Voice :‫ساثؼب‬ : Through 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)); } VB.NET Private Sub Voice_Out(ByVal data As IntPtr, ByVal size As Integer) 'for Recorder

~051~


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 ‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫حعظخذحَ رش‬ ‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫رّخ أْ رش‬ٚ ‫ حٌّشعٍش عزش حٌشزىش وً فظشس‬Packets‫ أوؼش ِٓ حٌـ‬ٚ‫حكذ أ‬ٚ ‫خ‬١‫غزذ ػ‬٠ ْ‫ااذ فااب‬١‫ حٌظشط‬ٝ‫ً عٍاا‬١‫طاا‬ٛ‫ااخص حٌظ‬١ٍّ‫ع‬ٚ ‫ي‬ٛ‫طاا‬ٌٛ‫ااخص حٌظلمااك ِاآ ح‬١ٍّ‫ ِاآ ع‬ٞ‫ااذعُ أ‬٠ ‫ ال‬UDP . ًّ‫ أوؼش ِٓ ٘زٖ حٌّشخوً أِش ِلظ‬ٚ‫حكذ أ‬ٚ ‫ع‬ٚ‫كذ‬ ٛ‫ي ٘اا‬ٛ‫واا‬ٛ‫ط‬ٚ‫ الكااع أْ ٘اازح حٌزش‬، TCP ‫ي‬ٛ‫واا‬ٛ‫ط‬ٚ‫ااش حإلسعااخي رخعااظخذحَ رش‬١ٍّ‫ْ ٔخظزااش ع‬٢‫دعٕااخ ح‬ ‫ي‬ٛ‫طااا‬ٌٛ‫ااخص حٌظلماااك ِاآ ح‬١ٍّ‫اااع ع‬١ّ‫ااذعُ ؿ‬٠ ‫ وّاااخ‬Oriented Protocol ٗ‫ؿاا‬ِٛ ‫ي‬ٛ‫واا‬ٛ‫ط‬ٚ‫رش‬ ‫اض ٘ازح‬١ّ٠ ‫ ِاخ‬ٛ٘ٚ Stream ‫د حٌـ‬ٍٛ‫ٓ رخعظخذحَ أع‬١‫ٓ حٌطشف‬١‫ذعُ حالطظخي ر‬٠ ٗٔٛ‫ و‬ٌٝ‫رخإلػخفش ا‬ ‫خٔاخص حٌّشعاٍش‬١‫ حألخاز رلـاُ حٌز‬ٝ‫ كخٌش حعاظخذحِٗ ٌآ ٔؼاطش اٌا‬ٟ‫شٖ ار إٔٔخ ف‬١‫ي عٓ غ‬ٛ‫و‬ٛ‫ط‬ٚ‫حٌزش‬ ٜ‫اخ ِاشس أخاش‬ٙ‫ع‬١ّ‫ٌش طـ‬ٛٙ‫ عا‬ٝ‫ٌش رخإلػاخفش اٌا‬ٛٙ‫اخ رىاً عا‬ٌٙ Fragmentation ً‫اظُ عّا‬٠ ‫غ‬١‫ك‬ . Delivered Out on Sequence ‫ف ِٓ ِشخوً حٌـ‬ٛ‫ْ حٌخ‬ٚ‫رذ‬ٚ

~050~


: ٍٟ٠ ‫ؿعٍٗ وّخ‬ٚ ‫ حٌغخرك‬Socket ‫ف حٌـ‬٠‫ طعش‬ٛ٘ ٖ‫ش‬١١‫ٕخ طغ‬١ٍ‫وً ِخ ع‬ 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);

~052~


‫;))‪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‬‬ ‫}‬ ‫‪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‬ا‪ِ ٛ‬اخ طاُ حعاظخذحِٗ‬ ‫ح‪ ْ٢‬فاا‪ِ ٟ‬عظااُ حٌزشِـ‪١‬ااخص ‪ّ٠‬ىٕااه حٌشؿاا‪ ٛ‬اٌاا‪ ٝ‬حٌمااشص حٌّااذِؾ حٌّؼااخي ‪ٌّ OpenH323‬عشفااش‬ ‫و‪١‬ف‪١‬اش حعاظخذحَ حٌاـ‪ٚ UDP‬حٌاـ‪ٌٕ RTP‬ماً حٌظا‪ٛ‬ص ‪ٚ‬فاك حٌّع‪١‬اخس ‪ .H323‬أ‪ ٚ‬حعاظخذحَ رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي‬ ‫حٌـ‪ ٛ٘ٚ TCP‬ؿ‪١‬ذ ف‪ ٟ‬كخٌش وخْ عخِاً حٌظاضحِٓ غ‪١‬اش ِ‪ٙ‬اُ را‪ ٓ١‬حٌّشعاً ‪ٚ‬حٌّغاظمزً ‪ٚ‬وّؼاخي عٍا‪ٝ‬‬ ‫رٌااه رشٔااخِؾ ‪ٚ Windows Media Server‬حٌااز‪٠ ٞ‬غااظخذَ حٌااـ‪ِ TCP‬ااع حٌااـ‪ٌٕ HTTP‬مااً‬ ‫حٌظ‪ٛ‬ص ‪ٚ‬حٌظ‪ٛ‬سس أ‪ ٚ‬حعظخذحَ أعٍ‪ٛ‬د حٌٕمً عزش حٌـ ‪ Direct Play‬ػّٓ حٌـ ‪.DirectX‬‬ ‫اٌغؤاي اٌز‪٠ ٞ‬طشح ٔفغٗ ا‪ِ ْ٢‬ب ٘‪ ٛ‬اٌجذ‪٠‬ذ ث‪ٙ‬زا اٌجش‪ٚ‬ر‪ٛ‬و‪ٛ‬ي ً٘ دً اٌّشىٍخ؟؟‬ ‫حٌـا‪ٛ‬حد رىااً رغااخؽش ٔعاُ لااذ كااً حٌّشااىٍش ك‪١‬اغ أْ ِعّخس‪٠‬ااش ٘اازح حٌزش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي حٌااز‪ ٞ‬حعااظفخد ِاآ‬ ‫ِ‪١‬ضحص حٌـ‪ٚ TCP‬حٌذعُ حٌّمذَ ِٓ لزً حٌـ‪ٌ UDP‬عٍّ‪١‬خص حٌاـ‪ Multicasting‬ار أطازق ٌاذ‪ٕ٠‬خ ح‪ْ٢‬‬ ‫ِٕظش ل‪٠ٛ‬ش ‪٠‬عظّذ عٍ‪ٙ١‬خ ف‪ ٟ‬عًّ حٌـ‪ٚ Fragmentation‬اعخدس طشط‪١‬ز‪ٙ‬خ رىً ع‪ٌٛٙ‬ش رخإلػخفش اٌ‪ٝ‬‬ ‫دعّاٗ عٍّ‪١‬اش ‪٘ٚ Delivered on Sequence‬اازح ‪ٚ‬حػاق ِاآ رٕ‪١‬اش حٌااـ‪ Header‬حٌخخطاش ر‪ٙ‬اازح‬ ‫حٌزش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٔظش اٌ‪ ٝ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~053‬‬


‫خبِغب‪How to Create a Voice Conference System Using Microsoft :‬‬ ‫‪: Direct Play 9‬‬ ‫دعّض ‪ Microsoft‬طمٕ‪١‬خص سحثعش ؿاذح ٌٍٕماً حٌظا‪ٛ‬ص فا‪ ٟ‬حإلطاذحس حٌخاخص راـ‪Direct Play9‬‬ ‫‪٠ٚ‬غاّ‪ ٝ‬أ‪٠‬ؼااخ ‪٘ٚ DirectPlay Transport Protocol‬اا‪ ٛ‬ؿااضء ِاآ ِـّ‪ٛ‬عااش حٌااـ‪DirectX‬‬ ‫‪ٚ‬واخْ حٌ‪ٙ‬اذف ِآ اؽالل‪ٙ‬اخ ‪ٚ‬ؿا‪ٛ‬د ِع‪١‬اخس ِ‪ٛ‬كاذ ٌّزاشِـ‪ ٓ١‬حألٌعاخد ف‪ّ١‬اخ ‪٠‬خاض حٌاـ ‪Network‬‬ ‫‪ٚ ،Games‬طعظّذ ٘ازٖ حٌّىظزاش عٍا‪ِ ٝ‬ـّ‪ٛ‬عاش ِآ حٌّعاخ‪١٠‬ش حٌخخطاش رظشاز‪١‬ه ك‪١‬اغ واخْ حٌ‪ٙ‬اذف‬ ‫ِٕ‪ٙ‬ااخ ٘اا‪ ٛ‬ؿعااً عٍّ‪١‬ااش حالطظااخي ِّىٕااش طلااض ؿّ‪١‬ااع حٌز‪١‬جااخص حٌّخظٍفااش ‪ ٚ‬عاا‪ٛ‬حء وااخْ حٌزش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي‬ ‫حٌّغااظخذَ ٘اا‪ ٛ‬حٌااـ‪ TCP/IP‬أ‪ IPX ٚ‬حٌخااخص راـ‪ Novel‬فاابْ عٍّ‪١‬ااش حالطظااخي ِّىٕااش ‪ٚ‬ر اذ‪ ْٚ‬أ‪ٞ‬‬ ‫حخظالفخص ِٓ حٌٕ‪ٛ‬حك‪ ٟ‬حٌزشِـ‪١‬ش‪ ِٓٚ ،‬أُ٘ ِ‪١‬ضحص حٌـ ‪:DirectPlay Transport Protocol‬‬ ‫ ‪ Reliable delivery of messages‬ك‪١‬غ ‪٠‬ذعُ عٍّ‪١‬ش حٌظلمك حٌظ‪ٛ‬ط‪ٌٍ ً١‬ـ‪ٙ‬ش حٌّعٕ‪١‬ش‬‫ ‪ Sequential a delivery of messages‬ك‪١‬غ ‪٠‬ذعُ حٌظ‪ٛ‬ط‪ٚ ً١‬فك حٌظشط‪١‬ذ حٌظل‪١‬ق‬‫ ‪ Send prioritization‬ك‪١‬غ ‪٠‬ذعُ عٍّ‪١‬ش ‪ٚ‬ػع أ‪٠ٌٛٚ‬خص ٌإلسعخي رٕخء عٍ‪ ٝ‬حألّ٘‪١‬ش‬‫ ‪ Streaming Session‬ك‪١‬غ طذعُ عٍّ‪١‬ش حٌٕمً ن‪، Stream Data‬‬‫لذِض ‪٘ Microsoft‬زٖ حٌلٍ‪ٛ‬ي وزاذحثً ٌاذعُ رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي حٌاـ‪ SCTP‬حٌّٕظظاش ‪ٚ ،‬لاذ كٍاض ؿّ‪١‬اع‬ ‫حٌّشااىالص حٌظاا‪ ٟ‬وخٔااض ط‪ٛ‬حؿااٗ حٌّزااشِـ‪ٌٕ ٓ١‬مااً حٌظاا‪ٛ‬ص عزااش رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي حٌااـ‪ TCP‬أ‪ ٚ‬حٌااـ‪UDP‬‬ ‫‪ٚ‬كااً ِلٍااٗ أعااٍ‪ٛ‬د آخااش ٌااشرؾ ػاآّ ِغااظ‪ ٜٛ‬ؽزمااش حٌااـ ‪ٚ ، Transport Layer‬طلظاا‪ ٞٛ‬حٌااـ‬ ‫‪ Direct Play‬عٍ‪ِ ٝ‬ـّ‪ٛ‬عش ػخّش ِٓ حٌـ‪ ِٓٚ Classes‬أّ٘‪ٙ‬خ ‪:‬‬ ‫أ‪ٚ‬ال ‪ :‬حٌـ ‪ٚ Connect Classes‬حٌخخطش رعٍّ‪١‬ش حٌشرؾ‪:‬‬ ‫حٌاـ ‪ Guido , Peer Classes، Address‬ك‪١‬اغ طغاظخذَ عٕاذ أشاخء حالطظاخي ِاع حٌطاشف‬ ‫حألخش ‪ٚ ،‬طغظخذَ ‪ DirectPlay‬ؽش‪٠‬مش ٌظّ‪١١‬ض حٌزشٔخِؾ عٓ حألخش رظ‪١ٌٛ‬اذ ‪ Hash Code‬خاخص‬ ‫رىاً رشٔاخِؾ ‪٠ٚ‬اظُ رٌاه رخعاظخذحَ حٌاـ‪٠ٚ Guido Class‬اظُ طّش‪٠‬اش حٌىا‪ٛ‬د حٌّ‪ٌٛ‬اذ ‪ٚ‬عٕا‪ٛ‬حْ حٌـ‪ٙ‬اخص‬ ‫حٌّمخرً اٌ‪ ٝ‬حٌـ ‪٘ٚ Peer Class‬زٖ حٌعٍّ‪١‬ش شز‪ٙ١‬ش رشىً وز‪١‬ش ٌعٍّ‪١‬ش حٌشرؾ رخعظخذحَ حٌاـ ‪Socket‬‬ ‫ف‪ ٟ‬رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي ‪٠ٚ ، TCP/IP‬ظُ حعظخذحِ‪ٙ‬خ وّخ ‪ ٍٟ٠‬وّؼخي‪:‬‬

‫~‪~054‬‬


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

~055~


// 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 ' 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;

~056~


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

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

~057~


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)

~058~


ً‫ٔم‬ٚ ً١‫خص طغـ‬١ٍّ‫حٌخخطش رىً ع‬ٚ Microsoft.DirectX.DirectPlay.Voice :‫خ‬١ٔ‫ػخ‬ :‫ص‬ٛ‫عشع حٌظ‬ٚ :ٌٟ‫خ رخٌشىً حٌظخ‬ٙ‫ٍٔخظ‬ٚ ً‫عش ِٓ حٌّشحك‬ّٛ‫ص رّـ‬ٛ‫عشع حٌظ‬ٚ ً‫ٔم‬ٚ ً١‫ش طغـ‬١ٍّ‫طّش ع‬

.‫خ‬ِٕٙ ً‫فش ٌى‬١‫ظ‬ٌٛ‫ كغذ ح‬Classes ‫عش ِٓ حٌـ‬ّٛ‫ ِـ‬ٌٝ‫خ ا‬ّٙ‫ف ٔمغ‬ٛ‫ع‬ٚ : Sessions ‫ادحسس حٌـ‬ٚ ‫ إلٔشخء‬Server ‫ حٌخخطش رطشف حٌـ‬Classes ‫ حٌـ‬-1 :‫ وّؼخي‬ٍٟ٠ ‫غظخذَ وّخ‬٠ٚ Server Class C#: Server server = new Voice.Server(peerObject);

VB.NET Dim server As Server = New Voice.Server(peerObject)

~059~


Server ‫ حٌاـ‬ٞٛ‫لظا‬٠ٚ ، Peer Class ‫ طُ حشظمخلٗ ِٓ حٌاـ‬ٞ‫حٌز‬ٚ Peer Object ‫غ ٔغٕذ ٌٗ حٌـ‬١‫ك‬ ٓ‫عااش ِاا‬ّٛ‫ ِـ‬ٝ‫ااخء حٌـٍغااش رخإلػااخفش اٌاا‬ٙٔ‫ا‬ٚ ‫ااش رااذأ‬١ٍّ‫ حٌخخطااش رع‬Methods‫ حٌااـ‬ٝ‫ عٍاا‬Object :ٜ‫خص حألخش‬١ٍّ‫حٌع‬

ُ‫ااظ‬٠ ‫ااغ‬١‫ ك‬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 ‫حٌاـ‬ٚ Peer Object ‫اخ حٌاـ‬ٌٙ ‫ ّٔاشس‬Method ‫َ ربٔشاخء‬ٛ‫ ٔما‬Voice Session ‫إلٔشخء‬ٚ :ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ Compression Type َ‫ حٌؼغؾ حٌّغظخذ‬ٛٔٚ Session Type C#: protected void CreateVoiceSession(Peer dpp, Voice.SessionType type, Guid compressionType) { try

~061~


{ //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; //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

~060~


Throw dxe End Try Catch e As Exception Throw e End Try End Sub :ٍٟ٠ ‫خ وّخ‬ٙ‫ظُ حعظذعخث‬٠ٚ C#: CreateVoiceSession(host, Voice.SessionType.Peer, mConfigForm.CompressionGuid); VB.NET CreateVoiceSession(host, Voice.SessionType.Peer, mConfigForm.CompressionGuid) ‫خ‬ٙ‫ أٔشج‬ٟ‫ حٌظ‬Sessions ‫ ٌالطظخي ِع حٌـ‬Client ‫ حٌخخطش رطشف حٌـ‬Classes ‫ حٌـ‬-2 :Server‫حٌـ‬ : 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;

~062~


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

~063~


‫‪mHalfDuplex = ((soundConfig.Flags And‬‬ ‫)‪Voice.SoundConfigFlags.HalfDuplex) <> 0‬‬ ‫‪Catch e As Exception‬‬ ‫‪Throw e‬‬ ‫‪End Try‬‬ ‫‪End Sub‬‬ ‫الكع أْ حٌّشخوً ف‪ ٟ‬حٌزش‪ٚ‬ط‪ٛ‬و‪ ٓ١ٌٛ‬حٌـ ‪ٚ TCP‬حٌاـ‪ UDP‬لاذ طاُ كٍ‪ٙ‬اخ فا‪ ٟ‬حٌاـ ‪ٌ DirectPlay‬ىآ‬ ‫‪ٚ‬وّخ ٘‪ِ ٛ‬عش‪ٚ‬ف فبْ حٌ‪ٙ‬ذف ِٓ أشاخء حٌاـ ‪ٌ Direct Play‬اُ ‪٠‬ىآ عا‪ٌ ٜٛ‬اذعُ رشِـاش حألٌعاخد‬ ‫‪ِٚ‬ع حٌّش‪ٔٚ‬ش حٌىز‪١‬شس حٌظ‪ ٟ‬طمذِ‪ٙ‬خ حٌاـ ‪ Direct Play‬فا‪ ٟ‬عٍّ‪١‬اش حالطظاخي حٌظا‪ٛ‬ط‪ ٟ‬اال أٔ‪ٙ‬اخ طفظماش‬ ‫ٌّ‪١‬ضحص حٌـ ‪ٚ Voice Over IP‬حٌظ‪٠ ٟ‬مذِ‪ٙ‬خ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌـ ‪ SCTP‬حٌخخص رخٌـ ‪...Linux‬‬ ‫‪٘ٚ‬ىزح ر‪ٕ١‬خ ٍِخض عآ أ٘اُ حٌطاشق الطظاخي حٌظا‪ٛ‬ط‪ ٟ‬عزاش حٌشازىش ‪ٚ‬ؽاشق رشِـاش حٌاـ ‪Voice‬‬ ‫‪ Chat‬طلااض ِٕظااش حٌااذ‪ٚ‬ص ٔ‪١‬ااض ‪ٚ‬ح٘ااُ ِ‪١‬ااضحص ‪ٚ‬ع‪١‬اا‪ٛ‬د رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬الص حٌااـ‪Transport Layer‬‬ ‫‪ِٚ‬اذ‪ ٜ‬اِىخٔ‪١‬خط‪ٙ‬اخ ٌٕماً حٌظاا‪ٛ‬ص عزاش حٌشازىش ‪ٚ‬أخ‪١‬اشح شااشف أل٘اُ حٌاـ ‪ٚ Classes‬حٌّغاظخذِش فاا‪ٟ‬‬ ‫حالطظااخي حٌظاا‪ٛ‬ط‪ ٟ‬رخعااظخذحَ حٌااـ ‪ ،DirectPlay Transport Protocol‬عاإم‪ َٛ‬ح‪ ْ٢‬رظطز‪١‬ااك‬ ‫رشٔاخِؾ ‪ Video Voice Conference System‬رخعاظخذحَ حٌاـ ‪ TCP‬إلسعاخي حٌظا‪ٛ‬سس ‪ٚ‬حٌاـ‬ ‫‪ UDP‬إلسعخي حٌظ‪ٛ‬ص ‪.‬‬

‫~‪~064‬‬


‫صبٌضتتتب‪ :‬رظتتتّ‪ ُ١‬ثشٔتتتبِج ٌٍّذبدصتتتخ اٌظتتت‪ٛ‬ر‪١‬خ ‪ٚ‬اٌّشئ‪١‬تتتخ ‪ٚ‬ؽتتتشق اٌزؼبِتتتً ِتتتغ اٌتتتـ‬ ‫‪ Telephony‬ف‪ ٟ‬ث‪١‬ئخ اٌذ‪ٚ‬د ٔ‪١‬ذ‪:‬‬

‫‪TAPI‬‬

‫‪Design an Advanced Video /Voice Conferencing System By Using‬‬ ‫‪API & TAPI Telephony to Transfer Video/Voice Through‬‬ ‫‪Networks & Voice Through Analog Telephone Line:‬‬ ‫ِالدظخ ٘بِخ جذا‪:‬‬ ‫‪٠‬فزشع ثه لجً اٌجذء ثمشاءح ٘زا اٌجضء ِٓ فظً اٌـ ‪ VOIP‬لشاءح اٌّ‪ٛ‬اػ‪١‬غ اٌزبٌ‪١‬خ‪:‬‬ ‫‪Streaming in Dot Net -1‬‬ ‫‪TCP,UDP Socket Programming -2‬‬ ‫‪Advanced Multicasting Systems -3‬‬ ‫‪ -4‬اٌجضء األ‪ٚ‬ي ِٓ ٘زا اٌفظً ‪VOIP‬‬ ‫ر‪ٕ١‬اخ فا‪ ٟ‬حٌـاضء حأل‪ٚ‬ي ِآ ٘ازح حٌفظاً و‪١‬ف‪١‬اش حعاظخذحَ حٌاـ ‪ِ API unmanaged methods‬آ‬ ‫حٌٍّاااف ‪ winmm.dll‬حٌّخظاااض ٌظعخِاااً ِاااع حٌاااـ ‪ Multimedia‬فااا‪ ٟ‬ر‪١‬جاااش ٔظاااخَ حٌظشاااغ‪ً١‬‬ ‫‪ٚ‬حعااظخذِٕخ ِـّ‪ٛ‬عااش حٌااـ ‪ٌ Methods‬ظغااـ‪ ً١‬حٌظاا‪ٛ‬ص ِاآ حٌّااخ‪٠‬ىش‪ٚ‬ف‪ٚ ْٛ‬طل‪ٍ٠ٛ‬ااٗ اٌاا‪Byte ٝ‬‬ ‫‪ Array‬إلسعااخٌٗ ‪ِٚ‬اآ ػااُ طل‪٠ٛ‬ااً حٌااـ ‪ Byte Array‬اٌاا‪ ٝ‬طاا‪ٛ‬ص ِااشس أخااش‪ ٜ‬رخعااظخذحَ أعااٍ‪ٛ‬د‬ ‫حٌعاشع ‪ٚ ،... FIFO – First in First Out‬عإلخ‪ٚ‬ي فا‪٘ ٟ‬ازح حٌّؼاخي حالعاظفخدس ِآ خاذِخص‬ ‫حٌـ‪ٚ TAPI telephony‬رٌه ٌٕمً حٌظ‪ٛ‬ص ِٓ حٌلخع‪ٛ‬د اٌ‪ ٝ‬ؽشف آخش ‪٠‬غاظخذَ حٌ‪ٙ‬اخطف حٌٕماخي‬ ‫أ‪ ٚ‬حٌ‪ٙ‬ااخطف حألسػاا‪ّ٠ٚ ،Analog Phone ٟ‬ىاآ حالعااظفخدس ِاآ حٌااـ ‪ TAPI telephony‬رعااذس‬ ‫ؽشق أع‪ٍٙٙ‬خ حالعظفخدس ِٓ حٌزشٔخِؾ حٌّ‪ٛ‬ؿ‪ٛ‬د ِع ٔظخَ حٌظشغ‪ٚ TAPI V3.0 ً١‬حٌّظخف ِع ٔظاخَ‬ ‫حٌظشغ‪ٚ ، ... Windows XP ً١‬ع‪١‬ى‪ ْٛ‬حٌّخطؾ حٌعخَ ٌٍّشش‪ ٚ‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ -1‬عا‪١‬لظ‪ ٞٛ‬حٌّشاش‪ ٚ‬عٍا‪ٚ ، Database Server ٝ‬طمظظاش ‪ٚ‬ظ‪١‬فظاٗ عٍا‪ ٝ‬طخاض‪ِ ٓ٠‬عٍ‪ِٛ‬اخص‬ ‫حٌّ‪ٛ‬ظف‪ ٓ١‬ف‪ ٟ‬حٌششوش وؤسلاخَ حٌ‪ٛٙ‬حطاف ‪ ٚ‬حٌعٕاخ‪ ٓ٠ٚ‬حٌاـ ‪ Computers Names‬حٌخخطاش راؤؿ‪ٙ‬ضس‬ ‫حٌّ‪ٛ‬ظف‪...ٓ١‬‬

‫~‪~065‬‬


‫‪ -2‬عااا‪١‬ظّىٓ ؿّ‪١‬اااع حٌّااا‪ٛ‬ظف‪ِ ٓ١‬ااآ حالطظاااخي حٌظااا‪ٛ‬ط‪ٚ ٟ‬حٌّشثااا‪ِ ٟ‬اااع أ‪ِ ٞ‬ااآ ألغاااخَ حٌشاااشوش‪،‬‬ ‫رخإلػخفش اٌ‪ ٝ‬حعظخذحَ حٌـ‪ٌ TAPI Telephony‬الطظخي ِع حٌـ ‪ٚ Analog Phone‬رخٌعىظ‪...‬‬ ‫‪ٌٍٚ‬زاااذء رظطز‪١‬اااك حٌّشاااش‪ ٚ‬عااإم‪ َٛ‬رظظاااّ‪ ُ١‬لخعاااذس ر‪١‬خٔاااخص طلظااا‪ ٞٛ‬عٍااا‪ ٝ‬أعاااّخء حٌّااا‪ٛ‬ظف‪ٓ١‬‬ ‫‪ٚ‬حٌـ‪ٌ Computer Name‬ىً ِٕ‪ٚ ُٙ‬ألغخِ‪ٚ ُٙ‬أسلخَ ٘‪ٛ‬حطف‪ ،ُٙ‬وّخ ‪:ٍٟ٠‬‬ ‫‪Name@Department‬‬ ‫‪Computer Name (hidden for‬‬ ‫)‪Clients‬‬ ‫‪Telephone Number‬‬ ‫‪Group ID‬‬ ‫)‪Other Info (Email Address‬‬

‫)‪String (Primary Kay‬‬ ‫‪String‬‬ ‫‪String‬‬ ‫)‪String (foreign Kay‬‬ ‫‪String‬‬

‫‪ٚ‬ؿااذ‪ٚ‬ي آخااش ‪٠‬لظاا‪ ٞٛ‬عٍاا‪ ٝ‬حٌااـ ‪ٚ Group ID‬حٌااـ ‪ Group Name‬ك‪١‬ااغ ‪٠‬ؼااخف اٌ‪١‬ااٗ أعااّخء‬ ‫حأللغخَ فا‪ ٟ‬حٌشاشوش ‪٠ٚ‬اشطزؾ ِاع ؿاذ‪ٚ‬ي ِعٍ‪ِٛ‬اخص حٌّا‪ٛ‬ظف‪ ٓ١‬رخٌاـ ‪ ، ... Group ID‬رعاذ طظاّ‪ُ١‬‬ ‫لخعااذس حٌز‪١‬خٔااخص حٌغااخرمش ‪ ،‬عاإزذأ رظظااّ‪ ُ١‬شخشااش حٌااـ‪ Client‬حٌظاا‪ ٟ‬ع‪١‬غااظخذِ‪ٙ‬خ حٌّاا‪ٛ‬ظف‪ ٓ١‬دحخااً‬ ‫حٌششوش ‪ٚ‬ع‪١‬ى‪ ْٛ‬حٌشىً حٌعخَ ٌ‪ٙ‬خ وّخ ‪:ٍٟ٠‬‬

‫ك‪١‬ااغ ‪٠‬لااذد حٌّ‪ٛ‬ظااف أ‪ ٚ‬حٌّااذ‪٠‬ش حعااُ حٌمغااُ حٌااز‪٠ ٞ‬ش‪٠‬ااذ حالطظااخي ِعااٗ ‪ٚ‬عٕااذ حخظ‪١‬ااخس حعااُ حٌمغااُ‬ ‫ع‪١‬ظ‪ٙ‬ش حٌـ ‪ Combo box‬حٌّمخرً ؿّ‪١‬ع أعّخء حٌّ‪ٛ‬ظف‪ ٓ١‬حٌز‪٠ ٓ٠‬عٍّ‪ ْٛ‬ف‪ ٟ‬رٌه حٌمغُ ‪ٚ‬فا‪ ٟ‬كاخي‬ ‫حخظ‪١‬خس اكذحُ٘ فبٔٗ ‪٠‬ما‪ َٛ‬رعّاً ‪ SELECT Query‬عٍا‪ ٝ‬حٌاـ ‪ Telephone Number‬حٌخاخص‬ ‫رخٌّ‪ٛ‬ظف رخإلػخفش اٌ‪ ٝ‬حٌـ ‪ Computer_Name‬حٌخخطاش راٗ ‪ ،‬ك‪١‬اغ ‪ّ٠‬ىٕاٗ اِاخ اؿاشحء ِىخٌّاش‬ ‫رخعظخذحَ حٌـ ‪ TAPI Telephony‬أ‪ ٚ‬اؿشحء ِىخٌّاش دحخٍ‪١‬اش رخعاظخذحَ حٌاـ ‪ٚ ، VOIP‬فا‪ ٟ‬حٌلخٌاش‬ ‫حأل‪ ٌٝٚ‬فبْ حالطظخي ع‪١‬ظُ عزش حٌـ ‪ٚ Modem‬خط‪ٛ‬ؽ حالطظخالص حٌعخد‪٠‬ش ‪ ،‬أِاخ فا‪ ٟ‬كخٌاش حخظ‪١‬اخس‬ ‫حالطظخي رخٌـ ‪ VOIP‬عٕذ٘خ ‪٠‬ظُ حٌزذء ربسعخي حٌظ‪ٛ‬ص اٌا‪ ٝ‬حٌاـ ‪ Computer_Name‬حٌاز‪٠ ٞ‬ش‪٠‬اذ‬

‫~‪~066‬‬


ٝ‫اٗ اٌا‬١‫اظُ ربسعاخي طٕز‬٠ ٚ(‫ظاف‬ٌّٛ‫اخس حعاُ ح‬١‫خٔاخص عٕاذ حخظ‬١‫غظخشؽ ِآ لخعاذس حٌز‬٠) ٗ‫حالطظخي ِع‬ ٝ‫ص اٌاا‬ٛ‫ي حٌظاا‬ٛ‫لاا‬٠ ‫حفمااش‬ٌّٛ‫ كااخي ح‬ٟ‫فاا‬ٚ ‫ش ِٕظظااشس‬١‫ط‬ٛ‫د ِىخٌّااش طاا‬ٛ‫ؿاا‬ٛ‫ إلخزااخسٖ ر‬Client‫حٌااـ‬ ٟ‫مااش حٌظاا‬٠‫ راإفظ حٌطش‬ٟ‫ حالطظااخي حٌّشثاا‬ٟ‫ااش فاا‬١ٍّ‫طااظُ حٌع‬ٚ ، ‫ظف‬ٌّٛ‫ حٌخااخص رااخ‬Computer‫حٌااـ‬ ... ٟ‫ط‬ٛ‫ حالطظخي حٌظ‬ٟ‫ششكٕخ٘خ ف‬ ‫ّىٕ​ٕاخ‬٠ٚ API ‫حي حٌاـ‬ٚ‫اض رخعاظخذحَ د‬١ٔ ‫ص‬ٚ‫ حٌاذ‬ٟ‫ فا‬TAPI Telephony ‫اش حعاظخذحَ حٌاـ‬١ٍّ‫طاظُ ع‬ TAPI Telephony ‫فش٘خ حٌٍّف حٌّخظض ٌظعخِاً ِاع حٌاـ‬ٛ٠ ٟ‫ حٌظ‬Methods‫حالعظفخدس ِٓ حٌـ‬ ً‫ّىآ حٌظعخِا‬٠ ٟ‫حٌظا‬ٚ Methods ‫ عذد ػخُ ِٓ حٌاـ‬ٍٝ‫ ٘زح حٌٍّف ع‬ٞٛ‫لظ‬٠ٚ tapi32.dll ٛ٘ٚ :‫خ‬ٙ١ٍ‫وّؼخي ع‬ٚ ‫ض‬١ٔ ‫ص‬ٚ‫جش حٌذ‬١‫ ر‬ٟ‫خ ف‬ٙ‫ِع‬ Method Name tapiRequestMakeCall(string stNumber, string stDummy1, string stDummy2, string stDummy3) phoneShutdown (hPhoneApp app) [DllImport("tapi32.dll")] static extern long phoneShutdown(long hPhoneApp); LONGWINAPIphoneSetVolume( HPHONE hPhone, DWORD dwHookSwitchDev, DWORD dwVolume)

Description ‫ش حالطظخي‬١ٍّ‫طغظخذَ إلؿشحء ع‬ٚ ‫ّشس‬٠ ‫غ‬١‫ ك‬Modem ‫رخعظخذحَ حٌـ‬ ‫ذ اؿشحء‬٠‫ ٔش‬ٞ‫خطف حٌز‬ٌٙ‫خ سلُ ح‬ٌٙ ٗ‫حطظخي ِع‬ TAPI ‫طغظخذَ إلغالق رشٔخِؾ حٌـ‬ٚ Telephony ‫ذ دسؿش‬٠‫طغظخذَ ٘زٖ حٌذحٌش ٌظلذ‬ٚ ‫خ حٌذسؿش رخٌـ‬ٌٙ ‫ّشس‬٠ٚ ‫ص‬ٛ‫حٌظ‬ ‫ّش‬١‫غ طعزش حٌم‬١‫ ك‬Hex ‫د‬ٛ‫ؿ‬ٚ َ‫ عذ‬ٍٝ‫ ع‬0x00000000 0x0000FFFF ‫ّش‬١‫ص أِخ حٌم‬ٛ‫ط‬ maximum ‫فظعزش عٓ حٌـ‬ ... volume

‫ أٔظش حٌٍّلمخص‬TAPI Telephony ‫ حٌخخطش رخٌـ‬Methods ‫ وخفش حٌـ‬ٍٝ‫ ٌإلؽال ع‬: ٗ٠ٕٛ‫ر‬ (Part 5). Appendixes A ُ‫ااخ سلاا‬ٌٙ ‫ ّٔااشس‬ٟ‫حٌظاا‬ٚ tapiRequestMakeCall Method ‫ حٌااـ‬ٚ‫ ٘اازح حٌّشااش‬ٟ‫عٕغااظخذَ فاا‬ :ٍٟ٠ ‫خ وّخ‬ٙ‫ف‬٠‫ظُ طعش‬٠ٚ ، ‫ش حالطظخي‬١ٍّ‫خطف إلؿشحء ع‬ٌٙ‫ح‬

C#: [System.Runtime.InteropServices.DllImport("tapi32.dll")] static extern long tapiRequestMakeCall(string stNumber, string stDummy1, string stDummy2, string stDummy3); . . . long RetVal = tapiRequestMakeCall(Telephone_number, "", "", ""); VB.NET: <System.Runtime.InteropServices.DllImport("tapi32.dll")> _

~067~


Shared Function tapiRequestMakeCall(ByVal stNumber As String, ByVal stDummy1 As String, ByVal stDummy2 As String, ByVal stDummy3 As String) As Long End Function . . Dim RetVal As Long = tapiRequestMakeCall(Telephone_number, "", "", "") :ٍٟ٠ ‫ص وّخ‬ٛ‫اسعخي حٌظ‬ٚ ‫ش حعظمزخي‬١ٍّ‫طظُ ع‬ C#: private void Voice_In() // ‫شفش‬١‫ص ِٓ حٌغ‬ٛ‫حعظمزخي حٌظ‬ { byte[] br; r.Bind(new IPEndPoint(IPAddress.Any, int.Parse(text_ReceiveingPORT.Text))); while (true) { br = new byte[16384]; r.Receive(br); m_Fifo.Write(br, 0, br.Length); } } private void Voice_Out(IntPtr data, int size)//‫شفش‬١‫ حٌغ‬ٌٝ‫ص ا‬ٛ‫اسعخي حٌظ‬ { if (m_RecBuffer == null || m_RecBuffer.Length < size) m_RecBuffer = new byte[size]; System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size); r.SendTo(m_RecBuffer, new IPEndPoint(IPAddress.Parse(Server_name), int.Parse(text_SendingPort.Text))); } VB.NET: Private Sub Voice_In() ' ‫شفش‬١‫ص ِٓ حٌغ‬ٛ‫حعظمزخي حٌظ‬ Dim br As Byte() r.Bind(New IPEndPoint(IPAddress.Any, Integer.Parse(text_ReceiveingPORT.Text))) Do While True br = New Byte(16383) r.Receive(br) m_Fifo.Write(br, 0, br.Length) Loop End Sub

~068~


Private Sub Voice_Out(ByVal data As IntPtr, ByVal size As Integer) '‫شفش‬١‫ حٌغ‬ٌٝ‫ص ا‬ٛ‫اسعخي حٌظ‬ 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) r.SendTo(m_RecBuffer, New IPEndPoint(IPAddress.Parse(Server_name), Integer.Parse(text_SendingPort.Text))) End Sub :ٍٟ٠ ‫ وّخ‬Server ‫ حٌـ‬ٌٝ‫ا‬ٚ ِٓ ‫شح‬١ِ‫سس حٌىخ‬ٛ‫حعظمزخي ط‬ٚ ‫ش اسعخي‬١ٍّ‫طظُ ع‬ٚ C#: private void Start_Receiving_Video_Conference() { try { // Open The Port mytcpl = new TcpListener (int.Parse(text_Camera_rec_port.Text)); mytcpl.Start (); // Start Listening on That Port mysocket = mytcpl.AcceptSocket (); ns = new NetworkStream (mysocket); pictureBox2.Image = Image.FromStream(ns); mytcpl.Stop(); if (mysocket.Connected ==true) { while (true) { Start_Receiving_Video_Conference (); } } myns.Flush(); } catch (Exception){} } private void Start_Sending_Video_Conference(string remote_IP,int port_number) { try {

~069~


MemoryStream ms = new MemoryStream();// Store it in Binary Array as Stream pictureBox1.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jp eg); byte[] arrImage = ms.GetBuffer(); myclient = new TcpClient (server_IP,port_number);//Connecting with server myns = myclient.GetStream (); mysw = new BinaryWriter (myns); mysw.Write(arrImage);//send the stream to above address ms.Flush(); mysw.Flush(); myns.Flush(); ms.Close(); mysw.Close (); myns.Close (); myclient.Close (); } catch (Exception ex) { MessageBox.Show(ex.Message,"Video Conference Error Message",MessageBoxButtons.OK,MessageBoxIcon.Error); } } VB.NET: Private Sub Start_Receiving_Video_Conference() Try mytcpl = New TcpListener(Integer.Parse(text_Camera_rec_port.Text)) mytcpl.Start() mysocket = mytcpl.AcceptSocket() ns = New NetworkStream(mysocket) pictureBox2.Image = Image.FromStream(ns) mytcpl.Stop() If mysocket.Connected = True Then Do While True Start_Receiving_Video_Conference() Loop End If myns.Flush() Catch e1 As Exception End Try End Sub

~071~


Private Sub Start_Sending_Video_Conference(ByVal remote_IP As String, ByVal port_number As Integer) Try Dim ms As MemoryStream = New MemoryStream pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Dim arrImage As Byte() = ms.GetBuffer() myclient = New TcpClient(server_IP, port_number) myns = myclient.GetStream() mysw = New BinaryWriter(myns) mysw.Write(arrImage) ms.Flush() mysw.Flush() myns.Flush() ms.Close() mysw.Close() myns.Close() myclient.Close() End Try ٓ‫ظاف ِا‬ٌّٛ‫وّؼاخي ارح أسعاً ح‬ٚ Port ‫ حٌاـ‬ٟ‫ْ فا‬ٛ‫ىا‬٠ ْ‫ـاذ أ‬٠ ‫ حٌطشف حألخش فابْ حالخاظالف‬ٟ‫ف‬ ‫ ٘اازٖ حٌلخٌااش‬ٟ‫ـااذ فاا‬١‫ ف‬Port 5000 ‫ حٌااـ‬ٝ‫د عٍاا‬ٛ‫ لغااُ حٌلخعاا‬ٟ‫ظااف فاا‬ٌّٛ‫ ح‬ٝ‫عااخص اٌاا‬١‫لغااُ حٌّز‬ ‫ كخٌااش‬ٟ‫ااخ أِاخ فاا‬ٙ١ٍ‫ طااُ حإلسعاخي ع‬ٟ‫ حٌظا‬Port ‫ ٔفاظ حٌااـ‬ٝ‫خاش عٍاا‬٢‫ حٌطااشف ح‬ٟ‫ص فا‬ٛ‫حعاظمزخي حٌظاا‬ Server‫ حٌااـ‬ٝ‫ٓ اٌاا‬١‫ ِعاا‬Port ٝ‫ حإلسعااخي عٍاا‬Clients‫ّىاآ ٌىااً حٌااـ‬٠ ‫ عٕااذ٘خ‬Server َ‫حعااظخذح‬ .‫ ِلذد‬Port ٍٝ‫ ع‬Clients‫ وً حٌـ‬ٌٝ‫ ا‬Messages‫ ربسعخي حٌـ‬Server‫خَ حٌـ‬١‫وزٌه ل‬ٚ

~070~


Chapter 11 Raw Socket Programming - Introduction to Raw Socket & Raw Protocols - Raw Socket Programming o ICMP – Internet Control Message Protocol Programming (Ping & Tracing) o Using ARP Protocol to Get The MAC of a Remote Machine in Dot Net - Introduction to Packet Sniffing Applications

~072~


Introduction to Raw Socket & Raw Protocols ‫ال‬ٚ‫أ‬ ٝ‫ طعظّاذ عٍا‬ٟ‫اخص حٌظا‬١‫خخطاش ٌٍزشِـ‬ٚ ‫خِاش‬ٌٙ‫ع ح‬١‫حػا‬ٌّٛ‫ ِآ ح‬Raw Socket ‫ حٌـ‬ٛ‫ػ‬ِٛ ‫عظزش‬٠ ‫ي‬ٛ‫وا‬ٛ‫ط‬ٚ‫اخ رش‬ِٕٙٚ Transport Layer ‫ ِآ حٌاـ‬ٝ‫ حألدٔا‬ٜٛ‫ حٌّغاظ‬ٟ‫الص فا‬ٛ‫و‬ٛ‫ط‬ٚ‫حٌظعخًِ ِع حٌزش‬ Physical Address ‫ حٌاـ‬ٚ‫ أ‬MAC ‫ ٌـٍاذ حٌاـ‬ٟ‫حٌّغظخذَ رشىً أعخعا‬ٚ RARP ‫حٌـ‬ٚ ARP‫حٌـ‬ ‫ حٌّخظااض‬IGMP ‫حٌااـ‬ٚ (‫ي‬ٚ‫ِااخص حٔظااش حٌفظااً حأل‬ٍٛ‫ااذ ِاآ حٌّع‬٠‫ )ٌّض‬Ethernet Card ‫ٌٍااـ‬ َ‫غاظخذ‬٠ ٞ‫حٌاز‬ٚ ICMP ‫ي حٌاـ‬ٛ‫و‬ٛ‫ط‬ٚ‫ رش‬ٌٝ‫ رخإلػخفش ا‬Multicasting ‫ حٌـ‬ٟ‫عخص ف‬ّٛ‫إلدحسس حٌّـ‬ ‫ إلسعااخي كخٌااش‬ٜ‫ااخص حألخااش‬١ٍّ‫ااش ِاآ حٌع‬١‫ حٌىؼ‬ٝ‫ رخإلػااخفش اٌاا‬Ping ‫ااش حٌااـ‬١ٍّ‫ ع‬ٟ‫ فاا‬ٟ‫رشااىً أعخعاا‬ ‫اااازح‬ٙ‫ حٌخااااخص ر‬Header ‫ؤخااااز حٌااااـ‬٠ٚ ، Destination ‫ حٌااااـ‬ٝ‫خ اٌاااا‬ٌٙ‫ رعااااذ اسعااااخ‬Message‫حٌااااـ‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫حػق ف‬ٚ ٛ٘ ‫ ِمغّش وّخ‬64 Byte ‫ي‬ٛ‫و‬ٛ‫ط‬ٚ‫حٌزش‬

ICMP Header ٝ‫طمغااُ اٌاا‬ٚ ‫اازٖ حٌشعااخٌش‬ٙ‫ حٌخااخص ر‬Code ‫حٌااـ‬ٚ ‫ حٌشعااخٌش حٌّشعااٍش‬ٛ‫ااخ ٔاا‬ٙ١‫لااذد ف‬٠ٚ 16 Bytes ٖ‫ ٘ااز‬11-1 ‫ي‬ٚ‫ػااق حٌـااذ‬ٛ٠ٚ ‫ااش ٌخطااؤ ِااخ‬٠‫ طمش‬Error Message ٚ‫ حعااظعالَ أ‬Query ٓ١‫ع‬ٛ‫ٔاا‬ : ‫ح‬ٛٔ‫حأل‬ TYPE CODE Description 0 0 Echo Reply 3 0 Network Unreachable 3 1 Host Unreachable 3 2 Protocol Unreachable 3 3 Port Unreachable

Query Error x X X X X

3

4

Fragmentation needed but no frag. bit set

X

3 3 3 3 3

5 6 7 8 9

Source routing failed Destination network unknown Destination host unknown Source host isolated (obsolete) Destination network administratively prohibited

X X X X X

3

10

X

3 3

11 12

Destination host administratively prohibited Network unreachable for TOS Host unreachable for TOS

~073~

X X


TYPE CODE Description 3 13 Communication administratively prohibited by filtering 3 14 Host precedence violation

Query Error X X

3 4

15 0

Precedence cutoff in effect Source quench

5 5 5

0 1 2

Redirect for network Redirect for host Redirect for TOS and network

5 8

3 0

Redirect for TOS and host Echo request

9 10

0 0

Router advertisement Route solicitation

11 11 12 12

0 1 0 1

TTL equals 0 during transit TTL equals 0 during reassembly IP header bad (catchall error) Required options missing

13

0

Timestamp request (obsolete)

x

0 0 0 0

Timestamp reply (obsolete) Information request (obsolete) Information reply (obsolete) Address mask request Address mask reply ICMP Messages ‫ح حٌـ‬ٛٔ‫ أ‬11-1 ‫ي‬ٚ‫ؿذ‬

x x x x x

14 15 16 17 18

X

x

X X X X

‫ي‬ٛ‫طااا‬ٚ ٓ‫ ٌظلماااك ِااا‬Checksum ‫د حٌخاااخص رخٌاااـ‬ٛ‫اااخ حٌىااا‬ٙ١‫ػاااع ف‬ٛ٠ٚ ٜ‫ أخاااش‬16 Bytes ‫اذ‬٠‫ي ٌّض‬ٚ‫ حٌفظاً حأل‬ٝ‫ق )حسؿاع اٌا‬١‫ رشاىً حٌظال‬ICMP Message‫ حٌخاخص رخٌاـ‬Header ‫حٌاـ‬ .ٞ‫خس‬١‫ حخظ‬ٛ٘ٚ (ٗ‫مش كغخر‬٠‫ؽش‬ٚ Checksum ‫ي حٌـ‬ٛ‫ِخص ك‬ٍٛ‫ِٓ حٌّع‬ ICMP Packet ‫ ٌٍااـ‬ٍٟ‫ ٌااشلُ حٌظغٍغاا‬16 ٚ Packet ID ‫ ٌٍااـ‬16 ٝ‫ ِمغااّش اٌاا‬32 Bytes .ً‫حٌّشع‬ ARP – Address ‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫ رش‬Network Layer ‫ حٌـ‬ٟ‫ؼخ ف‬٠‫خِش أ‬ٌٙ‫الص ح‬ٛ‫و‬ٛ‫ط‬ٚ‫ِٓ حٌزش‬ٚ ‫اذ حإلسعاخي‬٠‫ طش‬ٟ‫اش حٌظا‬ٙ‫ ٌٍـ‬MAC Address ‫غاظخذَ ٌـٍاذ حٌاـ‬٠ ‫ ار‬Resolution Protocol MAC ‫ ٌٍااـ‬Filtering ‫ااش حٌااـ‬١ٍّ‫ي اؿااشحء ع‬ٛ‫واا‬ٛ‫ط‬ٚ‫اازح حٌزش‬ٌٙ ٜ‫ِاآ حالعااظخذحِخص حألخااش‬ٚ ‫ااخ‬ٙ١ٌ‫ا‬ ‫اش‬١‫ي غ‬ٛ‫اش حٌاذخ‬١ٍّ‫ش ِآ ع‬١‫ش حٌشزىخص حٌالعاٍى‬٠‫ش ٌلّخ‬١‫ش رشىً وز‬١ٍّ‫طغظخذَ ٘زٖ حٌع‬ٚ Address MAC ‫خ رخعظخذحَ حٌشزىش ػّٓ حٌـ‬ٌٙ ‫ف‬ّٛ‫ حٌّغ‬MAC Addresses ‫غ طؼخف حٌـ‬١‫ي ك‬ٛ‫حٌّخ‬ ‫د‬ٛ‫ؿا‬ٌٍّٛ ٗ‫ ِشاخر‬MAC Address ‫ طٍّه‬ٟ‫ضس حٌظ‬ٙ‫ش حألؿ‬١‫ي ٌغ‬ٛ‫ ٌّٕع حٌذخ‬Router ‫ حٌـ‬ٟ‫ ف‬List Hardware ‫ واً ِآ حٌاـ‬ٝ‫ حٌخاخص راٗ عٍا‬Header ‫ حٌاـ‬ٞٛ‫لظا‬٠ٚ ، ... MAC List‫ػآّ حٌاـ‬

~074~


Hardware & Protocol Type ٝ‫ رخإلػااخفش اٌاا‬Protocol Address ‫حٌااـ‬ٚ Address :ٌٗ َ‫ذ حٌعخ‬١‫ حٌظشو‬ٌٟ‫ػق حٌشىً حٌظخ‬ٛ٠ٚ ، ‫ي‬ٛ‫و‬ٛ‫ط‬ٚ‫زح حٌزش‬ٌٙ َ‫حٌّغظخذ‬

ٜٛ‫ ِغاظ‬ٝ‫ طعّاً عٍا‬ٟ‫الص حٌظا‬ٛ‫وا‬ٛ‫ط‬ٚ‫ طظٕف ِآ حٌزش‬ARP ‫ حٌـ‬ٚ ICMP ‫ف أْ حٌـ‬ٚ‫ِٓ حٌّعش‬ٚ Connectionless ‫ااخ‬ٙٔ‫ أ‬ٟ‫عٕاا‬٠ ‫٘اازح‬ٚ TCP/IP Model ‫ ػاآّ حٌااـ‬Network Layer‫حٌااـ‬ ٟ‫الص فاااا‬ٛ‫واااا‬ٛ‫ط‬ٚ‫ ِاااآ حٌزش‬ٞ‫ حعااااظخذحَ أ‬ٝ‫الص عٍاااا‬ٛ‫واااا‬ٛ‫ط‬ٚ‫ ال طعظّااااذ ٘اااازٖ حٌزش‬ٚ ،Protocols ...‫خ‬ٙ‫ عٕذ حٌظعخًِ ِع‬Ports ‫ ار ال كخؿش العظخذحَ حٌـ‬Transport Layer‫حٌـ‬ ً‫اخ ِؼا‬ٙ‫الط‬ٛ‫و‬ٛ‫ط‬ٚ‫رش‬ٚ Raw Socket ‫اش رشِـاش حٌاـ‬١‫ف‬١‫ ِآ ٘ازح حٌفظاً و‬ٌٟ‫ حٌـاضء حٌظاخ‬ٟ‫ٓ ف‬١‫عٕز‬ .‫ض‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ ف‬ARP Protocol ‫ ؽشق حٌظعخًِ ِع حٌـ‬ٌٝ‫ رخإلػخفش ا‬، ICMP‫حٌـ‬ : Raw Socket Programming : ‫ب‬١ٔ‫صب‬ ‫ رعاذ‬Raw Socket Type ‫اف حٌاـ‬٠‫ال طعش‬ٚ‫ـذ أ‬٠ ‫ض‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ ف‬Raw Socket ‫ٌظعخًِ ِع حٌـ‬ ُ‫طااذع‬ٚ Network Layer ‫ حٌااـ‬ٝ‫ طعّااً عٍاا‬ٟ‫الص حٌظاا‬ٛ‫واا‬ٛ‫ط‬ٚ‫ ِاآ حٌزش‬ٞ‫ااخس أ‬١‫ّىٕ​ٕااخ حخظ‬٠ ‫رٌااه‬ :ٌٟ‫ حٌظخ‬15-2 ‫ي‬ٚ‫ حٌـذ‬ٟ‫حػق ف‬ٚ ٛ٘ ‫وّخ‬ٚ ‫ش‬١ٌ‫الص حٌظخ‬ٛ‫و‬ٛ‫ط‬ٚ‫ حٌظعخًِ ِع حٌزش‬Raw Socket‫حٌـ‬ Protocol Name GGP ICMP

Description Gateway-to-Gateway Protocol Internet Control Message Protocol

IGMP IP IPX ND

Internet Group Management Protocol A raw IP packet Novell IPX Protocol Net Disk Protocol

PUP Xerox PARC Universal Protocol (PUP) ROW A raw IP packet SPX Version 1 & 2 Novell SPX Protocol Raw Socket ‫خ حٌـ‬ّٙ‫ طذع‬ٟ‫الص حٌظ‬ٛ‫و‬ٛ‫ط‬ٚ‫ٓ حٌزش‬١‫ز‬٠ ٚ – 15-2 Table

~075~


:ٍٟ٠ ‫ وّخ‬Raw Socket ‫ف حٌـ‬٠‫ال طعش‬ٚ‫ـذ أ‬٠ ICMP ‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫وّؼخي ٌزشِـش رش‬ٚ C#: Socket row_socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Ic mp); VB.NET: Dim row_socket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp) ‫ؼااخ‬٠‫ عااذَ كخؿظااٗ أ‬ٟ‫عٕاا‬٠ ‫٘اازح‬ٚ Connectionless ‫ي‬ٛ‫واا‬ٛ‫ط‬ٚ‫ رش‬ICMP ‫ي حٌااـ‬ٛ‫واا‬ٛ‫ط‬ٚ‫عظزااش رش‬٠ٚ ٟ‫ ٌااازٌه ٔلاااذد ٌاااٗ فماااؾ فااا‬Socket ‫ ِاااع حٌاااـ‬Binding ‫ حٌاااـ‬ٚ‫ أ‬Connect‫اااش حٌاااـ‬١ٍّ‫إلؿاااشحء ع‬ Port ‫اذ سلاُ حٌاـ‬٠‫ْ طلذ‬ٚ‫د‬ٚ Destination ‫ ٌٍاـ‬IP Address ‫ حٌاـ‬IPEndPoint Object‫حٌاـ‬ :ٍٟ٠ ‫وّخ‬ٚ ‫ّش طفش‬١‫غ طؤخز حٌم‬١‫ك‬ C#: IPEndPoint iep = new IPEndPoint(IPAddress.Parse("10.0.0.10"), 0); VB.NET: Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse("10.0.0.10"), 0) ICMP ‫ذ حٌشىً حٌعخَ ٌٍـ‬٠‫ رعذ طلذ‬Sendto Method ‫ش حإلسعخي ِزخششس رخعظخذحَ حٌـ‬١ٍّ‫طظُ ع‬ٚ ‫اش حالعاظمزخي رخعاظخذحَ حٌاـ‬١ٍّ‫طاظُ ع‬ٚ Byte Array ‫خطٗ وـ‬٠ٛ‫غ طشعً ِلظ‬١‫ ك‬Header Format ICMP Header ‫إلٔشااخء‬ٚ ، ‫ااخ‬ٙ‫ أسعااً ر‬ٟ‫مااش حٌظاا‬٠‫راإفظ حٌطش‬ٚ ReceiveFrom Method ٛ‫وّااخ ٘اا‬ٚ Field ً‫ ٌىاا‬Data Type‫حٌااـ‬ٚ ‫ي‬ٛ‫واا‬ٛ‫ط‬ٚ‫اازح حٌزش‬ٌٙ َ‫ااذ رخٌشااىً حٌعااخ‬١‫ـااذ حٌظم‬٠ Class :ٌٟ‫ حٌظخ‬15-3 ‫ي‬ٚ‫ حٌـذ‬ٟ‫حػق ف‬ٚ Data Variable Type Code Checksum Message

Size 1 byte

Type Byte

1 byte Byte 2 bytes Unsigned 16-bit integer multibyte Byte array Table 15-3 , ICMP Message Format

‫ظُ رٌه وّخ‬٠ٚ ICMP Header ‫ذ حٌغخرك ٌٍـ‬١‫ذ رخٌظشو‬١‫ـذ حٌظم‬٠ ICMP Class ‫إلٔشخء حٌـ‬ٚ :ٍٟ٠ C#: class ICMP { public byte Type; public byte Code;

~076~


‫;‪public UInt16 Checksum‬‬ ‫;‪public int MessageSize‬‬ ‫;]‪public byte[] Message = new byte[1024‬‬ ‫}‬ ‫‪VB.NET:‬‬ ‫‪Class ICMP‬‬ ‫‪Public Type As Byte‬‬ ‫‪Public Code As Byte‬‬ ‫‪Public Checksum As UInt16‬‬ ‫‪Public MessageSize As Integer‬‬ ‫)‪Public Message As Byte() = New Byte(1024‬‬ ‫‪End Class‬‬ ‫عٕم‪ َٛ‬ح‪ ْ٢‬رظٕف‪١‬ز رشٔاخِؾ رغا‪١‬ؾ إلؿاشحء عٍّ‪١‬اش حٌاـ ‪ِٚ Ping‬آ حٌّعاش‪ٚ‬ف أْ حٌاـ ‪٠ Ping‬غاظخذَ‬ ‫حٌـ‪ Type 8‬إلسعخي ‪ٚ‬حٌاـ ‪ Type 0‬عٕاذ حالعاظمزخي ك‪١‬اغ ‪٠‬ما‪ َٛ‬حٌطاشف حٌّمخراً رخعاظمزخي حٌشعاخٌش‬ ‫‪ٚ‬اعاخدس اسعاخٌ‪ٙ‬خ وّاخ ٘ا‪ ٟ‬اٌا‪ ٝ‬حٌاـ‪ٚ ، SourceAddress‬ارح طاُ حعاظمزخي حٌاـ ‪ICMP Message‬‬ ‫رخٌااـ‪٘ Type 0‬اازح ‪٠‬عٕاا‪ ٟ‬حٔااٗ طااُ حٌ‪ٛ‬طاا‪ٛ‬ي اٌاا‪ ٝ‬حٌااـ‪ّ٠ٚ Destination‬ىاآ حٌظلمااك ِاآ ‪ٚ‬طاا‪ٛ‬ي‬ ‫حٌـ‪ ICMP Header‬رخٌشىً حٌظل‪١‬ق رعذ كغخد ٔخطؾ حٌاـ ‪ Checksum‬فابرح ططاخرك ِاع ِمٍا‪ٛ‬د‬ ‫ِـّ‪ ٛ‬حٌـ‪ Header Data‬عٕذ٘خ ٔغظط‪١‬ع ِعشفش أٔٗ طاُ طغاٍ‪ ُ١‬حٌاـ‪ٌ Message‬اـ ‪Destination‬‬ ‫رشىً حٌظل‪١‬ق ‪ٚ‬وّخ ٘‪ٚ ٛ‬حػق ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٌٍٚ‬زذء رخٌظطز‪١‬ك ع‪١‬ى‪ ْٛ‬حٌشىً حٌعخَ ٌٍزشٔخِؾ وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~077‬‬


Byte ٝ‫ٍااٗ اٌاا‬٠ٛ‫طل‬ٚ ICMP Header ‫ااف حٌااـ‬٠‫ال طعش‬ٚ‫ـااذ أ‬٠ ICMP Class ‫إلٔشااخء حٌااـ‬ٚ :ٍٟ٠ ‫وّخ‬ٚ ٗ١ٌ‫ذ٘خ ا‬٠‫ ٔش‬ٟ‫ حٌظ‬Ping Data‫ رعذ اعٕخد حٌـ‬Array C#: using System; using System.Net; using System.Net.Sockets; using System.Text; class ICMP { public byte Type; public byte Code; public UInt16 Checksum; public int MessageSize; public byte[] Message = new byte[1024]; public ICMP() { } public ICMP(byte[] data, int size) { Type = data[20]; Code = data[21]; Checksum = BitConverter.ToUInt16(data, 22); MessageSize = size - 24; Buffer.BlockCopy(data, 24, Message, 0, MessageSize); } public byte[] getBytes() { byte[] data = new byte[MessageSize + 9];

~078~


Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1); Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1); Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2); Buffer.BlockCopy(Message, 0, data, 4, MessageSize); return data; } public UInt16 getChecksum() { UInt32 chcksm = 0; byte[] data = getBytes(); int packetsize = MessageSize + 8; int index = 0; while ( index < packetsize) { chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index)); index += 2; } chcksm = (chcksm >> 16) + (chcksm & 0xffff); chcksm += (chcksm >> 16); return (UInt16)(~chcksm); } } VB.NET: Imports Microsoft.VisualBasic Imports System Imports System.Net Imports System.Net.Sockets Imports System.Text Friend Class ICMP Public Type As Byte Public Code As Byte Public Checksum As UInt16 Public MessageSize As Integer Public Message As Byte() = New Byte(1023) Public Sub New() End Sub Public Sub New(ByVal data As Byte(), ByVal size As Integer) Type = data(20) Code = data(21) Checksum = BitConverter.ToUInt16(data, 22) MessageSize = size - 24

~079~


Buffer.BlockCopy(data, 24, Message, 0, MessageSize) End Sub Public Function getBytes() As Byte() Dim data As Byte() = New Byte(MessageSize + 9 - 1) Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1) Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1) Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2) Buffer.BlockCopy(Message, 0, data, 4, MessageSize) Return data End Function Public Function getChecksum() As UInt16 Dim chcksm As UInt32 = System.Convert.ToUInt32(0) Dim data As Byte() = getBytes() Dim packetsize As Integer = MessageSize + 8 Dim index As Integer = 0 Do While index < packetsize chcksm +=chcksm Convert.ToUInt32(BitConverter.ToUInt16(data, index)) index += 2 Loop chcksm = (chcksm >> 16) + (chcksm And &HFFFF) chcksm += (chcksm >> 16) Return System.Convert.ToUInt32((Not chcksm)) End Function End Class Byte Array ٝ‫ اٌا‬ICMP Packet ‫اً حٌاـ‬٠ٛ‫ ٌظل‬getBytes Method ‫اغ لّٕاخ ربٔشاخء حٌاـ‬١‫ك‬ getChecksum Method ‫أٔشاجٕخ حٌاـ‬ٚ BitConverter.GetBytes Method‫رخعاظخذحَ حٌاـ‬ ٓ‫اش حٌظلماك ِا‬١ٍّ‫غاظخذَ ٌع‬١‫ع‬ٚ ٗ‫ا‬١ٌ‫غإذ ا‬١‫اغ ع‬١‫ ك‬ICMP Packet‫ ٌٍاـ‬Checksum ‫ٌلغاخد حٌاـ‬ . ‫ق‬١‫ رخٌشىً حٌظل‬Destination ‫ ٌٍـ‬Packet Header ‫ي حٌـ‬ٛ‫ط‬ٚ ‫ااااف‬٠‫ ػااااُ طعش‬Raw Socket ‫ااااف‬٠‫ حٌغااااخرك ِزخشااااشس رعااااذ طعش‬Class ‫ّىاااآ حعااااظخذحَ حٌااااـ‬٠ٚ ٓ‫ ِا‬instance Object ‫ ػاُ حشاظمخق‬sendto Method ٝ‫ إلعإخدٖ اٌا‬IPEndpoint Object ICMP ‫أشاااخء‬ٚ ICMP Header ‫اااش ٌٍاااـ‬١‫ُ حرظذحث‬١‫ اعااإخد لااا‬ٚ ‫ حٌغاااخرك‬ICMP Class‫حٌاااـ‬ Destination ‫ حٌااـ‬ٝ‫خ اٌاا‬ٌٙ‫ّىٕ​ٕااخ اسعااخ‬٠ ‫ااش‬٠‫خ‬ٌٕٙ‫ ح‬ٟ‫فاا‬ٚ Byte Array ٝ‫ااخ اٌاا‬ٍٙ٠ٛ‫طل‬ٚ Message ‫ٕظظش٘خ‬١‫ عا‬ٟ‫ ٌٍّاذس حٌظا‬Time Out ‫ش ِاذس حٌاـ‬١‫ّىٕ​ٕخ طغ‬٠ ‫ذ‬١‫رظؤو‬ٚ sendto method ‫رخعظخذحَ حٌـ‬ ً‫اظُ وا‬٠ٚ ‫ كخٌاش عاذَ حالعاظـخرش‬ٟ‫ فا‬SocketException ‫ حٌاـ‬ٝ‫ي عٍا‬ٛ‫ٓ حٌذخ‬١‫ ك‬ٌٝ‫ ا‬Source‫حٌـ‬ :ٍٟ٠ ‫رٌه وّخ‬ C#: byte[] data = new byte[1024]; int recv; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.Icmp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text),0);

~081~


EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 1); data = Encoding.ASCII.GetBytes("Ping Message OK"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length); packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getChecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.R eceiveTimeout, 1000); host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); VB.NET: Dim data As Byte() = New Byte(1023) Dim recv As Integer Dim host As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.Icmp) Dim iep As IPEndPoint = New IPEndPoint(IPAddress.Parse(textBox1.Text),0) Dim ep As EndPoint = CType(iep, EndPoint) Dim packet As ICMP = New ICMP() packet.Type = &H08 packet.Code = &H00 packet.Checksum = 0 Buffer.BlockCopy(BitConverter.GetBytes(CShort(1)), 0, packet.Message, 0, 2) Buffer.BlockCopy(BitConverter.GetBytes(CShort(1)), 0, packet.Message, 2, 2) data = Encoding.ASCII.GetBytes("Ping Message OK") Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length) packet.MessageSize = data.Length + 4 Dim packetsize As Integer = packet.MessageSize + 4 Dim chcksum As UInt16 = packet.getChecksum() packet.Checksum = chcksum

~080~


host.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.R eceiveTimeout, 1000) host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep) Socket ‫ف حٌغاخرك ٌٍاـ‬٠‫ عٕغظخذَ ٔفظ حٌظعش‬Destination ‫ حٌشعخٌش ِٓ حٌـ‬ٍٝ‫العظمزخي حٌشد ع‬ٚ Reference Value ‫اااخ حٌاااـ‬ٙ١ٌ‫ٔغااإذ ا‬ٚ ReceiveFrom Method‫اااغ عٕغاااظخذَ حٌاااـ‬١‫ك‬ ICMP ‫ حٌاـ‬ٌٝ‫ طُ حعظمزخٌٗ ا‬ٞ‫ٔغٕذ حٌشد حٌز‬ٚ ، ‫ أسعٍٕخ ِٓ خالٌٗ حٌشعخٌش‬ٞ‫ حٌز‬IPEndpoint‫ٌٍـ‬ :ٍٟ٠ ‫ظُ وً رٌه وّخ‬٠ٚ ، ICMP Class ‫ أٔشت ِٓ حٌـ‬ٞ‫ حٌز‬Instance Object C#: try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); } catch (SocketException) { listBox1.Items.Clear(); listBox1.Items.Add("No response from remote host"); return; } ICMP response = new ICMP(data, recv); listBox1.Items.Clear(); listBox1.Items.Add("response from: "+ ep.ToString()); listBox1.Items.Add(" Type: "+ response.Type); listBox1.Items.Add(" Code: "+ response.Code); int Identifier = BitConverter.ToInt16(response.Message, 0); int Sequence = BitConverter.ToInt16(response.Message, 2); listBox1.Items.Add(" Identifier: "+ Identifier); listBox1.Items.Add(" Sequence: "+ Sequence); string stringData = Encoding.ASCII.GetString(response.Message,4, response.MessageSize - 4); listBox1.Items.Add(" data: "+stringData); host.Close();

~082~


VB.NET: Try data = New Byte(1023) recv = host.ReceiveFrom(data, ep) Catch e1 As SocketException listBox1.Items.Clear() listBox1.Items.Add("No response from remote host") Return End Try Dim response As ICMP = New ICMP(data, recv) listBox1.Items.Clear() listBox1.Items.Add("response from: " & ep.ToString()) listBox1.Items.Add(" Type: " & response.Type) listBox1.Items.Add(" Code: " & response.Code) Dim Identifier As Integer = BitConverter.ToInt16(response.Message, 0) Dim Sequence As Integer = BitConverter.ToInt16(response.Message, 2) listBox1.Items.Add(" Identifier: " & Identifier) listBox1.Items.Add(" Sequence: " & Sequence) Dim stringData As String = Encoding.ASCII.GetString(response.Message,4, response.MessageSize - 4) listBox1.Items.Add(" data: " & stringData) host.Close() ‫ف‬ٚ‫ِاآ حٌّعااش‬ٚ Tracing ‫ حٌغااخرك إلٔشااخء رشٔااخِؾ ٌعّااً حٌااـ‬Class ‫ؼااخ حعااظخذحَ حٌااـ‬٠‫ّىٕ​ٕااخ أ‬٠ٚ ‫ّاااش عزش٘اااخ‬٠ ٟ‫ حٌظااا‬Routers ‫ حٌاااـ‬ٚ‫ أ‬Hops ‫َ رظعماااذ حٌاااـ‬ٛ‫مااا‬٠ ٗ‫ حٔااا‬Routing Tracing‫رخٌاااـ‬ ICMP Replay Message ٗ‫ ِآ خالٌا‬Packet ‫ّش حٌـ‬٠ Router ً‫شؿع و‬٠ ‫غ‬١‫ ك‬Packet‫حٌـ‬ ‫ااش‬٠‫ طااُ طّش‬ٞ‫ حٌااز‬Router ‫ ٌٍااـ‬IP ‫ حٌااـ‬ٝ‫ أسعااٍض رخإلػااخفش اٌاا‬ٟ‫ حٌظاا‬Message ‫ حٌااـ‬ٝ‫ عٍاا‬ٞٛ‫طلظاا‬ ‫ي‬ٛ‫طاا‬ٚ ٝ‫ كظاا‬Router ً‫ واا‬ٝ‫ي اٌاا‬ٛ‫طاا‬ٌٍٛ ‫ حعااظغشق‬ٞ‫لااض حٌااز‬ٌٛ‫ح‬ٚ ٗ‫ ِاآ خالٌاا‬Message‫حٌااـ‬ :ٍٟ٠ ‫ْ حٌشىً حٌعخَ ٌٍزشٔخِؾ وّخ‬ٛ‫ى‬١‫ع‬ٚ ، Destination ‫ حٌـ‬ٌٝ‫ ا‬Packet‫حٌـ‬

~083~


Router ً‫ ٌىا‬IP ‫ ؿٍاذ حٌاـ‬ٍٝ‫عظّذ ع‬١‫ فبْ حٌزشٔخِؾ ع‬Tracing ‫ف حٌـ‬٠‫حػق ِٓ طعش‬ٚ ٛ٘ ‫وّخ‬ٚ َ‫ااش رخعااظخذح‬١ٍّ‫ّىاآ اؿااشحء ٘اازٖ حٌع‬٠ٚ ٟ‫ حٌطااشف حٌّعٕاا‬ٝ‫ي اٌاا‬ٛ‫طاا‬ٌٛ‫ٓ ح‬١‫ كاا‬ٝ‫ّااش ِاآ خالٌااٗ اٌاا‬٠ Loop ً‫خ دحخاا‬ٙ‫ااغ ٔؼااع‬١‫ ك‬SetSocketOption Method‫ ػاآّ حٌااـ‬IpTimeToLive‫حٌااـ‬ ٓ‫ عا‬TTL ً‫عزاش وا‬٠ ‫اغ‬١‫ ك‬TTL ‫ حٌاـ‬ٌٝ‫ّظٗ ا‬١‫ٔغٕذ ل‬ٚ ‫حكذ‬ٚ ‫ رّمذحس‬Loop ‫ذ حٌـ‬٠‫ وً ِشس ٔض‬ٟ‫ف‬ٚ Hop ‫ رٌااه حٌااـ‬ٝ‫ اٌاا‬Ping Message ‫ااظُ اسعااخي‬٠ٚ ٗ‫س ِاآ خالٌاا‬ٚ‫ طااُ حٌّااش‬Router ٚ‫ أ‬Hop ً‫حعاظمزخي حٌاشد ِآ وا‬ٚ Ping ‫اش اسعاخي حٌاـ‬١ٍّ‫ٓ ع‬١‫ش حٌّغظغشلش را‬١ِٕ‫ظ حٌفظشس حٌض‬١‫خالي رٌه ٔم‬ٚ َ‫اخط رٌاه رخعاظخذح‬١‫ّىٕ​ٕخ ل‬٠ٚ ٌٗ‫ ِٓ خال‬Packet ‫ ِش حٌـ‬Hop ‫ آخش‬ٌٝ‫ي ا‬ٛ‫ط‬ٌٛ‫ٓ ح‬١‫ ك‬ٌٝ‫ ا‬Hop Integer ‫ّاش‬١‫ ل‬Property ‫طشؿاع ٘ازٖ حٌاـ‬ٚ Environment Class‫ ػّٓ حٌاـ‬TickCount ‫حٌـ‬ ‫ّاش‬١‫ّىٕ​ٕاخ حخاز ٘ازٖ حٌم‬٠ ‫اغ‬١‫ ك‬ٌٟ‫لض حٌلخ‬ٌٛ‫ ح‬ٌٝ‫ً رخٌعًّ ا‬١‫ ِٓ رذأ ٔظخَ حٌظشغ‬Millisecond ‫رخٌـ‬ ٓ‫ ِا‬ٝ‫ٌا‬ٚ‫ّاش حأل‬١‫ِآ ػاُ ؽاشف حٌم‬ٚ ‫ عٕذ حعظمزخي حٌشد‬ٜ‫أخز٘خ ِشس أخش‬ٚ Ping ‫ش عًّ حٌـ‬٠‫عٕذ رذح‬ :ٍٟ٠ ‫ظُ وً رٌه وّخ‬٠ٚ ،...‫ش‬١ٔ‫حٌؼخ‬ C#: byte[] data = new byte[1024]; int recv, timestart, timestop; Socket trace_socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw, ProtocolType.Icmp); IPHostEntry dest = Dns.Resolve(textBox2.Text); IPEndPoint iep = new IPEndPoint(dest.AddressList[0], 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("Tracing is OK,FADI Abdel-qader"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);

~084~


packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getChecksum(); packet.Checksum = chcksum; trace_socket.SetSocketOption(SocketOptionLevel.Socket,SocketOption Name.ReceiveTimeout, 1000); int badcount = 0; for (int i = 1; i < 50; i++) { trace_socket.SetSocketOption(SocketOptionLevel.IP,SocketOptionNam e.IpTimeToLive, i); timestart = Environment.TickCount; trace_socket.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = trace_socket.ReceiveFrom(data, ref ep); timestop = Environment.TickCount; ICMP response = new ICMP(data, recv); if (response.Type == 11) listBox1.Items.Add("hop response from ms"+ i+ ep.ToString()+ (timestop-timestart)); if (response.Type == 0) { listBox1.Items.Add(" reached in hops, ms " + ep.ToString()+ i+ (timestop-timestart)); break; } badcount = 0; } catch (SocketException) { listBox1.Items.Add("hop No response from remote host "+ i); badcount++; if (badcount == 5) { listBox1.Items.Add("Unable to contact remote host"); break; } } }

~085~


trace_socket.Close(); VB.NET: Dim data As Byte() = New Byte(1023) Dim recv, timestart, timestop As Integer Dim trace_socket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp) Dim dest As IPHostEntry = Dns.Resolve(textBox2.Text) Dim iep As IPEndPoint = New IPEndPoint(dest.AddressList(0), 0) Dim ep As EndPoint = CType(iep, EndPoint) Dim packet As ICMP = New ICMP packet.Type = &H08 packet.Code = &H00 packet.Checksum = 0 Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2) Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 2, 2) data = Encoding.ASCII.GetBytes("Tracing is OK,FADI Abdel-qader") Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length) packet.MessageSize = data.Length + 4 Dim packetsize As Integer = packet.MessageSize + 4 Dim chcksum As UInt16 = packet.getChecksum() packet.Checksum = chcksum trace_socket.SetSocketOption(SocketOptionLevel.Socket,SocketOption Name.ReceiveTimeout, 1000) Dim badcount As Integer = 0 For i As Integer = 1 To 49 trace_socket.SetSocketOption(SocketOptionLevel.IP,SocketOptionNam e.IpTimeToLive, i) timestart = Environment.TickCount trace_socket.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep) Try data = New Byte(1023) recv = trace_socket.ReceiveFrom(data, ep) timestop = Environment.TickCount Dim response As ICMP = New ICMP(data, recv) If response.Type = 11 Then listBox1.Items.Add("hop response from ms" & i+ ep.ToString()+ (timestop-timestart)) End If If response.Type = 0 Then

~086~


listBox1.Items.Add(" reached in hops, ms " & ep.ToString()+ i+ (timestop-timestart)) Exit Try End If badcount = 0 Catch e1 As SocketException listBox1.Items.Add("hop No response from remote host " & i) badcount += 1 If badcount = 5 Then listBox1.Items.Add("Unable to contact remote host") Exit For End If End Try Next i trace_socket.Close() ً‫ااش حعااظخذحِٗ إلٔشااخء رشٔااخِؾ ٌعّاا‬١‫ف‬١‫و‬ٚ ‫ااض‬١ٔ ‫ص‬ٚ‫ حٌااذ‬ٟ‫ فاا‬ICMP ‫ااش حعااظخذحَ حٌااـ‬١‫ف‬١‫ٕااخ و‬١‫٘ىاازح ر‬ٚ ً‫ ِآ ٘ازح حٌفظا‬ٌٟ‫ حٌـاضء حٌظاخ‬ٟ‫ٓ فا‬١‫ف ٔزا‬ٛ‫ عا‬، Routing Tracing‫آخاش ٌعّاً حٌاـ‬ٚ Ping‫حٌاـ‬ ٞ‫ أل‬MAC Address ‫ااض ٌـٍااذ حٌااـ‬١ٔ ‫ص‬ٚ‫ حٌااذ‬ٟ‫ فاا‬ARP Protocol ‫ااش حٌظعخِااً ِااع حٌااـ‬١‫ف‬١‫و‬ .‫ حٌشزىش‬ٍٝ‫ ع‬Destination : ‫خص حٌشزىخص‬١‫ رشِـ‬ٟ‫ ف‬MAC Address ‫ ٌـٍذ حٌـ‬ARP Protocol ‫حعظخذحَ حٌـ‬ ‫ ِااآ خاااالي‬nbtstat ‫ ِاآ خاااالي حألِاااش‬IP Host ٞ‫ أل‬MAC Address ‫ّىٕ​ٕااخ ؿٍاااذ حٌاااـ‬٠ :ٌٟ‫ الكع حٌشىً حٌظخ‬Command Prompt‫حٌـ‬

َ‫ااااااض رخعااااااظخذح‬١ٔ ‫ص‬ٚ‫ ِاااااآ دحخااااااً حٌااااااذ‬Command ‫ّىٕ​ٕااااااخ حالعااااااظفخدس ِاااااآ ٘اااااازح حٌااااااـ‬٠ٚ ّٓ‫د ػاااااااا‬ٛ‫ؿاااااااا‬ٌّٛ‫ ح‬Process Class‫حٌااااااااـ‬ٚ ProcessStartInfo Class‫حٌااااااااـ‬ Arguments ‫حٌاـ‬ٚ Command ‫غ ّٔاشس حٌاـ‬١‫ ك‬، System.Diagnostics Namespace‫حٌـ‬ ‫ااش‬٠‫ ػااُ ٕٔفااز حألِااش رظّش‬ProcessStartInfo Instance Object‫ حٌااـ‬ٝ‫اازٖ اٌاا‬١‫ااذ طٕف‬٠‫ ٔش‬ٞ‫حٌااز‬ :ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ Process.Start Method ‫ حٌـ‬ٌٝ‫ حٌغخرك ا‬instance object‫حٌـ‬ C#: public string GetMac(string IP) { string str1=String.Empty; try

~087~


{ string str2=String.Empty; ProcessStartInfo info1 = new ProcessStartInfo(); Process process1 = new Process(); info1.FileName = "nbtstat"; info1.RedirectStandardInput = false; info1.RedirectStandardOutput = true; info1.Arguments = "-A " + IP; info1.UseShellExecute = false; process1 = Process.Start(info1); int num1 = -1; while (num1 <= -1) { num1 = str2.Trim().ToLower().IndexOf("mac address", 0); if (num1 > -1) { break; } str2 = process1.StandardOutput.ReadLine(); } process1.WaitForExit(); str1 = str2.Trim(); } catch (Exception exception2) { throw exception2; } return str1; } } VB.NET: Public Function GetMac(ByVal IP As String) As String Dim str1 As String = String.Empty Try Dim str2 As String = String.Empty Dim info1 As ProcessStartInfo = New ProcessStartInfo Dim process1 As Process = New Process info1.FileName = "nbtstat" info1.RedirectStandardInput = False info1.RedirectStandardOutput = True info1.Arguments = "-A " & IP info1.UseShellExecute = False process1 = Process.Start(info1) Dim num1 As Integer = -1 Do While num1 <= -1 num1 = str2.Trim().ToLower().IndexOf("mac address", 0) If num1 > -1 Then Exit Do End If str2 = process1.StandardOutput.ReadLine() Loop

~088~


‫)(‪process1.WaitForExit‬‬ ‫)(‪str1 = str2.Trim‬‬ ‫‪Catch exception2 As Exception‬‬ ‫‪Throw exception2‬‬ ‫‪End Try‬‬ ‫‪Return str1‬‬ ‫‪End Function‬‬ ‫‪ٌٚ‬ظٕف‪١‬ااز حٌااـ ‪ Method‬حٌغااخرمش ّٔااشس حٌااـ ‪) IP Address‬حٌخااخص رخٌـ‪ٙ‬ااخص حٌااز‪ٔ ٞ‬ش‪٠‬ااذ أْ ٔـٍااذ‬ ‫حٌـ‪ (ٌٗ MAC Address‬اٌ‪ ٝ‬حٌـ ‪ Method‬حٌغخرمش ك‪١‬غ لّٕخ رفظً حٌاـ ‪ MAC Address‬عآ‬ ‫رم‪١‬ش حٌّعٍ‪ِٛ‬خص حٌظ‪٠ ٟ‬خشؿ‪ٙ‬خ ٌٕخ رخعظخذحَ حٌـ ‪... Trim Method‬‬ ‫‪٘ٚ‬ىزح ر‪ٕ١‬خ و‪١‬ف‪١‬ش حعظخذحَ وً ِٓ حٌزش‪ٚ‬ط‪ٛ‬و‪ ٓ١ٌٛ‬حٌاـ ‪ٚ ICMP‬حٌاـ ‪ ARP‬فا‪ ٟ‬حٌاذ‪ٚ‬ص ٔ‪١‬اض ‪ ،‬عا‪ٛ‬ف‬ ‫ٔز‪ ٓ١‬ف‪ ٟ‬حٌـضء حٌظخٌ‪٘ ِٓ ٟ‬زح حٌفظاً ِزاذأ عّاً رشِـ‪١‬اخص حٌاـ ‪ٚ Packet Sniffing‬عإم‪ِ َٛ‬آ‬ ‫خالٌٗ رزٕخء رشٔخِؾ ‪ Sniffing‬رغ‪١‬ؾ‪.‬‬ ‫صبٌضب ‪Introduction to Packet Sniffing Applications :‬‬ ‫طىّااآ حٌفىاااشس حألعخعااا‪١‬ش ِااآ حٌاااـ ‪ Packet Sniffing Applications‬رخٌظظااإض عٍااا‪ٝ‬‬ ‫حٌااـ‪ Network Layer‬أ‪ ٚ‬حٌااـ‪ RawSocket‬رعااذ حخظ‪١‬ااخس حٌااـ‪ Network Interface‬ار أٔ‪ٙ‬ااخ ال‬ ‫طعًّ ػّٓ ٔطخق ‪ِ Port‬لذد ‪ٔٚ‬غظط‪١‬ع ِٓ خاالي حٌاـ ‪ Raw Socket‬حٌظماخؽ أ‪ّ٠ Packet ٞ‬اش‬ ‫ِٓ خالي حٌـ ‪ٌٚ Network Interface Card‬ظلٍ‪١‬اً حٌاـ‪ Packet‬الراذ ِآ ِعشفاش حٌلـاُ حٌىٍا‪ٟ‬‬ ‫ٌىاً ‪ Header‬ػاُ اػاخفظٗ ‪ٚ ،‬رشاىً دحثاُ ‪٠‬اظُ اػاخفش حٌاـ ‪ Header Length‬اٌا‪ ٝ‬واً ‪Header‬‬ ‫ػّٓ وً ؽزمش ِٓ ؽزمخص حٌـ ‪ ، TCP/IP‬الكع ِ‪ٛ‬لع حٌـ ‪ Header Length‬ف‪ ٟ‬واً ‪Header‬‬ ‫ِٓ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬الص حٌـ‪: TCP/IP‬‬

‫‪ّ٠ٚ‬ىٕ​ٕخ فظً وً ‪ Layer‬عٓ حألخش‪ ٜ‬رعذ ِعشفاش حٌاـ ‪ٌ Header Length‬ىاً ‪ ، Layer‬الكاع‬ ‫ِ آ حٌشااىً حٌغااخرك حٔااٗ ‪ّ٠‬ىٕ​ٕااخ ِعشفااش حٌلـااُ حٌىٍاا‪ٌٍ ٟ‬ااـ ‪ِ Packet‬اآ خااالي حٌـااضء حأل‪ٚ‬ي ِٕااٗ‬ ‫‪ٚ‬حٌّغااّ‪ ٝ‬رخٌااـ ‪ّ٠ٚ ، Frame‬ىٕ​ٕااخ ِعشفااش ِ‪ٛ‬لااع حٌااـ‪ Data‬فاا‪ ٟ‬حٌااـ ‪ِ Packet‬اآ خااالي حٌّعخدٌااش‬ ‫حٌظخٌ‪١‬ش‪:‬‬

‫~‪~089‬‬


Data in Application Layer = Total Length - 

(IP Header Length  Options) and (Transport Protocol Header Length  Options)

Packet ‫ٓ حٌااـ‬٠‫ ٌطااشف حٌّشعااً ِااؼال ِاآ خااالي طخااض‬IP Address ‫ّىٕ​ٕااخ ِااؼال ِعشفااش حٌااـ‬٠ٚ ‫لاع‬ِٛ ٟ‫اؤط‬٠ ‫ ار‬، ٗ‫اذ حٌماشحءس ِٕا‬٠‫ ٔش‬ٞ‫ ٌٍاـّىخْ حٌاز‬offset ‫اش حٌاـ‬١١‫ ػاُ طغ‬Byte Array ٟ‫حٌٍّظمؾ ف‬ :ٌٟ‫ الكع حٌشىً حٌظخ‬12 Bytes ‫ دحثّخ رعذ‬IP Packet ‫ حٌـ‬ٟ‫ ف‬IP Source Address‫حٌـ‬

Protocol ً‫ ٌىا‬Header Elements ‫ حٌاـ‬ٝ‫ عٍا‬ٞٛ‫لظا‬٠ Struct ٚ‫ أ‬Class ‫ـذ دحثّاخ أشاخء‬٠ٚ ‫اخ‬ٌٙ ‫اش‬١‫م‬١‫ حٌغعش حٌلم‬ٍٝ‫خ رٕخء ع‬ِٕٙ ً‫ذ ععش و‬٠‫طلذ‬ٚ ، ‫ٍٗ الكمخ‬١ٍ‫ع طل‬١‫ ٔغظط‬ٝ‫كظ‬ٚ ٗ‫ظُ حٌظعخًِ ِع‬٠ : IPHeader‫ خخص رخٌـ‬Struct ‫وّؼخي إلٔشخء‬ٚ C#: public struct IPHeader { [FieldOffset(0)] public byte ip_verlen; //IP version and IP Header length [FieldOffset(1)] public byte ip_tos; //Type of Service [FieldOffset(2)] public ushort ip_totallength; //Total Packet Length [FieldOffset(4)] public ushort ip_id; //Unique ID [FieldOffset(6)] public ushort ip_offset; //Flags and Offset [FieldOffset(8)] public byte ip_ttl; //Time To Live [FieldOffset(9)] public byte ip_protocol; //Protocol (TCP, UDP, ICMP, Etc.) [FieldOffset(10)] public ushort ip_checksum; //IP Header Checksum [FieldOffset(12)] public uint ip_srcaddr; //Source IP Address [FieldOffset(16)] public uint ip_destaddr; //Destination IP Address }

~091~


VB.NET: Public Structure IPHeader <FieldOffset(0)> _ Public ip_verlen As Byte 'IP version and IP Header length <FieldOffset(1)> _ Public ip_tos As Byte 'Type of Service <FieldOffset(2)> _ Public ip_totallength As System.UInt16 'Total Packet Length <FieldOffset(4)> _ Public ip_id As System.UInt16 'Unique ID <FieldOffset(6)> _ Public ip_offset As System.UInt16 'Flags and Offset <FieldOffset(8)> _ Public ip_ttl As Byte 'Time To Live <FieldOffset(9)> _ Public ip_protocol As Byte 'Protocol (TCP, UDP, ICMP, Etc.) <FieldOffset(10)> _ Public ip_checksum As System.UInt16 'IP Header Checksum <FieldOffset(12)> _ Public ip_srcaddr As System.UInt32 'Source IP Address <FieldOffset(16)> _ Public ip_destaddr As System.UInt32 'Destination IP Address End Structure IP ‫اخ حٌاـ‬ٙ١‫ٔلاذد ف‬ٚ Raw Socket ‫اف‬٠‫ـاذ طعش‬٠ IP Layer ‫ حٌاـ‬ٝ‫اش حٌظظإض عٍا‬١ٍّ‫اً ع‬١‫ٌظفع‬ٚ Interface Card ‫ ٌٍاـ‬IP Address ‫ ِاع حٌاـ‬Binding ‫َ رعّاً حٌاـ‬ٛ‫ ػاُ ٔما‬Protocol Type‫وـ‬ ‫ااخ ال‬ٙٔ‫ٓ ار أ‬١‫ ِعاا‬Port ‫ااذ‬٠‫ طلذ‬Raw Socket ‫ااذ ال طلظااخؽ حٌااـ‬١‫رظؤو‬ٚ ، ٗ‫اا‬١ٍ‫ااذ حٌظظاإض ع‬٠‫ ٔش‬ٞ‫حٌااز‬ :ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ ، Transport Layer Protocols ‫ ِٓ حٌـ‬ٞ‫طظعخًِ ِع أ‬ C#: socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); socket.Bind(new IPEndPoint(IPAddress.Parse(“10.0.0.10”), 0)); socket.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null); VB.NET: socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP) socket.Bind(New IPEndPoint(IPAddress.Parse(“10.0.0.10”), 0)) socket.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf Me.OnReceive), Nothing) ‫ظُ رٌه‬٠ٚ ‫ حٌغخرمش‬BeginReceive Method ‫ ٌٍـ‬AsyncCallback Method ‫ػُ اػخفش حٌـ‬ :ٍٟ٠ ‫وّخ‬ C#: private void OnReceive(IAsyncResult ar)

~090~


{ int received = socket.EndReceive(ar); if (socket != null) { byte[] packet = new byte[received]; Array.Copy(Buffer, 0, packet, 0, received); // Here The all Captured Packet in The Buffer } socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null); } VB.NET: Private Sub OnReceive(ByVal ar As IasyncResult) Dim received As Integer = socket.EndReceive(ar) If Not socket Is Nothing Then Dim packet As Byte() = New Byte(received) Array.Copy(Buffer, 0, packet, 0, received) „ Here The all Captured Packet in The Buffer End If socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf Me.OnReceive), Nothing) End Sub ٗ‫ٕا‬٠‫طخض‬ٚ ٗ‫اظُ حٌظمخؽا‬٠ Network Layer ‫ّش ِٓ خاالي حٌاـ‬٠ Packet ٞ‫ ٘زٖ حٌّشكٍش فبْ أ‬ٟ‫ف‬ٚ ‫ حٌٍّاظمؾ‬Packet‫ ٌٍاـ‬Header ‫ٍٗ الكماخ رلغاذ كـاُ حٌاـ‬١ٍ‫ّىٓ طل‬٠ ‫غ‬١‫ ك‬،‫ حٌغخرك‬Buffer ‫ حٌـ‬ٟ‫ف‬ ... Header ‫ حٌـ‬ٟ‫ ف‬Element ً‫ ِعشفش حٌلـُ ٌى‬ٌٝ‫رخإلػخفش ا‬ ‫خ ٌزشِـش‬ِٙ‫ش حعظخذح‬١‫ف‬١‫و‬ٚ ‫ض‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ ف‬Raw Socket ‫ش حٌظعخًِ ِع حٌـ‬١‫ف‬١‫ٕخ و‬١‫٘ىزح ر‬ٚ ... Raw IP ‫حٌـ‬ٚ ICMP‫الص حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫رش‬ Application Layer ‫الد اٌـ‬ٛ‫و‬ٛ‫ر‬ٚ‫ ػٓ ثشِجخ ثش‬ٌٟ‫ اٌجضء اٌزب‬ٟ‫ش ف‬٠‫زُ اٌذذ‬١‫ع‬ .‫ذ‬١ٔ ‫د‬ٚ‫ئخ اٌذ‬١‫ ث‬ٟ‫ ف‬Remoting‫اٌـ‬ٚ

~092~


Part 4 Application Layer Programming

Chapter12 DNS Programming Chapter13 HTTP Programming Chapter14 Web Services & XML Programming Chapter15 Remoting & Distributed Systems Programming & Design Chapter16 SMTP & POP3 Programming Chapter17 FTP Programming

~093~


Chapter 12 DNS Programming - Synchronous DNS Members - Asynchronous DNS Members

~094~


‫‪:DNS Programming :12‬‬ ‫طعظزش خذِش ‪ٚ DNS‬حكذس ِآ أ٘اُ حٌخاذِخص حٌظا‪ ٟ‬طغاظخذَ فا‪ ٟ‬حإلٔظشٔاض ‪ٚ‬حٌشازىخص رشاىً عاخَ‪،‬‬ ‫‪ٚ‬طخظظش ‪ٚ‬ظ‪١‬فش ‪ DNS‬رخٌم‪١‬خَ رعٍّ‪١‬ش طشؿّش حٌـ‪ Domain Name‬اٌا‪ٚ Domain IP ٝ‬حٌعىاظ‬ ‫‪٠ٚ ،‬ااظُ رٌااه ِاآ خااالي ِـّ‪ٛ‬عااش وز‪١‬ااشس ؿااذح ِاآ ِااض‪ٚ‬دحص ‪ٚ ) DNS‬حٌظاا‪ ٟ‬طماا‪ َٛ‬رظلااذ‪٠‬غ لخعااذس‬ ‫حٌز‪١‬خٔخص حٌخخطش ر‪ٙ‬خ وً فظشس ِع‪ٕ١‬ش( ‪ ،‬طزذأ ٘زٖ حٌعٍّ‪١‬ش ف‪ ٟ‬حٌشازىخص حٌّلٍ‪١‬اش رم‪١‬اخَ حٌاـ‪Client A‬‬ ‫رطٍذ حٌـ‪ Domain‬حٌخخص رخٌـ‪ٚ Client B‬رٌه ربدخخي ‪ Domain Name‬حٌخاخص راٗ ‪-‬ك‪١‬اغ‬ ‫طُ ِغزمخ ل‪١‬خَ حٌـ‪ Client B‬رظعش‪٠‬ف ٔفغٗ ف‪ ٟ‬لخعاذس حٌز‪١‬خٔاخص حٌخخطاش راـ ‪ - DNS Server‬وّاخ‬ ‫‪٠‬لظ‪ ٞٛ‬وً ‪ Client‬عٍ‪ ٝ‬لخعذس ر‪١‬خٔخص طلظ‪ ٞٛ‬عٍا‪ ٝ‬عٕاخ‪ ٓ٠ٚ‬حٌاـ‪ٚ Domains‬طغاّ‪ ٝ‬رخٌاـ ‪local‬‬ ‫‪ DNS‬ك‪١‬غ ‪٠‬م‪ َٛ‬رخٌزلغ رذحخٍ‪ٙ‬خ عٍ‪ ٝ‬عٕ‪ٛ‬حْ ‪ ِٓ Domain‬خالي ‪ Domain Name‬فبرح ٌاُ‬ ‫‪٠‬ـاذٖ ‪٠‬ما‪ َٛ‬رطٍاذ عٕا‪ٛ‬حْ حٌاذ‪ِ ٓ١ِٚ‬آ حٌاـ‪ٚ DNS Server‬رعاذ ا‪٠‬ـاخدٖ ‪٠‬ما‪ َٛ‬حٌاـ‪DNS Server‬‬ ‫ربسعخي حٌعٕ‪ٛ‬حْ اٌ‪ ٝ‬حٌاـ‪٠ٚ Client‬ما‪ َٛ‬راذ‪ٚ‬سٖ رظخاض‪ ٓ٠‬حٌعٕا‪ٛ‬حْ فا‪ Local DNS ٟ‬حٌخاخص راٗ ‪،‬‬ ‫حٔظش اٌ‪ ٝ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫فااا‪ ٟ‬حٌاااذ‪ٚ‬ص ٔ‪١‬اااض ‪ّ٠‬ىٕ​ٕاااخ حٌظعخِاااً ِاااع ‪ DNS‬رخعاااظخذحَ ‪ٚ System.Net Namespace‬حٌظااا‪ٟ‬‬ ‫طلظا‪ ٞٛ‬عٍا‪ ٝ‬ؿّ‪١‬اع حٌااـ‪ ٚ Classes‬حٌاـ‪ Methods‬حٌخخطاش راـ ‪ٚ ، DNS‬طمغااُ د‪ٚ‬حي حٌاـ ‪DNS‬‬ ‫‪ Class‬اٌا‪ ٝ‬لغاّ‪ِ ٓ١‬ظاضحِٓ ‪ ٚ Synchronous Methods‬غ‪١‬اش ِظاضحِٓ ‪Asynchronous‬‬ ‫‪ ٟ٘ٚ Methods‬وّخ ‪:ٍٟ٠‬‬ ‫أ‪ٚ‬ال اٌذ‪ٚ‬اي اٌّزضإِخ ‪: ٟ٘ٚ Synchronous Methods‬‬ ‫‪ٚ GetHostName‬حٌظ‪ ٟ‬طغظخذَ ٌـٍذ حعُ حٌـ ‪ٚ Host‬طشؿع ٘زٖ حٌذحٌش ل‪ّ١‬ش ‪ String‬طلظ‪ٞٛ‬‬ ‫عٍ‪ ٝ‬حٌـ‪ٚ Computer Name‬ال طؤخز ٘زٖ حٌذحٌش أ‪ ٞ‬رخس‪١ِٚ‬ظشحص ‪ّ٠ٚ‬ىٓ حعظخذحِ‪ٙ‬خ وّخ ‪: ٍٟ٠‬‬ ‫‪C#:‬‬ ‫;)(‪string hostname = Dns.GetHostName‬‬ ‫‪VB.NET:‬‬ ‫‪Private hostname As String = Dns.GetHostName‬‬ ‫حٌذحٌش ‪ ٚ GetHostByName‬حٌذحٌش ‪ٚ GetHostByAddress‬طغظخذَ وً ِٕ‪ٙ‬خ وّخ ‪:ٍٟ٠‬‬ ‫‪C#:‬‬ ‫ٌـٍذ ‪IPHostEntry host_ip = Dns.GetHostByName(Computer_Name); //‬‬ ‫حٌعٕ‪ٛ‬حْ رخعظخذحَ حالعُ‬

‫~‪~095‬‬


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) ‫اخ‬ٌٙ ‫ ارح أسعاٍض‬Host Name ‫اغ طشؿاع‬١‫ ك‬Overloaded Method ٟ‫٘ا‬ٚ Resolve ‫حٌذحٌش‬ IPHostEntry‫ حٌاـ‬ٟ‫ ف‬Host Name ‫خ‬ٌٙ ‫ ارح أسعٍض‬Host Address ‫طشؿع‬ٚ IP Address : ‫خ‬ِٙ‫مش حعظخذح‬٠‫ٓ ؽش‬١‫ز‬٠ ‫٘زح حٌّؼخي‬ٚ ، ‫حي حٌغخرمش‬ٚ‫خ عٓ حعظخذحَ حٌذ‬ِٙ‫خظٍف حعظخذح‬٠ ‫ال‬ٚ 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

~096~


: Asynchronous Methods ‫ش اٌّزضإِخ‬١‫اي اٌغ‬ٚ‫ب اٌذ‬١ٔ‫صب‬ : ‫خ‬ٙ١ٍ‫ِٓ حألِؼٍش ع‬ٚ End ٚ‫ أ‬Begin ‫طزذأ عخدس رىٍّش‬ٚ BeginGetHostByName ٚ BeginResolve ٚ EndGetHostByName ٚ EndResolve ‫ز٘خ إلوّخي‬١‫شظشؽ طٕف‬٠ ‫ْ حٔٗ ال‬ٛ‫خ طخظٍف رى‬ٕٙ‫حي حٌّظضحِٕش ٌى‬ٚ‫ حٌذ‬ٟ‫ حٌلخي ف‬ٛ٘ ‫خ وّخ‬ٍّٙ‫عش ع‬١‫ؽز‬ ‫ كخٌش‬ٟ‫ حٌزشٔخِؾ اال ف‬ٟ‫ش ف‬١ٔ‫س حٌؼخ‬ٛ‫ حٌخط‬ٌٝ‫ٓ حٌّظضحِٓ ال طغّق حالٔظمخي ا‬١‫ ك‬ٟ‫عًّ حٌزشٔخِؾ ف‬ َ‫ٕظق رخعظخذح‬٠ ‫ حٌزشٔخِؾ ٌزٌه‬ٟ‫ش رشىً عخَ ف‬١‫جش رخفغ حألدحث‬١‫لذ طغزذ ٘زٖ حٌغ‬ٚ ‫خ‬ٍّٙ‫خء ع‬ٙ‫حٔظ‬ : ٍٟ٠ ‫طغظخذَ وّخ‬ٚ ‫ش ِظضحِٕش‬١‫مش حٌغ‬٠‫حٌطش‬ Begin___ public static IAsyncResult BeginResolve(string hostname, AsyncCallback requestCallback, object stateObject) ٗ‫اا‬١‫عااشف ف‬٠ ٟٔ‫ظش حٌؼااخ‬١ِٚ‫ حٌزااخس‬ٚ ‫ي‬ٚ‫ظش حأل‬١ِٚ‫ حٌزااخس‬ٟ‫ فاا‬Host Name ‫ػااع حٌ اـ‬ٚ ُ‫ااظ‬٠ ‫ااغ‬١‫ك‬ End____ َ‫غاظخذ‬٠ٚ ، delegate Method ٝ‫اش ِاذخالص اٌا‬٠‫طغاّق ٌاه رظّش‬ٚ delegate‫حٌاـ‬ : ٍٟ٠ ‫ وّخ‬Back Result ‫ حٌـ‬ٟ‫ش ف‬١ٍّ‫خء حٌع‬ٙٔ‫إل‬ public static IPHostEntry EndResolve(IasyncResult ar) ‫ ؿٍاذ‬ٝ‫عًّ عٍا‬٠ ‫غ‬١‫ حٌشزىش ك‬ٍٝ‫دس ع‬ٛ‫ؿ‬ٌّٛ‫ ح‬IP‟s‫ع حٌـ‬١ّ‫َ رـٍذ ؿ‬ٛ‫م‬٠ ‫ؾ‬١‫ رغ‬ٚ ًِ‫ٕ٘خ ِؼخي شخ‬ٚ ‫ااز‬١‫ رظٕف‬StandardOutput ‫ش‬١‫ ِاآ خااالي حٌخخطاا‬ProcessStartInfo ٓ‫ ِاا‬host names‫حٌااـ‬ ‫ ِااااآ خاااااالي حٌذحٌاااااش‬host name ٝ‫ٍاااااٗ اٌااااا‬٠ٛ‫اااااظُ طل‬٠ ‫اااااغ‬١‫ ك‬، Net View ‫حألِاااااش‬ ً‫ا‬٠ٛ‫اظُ طل‬٠ ُ‫ ػا‬Collicaion ٟ‫خ ف‬ٕٙ٠‫ ػُ طخض‬GetMachineNamesFromProcessOutput StreamReader‫ظُ حعاظخذحَ حٌاـ‬٠ ‫ ؽزعخ‬.. Dns.Resolve ‫ٓ ِٓ خالي حٌذحٌش‬٠ٚ‫ عٕخ‬ٌٝ‫حألعّخء ا‬ : ‫ حٌّؼخي‬ٛ٘ ‫٘زح‬ٚ ProcessStartInfo‫ حٌخخص رخٌـ‬collection‫ٌمشحءس حٌـ‬ 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());

~097~


StringCollection _machineIPs = new StringCollection(); foreach(string machine in _machineNames) { _machineIPs.Add(IPAddresses(machine)); } return _machineIPs; } private static string IPAddresses(string server) { try { System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding(); // Get server related information. IPHostEntry heserver = Dns.Resolve(server); //assumin the machine has only one IP address return heserver.AddressList[0].ToString(); } catch { return "Address Retrieval error for " + server; } } //string manipulations private StringCollection GetMachineNamesFromProcessOutput(string processOutput) { string _allMachines = processOutput.Substring( processOutput.IndexOf("\\")); StringCollection _machines= new StringCollection(); while(_allMachines.IndexOf("\\") != -1 ) { _machines.Add(_allMachines.Substring(_allMachines.IndexOf("\\"), _allMachines.IndexOf(" ",_allMachines.IndexOf("\\")) _allMachines.IndexOf("\\")).Replace("\\",String.Empty)); _allMachines = _allMachines.Substring(_allMachines.IndexOf(" ",_allMachines.IndexOf("\\") + 1)); } return _machines; } } public class Runner { static void Main() { Names _names = new Names();

~098~


StringCollection names = _names.GetNames(); foreach(string name in names) Console.WriteLine(name); Console.ReadLine(); } } VB.NET: 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

~099~


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 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 ٓ‫ ػ‬ٌٟ‫ اٌفظً اٌزب‬ٟ‫ش ف‬٠‫اٌذذ‬

~211~


Chapter 13 HTTP Programming

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

~210~


HTTP – Hyper Text Transfer Protocol Programming :13 َ‫ً ؽٍاذ حٌّغاظخذ‬١‫طا‬ٛ‫ي حٌّغاظخذَ ٌظ‬ٛ‫وا‬ٛ‫ حٔاٗ حٌزشط‬ٝ‫ رشاىً عاخَ عٍا‬HTTP‫فاش حٌاـ‬١‫ظ‬ٚ ‫طظٍخض‬ ٞ‫حٌاز‬ٚ Request‫ حٌاـ‬ٝ‫ راخٌشد عٍا‬web server‫اخَ حٌاـ‬١‫ ػُ ل‬Server ‫ذ‬٠ٌٛ‫ ح‬ٌٝ‫ ا‬User Request ‫( ِآ حٌإض‬Multimedia) ‫اع أشاىخي‬١ّ‫ع ٔمً ؿ‬١‫ذ طغظط‬١‫رظؤو‬ٚ Server Response ‫ رـ‬ّٝ‫غ‬٠ Client Application‫ حٌااـ‬ٝ‫ اٌاا‬Web Server‫ ِاآ حٌااـ‬.. ٖ‫ااش‬١‫غ‬ٚ ٛ٠‫ااذ‬١‫ ف‬ٚ ‫ص‬ٛ‫ طاا‬ٚ ‫سس‬ٛ‫طاا‬ٚ .Byte object‫وـ‬ ‫ حعاظخذحِٗ رشاىً ِزخشاش‬ٟ‫عٕا‬٠ ‫٘ازح‬ٚ Application Layer‫ حٌـ‬ٍٝ‫ ع‬HTTP‫ي حٌـ‬ٛ‫و‬ٛ‫عًّ رشط‬٠ :ٌٟ‫ حٌشىً حٌظخ‬ٌٝ‫ حٔظش ا‬DNS,SMTP,POP3,FTP ٟ‫ حٌلخي ف‬ٛ٘ ‫ش حٌّغظخذَ وّخ‬ٙ‫حؿ‬ٚ ِٓ

Downloading From Web Server : ‫ال‬ٚ‫أ‬ WebClient Class‫ااض رخعااظخذحَ حٌااـ‬١ٔ ‫ص‬ٚ‫ حٌااذ‬ٟ‫ فاا‬Web Server‫ع حٌظعخِااً ِااع حٌااـ‬١‫ٔغااظط‬ ‫ً ؽٍااذ‬١‫طاا‬ٛ‫ااخص ٌظ‬١ٔ‫ااع حإلِىخ‬١ّ‫ ار طمااذَ ٌٕااخ ؿ‬System.Net Namespace ٟ‫د فاا‬ٛ‫ؿاا‬ٌّٛ‫ح‬ WebClient Class‫طذعُ حٌاـ‬ٚ User Request & Server Responseٗ١ٍ‫ حٌشد ع‬ٚ ْٛ‫حٌضر‬ :ٟ٘ٚ Web Server‫خٔخص ِٓ حٌـ‬١‫ً حٌز‬١ّ‫ ٌظل‬Methods ‫ػالػش‬ Byte ٟ‫اخ فا‬ٕٙ٠‫طخض‬ٚ Web Server‫خٔاخص ِآ حٌاـ‬١‫اخ ؿٍاذ حٌز‬ٙ‫فظ‬١‫ظ‬ٚ​ٚ DownloadData -1 :‫ وّؼخي‬ٍٟ٠ ‫طغظخذَ وّخ‬ٚ HTML Code ً‫ شى‬ٍٝ‫طعشع ع‬ٚ Array 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");

~212~


Console.WriteLine(Encoding.ASCII.GetString(response)); } } 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 ٟ‫ااخ ِزخشااشس فاا‬ٕٙ٠‫طخض‬ٚ Web Server‫ااخ ٔمااً ٍِااف ِااخ ِاآ حٌااـ‬ٙ‫فظ‬١‫ظ‬ٚ​ٚ DownloadFile-2 ْ‫حٌّىاخ‬ٚ ‫لاع حٌٍّاف‬ِٛ ‫اش‬٠‫ح طّش‬ٛ‫اه عا‬١ٍ‫ً حالعاظخذحَ ؿاذح ار ِاخ ع‬ٙ‫ عا‬ٛ٘ٚ 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

~213~


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 ‫ ٌـٍااذ‬Server‫حٌ اـ‬ٚ ْٛ‫ٓ حٌضراا‬١‫ راا‬Read Only Stream ‫ااخ أشااخء‬ٙ‫فظ‬١‫ظ‬ٚ​ٚ OpenRead -3 ‫اذ‬٠‫ طش‬ٞ‫لاع حٌاز‬ٌٍّٛ URL‫ش حٌـ‬٠‫ رعذ طّش‬Stream Object ٟ‫ٕٗ ف‬٠‫طخض‬ٚ ‫ ِلذد‬URL ِٓ ‫خٔخص‬١‫ر‬ Stream ‫ حٌااـ‬ٟ‫خٔااخص حٌّخضٔااش فاا‬١‫ع عااشع حٌز‬١‫ ٔغااظط‬ReadLine ‫رخعااظخذحَ حٌذحٌااش‬ٚ ٗ‫عشػاا‬ . HTML Code ً‫ شى‬ٍٝ‫ ع‬Object . 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

~214~


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‫ حٌاـ‬ٞٛ‫لظا‬٠ٚ ‫غاظخذَ ٌـٍااذ‬٠ ٞ‫حٌاز‬ٚ ResponseHeaders property ً‫ ِؼا‬Web Host‫ِاخص عآ حٌاـ‬ٍٛ‫ِع‬ ُ‫حعاا‬ٚ cash control‫ حٌااـ‬ٛ‫ٔاا‬ٚ Headers‫ ِؼااً عااذد حٌااـ‬web host‫ِااخص ٘خِااش عاآ حٌااـ‬ٍٛ‫ِع‬ ٟ‫ٍا‬٠ ‫غاظخذَ وّاخ‬٠ٚ ،‫خِاش‬ٌٙ‫ِاخص ح‬ٍٛ‫ش٘خ ِٓ حٌّع‬١‫غ‬ٚ َ‫ حٌّغظخذ‬Encoding‫ حٌـ‬ٛٔ ٚ Server‫حٌـ‬ :‫وّؼخي‬ 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

~215~


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 Uploading to Web Server : ‫ب‬١ٔ‫صب‬ : ٟ٘ٚ Web Server‫ حٌـ‬ٌٝ‫خٔخص ا‬١‫ً حٌز‬١ّ‫ ٌظل‬Methods ‫ أسرعش‬WebClient‫ذعُ حٌـ‬٠ ‫اش‬٠‫رٌاه رعاذ طّش‬ٚ Web Server‫ حٌاـ‬ٝ‫ اٌا‬Stream Data‫غاظخذَ إلسعخٌاـ‬٠ٚ OpenWrite -1 ‫ـااذ أْ طٍّااه‬٠ ‫ ؽزعااخ‬Web Page‫ حٌااـ‬ٝ‫ااذ وظخرظااٗ عٍاا‬٠‫ ٔش‬ٞ‫حٌاإض حٌااز‬ٚ ‫ ٌٍٍّااف‬URL‫حْ حٌااـ‬ٛ‫عٕاا‬ :‫ وّؼخي‬ٍٟ٠ ‫غظخذَ وّخ‬٠ٚ ‫خص ٌزٌه‬١‫حٌظالك‬ C#: using System; using System.IO; using System.Net; method_class OpenWrite { 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(); }

~216~


} 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 Web Server‫ حٌاـ‬ٌٝ‫ ا‬Byte ٌٕٛ‫فش ِٓ ح‬ٛ‫خص ِظف‬٠ٛ‫غظخذَ ٌٕمً ِلظ‬٠ٚ UploadData – 2 ٖ‫اش‬١‫غ‬ٚ ٛ٠‫اذ‬١‫س حٌف‬ٛ‫خٔاخص ِؼاً حٌإض حٌظا‬١‫ ِٓ حٌز‬ٛٔ ٞ‫خ سفع أ‬ٌٙ‫ع ِٓ خال‬١‫ حٔه طغظط‬ٟٕ‫ع‬٠ ‫٘زح‬ٚ :‫ وّؼخي‬ٍٟ٠ ‫غظخذَ وّخ‬٠ٚ Byte Array ٌٝ‫خ ا‬ٍٙ٠ٛ‫ رعذ طل‬web server‫ حٌـ‬ٌٝ‫ا‬ C#: using System; using System.Net; using System.Text; Method_class UploadData { 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

~217~


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 Web ‫ حٌاـ‬ٝ‫ اٌا‬Local Computer‫طغاظخذَ ٘ازٖ حٌذحٌاش ٌشفاع ٍِاف ِآ حٌاـ‬ٚ UploadFile -3 :‫ وّؼخي‬ٍٟ٠ ‫طغظخذَ وّخ‬ٚ ‫ رغطش حالعظخذحَ ؿذح‬ٟ٘ٚ 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 ‫ااخ‬ٙ‫ حٌخخطااش ر‬values‫حٌااـ‬ٚ ‫خٔااخص‬١‫ ِاآ حٌز‬Collection ‫طغااظخذَ ٌشفااع‬ٚ UploadValues -4 ‫اااف‬٠‫ٌظعش‬ٚ Byte Array ٝ‫ اٌااا‬Collection‫اااً حٌاااـ‬٠ٛ‫رٌاااه رعاااذ طل‬ٚ Server ‫اااذ‬٠ٌٛ‫ ح‬ٝ‫اٌااا‬ Namespace ٟ‫د فاااا‬ٛ‫ؿاااا‬ٌّٛ‫ ح‬NameValueCollection ‫ ٔغااااظخذَ حٌىااااالط‬Collection ‫ إلػاااااااخفش‬add ‫فاااااااٗ ٔغاااااااظخذَ حٌذحٌاااااااش‬٠‫رعاااااااذ طعش‬ٚ System.Collections.Specialized :‫ وّؼخي‬ٍٟ٠ ‫طغظخذَ وّخ‬ٚ ..‫ذ‬٠‫ ؿذ‬Collection‫حٌـ‬ C#: using System; using System.Collections.Specialized; using System.Net; using System.Text; class UploadValues_Method {

~218~


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 :HTTP Programming‫ اٌـ‬ٟ‫غ األوضش رمذِب ف‬١‫اػ‬ٌّٛ‫ا‬: ‫صبٌضب‬ ٞ‫حٌاز‬ٚ Web Client Applications ‫ماخص‬١‫ رشِـاش ططز‬ٟ‫عظزش ٘زح حٌـضء ِٓ أُ٘ حألؿاضحء فا‬٠ ٚ HttpWebRequest Class‫ااااااٗ عاااااآ حعااااااظخذحَ وااااااً ِاااااآ حٌااااااـ‬١‫ف ٔظلااااااذع ف‬ٛ‫عاااااا‬ :HttpWebResponse Class‫حٌـ‬ : HttpWebRequest Class َ‫ اعزخذا‬-1 ٟ‫ فاا‬ٟ‫ طغااظخذَ رشااىً أعخعاا‬ٟ‫حٌظاا‬ٚ Properties‫عااش ِاآ حٌااـ‬ّٛ‫ ِـ‬ٝ‫ عٍاا‬Class‫ ٘اازح حٌااـ‬ٞٛ‫لظاا‬٠ : ً‫ إلٔشخء ِؼ‬Web Client Applications‫مخص حٌـ‬١‫ططز‬ ُ‫سل‬ٚ Proxy Server‫حْ حٌـ‬ٕٛ‫خ ع‬ٙ١‫ ّٔشس ف‬ٟ‫حٌظ‬ٚ : Web Proxy‫ش حٌـ‬١‫ حعظخذحَ خخط‬-1 ٚ‫ أ‬Proxy Server ‫ِٓ خٍف‬HTTP Web Requests‫ع حٌظعخًِ ِع حٌـ‬١‫ ٔغظط‬ٝ‫ كظ‬Port‫حٌـ‬ :‫ وّؼخي‬ٍٟ٠ ‫ وّخ‬Proxy Server Prosperity‫ف حٌـ‬٠‫ظُ طعش‬٠ٚ Firewall C#: using System; using System.Net;

~219~


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 ٓ‫ ِاا‬WebProxy Object ‫ ػااُ ٔعااشف‬HttpWebRequest Object‫ااش حٌااـ‬٠‫ حٌزذح‬ٟ‫ٔعااشف فاا‬ ‫ع‬١‫رعذ رٌاه ٔغاظط‬ٚ Port ‫سلُ حٌـ‬ٚ Proxy Server‫حْ حٌـ‬ٕٛ‫ٔغٕذ ٌٗ ع‬ٚ webProxy Class‫حٌـ‬ ‫اااع‬١ّ‫ ؿ‬ٟ‫دس عاااخدس فااا‬ٛ‫ؿااا‬ِٛ ْٛ‫ طىااا‬ٟ‫ حٌظااا‬Proxy ‫ش‬١‫ رخعاااظخذحَ حٌخخطااا‬Object ٞ‫ أ‬ٝ‫اعااإخدٖ اٌااا‬ . HttpWebRequest Objects

~201~


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) ٗ‫ٔغاإذ ٌاا‬ٚ Stream Object ‫ااف‬٠‫َ رظعش‬ٛ‫ ٔماا‬HttpWebRequest Object‫ااف حٌااـ‬٠‫رعااذ طعش‬ . GetRequestStream ‫ ِٓ خالي حٌذحٌش‬Request Stream‫حٌـ‬ :HttpWebResponse Class َ‫ اعزخذا‬- 2 ٝ‫ اٌااا‬Server ‫اااذ‬٠ٌٛ‫خٔاااخص ِااآ ح‬١‫ إلسؿاااخ ر‬HttpWebResponse Object‫طغااظخذَ حٌاااـ‬ ٖ‫اااز‬ٌٙ BeginGetResponse ‫ حٌذحٌاااش‬ٚ GetResponse ‫اااغ ٔغاااظخذَ حٌذحٌاااش‬١‫ ك‬Client‫حٌاااـ‬ ‫ طعظزاش‬BeginGetResponse ْ‫ أ‬ٜٛ‫ عا‬Method‫فاش ٘ازٖ حٌاـ‬١‫ظ‬ٚ ٟ‫ؿذ فشق فا‬ٛ٠ ‫ال‬ٚ ‫ش‬١ٍّ‫حٌع‬ . asynchronous Method : ٟ٘ٚ Properties‫ عذد ِٓ حٌـ‬ٍٝ‫ ع‬HttpWebResponse Object ‫ حٌـ‬ٞٛ‫لظ‬٠ Character Set‫ حٌـ‬ٛٔ ‫ذ‬٠‫طغظخذَ ٌظلذ‬ٚ : CharacterSet -1 encoding‫ش حٌـ‬١ٍّ‫طغظخذَ ٌع‬ٚ : ContentEncoding -2 ‫طغظخذَ ٌّعشفش كـُ حٌشد‬ٚ : ContentLength -3 Response‫ حٌـ‬ٛٔ ‫ذ‬٠‫ ٌظلذ‬: ContentType -4 ‫ فااخس‬Cookie ‫ال أشااخء ٍِااف‬ٚ‫ـااذ أ‬٠ ‫خ‬ِٙ‫حعااظخذح‬ٚ Cookies‫ ٌظعخِااً ِااع حٌااـ‬: Cookies -5 :‫ وّؼخي‬ٍٟ٠ ‫فٗ وّخ‬٠‫طعش‬ٚ

~200~


C#: HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(http://www.amazon.com); hwr.CookieContainer = new CookieContainer(); : ٍٟ٠ ‫ٗ وّخ‬١ٌ‫ ػُ ٔغٕذٖ ا‬HTTP Request‫رٌه لزً حٌـ‬ٚ HttpWebResponse hwrsp = (HttpWebResponse)hwr.GetResponse(); hwrsp.Cookies = hwr.CookieContainer.GetCookies(hwr.RequestUri); 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) HTTP Headers‫ ٌّعشفش حٌـ‬: Headers -6 ً٠‫خ أخش طعذ‬٠‫طخس‬ٚ ‫لض‬ٚ ٗ١‫شؿع ف‬٠ : LastModified -7 HTTP Response‫ حٌـ‬ٟ‫ طغظخذَ ف‬ٟ‫حٌظ‬ٚ ‫ ٌّعشفش حٌذحٌش‬: Method -8 HTTP Version‫ ٌّعشفش حٌـ‬: ProtocolVersion – 9 Server‫ حٌخخص د‬URL‫ حٌـ‬: ResponseUri – 12 Server‫ ٌّعشفش حعُ حٌـ‬: Server – 11 َ‫ حٌّغظخذ‬Coding‫ حٌـ‬ٛٔ ‫ ٌّعشفش‬: StatusCode – 12 HTTP‫ كخٌش حٌـ‬ٍٝ‫ ع‬ٞٛ‫لظ‬٠ Text ‫ إلسؿخ‬: StatusDescription – 13 ‫ؽتشق اٌزؼبِتتً ِتغ اٌتتـ‬ٚ ‫تذ‬١ٔ ‫د‬ٚ‫ئتخ اٌتتذ‬١‫ ث‬ٟ‫ فتت‬HTTP ‫تتخ ثشِجتخ اٌتـ‬١‫ف‬١‫ ٘تتزا اٌفظتً و‬ٟ‫ٕتب فت‬١‫ث‬ ‫ف ٔزذتذس‬ٛ‫ عت‬, ‫تذ‬١ٔ ‫د‬ٚ‫ئتخ اٌتذ‬١‫ ث‬ٟ‫ فت‬HttpWebResponse‫اٌتـ‬ٚ HttpWebRequest .‫ذ‬١ٔ ‫د‬ٚ‫ئخ اٌذ‬١‫ ث‬ٟ‫ؽشق اٌزؼبًِ ِؼٗ ف‬ٚ XML‫اٌـ‬ٚ Web Services ٓ‫ ػ‬ٌٟ‫ اٌفظً اٌزب‬ٟ‫ف‬

~202~


Chapter 14 Web Services & XML Programming

-Introduction to Web services & XML -Create A Simple Web Service Application -Using ADO.NET With Web Services  Create a Simple GIS System to Send Information About Countries Via SOAP & XML to Clients.

~203~


Web Services Programming :14 web server‫ٓ حٌاـ‬١‫اش حٌظفخعاً را‬١‫ف‬١‫اٗ و‬١‫ٕاخ ف‬١‫ر‬ٚ HTTP‫ حٌفظً حٌغاخرك عآ رشِـاش حٌاـ‬ٟ‫طلذػٕخ ف‬ .‫ حٌفظً حٌغخرك‬ٟ‫عظزش ٘زح حٌفظً ِىًّ ٌّخ طلذػٕخ عٕٗ ف‬٠ٚ client‫حٌـ‬ٚ web ‫دس رخٌاـ‬ٛ‫ؿا‬ٌّٛ‫ ح‬Methods‫اش حالعاظفخدس ِآ حٌاـ‬١ٔ‫ ربِىخ‬web services‫فاش حٌاـ‬١‫ظ‬ٚ ‫طظٍخض‬ Simple ‫ حخظظاخس ٌاـ‬ٛ‫٘ا‬ٚ SOAP ‫ي حٌاـ‬ٛ‫وا‬ٛ‫رخعاظخذحَ رشط‬ٚ ،ْٛ‫ دحخً رشٔخِؾ حٌضرا‬server ٝ‫ اٌاا‬web Services server‫ ِاآ حٌااـ‬Result‫ااظُ ٔمااً حٌااـ‬٠ Object Access Protocol ‫اغ طٕماً عزاش‬١‫ ك‬XML - extensible Markup Language‫ حٌاـ‬ٌٝ‫خ ا‬ٍٙ٠ٛ‫ رعذ طل‬Client‫حٌـ‬ ٓ‫ ِا‬Data‫ي حٌاـ‬ٛ‫طا‬ٚ ً١ٙ‫ طغا‬ٛ‫ذف ِآ حعاظخذحِٗ ٘ا‬ٌٙ‫ح‬ٚ ْٛ‫خص حٌضر‬ٙ‫ ؿ‬ٌٝ‫ ا‬HTTP‫ي حٌـ‬ٛ‫و‬ٛ‫رشط‬ ‫جاخص‬١‫اع ر‬١ّ‫جاخص حٌّخظٍفاش ار أْ ؿ‬١‫حٌز‬ٚ firewalls ‫ ِآ خاالي حٌاـ‬Client‫ حٌـ‬ٌٝ‫ ا‬web server‫حٌـ‬ XML‫ال طخظٍاف ٌغاش حٌاـ‬ٚ . 82 Port‫ حٌاـ‬ٝ‫عّاً عٍا‬٠ ٞ‫حٌاز‬ٚ HTTP‫ي حٌاـ‬ٛ‫و‬ٛ‫حٌشزىخص طذعُ رشط‬ Elements ‫عااش ِآ حٌاـ‬ّٛ‫ ِـ‬ٟ‫٘ا‬ٚ HTML‫ حٌااـ‬ٟ‫حعااذ فا‬ٛ‫ ار طغااظخذَ ٔفاظ حٌم‬HTML‫عآ حٌاـ‬ : ‫خ‬ٙ١ٍ‫وّؼخي ع‬ٚ ‫ٔش حوزش‬ٚ‫ض رّش‬١ّ‫> <> ٌىٓ طظ‬/<‫ ِؼً حٌـ‬Attributes‫حٌـ‬ٚ <MyStuff> <myName>FADI Abdel-qader</myName> <myTelephone>+962796...</myTelephone> <myEmail>fadi822000@yahoo.com</myEmail> <myAge>25</myAge> <myGender>M</myGender> </myStuff> Text,Binary Data, Serialization ‫حء‬ٛ‫ عا‬XML‫ذٖ رخعاظخذحَ حٌاـ‬٠‫ء ٔش‬ٟ‫ ش‬ٞ‫ّىٓ ٔمً أ‬٠ٚ ‫اع‬١ّ‫ ٔماً ؿ‬ٝ‫اش عٍا‬١ٌ‫خ حٌعخ‬ٙ‫ لاذسط‬ٛ‫ش٘اخ ٘ا‬١‫ عآ غ‬XML ‫اض حٌاـ‬١ِ ‫ِاخ‬ٚ ‫ء حخاش‬ٟ‫ ش‬ٞ‫ أ‬ٚ‫ أ‬Object ...‫جخص‬١‫ع حٌز‬١ّ‫خٔخص رـ‬١‫ح حٌز‬ٛٔ‫ح‬ System.xml Namespaces ‫ااض رخعااظخذحَ حٌااـ‬١ٔ ‫ص‬ٚ‫ حٌااذ‬ٟ‫ فاا‬XML ‫ّىٕ​ٕااخ حٌظعخِااً ِااع حٌااـ‬٠ٚ : XmlDocument‫ حٌغخرك رخعظخذحَ حٌـ‬XML ‫ش لشحءس ٍِف حٌـ‬١‫ف‬١‫ػق و‬ٛ٠ ‫٘زح ِؼخي‬ٚ C#: using System.Xml; 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 Gender = xDoc.GetElementsByTagName("myGender"); MessageBox.Show( "Name: " + name[0].InnerText +"\n"+ "Telephone: " + telephone[0].InnerText +"\n"+ "Email: "+ email[0].InnerText +"\n"+ "Age: "+ age[0].InnerText +"\n"+ "Gender: "+ Gender[0].InnerText +"\n"

~204~


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 Gender As XmlNodeList = xDoc.GetElementsByTagName("myGender") 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) & "" + "Gender: " + Gender(0).InnerText + "" & Microsoft.VisualBasic.Chr(10) & "") ‫وّاخ‬ٚ XML Data ‫جاش‬١٘ ٝ‫خٔاخص عٍا‬١‫ٓ ر‬٠‫ ٌخاض‬XmlTextWriter Class ‫ّىٓ حعظخذحَ حٌـ‬٠ٚ :ٌٟ‫ حٌّؼخي حٌظخ‬ٟ‫ف‬

C#: private void btnSave_Click(object sender, System.EventArgs e) { try { XmlTextWriter XMLWriter = new XmlTextWriter ("AddressBook.XML", null); XMLWriter.Formatting = Formatting.Indented;

~205~


XMLWriter.WriteComment("‫ٓ ٍِف‬٠ٚ‫;)"حٌعٕخ‬ XMLWriter.WriteStartElement("AddressBook"); XMLWriter.WriteStartElement("Name"); XMLWriter.WriteString(tx_Name.Text); XMLWriter.WriteEndElement(); XMLWriter.WriteStartElement("Address"); XMLWriter.WriteString(tx_Address.Text); XMLWriter.WriteEndElement(); XMLWriter.WriteEndElement(); XMLWriter.Flush(); XMLWriter.Close(); MessageBox.Show("ُ‫;)"ط‬ } catch(Exception ex) { MessageBox.Show(ex.Message); } } private void btnViewXML_Click(object sender, System.EventArgs e) { try { XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; doc.Load("AddressBook.xml"); MessageBox.Show(doc.InnerXml,"‫خص حٌٍّف‬٠ٛ‫;)"ِلظ‬ } catch(Exception ex) { MessageBox.Show(ex.Message); } } VB.NET: Private Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Try Dim XMLWriter As XmlTextWriter = New XmlTextWriter("AddressBook.XML", Nothing) XMLWriter.Formatting = Formatting.Indented

~206~


XMLWriter.WriteComment("‫ٓ ٍِف‬٠ٚ‫)"حٌعٕخ‬ XMLWriter.WriteStartElement("AddressBook") XMLWriter.WriteStartElement("Name") XMLWriter.WriteString(tx_Name.Text) XMLWriter.WriteEndElement() XMLWriter.WriteStartElement("Address") XMLWriter.WriteString(tx_Address.Text) XMLWriter.WriteEndElement()

XMLWriter.WriteEndElement() XMLWriter.Flush() XMLWriter.Close() MessageBox.Show("ُ‫)"ط‬ Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Private Sub btnViewXML_Click(ByVal sender As Object, ByVal e As System.EventArgs) Try Dim doc As XmlDocument = New XmlDocument doc.PreserveWhitespace = True doc.Load("AddressBook.xml") MessageBox.Show(doc.InnerXml, "‫خص‬٠ٛ‫)"حٌٍّف ِلظ‬ Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub

~207~


: ٟ٘ٚ ً‫ رؼالػش ِشحك‬web services‫ش حعظخذحَ حٌـ‬١ٍّ‫طّش ع‬ ‫خٔااخص عزااش‬١‫حعااظمزخي حٌز‬ٚ ‫ااظُ ِاآ خالٌااٗ اسعااخي‬٠ ٞ‫حٌااز‬ٚ : The web service server -1 . ASP.NET‫حٌـ‬ٚ IIS‫ رخعظخذحَ حٌـ‬SOAP‫ي حٌـ‬ٛ‫و‬ٛ‫رشط‬ ٝ‫اٌاا‬ٚ ٓ‫خٔااخص ِاا‬١‫ حعااظمزخي حٌز‬ٚ ‫ ربسعااخي‬Client ‫غااّق ٌٍاـ‬٠ ٞ‫حٌااز‬ٚ : The proxy object -2 ‫ ِآ خاالي حٌىاالط‬HttpWebRequest‫ حٌاـ‬ٟ‫فاٗ فا‬٠‫اظُ طعش‬٠ ‫غ‬١‫ ك‬web Services Server‫حٌـ‬ .‫ حٌـضء حٌغخرك‬ٟ‫ٕظٗ ف‬١‫ ِخ ر‬ٛ٘ٚ WebProxy Web ‫اخ رخٌاـ‬ٙ‫اظُ سرط‬٠ ٟ‫حٌظا‬ٚ ْٛ‫اش حٌخخطاش رضرا‬ٙ‫حؿ‬ٌٛ‫ ح‬ٛ‫٘ا‬ٚ : The client application -3 : ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ وّخ ف‬Services Server

: Create a Simple Web Services Application :13.2 ‫اذ‬٠‫ ؿذ‬ASP.NET Web Services ٚ‫َ رعّاً ِشاش‬ٛ‫ ٔما‬web services server ‫إلٔشاخء‬ٚ ‫ااااااااغ حٌىااااااااالط‬٠‫س‬ٛ‫َ رظ‬ٛ‫ ػااااااااُ ٔماااااااا‬System.Web.Services Namespaces ٟ‫ٔغااااااااظذع‬ٚ :‫ وّؼخي‬ٍٟ٠ ‫وّخ‬ٚ ٚ‫ ٌٍّشش‬ٟ‫غ‬١‫ حٌشث‬Class‫ ٌٍـ‬WebService 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; } }

~208~


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 ‫ّاش‬١‫ ِاع حٌم‬ٝ‫ٌا‬ٚ‫ّاش حأل‬١‫َ ربسؿاخ ٔاخطؾ ؿّاع حٌم‬ٛ‫ما‬٠ ‫رعاذ رٌاه‬ٚ B ٚ A ٓ١‫ّظا‬١‫اظُ حعاظمزخي ل‬٠ ‫غ‬١‫ك‬ ً‫ حٌشاى‬ٟ‫اش فا‬ٙ‫ظ‬٠ ‫وّاخ‬ٚ SOAP‫ي حٌاـ‬ٛ‫وا‬ٛ‫ رخعاظخذحَ رشط‬XML ً‫ شى‬ٍٝ‫ ع‬Client‫ حٌـ‬ٌٝ‫ش ا‬١ٔ‫حٌؼخ‬ : ٌٟ‫حٌظخ‬

ٗ‫ اسفخلااا‬ٚ Dll File ٝ‫اااً حٌىاااالط حٌغاااخرك اٌااا‬٠ٛ‫ال طل‬ٚ‫ـاااذ أ‬٠ Client‫إلٔشاااخء رشٔاااخِؾ حٌاااـ‬ٚ : ٍٟ٠ ‫ظُ حعظخذحِٗ وّخ‬٠ٚ Client Resources‫رخٌـ‬

~209~


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); } } } 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 Server ‫حٌااـ‬ٚ Client ‫ٓ حٌااـ‬١‫ راا‬Connection Object ‫ّىاآ أشااخء‬٠ ‫وّااخ‬ ً‫ حٌشاى‬ٟ‫وّاخ فا‬ٚ ٚ‫ حٌّشاش‬ٝ‫ اٌا‬Web Services Reference ‫ظُ رٌه ربػخفش‬٠ٚ ‫رشىً ِزخشش‬ :ٌٟ‫حٌظخ‬

‫رٌاه‬ٚ ‫اذ‬١‫اخص رع‬ٙ‫ ؿ‬ٍٝ‫ ع‬ٚ‫خص أ‬ٙ‫ ٔفظ حٌـ‬ٍٝ‫ ع‬Web Services ‫حء وخٔض حٌـ‬ٛ‫خس ع‬١‫ظُ حالخظ‬٠ ‫غ‬١‫ك‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬ٚ ‫لع‬ٌٍّٛ URL ‫ػع حٌـ‬ٛ‫ر‬

~221~


‫عٕذ٘خ ٔغظط‪١‬ع حعظذعخء حٌـ ‪ Methods‬حٌغخرمش ف‪ ٟ‬حٌزشٔخِؾ وّخ ‪ٚ‬أ‪ٙ‬خ عٍ‪ٔ ٝ‬فظ حٌـ‪ٙ‬خص ‪ ،‬عإز‪ٓ١‬‬ ‫ف‪ ٟ‬حٌـضء حٌظخٌ‪٘ ِٓ ٟ‬زح حٌفظً و‪١‬ف‪١‬ش سرؾ حٌـ ‪ِ ADO.NET‬ع حٌـ ‪ Web Services‬إلسعاخي‬ ‫حٌـ ‪ Result‬وـ ‪ XML‬اٌ‪ ٝ‬حٌـ‪.Client‬‬

‫~‪~220‬‬


‫‪Using ADO.NET With Web Services :13.3‬‬ ‫حعااظخذِٕخ فاا‪ ٟ‬حٌّؼااخي حٌغااخرك حٌااـ ‪ Web Services‬إلسعااخي ر‪١‬خٔااخص اٌاا‪ ٝ‬حٌااـ ‪ِ Client‬غااظخذِخ‬ ‫رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي حٌاـ ‪ٚ ، SOAP‬فا‪٘ ٟ‬ازح حٌّؼاخي عإم‪ َٛ‬ربٔشاخء ‪ٌٕ Web Services‬ماً ر‪١‬خٔاخص ِآ حٌاـ‬ ‫‪ SQL Server Database‬اٌ‪ ٝ‬حٌـ ‪ّ٠ٚ Client‬ىٓ أْ طى‪٘ ْٛ‬زٖ حٌز‪١‬خٔاخص عزاخسس عآ ‪ Text‬أ‪ٚ‬‬ ‫‪ Image‬أ‪ ٚ‬غ‪١‬شٖ ‪ٌٍٚ ...‬زذء عٕم‪ َٛ‬أ‪ٚ‬ال رظؤوذ ِٓ اعذحدحص حٌـ‪ Authentication‬ف‪ ٟ‬حٌـ ‪ٚ IIS‬حٌاـ‬ ‫‪٠ٚ ، SQL Server‬ـاذ أْ طىا‪ ْٛ‬اعاذحدحص حٌاـ ‪ Authentication‬فا‪ ٟ‬حٌاـ‪ IIS‬وّاخ فا‪ ٟ‬حٌشاىً‬ ‫حٌظخٌ‪:ٟ‬‬

‫ك‪١‬اغ ٔلااذد ‪ِ User‬عا‪ٔٚ ٓ١‬عطاا‪ٌ ٟ‬اٗ طااالك‪١‬خص ِع‪ٕ١‬ااش ٌاذخ‪ٛ‬ي عٍاا‪ ٝ‬لخعاذس حٌز‪١‬خٔااخص ‪ٚ‬حٌّ‪ٛ‬ؿاا‪ٛ‬دس‬ ‫عٍاااا‪ ٝ‬حٌااااـ ‪ٔٚ ، SQL Server‬عطاااا‪ٌ ٟ‬ااااٗ ٘اااازٖ حٌظااااالك‪١‬خص ِاااآ حٌااااـ ‪ Security‬ػاااآّ‬ ‫حٌـ‪ Enterprise Manager‬حٌخخص رخٌـ ‪ٚ Microsoft SQL Server‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~222‬‬


‫ػُ ٔذخً حعُ حٌّغظخذَ حٌز‪ ٞ‬كاذدٔخٖ فا‪ ٟ‬حٌاـ ‪ IIS‬ػآّ حٌاـ ‪ Users‬حٌّغاّ‪ٛ‬ف ٌ‪ٙ‬اُ رخٌاذخ‪ٛ‬ي عٍا‪ٝ‬‬ ‫لخعذس حٌز‪١‬خٔخص ‪ٚ‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٌٚ‬ظلذ‪٠‬اااذ حٌظاااالك‪١‬خص ٔخظاااخس لخعاااذس حٌز‪١‬خٔاااخص حٌظااا‪ٔ ٟ‬ش‪٠‬اااذ حعاااظخذحِ‪ٙ‬خ ‪ٔٚ‬لاااذد طاااالك‪١‬خص حٌاااـ‬ ‫‪ٚ Database Access‬حٌـ‪ ِٓ Server Roles‬حٌاـ ‪ٚ SQL Server Login Properties‬وّاخ‬ ‫ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٚ‬رظؤو‪١‬ذ ‪ّ٠‬ىٕه طلذ‪٠‬ذ حٌظالك‪١‬خص حٌظ‪ ٟ‬طش‪٠‬ذ٘خ ‪ٚ‬حٌظ‪ ٟ‬طظٕخعذ ِع حٌزشٔخِؾ حٌز‪ ٞ‬طش‪٠‬ذ أشخثٗ‪.‬‬ ‫‪ٌٍٚ‬زااذء عاإم‪ َٛ‬رعّااً فىااشس رغاا‪١‬طش إلٔشااخء ٔظااخَ ‪ GIS‬رغاا‪١‬ؾ ‪٠‬شعااً حٌااـ ‪ Client‬حعااُ حٌزٍااذ حٌااز‪ٞ‬‬ ‫‪٠‬خظخسٖ ِٓ حٌخخسؽش اٌ‪ ٝ‬حٌاـ‪٠ٚ Web Services Server‬شؿاع حٌاـ ‪ِ Web Services‬عٍ‪ِٛ‬اخص‬

‫~‪~223‬‬


‫ لخعاذس‬ٟ‫ فا‬Table ً‫اش رعّا‬٠‫ حٌزذح‬ٟ‫َ ف‬ٛ‫ف ٔم‬ٛ‫ع‬ٚ Client ‫ حٌـ‬ٌٝ‫خٔخص ا‬١‫عٓ ٘زح حٌزٍذ ِٓ لخعذس حٌز‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬ٚ ‫ِخص عٓ ٘زح حٌزٍذ‬ٍٛ‫ ِع‬ٚ ‫ أعُ حٌزٍذ‬ٍٝ‫ ع‬ٞٛ‫طلظ‬ٚ ‫خٔخص‬١‫حٌز‬

Server ‫حإلفاالص ِآ حٌاـ‬ٚ ‫ رخٌغالذ‬Web Services ‫خٔاخص ِاع حٌاـ‬١‫َ راشرؾ لخعاذس حٌز‬ٛ‫ػاُ عإم‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬ٚ Explorer

Web Services ‫ حٌاـ‬ٝ‫طاش اٌا‬٠‫اٗ ِآ حٌخش‬١ٍ‫َ رؼاغؾ ع‬ٛ‫ما‬٠ ٞ‫ حعاُ حٌزٍاذ حٌاز‬Client ‫شعاً حٌاـ‬١‫ع‬ String ‫طشؿااع‬ٚ ‫حكااذ‬ٚ ‫ظش‬١ِٚ‫ طؤخااز رااخس‬Method ‫ أشااخء‬ٝ‫ ٘اازٖ حٌلخٌااش ٔلاآ رلخؿااش اٌاا‬ٟ‫فاا‬ٚ :ٍٟ٠ ‫وّخ‬ٚ ‫ِخص عٓ ٘زح حٌزٍذ‬ٍٛ‫ ِع‬ٍٝ‫ ع‬ٞٛ‫ طلظ‬Return Value C#: [WebMethod] public string GIS_Country(string country) { try { sqlDataAdapter1.SelectCommand.CommandText = "select * from GIS where Country='"+ country+"'"; DataSet ds = new DataSet (); sqlDataAdapter1.Fill (ds); return ds.Tables[0].Rows[0][1].ToString (); } catch (Exception){return "I Can not Find Your Country! Please Select Another One";} } VB.NET: <WebMethod()> _ Public Function GIS_Country(ByVal country As String) As String Try sqlDataAdapter1.SelectCommand.CommandText = "select * from GIS where Country='" & country & "'"

~224~


Dim ds As DataSet = New DataSet sqlDataAdapter1.Fill(ds) Return ds.Tables(0).Rows(0)(1).ToString() Catch e1 As Exception Return "I Can not Find Your Country! Please Select Another One" End Try End Function ‫ حٌّؼاخي‬ٟ‫وّاخ فا‬ٚ ‫خ‬ٙ‫ طاُ أشاخث‬ٟ‫ حٌظا‬Web Service ‫َ رشرطاٗ ِاع حٌاـ‬ٛ‫ عإم‬Client ‫ ؽاشف حٌاـ‬ٟ‫ف‬ ‫شؿااع ٌٕااخ‬٠ٚ Web Services Method ‫ حٌااـ‬ٝ‫ٌااش اٌاا‬ٚ‫ حعااُ حٌذ‬Client‫ّشس حٌااـ‬١‫عاا‬ٚ ‫حٌغااخرك‬ :ٍٟ٠ ‫ وّخ‬Client‫ْ حٌشىً حٌعخَ ٌٍـ‬ٛ‫ى‬١‫ع‬ٚ ،‫ٌش‬ٚ‫ِخص عٓ حٌذ‬ٍٛ‫ِع‬

Web ‫ حٌـ‬ٌٝ‫شعً حعُ حٌزٍذ ا‬٠ ‫خ‬ٙ١ٍ‫غ عٕذ حٌؼغؾ ع‬١‫ ك‬Areas ًّ‫د وً رٍذ رع‬ٚ‫ذ كذ‬٠‫ع طلذ‬١‫ٔغظط‬ ‫ واً رٍاذ‬ٝ‫ عٍا‬Panel ‫ رابدسحؽ‬ٛ‫ػا‬ٌّٛ‫ عإلً ح‬GDI ‫ذحص حٌاـ‬١‫ ال ٔذخً رظعم‬ٟ‫ٌى‬ٚ ، Services ‫ عٕاذ كاذع‬ٌٟ‫د حٌظاخ‬ٛ‫ْ حٌى‬ٛ‫ى‬١‫ع‬ٚ ، Transparency‫ حٌشفخف حٌـ‬ٌٕٛ‫ش ٌٗ ِٓ ح‬١‫ْ حٌخٍف‬ٌٛ ً‫ٔـع‬ٚ :ٍٟ٠ ‫وّخ‬ٚ ‫ وً رٍذ‬ٍٝ‫عش ع‬ٛ‫ػ‬ٌّٛ‫ ح‬Panel ‫ حٌـ‬ٍٝ‫ ع‬Mouse Down ‫حٌـ‬

~225~


C#: private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { localhost.Service1 sr = new GIS.localhost.Service1 (); this.Text = sr.GIS_Country ("Jordan"); } VB.NET Private Sub panel1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Dim sr As localhost.Service1 = New GIS.localhost.Service1 Me.Text = sr.GIS_Country("Jordan") End Sub ‫سح ِتضال ثؼتذ إدؼتبس٘ب‬ٛ‫ وظت‬Binary Data ‫ إلسجتبع‬Web Services ‫ّىٓ اعتزخذاَ اٌتـ‬٠ٚ ‫تك‬١‫ّىتٓ رطج‬٠ٚ , Streaming ‫ اٌفظتً اٌختبص ثبٌتـ‬ٟ‫ ِب رتُ شتشدٗ فت‬ٛ٘ٚ ‫بٔبد‬١‫ِٓ لبػذح اٌج‬ ٓ‫ ػت‬ٌٟ‫ اٌفظتً اٌزتب‬ٟ‫ش فت‬٠‫زُ اٌذتذ‬١‫ عت‬,‫مخ‬٠‫ثٕفظ اٌطش‬ٚ ASP.NET ‫ اٌـ‬ٍٝ‫ُ ػ‬١٘‫وً ٘زٖ اٌّفب‬ .‫ذ‬١ٔ ‫د‬ٚ‫ اٌذ‬ٟ‫ب ف‬ٙ‫مبر‬١‫رطج‬ٚ Remoting ‫اٌـ‬

~226~


Chapter 15 Remoting & Distributed Systems Programming & Design

- The Distributed Systems Concept & Design  Design a Distributed eCommerce System by Using ASP.NET and Web Services. - Serialization Programming  The Serialization (Classes & Members)  Using BinaryFormatter & SoapFormatter to Serialize Objects & Images Through Network - Remoting Programming  Remoting (Classes & Members)  Using Remoting Applications in Dot Net  Create an Advanced Distributed eLearning System (Remote Class Room)  Create an Advanced Remote Desktop Application With Remote (Mouse/Keyboard) Control Features

~227~


‫‪ , 15‬أ‪ٚ‬ال ‪: The Distributed Systems Concept & Design -‬‬ ‫‪٠‬عشف حٌٕظخَ حٌّ‪ٛ‬ص عٍ‪ ٝ‬حٔٗ ِـّ‪ٛ‬عش ِٓ حألؿ‪ٙ‬ضس حٌظ‪ ٟ‬طعًّ ِع رعؼ‪ٙ‬خ وٕظخَ ‪ٚ‬حكذ رّعٕ‪ٝ‬‬ ‫ط‪ٛ‬ص‪٠‬ع ِ‪ٙ‬خَ حٌزشٔخِؾ عٍ‪ِ ٝ‬ـّ‪ٛ‬عش ِٓ حألؿ‪ٙ‬ضس رل‪١‬غ طعًّ رشىً ِظ‪ٛ‬حص‪ِ ٛ٘ٚ ٞ‬خ ‪٠‬غّ‪ٝ‬‬ ‫رخٌـ‪ Load Balance‬ك‪١‬غ طى‪ٕ٘ ْٛ‬خٌه ٔغخش ِٓ حٌزشٔخِؾ عٍ‪ ٝ‬وً ‪ٚ Server‬طعًّ ِع‬ ‫رعؼ‪ٙ‬خ عٍ‪ ٝ‬أعخط ط‪ٛ‬ص‪٠‬ع حٌلًّ أ‪ ٚ‬رشىً ِظغٍغً رل‪١‬غ طعًّ ِع رعؼ‪ٙ‬خ عٍ‪ ٝ‬أعخط ط‪ٛ‬ص‪٠‬ع‬ ‫حٌّ‪ٙ‬خَ ‪٠ٚ ،‬فؼً ف‪ ٟ‬رشِـ‪١‬خص حألعّخي ‪ Business Applications‬طمغ‪ ُ١‬حٌّ‪ٙ‬خَ حٌظخٌ‪١‬ش وً‬ ‫ِٕ‪ٙ‬خ عٍ‪ِٕ Server ٝ‬فظً‪:‬‬ ‫‪ٚ -1‬حؿ‪ٙ‬ااش حٌّغااظخذَ أ‪ ٚ‬حٌااـ ‪٘ٚ Presentation‬اا‪ ٟ‬حٌ‪ٛ‬حؿ‪ٙ‬ااش حٌظاا‪٠ ٟ‬ظعخِااً ِع‪ٙ‬ااخ حٌضراا‪ ْٛ‬رشااىً‬ ‫ِزخشش‪.‬‬ ‫‪ -2‬حٌـضء حٌز‪ ٌٗ ٞ‬عاللش رطز‪١‬عش رشٔخِؾ حألعّخي‪ٚ Business Tier‬ؿّ‪١‬ع حٌم‪ٛ‬حعذ حٌظ‪ٌٙ ٟ‬خ‬ ‫عاللش رخٌعًّ ِؼً ؽش‪٠‬مش كغخد حٌخظ‪ِٛ‬خص ‪ Discounts‬أ‪ ٚ‬ؽش‪٠‬مش حٌذفع أ‪ ٚ‬ؽش‪٠‬مش ط‪ٛ‬ط‪ً١‬‬ ‫حٌغٍعش ٌضر‪ ْٛ‬أ‪ِ ٚ‬خ شخرٗ‪.‬‬ ‫‪ -3‬حٌـااضء حٌّخظااض ٌلفااع حٌز‪١‬خٔااخص ‪٘ٚ Data Source‬اا‪ ٛ‬حٌـااضء حٌااز‪٠ ٞ‬لظاا‪ ٞٛ‬عٍاا‪ ٝ‬ل‪ٛ‬حعااذ‬ ‫حٌز‪١‬خٔخص ‪ٚ‬حٌظ‪ ٟ‬طلفع عٍ‪ٙ١‬خ ِعٍ‪ِٛ‬خص حٌضرخثٓ أ‪ ٚ‬كغخرخط‪ٚ ُٙ‬وً ِخ ٌٗ عاللش رزٌه‪.‬‬ ‫‪ّ٠ٚ‬ىٓ أْ ‪٠‬ظُ سرؾ وً ِٓ ٘زٖ حألؿضحء ِع رعؼ‪ٙ‬خ حٌزعغ ِغظخذِخ حٌـ)‪ (Web Services‬أ‪ٚ‬‬ ‫حعظخذحِ‪ٙ‬خ وـ ‪ِ ٛ٘ٚ DLL Reference‬خ ر‪ٕ١‬ظٗ ف‪ ٟ‬حٌفظً حٌغخرك ‪Web Services‬‬ ‫‪ٚ ، Programming‬ف‪ ٟ‬وال حٌلخٌظ‪٠ ٓ١‬ـذ حعظخذحَ أعٍ‪ٛ‬د حٌـ ‪ٌ Remoting‬شرؾ ر‪ٓ١‬‬ ‫حٌـ‪ Servers‬حٌّظعذدس ‪ٚ ،‬ع‪ٛ‬ف ٔز‪ ٓ١‬ف‪ ٟ‬حٌـضء حٌظخٌ‪٘ ِٓ ٟ‬زح حٌفظً و‪١‬ف‪١‬ش حٌشرؾ رخعظخذحَ‬ ‫حٌـ‪ٚ Remoting‬و‪١‬ف‪١‬ش حالعظفخدس ِٓ حٌـ ‪ Serialization‬العظخذحَ ِىظزخص حٌـ ‪ٚ Dll‬حٌظ‪ ٟ‬لذ‬ ‫طى‪ِٛ ْٛ‬ؿ‪ٛ‬دس عٍ‪ ٝ‬ؿ‪ٙ‬خص رع‪١‬ذ الكع حٌشىً حٌظخٌ‪:ٟ‬‬

‫طعظزش حٌـ ‪ ِٓ Web Services‬حألِ‪ٛ‬س حٌ‪ٙ‬خِش ‪ٚ‬خخطش رزشِـش حٌٕظُ حٌّ‪ٛ‬صعش ك‪١‬غ ٔم‪ َٛ‬رشرؾ‬ ‫أؿضحء حٌزشٔخِؾ ِع رعؼ‪ٙ‬خ حٌزعغ ‪ٚ‬وّؼخي عٕم‪ َٛ‬رظطز‪١‬ك ٔظخَ ٌششوش طظٕ‪١‬ع حٌعخد حٌلخع‪ٛ‬د‬ ‫طغظخذَ أعٍ‪ٛ‬د حٌز‪١‬ع حإلٌىظش‪) ٟٔٚ‬حٌظـخسس حإلٌىظش‪١ٔٚ‬ش( ‪ ،‬ك‪١‬غ ع‪١‬م‪ َٛ‬حٌضر‪ ْٛ‬رخٌذخ‪ٛ‬ي عٍ‪ٝ‬‬ ‫حٌـ‪ Web Site‬حٌخخص رخٌششوش ‪ٚ‬حٌّزٕ‪ ٟ‬عٍ‪ ٝ‬حٌـ ‪٠ٚ ASP.NET‬لظ‪٘ ٞٛ‬زح حٌّ‪ٛ‬لع عٍ‪ٝ‬‬ ‫حٌّٕظـخص حٌخخطش رخٌششوش ‪ٚ‬حألععخس ٌىً ِٕظؾ ‪ٚ‬طعظّذ حٌششوش رٕه حٌـ ‪ٌ ABC‬ذفع حإلٌىظش‪،ٟٔٚ‬‬ ‫‪ ٚ‬حٌـ ‪ٌ DHL‬ظ‪ٛ‬ط‪ ً١‬حٌّٕظؾ اٌ‪ ٝ‬حٌزٍذ حٌز‪٠ ٞ‬م‪ ُ١‬ف‪ ٗ١‬حٌضر‪ ،ْٛ‬وّخ ‪ٚ‬طمذَ حٌششوش خظ‪ِٛ‬خص رٕغزش‬ ‫‪ٌ % 22‬ضرخثٓ حٌّم‪ ٓ١ّ١‬ف‪ ٟ‬حألسدْ ‪ ٚ‬فٍغط‪ٚ ٓ١‬حٌعشحق ‪ٚ‬ع‪ٛ‬س‪٠‬خ ‪ٚ‬خظ‪ِٛ‬خص طظً اٌ‪% 52 ٝ‬‬ ‫ٌضرخثٓ حٌز‪٠ ٓ٠‬شظش‪ِٕ 3 ْٚ‬ظـخص أ‪ ٚ‬أوؼش ِٓ ِٕظـخص حٌششوش‪.‬‬

‫~‪~228‬‬


‫‪ ٚ‬لزً حٌزذء رزٕخء حٌٕظخَ عٕم‪ َٛ‬رظمغ‪٘ ُ١‬زٖ حٌّ‪ٙ‬خَ عٍ‪ ٝ‬ػالػش أؿضحء ‪ٚ‬وّخ ‪:ٍٟ٠‬‬ ‫‪ٚ -1‬حؿ‪ٙ‬ش حٌّغظخذَ حٌـ ‪ّ٠ٚ Presentation‬ىٓ أْ طى‪ِٛ ْٛ‬لع حٌىظش‪ِ ٟٔٚ‬زٕ‪ ٟ‬عٍ‪ٝ‬‬ ‫حٌـ‪٠ ASP.NET‬لظ‪ ٞٛ‬عٍ‪ ٝ‬ط‪ٛ‬س حٌّٕظـخص ‪ٚ‬ششف ِخظظش عٓ وً ِٕظؾ رخإلػخفش اٌ‪ ٝ‬عٍش‬ ‫حٌّشظش‪٠‬خص حٌـ ‪ٚ Shopping Cart‬حٌظ‪٠ ٟ‬ـّع ف‪ٙ١‬خ حٌضر‪ِ ْٛ‬شظش‪٠‬خطٗ ِٓ حٌّ‪ٛ‬لع ‪ٚ‬حٌم‪ّ١‬ش‬ ‫حإلؿّخٌ‪١‬ش ٌ‪ٙ‬خ‪.‬‬ ‫‪ -2‬حٌـ ‪ِ ٛ٘ٚ Business Part‬مغُ ٕ٘خ عٍ‪ ٝ‬ػالػش أؿضحء ) حٌزٕه‪ٔ،‬ظخَ حٌخظ‪ِٛ‬خص أ‪ٚ‬‬ ‫حٌؼشحثذ ‪ٔ،‬ظخَ حٌظ‪ٛ‬ط‪ DHL ً١‬وّؼخي(‬ ‫‪ -3‬حٌـ ‪ٕ٘ ٛ٘ٚ Data Source Part‬خ لخعذس حٌز‪١‬خٔخص حٌخخطش رخٌششوش ‪ٚ‬حٌظ‪ ٟ‬طمغُ اٌ‪ ٝ‬ؿضأ‪ٓ٠‬‬ ‫)ؿضء ِعٍ‪ِٛ‬خص حٌضرخثٓ ‪ ،‬ؿضء حٌعش‪ٚ‬ع ‪ٚ‬حألععخس(‪.‬‬

‫رٕ‪ :ٗ٠ٛ‬جّ‪١‬غ اٌّؼٍ‪ِٛ‬بد اٌّزؼٍمخ ثبٌششوبد اٌّزو‪ٛ‬سح ٘‪ِ ٟ‬ؼٍ‪ِٛ‬تبد ‪١ّ٘ٚ‬تخ ‪ٚ‬أعتّبء اٌشتشوبد‬ ‫‪ٚ‬اٌجٕ‪ٛ‬ن اٌّ‪ٛ‬ػ‪ٛ‬ػخ فت‪ ٟ‬اٌّضتبي ٘ت‪ ٟ‬أعتّبء ِغتجٍخ ألطتذبث‪ٙ‬ب ‪ٚ‬ال رؼجتش اٌّؼٍ‪ِٛ‬تبد اٌّ‪ٛ‬جت‪ٛ‬دح‬ ‫ػٓ اٌطش‪٠‬مخ اٌّزجؼخ ‪ٚ‬إّٔب رُ رجغ‪١‬ط‪ٙ‬ب لذس اإلِىبْ ٌغب‪٠‬بد اٌزؼٍُ‪.‬‬ ‫ع‪١‬عظّذ أعٍ‪ٛ‬د حٌشرؾ ر‪٘ ٓ١‬زٖ حألٔظّش عٍ‪ ٝ‬حٌـ ‪ Web Services‬ك‪١‬غ ع‪ٛ١‬فش رٕه حٌـ ‪ABC‬‬ ‫حٌـ ‪ Web Service‬حٌخخطش رؤعٍ‪ٛ‬د حٌذفع حإلٌىظش‪ٚ ٟٔٚ‬عظ‪ٛ‬فش حٌـ ‪ DHL‬حٌـ ‪Web Service‬‬ ‫حٌخخطش رظ‪ٛ‬ط‪ ً١‬حٌّٕظؾ ‪ٚ‬ع‪١‬ظُ سرؾ ٘زٖ حٌـ ‪ Web Services‬رخٌّ‪ٛ‬لع حإلٌىظش‪ٚ ٟٔٚ‬عٕفظشع‬ ‫أْ حٌزٕه ع‪١‬لظخؽ حٌّعٍ‪ِٛ‬خص حٌظخٌ‪١‬ش إلطّخَ عٍّ‪١‬ش حٌذفع‪:‬‬ ‫‪Field Name‬‬ ‫حعُ حٌضر‪(Full Name) ْٛ‬‬ ‫حٌعٕ‪ٛ‬حْ )‪ + (Full Address‬سلُ حٌ‪ٙ‬خطف‬ ‫‪ٚ‬حٌفخوظ ‪...‬‬ ‫سِض حٌذ‪ٌٚ‬ش ‪ ٚ‬حٌّذ‪ٕ٠‬ش )‪(Zip Code‬‬ ‫سلُ رطخلش حالثظّخْ ع‪ٛ‬حء وخْ ‪MasterCard,‬‬ ‫‪VISA, Discover , American‬‬ ‫‪ Express‬أ‪ ٚ‬غ‪١‬شٖ‬ ‫حٌّزٍت حٌّ‪ٛ‬د‬ ‫سلُ حٌلغخد حٌخخص رخٌششوش‬

‫‪Data Type‬‬ ‫‪String‬‬ ‫‪String‬‬ ‫‪Integer‬‬ ‫‪String‬‬

‫‪Float‬‬ ‫‪String‬‬

‫‪ٚ‬عظى‪ ْٛ‬حٌـ ‪ Method‬رخٌـ ‪ Web Services‬حٌخخطش رخٌزٕه وّخ ‪ ٍٟ٠‬وّؼخي‪:‬‬ ‫‪C#‬‬ ‫]‪[WebMethod‬‬ ‫‪public bool Bank_Tier(string Customer_Name,string Address,int‬‬ ‫‪zip_code,string payment_method,string ecard_number,float‬‬ ‫)‪depositor,string acount_number‬‬ ‫{‬ ‫‪// Check if the eCard number is correct‬‬ ‫‪// Check if the Account is Available‬‬ ‫‪// Do The Transaction‬‬ ‫‪// Return if the Transaction Done Successfully or not‬‬ ‫}‬

‫~‪~229‬‬


VB.NET <WebMethod()> _ Public Function Bank_Tier(ByVal Customer_Name As String, ByVal Address As String, ByVal zip_code As Integer, ByVal payment_method As String, ByVal ecard_number As String, ByVal depositor As Single, ByVal acount_number As String) As Boolean ' Check if the eCard number is correct ' Check if the Account is Available ' Do The Transaction ' Return if the Transaction Done Successfully or not End Function DHL ‫ٍّه حٌـ‬٠ ‫غ‬١‫ ك‬DHL Customers Table ‫ حٌـ‬ٟ‫خ ف‬ٍٙ١‫عٕفظشع أْ حٌششوش لذ طُ طغـ‬ DHL‫طٍذ حٌـ‬١‫ْ ع‬٢‫ح‬... (ٗ‫ِخ شخر‬ٚ ‫خ‬ٙٔ‫ح‬ٕٛ‫ع‬ٚ ‫ِخص حٌىخٍِش عٓ حٌششوش )ِؼً سلُ حٌلغخد‬ٍٛ‫حٌّع‬ :ْٛ‫ حٌضر‬ٌٝ‫ً حٌغٍعش ا‬١‫ط‬ٛ‫ِخص ٌظ‬ٍٛ‫٘زٖ حٌّع‬ Data Type String String Integer String String Float

Field Name (Full Name) ْٛ‫حعُ حٌضر‬ ‫خطف‬ٌٙ‫ سلُ ح‬+ (Full Address) ْ‫ح‬ٕٛ‫حٌع‬ ... ‫حٌفخوظ‬ٚ (Zip Code) ‫ٕش‬٠‫ حٌّذ‬ٚ ‫ٌش‬ٚ‫سِض حٌذ‬ ‫خ‬ِٕٙ ‫ طُ حٌششحء‬ٟ‫حعُ حٌششوش حٌظ‬ (Primary Kay) Email ٟٔٚ‫ذ حإلٌىظش‬٠‫حٌزش‬ (‫ي‬ٛ‫د )حٌّل‬ٍٛ‫ حٌّزٍت حٌّط‬ٟ‫طخف‬ ‫ طلغذ‬ٜ‫ أخش‬method ِٓ ٗ‫ظُ ِعشفظ‬١‫)ع‬

ٞ‫ حٌزٍذ حٌز‬ٌٝ‫ً حٌغٍعش ا‬١‫ط‬ٛ‫رش ٌظ‬ٍٛ‫ّش حٌّط‬١‫حٌم‬ (ْٛ‫ٗ حٌضر‬١‫ُ ف‬١‫م‬٠

:‫ وّؼخي‬ٍٟ٠ ‫ وّخ‬DHL ‫ حٌخخطش رخٌـ‬Web Services ‫ رخٌـ‬Method ‫ْ حٌـ‬ٛ‫عظى‬ٚ C#: [WebMethod] public string DHL_Tier(string Customer_Name,string Address,int zip_code,string company_name,string email,float cost, int quantity) { // Check the Company Account // Store all information about the Customer // Do The Transaction // if the Transaction Done Successfully // it Return The Number of Days that Need to Deliver the Product to Customer }

~231~


VB.NET <WebMethod()> _ Public Function DHL_Tier(ByVal Customer_Name As String, ByVal Address As String, ByVal zip_code As Integer, ByVal company_name As String, ByVal email As String, ByVal cost As Single, ByVal quantity As Integer) As String ' Check the Company Account ' Store all information about the Customer ' Do The Transaction ' if the Transaction Done Successfully ' it Return The Number of Days that Need to Deliver the Product to Customer End Function :‫ش‬١ٌ‫ِخص حٌظخ‬ٍٛ‫ظطٍذ ِٕٗ ادخخي حٌّع‬١‫لع ع‬ٌّٛ‫ ح‬ٟ‫ً ف‬١‫ْ حٌظغـ‬ٛ‫ صر‬ٞ‫ذ أ‬٠‫ش‬٠ ‫ٌزٌه عٕذِخ‬ Data Type String String String Integer String

Field Name (Full Name) ْٛ‫حعُ حٌضر‬ (Password) ‫س‬ٚ‫وٍّش حٌّش‬ (Primary Kay) Email ٟٔٚ‫ذ حإلٌىظش‬٠‫حٌزش‬ ‫خطف‬ٌٙ‫ سلُ ح‬+ (Full Address) ْ‫ح‬ٕٛ‫حٌع‬ ... ‫حٌفخوظ‬ٚ (Zip Code) ‫ٕش‬٠‫ حٌّذ‬ٚ ‫ٌش‬ٚ‫سِض حٌذ‬

‫ق‬ٛ‫ عشراش حٌظغا‬ٟ‫ رعاذ )فا‬ٜ‫اش حٌّشاظش‬١‫غ‬ٚ ( ‫خ‬ٙ‫ طُ ششحث‬ٟ‫خص حٌششحء )حٌغٍع حٌظ‬١ٍّ‫ع ع‬١ّ‫طغـً ؿ‬ٚ ‫ي‬ٛ‫ حٌلما‬ٝ‫ عٍا‬ٞٛ‫عاظلظ‬ٚ Storage Tier ‫ حٌـ‬ٟ‫دس ف‬ٛ‫ؿ‬ِٛ ‫خٔخص‬١‫ لخعذس ر‬ٍٝ‫( ع‬shopping Cart :‫ش‬١ٌ‫حٌظخ‬ Data Type Field Name String (Foreign Kay) Email ٟٔٚ‫ذ حإلٌىظش‬٠‫حٌزش‬ String ٚ‫ أ‬Barcode (Foreign Kay) ‫د ٌغٍعش‬ٛ‫حٌزخس و‬ Integer ‫د‬ٍٛ‫حٌعذد حٌّط‬ Date/Time ‫لض حٌطٍذ‬ٚ​ٚ ‫خ‬٠‫طخس‬ Date/Time ُ١ٍ‫لض حٌظغ‬ٚ​ٚ ‫خ‬٠‫طخس‬ Float ‫د‬ٍٛ‫ حٌّزٍت حٌّط‬ٟ‫طخف‬ String Check or Bank ) ‫مش حٌذفع‬٠‫ؽش‬ (Transfer.. String (DHL For Example) ُ١ٍ‫مش حٌظغ‬٠‫ؽش‬ Boolean (True/False) (Statues) ‫ً٘ طُ حٌذفع أَ ال‬

~230~


‫سس‬ٛ‫ ط‬ٌٝ‫خص رخإلػخفش ا‬١ّ‫حٌى‬ٚ ‫فشس‬ٛ‫ حٌغٍع حٌّظ‬ٍٝ‫ ع‬ٞٛ‫لظ‬٠ ‫ آخش‬Table ‫د‬ٛ‫ؿ‬ٚ ‫عٕفظشع‬ٚ :‫حٌغٍعش‬ Data Type Field Name String ٚ‫ أ‬Barcode (Primary Kay) ‫د ٌغٍعش‬ٛ‫حٌزخس و‬ String ‫حعُ حٌغٍعش‬ Integer ‫فش‬ٛ‫حٌعذد حٌّظ‬ Binary ‫سس حٌغٍعش‬ٛ‫ط‬ ً‫زش ٌى‬٠‫حٌؼش‬ٚ ‫ٌش‬ٚ‫ سِض حٌذ‬ٍٝ‫ ع‬ٞٛ‫غ طلظ‬١‫ ك‬Tax ‫زش‬٠‫ ٌلغخد حٌؼش‬ٜ‫خٔخص أخش‬١‫لخعذس ر‬ٚ :‫ٌش‬ٚ‫د‬ Data Type Field Name Integer (Zip Code) ‫ٕش‬٠‫ حٌّذ‬ٚ ‫ٌش‬ٚ‫سِض حٌذ‬ Float Tax ‫زش‬٠‫حٌؼش‬ :‫ٌش‬ٚ‫ف ٌىً د‬ّٕٛ​ٌّ‫ ح‬Discount ُ‫حٌخظ‬ٚ ‫ٌش‬ٚ‫ حعُ حٌذ‬ٍٝ‫ ع‬ٞٛ‫لظ‬٠ ‫ي آخش‬ٚ‫ؿذ‬ٚ Data Type Field Name Integer (Zip Code) ‫ٕش‬٠‫ حٌّذ‬ٚ ‫ٌش‬ٚ‫سِض حٌذ‬ Float discount ُ‫حٌخظ‬ ‫ااخ رظاافلش‬ٙ‫سرط‬ٚ ‫ِااخص حٌعّااالء‬ٍٛ‫ ِع‬ٝ‫ عٍاا‬ٞٛ‫ طلظاا‬ٟ‫خٔااخص حٌظاا‬١‫ رٕااخء لخعااذس حٌز‬ٝ‫ْ عاإلظخؽ اٌاا‬٢‫ح‬ٚ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬ٚ ASP.NET

‫خٔخص حٌّذخٍاش‬١‫ال حٌظلمك ِٓ طلش حٌز‬ٚ‫ظُ أ‬٠ ْ‫ـذ أ‬٠ Register Me Now ‫ حٌـ‬ٍٝ‫رعذ حٌؼغؾ ع‬ : ‫خٔخص‬١‫ لخعذس حٌز‬ٌٝ‫ِخص ا‬ٍٛ‫ػُ ادخخي حٌّع‬ C#: try { // Check if All Information is Correct if Yes do: sqlConnection1.Open(); sqlCommand1.CommandText = "insert into Clients_info values('"+Email_TextBox.Text+"','"+Pass_TextBox.Text+"','"+Name_T extBox.Text+"',"+Zipcode_TextBox.Text + ",'"+address_TextBox.Text+"')";

~232~


sqlCommand1.ExecuteNonQuery(); Response.Redirect("http://www.fadidotnet.org/welcome.aspx"); } catch(Exception ex){msg_txt.Text = ex.Message;} finally{sqlConnection1.Close (); } VB.NET Try „ Check if All Information is Correct if Yes do: sqlConnection1.Open() sqlCommand1.CommandText = "insert into Clients_info values('" & Email_TextBox.Text & "','" & Pass_TextBox.Text & "','" & Name_TextBox.Text & "'," & Zipcode_TextBox.Text & ",'" & address_TextBox.Text & "')" sqlCommand1.ExecuteNonQuery() Response.Redirect("http://www.fadidotnet.org/welcome.aspx") Catch ex As Exception msg_txt.Text = ex.Message Finally sqlConnection1.Close () End Try ‫اخس‬١‫ّىٕاه حخظ‬٠ ‫غ‬١‫ حٌّٕظـخص حٌخخطش رخٌششوش ك‬ٍٝ‫ ع‬ٞٛ‫ طلظ‬ٟ‫ حٌظفلش حٌظ‬ٌٝ‫ٕظمً ا‬١‫رعذ رٌه ع‬ٚ ...‫خص‬٠‫ عٍش حٌّشظش‬ٟ‫خ ف‬ٙ‫ظُ كفظ‬٠ٚ ‫خ‬ٙ‫ذ ششحث‬٠‫ طش‬ٟ‫حٌغٍعش حٌظ‬

ّٓ‫خ ػااا‬ٙ‫طاااف‬ٛ‫ ر‬Client Information Table ‫صعاااش فظاااً حٌاااـ‬ٌّٛ‫ حألٔظّاااش ح‬ٟ‫اااظُ فااا‬٠ ُ‫اظ‬٠ٚ Business Tire ٗ‫ِاخ شاخر‬ٚ ‫س حٌّظعٍماش رخٌشاشحء‬ٛ‫اش حألِا‬١‫ عآ رم‬Presentation Tier‫حٌاـ‬ ‫ حٌخاخص رخٌشاشوش‬ASP.NET ‫ حٌاـ‬ٚ‫شرؾ ِع ِشاش‬٠ Web Services َ‫عخ رخعظخذح‬١ّ‫خ ؿ‬ٙ‫سرط‬ ٓ١‫فظشع حٌفظً حٌظاخَ را‬٠ٚ ، ‫ آخش‬ٌٝ‫ ِٓ ٔظخَ ا‬Serialization Object ‫ِخص وـ‬ٍٛ‫طشعً حٌّع‬ٚ ْٚ‫ش د‬١‫ّاش طاخف‬١‫ ل‬Remote Method ً‫اغ عاظشؿع وا‬١‫ص ك‬ٛ‫وً ؽزمش ِٓ ؽزماخص حٌٕظاخَ حٌّا‬ :ٌٟ‫ الكع حٌشىً حٌظخ‬،‫ّش‬١‫ش حعظخشحؽ ٘زٖ حٌم‬١‫ف‬١‫خس و‬ٙ‫اظ‬

~233~


: Business Tier Web Services ‫ حٌـ‬ٟ‫ف‬ ٝ‫ حٌؼشحثذ( اٌا‬ٚ ‫ِخص‬ٛ‫ حٌخظ‬ٚ ‫ع‬١‫ )ٔظخَ حٌز‬ٍٝ‫ ع‬ٞٛ‫ طلظ‬ٟ‫حٌظ‬ٚ Web Services ‫طشؿع ٘زٖ حٌـ‬ ٓ‫ااخسٖ شااشحء عااٍعش ِاا‬١‫ْ رعااذ حخظ‬ٛ‫رااش ِاآ حٌضراا‬ٍٛ‫ش حٌّط‬١‫ّااش حٌظااخف‬١‫ حٌم‬Presentation Tier ‫حٌااـ‬ ٝ‫ عٍا‬ٞٛ‫لظ‬١‫ عا‬ٟٔ‫حٌؼخ‬ٚ ‫ٌش‬ٚ‫ سِض حٌذ‬ٍٝ‫ ع‬ٞٛ‫لظ‬١‫ي ع‬ٚ‫ظشحص حأل‬١ِٚ‫غ عظؤخز أسرعش رخس‬١‫لع ك‬ٌّٛ‫ح‬ ٝ‫ عٍا‬ٞٛ‫لظ‬١‫حٌشحراع عا‬ٚ ‫ حٌخخص رخٌغٍعش‬Barcode ‫ حٌـ‬ٍٝ‫حٌؼخٌغ ع‬ٚ ْٛ‫ حٌخخص رخٌضر‬Email ‫حٌـ‬ ُ‫اظ‬٠ٚ ‫ْ ٌشاشحء حٌغاٍعش‬ٛ‫رش ِٓ حٌضرا‬ٍٛ‫ش حٌّط‬١‫ّش حٌظخف‬١‫ حٌم‬Method ‫طشؿع ٘زٖ حٌـ‬ٚ ‫مش حٌذفع‬٠‫ؽش‬ :ٍٟ٠ ‫خ وّخ‬ّٙ١ّ‫طظ‬ C# [WebMethod] public float Business_Tier_Get_Net_Cost (int zip_code,string email,string barcode,string payment_method,int quantity) { float tax = Calculate_Tax(email,zip_code,barcode,quantity); float dicount = Calculate_Discount(email,zip_code,barcode,quantity); float DHL_Cost = DHL_Cost(Products_barcode,Product_weighing,Company_ID,quantity; float Product_Cost = Product(barcode,quantity); return (Product_Cost + tax + DHL_Cost) - dicount; } VB.NET <WebMethod()> _ Public Function Business_Tier_Get_Net_Cost(ByVal zip_code As Integer, ByVal email As String, ByVal barcode As String, ByVal payment_method As String, ByVal quantity As Integer) As Single Dim tax As Single = Calculate_Tax(email, zip_code, barcode, quantity) Dim dicount As Single = Calculate_Discount(email, zip_code, barcode, quantity) Dim DHL_Cost As Single = DHL_Cost(Products_barcode, Product_weighing, Company_ID, quantity) Dim Product_Cost As Single = Product(barcode, quantity) Return (Product_Cost + tax + DHL_Cost) - dicount End Function

~234~


ٝ‫ عٍا‬ٞٛ‫ طلظا‬ٟ‫ حٌظافلش حٌظا‬ٝ‫لاع اٌا‬ٌّٛ‫ٕظمً راٗ ح‬١‫ شاشحء حٌغاٍعش عا‬ٝ‫ْ عٍا‬ٛ‫حفمش حٌضر‬ِٛ ‫ كخٌش‬ٟ‫ف‬ٚ ‫ حٌخخطااش‬Web Service ‫ عزااش حٌااـ‬Server ‫ حٌااـ‬ٝ‫ُ اٌاا‬١‫ااش حٌماا‬٠‫ااظُ طّش‬٠ ‫ااغ‬١‫ ك‬، ‫ِااخص حٌزٕااه‬ٍٛ‫ِع‬ :ٍٟ٠ ‫وّخ‬ٚ ‫رخٌزٕه‬ C#: [WebMethod] public bool Payment (string Customer_Name,string Address,int zip_code,string payment_method,string ecard_number,string acount_number) { Return Bank_Tier( Customer_Name, Address, zip_code, payment_method, ecard_number, Net_Cost, acount_number); } VB.NET: <WebMethod()> _ Public Function Payment(ByVal Customer_Name As String, ByVal Address As String, ByVal zip_code As Integer, ByVal payment_method As String, ByVal ecard_number As String, ByVal acount_number As String) As Boolean Return Bank_Tier(Customer_Name, Address, zip_code, payment_method, ecard_number, Net_Cost, acount_number) End Function ٚ‫اش أ‬ٙ‫اش ِٕفظاٍش عآ حٌـ‬ٙ‫صعش فبْ وً خذِش ِٓ حٌخاذِخص طعّاً رـ‬ٌّٛ‫ حٌٕظُ ح‬ٟ‫وّخ الكظٕخ ف‬ٚ ‫ حٌـاضء‬ٟ‫ عإظلذع فا‬...‫حكاذ‬ٚ َ‫ ٔظاخ‬ٟ‫اخ فا‬ٙٔ‫وؤ‬ٚ ‫عخ‬١ّ‫طعًّ ؿ‬ٚ ،ْٛ‫خ حٌضر‬ٙ‫ظعخًِ ِع‬٠ ٟ‫ش حٌظ‬ٙ‫حؿ‬ٌٛ‫ح‬ ُ‫حٌاإظ‬ٚ ‫ااخص حٌشاازىخص‬١‫ رشِـ‬ٟ‫ااخ فاا‬ٙ‫مخط‬١‫ططز‬ٚ Remoting‫حٌااـ‬ٚ Serialization ‫ عاآ حٌااـ‬ٌٟ‫حٌظااخ‬ .‫صعش‬ٌّٛ‫ح‬

~235~


: The Serialization Programming - ‫ب‬١ٔ‫صب‬ ً‫ عّا‬Serialization‫ّىٕ​ٕاخ ِآ خاالي حٌاـ‬٠ : The Serialization Classes & Members Stream ‫اش رخعاظخذحَ حٌاـ‬١ٍ‫حء عزاش حٌشازىش حٌّل‬ٛ‫ آخش ع‬ٌٝ‫خص ا‬ٙ‫ ِٓ ؿ‬Object‫ ٌـ‬Serializing ‫ّىٕ​ٕخ حعاظخذحَ حٌاـ‬٠ٚ ، Remoting‫حٌـ‬ٚ WebServices‫ عزش حإلٔظشٔض رخعظخذحَ حٌـ‬ٚ‫ أ‬Socket System.Runtime.Serialization ‫ااااض ِاااآ خااااالي حٌااااـ‬١ٔ ‫ص‬ٚ‫ حٌااااذ‬ٟ‫ فاااا‬Serialization ٟ‫حٌظاا‬ٚ Classes‫ عااذد ػااخُ ِاآ حٌااـ‬ٝ‫ عٍاا‬Namespace ‫ ٘اازح حٌااـ‬ٞٛ‫لظاا‬٠ ‫ااغ‬١‫ ك‬Namespace ‫ي‬ٚ‫ٓ حٌـاذ‬١‫ز‬٠ٚ ،‫ش‬١ٍ‫ حٌشزىش حٌّل‬ٚ‫ عزش حإلٔظشٔض أ‬Object ٞ‫ أل‬Serialization ًّ‫ ع‬ٟ‫طغخعذ ف‬ :‫صعش‬ٌّٛ‫ رٕخء حٌٕظُ ح‬ٟ‫خ ف‬ِٕٙ ‫ّىٕ​ٕخ حالعظفخدس‬٠ ٟ‫حٌظ‬ٚ Classes ‫ أُ٘ ٘زٖ حٌـ‬ٌٟ‫حٌظخ‬ ًّ‫ش ٌع‬١‫غ‬١‫ظخثف حٌشث‬ٌٛ‫ وً ح‬ٍٝ‫ ع‬Class ‫ ٘زح حٌـ‬ٞٛ‫لظ‬٠ٚ Serialize ‫غظخذَ حٌـ‬٠ ‫خ‬ِٕٙٚ Object ٞ‫ أل‬Serialization Stream ‫ عزش حٌـ‬Object Serializing ‫ إلسعخي‬Method Serializing ‫ طغظخذَ ٌالعظمزخي حٌـ‬ٟ‫حٌظ‬ٚ Deserialize ‫حٌـ‬ٚ .ٜ‫ ِشس أخش‬Object ٌٝ‫ٍٗ ا‬٠ٛ‫ طل‬ٚ Stream‫ ِٓ حٌـ‬Object ‫ي‬ٛ‫و‬ٛ‫ط‬ٚ‫ٓ ّ٘خ حإلسعخي عزش رش‬١‫ع‬ٛٔ ‫ش حإلسعخي‬١ٍّ‫طؤخز ع‬ٚ Namespace ‫ ػّٓ حٌـ‬ٟ‫ؤط‬٠ٚ Soap ‫حٌـ‬ ‫غ‬١‫ ك‬System.Runtime.Serialization.Formatters.Soap ً‫ حٌفظ‬ٟ‫ٕخ ف‬١‫لذ ر‬ٚ ٚ‫ ٌٍّشش‬Reference ‫ حٌـ‬ٌٝ‫ـذ اػخفظٗ ا‬٠ Object ‫ي حٌـ‬ٛ‫ل‬٠ ‫غ‬١‫ ك‬SOAP ‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫ش عًّ رش‬١‫ف‬١‫حٌغخرك و‬ ً٠ٛ‫ رظل‬ٟ٘ ‫ش‬١ٔ‫مش حٌؼخ‬٠‫حٌطش‬ٚ ، XML Serial Stream ٌٝ‫ا‬ ّٓ‫ ػ‬ٟ‫ؤط‬٠ٚ Binary Serial Stream ٌٝ‫ ا‬Object‫حٌـ‬ : Namespace‫حٌـ‬ System.Runtime.Serialization.Formatters.Binary .ً‫ ٘زح حٌفظ‬ٟ‫ حألِؼٍش حٌمخدِش ف‬ٟ‫ً ف‬١‫ظُ ششكٗ رخٌظفظ‬١‫ ع‬ٞ‫حٌز‬ٚ ‫حٌـ‬ٚ IFormatter Interface ‫ حٌـ‬ٍٝ‫ ع‬ٞٛ‫لظ‬٠ ‫غ‬١‫ك‬ ‫ً حٌـ‬١‫خص طّؼ‬١ٍّ‫ ع‬ٟ‫ّخ ف‬ِٙ‫ ألعظخذ‬IConvertible Interface ... Serializing Stream ‫ّىٓ اسعخٌٗ عزش حٌـ‬٠ ٝ‫ كظ‬Object ‫ ٘زح‬ٞٛ‫لظ‬٠ ‫غ‬١‫ ك‬Object ٞ‫ أل‬ٟ‫حث‬ٛ‫ عش‬ID ُ‫ذ سل‬١ٌٛ‫غظخذَ ٌظ‬٠ٚ ٍٟ‫ذ سلُ طغٍغ‬١ٌٛ‫َ رظ‬ٛ‫م‬٠ ‫ي‬ٚ‫ حأل‬Tow Methods ٍٝ‫ ع‬Class ‫حٌـ‬ ‫ حٌخخص رخٌـ‬ID ‫ّش حٌـ‬١‫شؿع ل‬٠ ٟٔ‫حٌؼخ‬ٚ GetID ّٝ‫غ‬٠ Object ‫ٌٍـ‬ ُ‫ّخ حع‬ِٕٙ ً‫ؤخز و‬٠ٚ HasId ّٝ‫غ‬٠ٚ Object ٚ‫ أ‬True ‫ّش‬١‫ل‬ٚ ٌٗ ٍٟ‫ذ سلُ طغٍغ‬١ٌٛ‫ذ ط‬٠‫ ٔش‬ٞ‫ حٌز‬Object ‫حٌـ‬ ‫خ‬ٙ١‫ طُ ف‬ٟ‫ حٌظ‬ٌٝٚ‫ حٌّشس حأل‬ٟ٘ ٖ‫ّخ ارح وخٔض ٘ز‬١‫ذ ف‬٠‫ ٌظلذ‬False ...‫ أَ ال‬Object ‫ ٌٍـ‬ٍٟ‫ذ سلُ طغٍغ‬١ٌٛ‫ط‬ GetId ( object_name,out bool) to Set an ID HasId( object_name,out bool)  to Return the ID ‫ش‬١ٍّ‫خ ٌع‬ٌٙ ‫ّىٓ أْ ٔلظخؽ‬٠ ٟ‫ِخص حٌظ‬ٍٛ‫ وً حٌّع‬ٍٝ‫ ع‬ٞٛ‫لظ‬٠ٚ ‫ ِؼال‬Object ٞ‫ أل‬Deserialize ‫ حٌـ‬ٚ Serialize ‫حٌـ‬ ‫حٌـ‬ٚ FullTypeName ‫ حٌـ‬ٚ AssemblyName Objects ‫ ٌٍـ‬Data Types ‫الص حٌـ‬٠ٛ‫طل‬ٚ MemberCount ...‫ش٘خ‬١‫غ‬ٚ

Formatters , Formatter & FormatterServices

FormatterConverter

ObjectIDGenerator

SerializationInfo

[Serializable] Attribute ‫عااشف رخٌااـ‬٠ ْ‫ال أ‬ٚ‫ـااذ أ‬٠ Serializable Class ٞ‫إلٔشااخء أ‬ ‫ااخ‬ٙ١ٍ‫ ع‬Serializing ً‫ااظُ عّاا‬٠ ْ‫ّىاآ أ‬٠ ٟ‫ حٌظاا‬Classes ‫ ِاآ حٌاـ‬Class‫عااشف أْ ٘اازح حٌااـ‬٠ ‫اغ‬١‫ك‬ :‫ حٌخخص رخٌّؼخي حٌغخرك‬Bank_Tier‫ ٌٍـ‬Serializable Class ًّ‫ وّؼخي ٌع‬ٍٟ٠ ‫وّخ‬ٚ

~236~


C#: [Serializable] public class Bank_Tier { public string Customer_Name; public string Address; public int zip_code; public string payment_method; public string ecard_number; public float depositor; public string acount_number; public Bank_Tier(){// Get_Session_ID();} } VB.NET: <Serializable()> _ Public Class Bank_Tier Public Customer_Name As String Public Address As String Public zip_code As Integer Public payment_method As String Public ecard_number As String Public depositor As Single Public acount_number As String Public Sub New() ' Get_Session_ID() End Sub End Class Binary ‫حء واـ‬ٛ‫ماش حإلسعاخي عا‬٠‫اذ ؽش‬٠‫اش حإلسعاخي الراذ ِآ طلذ‬١ٍّ‫إلٔشخء حٌزشٔاخِؾ حٌخاخص رع‬ٚ ‫د‬ٛ‫ؿاا‬ٌّٛ‫ح‬ٚ BinaryFormatter ‫ي عٕغااظخذَ حٌااـ‬ٚ‫ حأل‬ٟ‫ ففاا‬XML Data ٚ‫ أ‬Stream Data ‫ أِااخ‬System.Runtime.Serialization.Formatters.Binary Namespace‫ػاآّ حٌااـ‬ SOAPFormatter Class ‫حٌّعاشف ػآّ حٌاـ‬ٚ SOAP Protocol ‫غظخذَ ِع حٌاـ‬١‫ فغ‬ٟٔ‫حٌؼخ‬ System.Runtime.Serialization.Formatters.Soap ‫د ػااااآّ حٌاااااـ‬ٛ‫ؿااااا‬ٌّٛ‫ح‬ٚ .Namespace ٓ‫ال ِاا‬ٚ‫ الرااذ أ‬SOAP Formatter ‫ حٌغااخرك رخعااظخذحَ حٌااـ‬Class ‫ ٌٍااـ‬Serialization ً‫ٌعّاا‬ٚ :‫ش‬١ٌ‫ حٌظخ‬Namespaces‫ف حٌـ‬٠‫طعش‬ System.Runtime.Serialization System.Runtime.Serialization.Formatters.Soap ‫ّااخ رعاذ اعاإخد‬١‫ع ف‬١‫ااغ ٔغااظط‬١‫ ك‬Bank Web Services ‫ ِاآ حٌااـ‬Instance ً‫َ رعّاا‬ٛ‫ػااُ ٔماا‬ Bank Server ‫ حٌااـ‬ٝ‫خ اٌاا‬ٌٙ‫ااٗ ػااُ اسعااخ‬١ٌ‫ ا‬Presentation Tier‫ااش ِاآ حٌااـ‬١‫ط‬٢‫ِااخص ح‬ٍٛ‫حٌّع‬ Binary Data ‫اخص واـ‬ٙ‫ حٌـ‬ٝ‫خ عٍا‬ٙ‫ كفظ‬ٚ‫ أ‬NetworkStream‫ حٌـ‬ٚ‫ أ‬Remoting ‫رخعظخذحَ حٌـ‬ ‫ي حٌاـ‬ٛ‫وا‬ٛ‫ط‬ٚ‫ رخعاظخذحَ رش‬XML File ‫ٓ حٌّخشؿاخص راـ‬٠‫ وّؼاخي ٌظخاض‬ٍٟ٠ ‫وّخ‬ٚ XML File ٚ‫أ‬ : SOAP

~237~


C#: Bank_Tier bt = new Bank_Tier(); bt.acount_number = acount_number; bt.Address = Address; bt.depositor=depositor; bt.ecard_number = ecard_number; bt.payment_method = payment_method; bt.zip_code = zip_code; Stream str = new FileStream("bank_result.xml", FileMode.Create, FileAccess.ReadWrite); IFormatter formatter = new SoapFormatter(); formatter.Serialize(str, bt); str.Close(); VB.NET: Dim bt As Bank_Tier = New Bank_Tier bt.acount_number = acount_number bt.Address = Address bt.depositor=depositor bt.ecard_number = ecard_number bt.payment_method = payment_method bt.zip_code = zip_code Dim str As Stream = New FileStream("bank_result.xml", FileMode.Create, FileAccess.ReadWrite) Dim formatter As IFormatter = New SoapFormatter formatter.Serialize(str, bt) str.Close() :ٍٟ٠ ‫وّخ‬ٚ ‫خ‬ٌٙ‫ طُ ادخخ‬ٟ‫خٔخص حٌظ‬١‫ حٌز‬ٍٝ‫ ع‬ٞٛ‫لظ‬٠ XML ‫ ٍِف‬Output ‫ْ حٌـ‬ٛ‫عى‬ٚ - <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAPENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/ "> - <SOAP-ENV:Body> - <a1:Form1_x002B_Bank_Tier id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serializatio n/Serialization%2C%20Version%3D1.0.2309.39316%2C%20C ulture%3Dneutral%2C%20PublicKeyToken%3Dnull">

~238~


<Customer_Name xsi:null="1" /> <Address id="ref-3">Amman Jordan</Address> <zip_code>962</zip_code> <payment_method id="ref-4">Master Card</payment_method> <ecard_number id="ref-5">66-6655-44443355655</ecard_number> <depositor>600</depositor> <acount_number id="ref-6">3399948845</acount_number> </a1:Form1_x002B_Bank_Tier> </SOAP-ENV:Body> </SOAP-ENV:Envelope> َ‫ رخعاظخذح‬ٚ‫ أ‬Network Stream ‫خٔاخص عزاش حٌاـ‬١‫ع حعظخذحَ ٘زح حٌّؼخي إلسعخي حٌز‬١‫ذ ٔغظط‬١‫رظؤو‬ٚ ً‫ شاى‬ٝ‫ عٍا‬Object ٞ‫اً أ‬١‫ ٌظّؼ‬Serialization ‫ّىٕ​ٕاخ حالعاظفخدس ِآ حٌاـ‬٠ ‫ وّخ‬، Remoting ‫حٌـ‬ ...ٜ‫س أخش‬ِٛ‫ أ‬ٟ‫خ ف‬ِٙ‫ العظخذح‬Binary Data ٚ‫ أ‬XML Object ‫ إلسعاخي‬BinaryFormatter Class ‫ش حالعاظفخدس ِآ حٌاـ‬١‫ف‬١‫ و‬ٌٟ‫ حٌّؼخي حٌظخ‬ٟ‫ٓ ف‬١‫عٕز‬ SOAP ‫اش حالعاظفخدس ِآ حٌاـ‬١‫ف‬١‫ٓ و‬١‫ آخش عزش حٌشزىش وّاخ عإز‬ٌٝ‫خص ا‬ٙ‫ ِٓ ؿ‬Binary Data ٚ‫أ‬ ‫اخص‬ٙ‫سس ِآ ؿ‬ٛ‫ذ اسعخي ط‬٠‫وّؼخي ٔش‬ٚ XML Stream‫ وـ‬Binary Data ‫ إلسعخي‬Protocol :ٍٟ٠ ‫وّخ‬ٚ MemoryStream‫ رخعظخذحَ حٌـ‬Binary Stream ٌٝ‫خ ا‬ٍٙ٠ٛ‫ آخش رعذ طل‬ٌٝ‫ا‬ :‫ رشٔخِؾ حإلسعخي‬ٟ‫ ف‬BinaryFormatter ‫ رخعظخذحَ حٌـ‬: ‫ال‬ٚ‫أ‬ C#: using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; . . private void Send_Image_Using_BinaryFormatter { MemoryStream ms = new MemoryStream (); pictureBox1.Image.Save (ms,System.Drawing.Imaging.ImageFormat.Jpeg); object op = (object) ms; BinaryFormatter br = new BinaryFormatter (); TcpClient myclient = new TcpClient ("localhost",5000); NetworkStream myns = myclient.GetStream (); br.Serialize (myns,op); myns.Close (); myclient.Close (); }

~239~


VB.NET Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization . . Private Property Send_Image_Using_BinaryFormatter() As void Dim ms As MemoryStream = New MemoryStream () pictureBox1.Image.Save (ms,System.Drawing.Imaging.ImageFormat.Jpeg) Dim op As Object = CObj(ms) Dim br As BinaryFormatter = New BinaryFormatter Dim myclient As TcpClient = New TcpClient("localhost", 5000) Dim myns As NetworkStream = myclient.GetStream() br.Serialize (myns,op) myns.Close () myclient.Close () End Property :‫ رشٔخِؾ حالعظمزخي‬ٟ‫ ف‬BinaryFormatter ‫حعظخذحَ حٌـ‬ ‫ رشٔاااااخِؾ حالعاااااظمزخي عٕغاااااظخذَ حٌذحٌاااااش حٌّعخوغاااااش‬ٟ‫ فااااا‬BinarFormatter ‫العاااااظخذحَ حٌاااااـ‬ٚ ٝ‫ٌاٗ اٌا‬ٛ‫ٔل‬ٚ ً‫ حٌّغاظمز‬Object ‫ ٌٍاـ‬Casting ً‫َ رعّا‬ٛ‫ ػُ ٔما‬Deserialize ٟ٘ٚ Serialize‫ٌٍـ‬ Picture box ‫ حٌااـ‬ٝ‫ع عشػااٗ عٍاا‬١‫ عٕااذ٘خ ٔغااظط‬، ٜ‫ ِااشس أخااش‬MemoryStream Object : Image Class ‫دس ػّٓ حٌـ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ FromStream Method ‫رخعظخذحَ حٌـ‬ C#: void Image_Receiver() { NetworkStream myns; TcpListener mytcpl; Socket mysocket; Thread myth; mytcpl = new TcpListener (5000); mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); BinaryFormatter br = new BinaryFormatter (); object op; op= br.Deserialize (myns); // Deserialize the Object from Stream MemoryStream mm = (MemoryStream) op; // Casting The Object to MemoryStream Object

~241~


pictureBox1.Image = Image.FromStream(mm); mytcpl.Stop(); if (mysocket.Connected ==true) {while (true){Image_Receiver();}} } . . private void server_Load(object sender, System.EventArgs e) { Thread myth; myth= new Thread (new System.Threading .ThreadStart(Image_Receiver)); myth.Start (); } VB.NET Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization . . Private Sub Image_Receiver() Dim myns As NetworkStream Dim mytcpl As TcpListener Dim mysocket As Socket Dim myth As Thread mytcpl = New TcpListener(5000) mytcpl.Start() mysocket = mytcpl.AcceptSocket() myns = New NetworkStream(mysocket) Dim br As BinaryFormatter = New BinaryFormatter Dim op As Object op = br.Deserialize(myns) ' Deserialize the Object from Stream Dim mm As MemoryStream = CType(op, MemoryStream) ' Casting The Object to MemoryStream Object pictureBox1.Image = Image.FromStream(mm) mytcpl.Stop() If mysocket.Connected = True Then Do While True Image_Receiver() Loop End If End Sub

~240~


. . Private Sub server_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim myth As Thread myth = New Thread(New System.Threading.ThreadStart(AddressOf Image_Receiver)) myth.Start() End Sub :‫ رشٔخِؾ حإلسعخي‬ٟ‫ ف‬SOAP ‫ حعظخذحَ حٌـ‬: ‫خ‬١ٔ‫ػخ‬ ٜ‫سس ِاشس أخاش‬ٛ‫ طا‬ٝ‫ حٌطاشف حٌّمخراً اٌا‬ٟ‫ي فا‬ٛ‫ ػاُ طلا‬XML Data ‫سس وـ‬ٛ‫غ عظشعً حٌظ‬١‫ك‬ :‫ رشٔخِؾ حإلسعخي‬ٟ‫ ف‬ٍٟ٠ ‫وّخ‬ٚ SOAP ‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫ش رخعظخذحَ رش‬١ٍّ‫طظُ ٘زٖ حٌع‬ٚ C#: using System.Runtime.Serialization.Formatters.Soap; using System.Runtime.Serialization; . . private void Send_Image_Using_ SoapFormatter { server fr = new server (); fr.Show(); MemoryStream ms = new MemoryStream (); pictureBox1.Image.Save (ms,System.Drawing.Imaging.ImageFormat.Jpeg); object op = (object) ms; TcpClient myclient = new TcpClient ("localhost",5000); NetworkStream myns = myclient.GetStream (); IFormatter formatter = new SoapFormatter(); formatter.Serialize(myns, op); myns.Close(); } VB.NET: Imports System.Runtime.Serialization.Formatters.Soap Imports System.Runtime.Serialization . . Private void Property SoapFormatter() As Send_Image_Using_ Dim fr As server = New server fr.Show() Dim ms As MemoryStream = New MemoryStream

~242~


pictureBox1.Image.Save (ms,System.Drawing.Imaging.ImageFormat.Jpeg) Dim op As Object = CObj(ms) Dim myclient As TcpClient = New TcpClient("localhost", 5000) Dim myns As NetworkStream = myclient.GetStream() Dim formatter As IFormatter = New SoapFormatter formatter.Serialize(myns, op) myns.Close() End Property :‫ رشٔخِؾ حالعظمزخي‬ٟ‫ ف‬SoapFormatter ‫حعظخذحَ حٌـ‬ Serialize‫ رشٔخِؾ حالعظمزخي عٕغظخذَ حٌذحٌش حٌّعخوغاش ٌٍاـ‬ٟ‫ ف‬SOAP ‫ي حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫العظخذحَ رش‬ٚ ٝ‫ٌاااااٗ اٌااااا‬ٛ‫ٔل‬ٚ ً‫ حٌّغاااااظمز‬Object ‫ ٌٍاااااـ‬Casting ً‫َ رعّااااا‬ٛ‫ ػاااااُ ٔمااااا‬Deserialize ٟ‫٘ااااا‬ٚ Picture box ‫ حٌااـ‬ٝ‫ع عشػااٗ عٍاا‬١‫ عٕااذ٘خ ٔغااظط‬، ٜ‫ ِااشس أخااش‬MemoryStream Object : Image Class ‫دس ػّٓ حٌـ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ FromStream Method ‫رخعظخذحَ حٌـ‬ C#: using System.Runtime.Serialization.Formatters.Soap; using System.Runtime.Serialization; . . void Image_Receiver() { NetworkStream myns; TcpListener mytcpl; Socket mysocket; mytcpl = new TcpListener (5000); mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); object op; IFormatter formatter = new SoapFormatter(); op= formatter.Deserialize(myns); myns.Close(); MemoryStream mm = (MemoryStream) op; pictureBox1.Image = Image.FromStream(mm); mytcpl.Stop(); if (mysocket.Connected ==true) { while (true) {Image_Receiver();} } } .

~243~


. private void server_Load(object sender, System.EventArgs e) { Thread myth; myth= new Thread (new System.Threading .ThreadStart(Image_Receiver)); // Start Thread Session myth.Start (); } VB.NET: Imports System.Runtime.Serialization.Formatters.Soap Imports System.Runtime.Serialization . . Private Sub Image_Receiver() Dim myns As NetworkStream Dim mytcpl As TcpListener Dim mysocket As Socket mytcpl = New TcpListener(5000) mytcpl.Start() mysocket = mytcpl.AcceptSocket() myns = New NetworkStream(mysocket) Dim op As Object Dim formatter As IFormatter = New SoapFormatter op = formatter.Deserialize(myns) myns.Close() Dim mm As MemoryStream = CType(op, MemoryStream) pictureBox1.Image = Image.FromStream(mm) mytcpl.Stop() If mysocket.Connected = True Then Do While True Image_Receiver() Loop End If End Sub . . Private Sub server_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim myth As Thread myth = New Thread(New System.Threading.ThreadStart(AddressOf Image_Receiver)) ' Start Thread Session myth.Start() End Sub Binary ‫خ حٌـ‬ٙ١‫ع‬ٕٛ‫ض ر‬١ٔ ‫ص‬ٚ‫جش حٌذ‬١‫ ر‬ٟ‫ ف‬Serialization ‫ش حعظخذحَ حٌـ‬١‫ف‬١‫ٕخ و‬١‫٘ىزح ر‬ٚ Remoting ‫ ِٓ ٘زح حٌفظً عٓ حٌـ‬ٌٟ‫ حٌـضء حٌظخ‬ٟ‫غ ف‬٠‫ظُ حٌلذ‬١‫ ع‬، XML Data‫حٌـ‬ٚ ...‫صعش‬ٌّٛ‫حٌٕظُ ح‬ٚ ‫خص حٌشزىخص‬١‫ رشِـ‬ٟ‫خ ف‬ِٙ‫حعظخذح‬ٚ

~244~


‫صبٌضب‪: Remoting Programming :‬‬ ‫‪٠‬عظزااش ِ‪ٛ‬ػاا‪ ٛ‬حٌااـ ‪ِ Remoting‬اآ حٌّ‪ٛ‬حػاا‪١‬ع حٌ‪ٙ‬خِااش ؿااذح فاا‪ ٟ‬رشِـااش حٌشاازىخص ‪ ،‬ار ‪٠‬مااذَ ٌٕااخ‬ ‫اِىخٔ‪١‬خص سحثعش ف‪ِ ٟ‬شخسوش ‪ ٚ‬حعظخذحَ حٌـ ‪ٚ Remote Methods‬حٌّ‪ٛ‬ؿ‪ٛ‬دس عٍ‪ ٝ‬حٌـ ‪Remote‬‬ ‫‪ٚ Server‬طشازٗ عٍّ‪١‬اش حٌظعخِاً ِاع حٌاـ‪ Remoting‬عٍّ‪١‬اش حٌاـ ‪ Web Services‬اٌا‪ ٝ‬كاذ وز‪١‬اش‬ ‫ك‪١‬غ ‪٠‬ظطٍذ حعظخذحِ‪ٙ‬خ عّاً ‪ Proxy Object‬فا‪ ٟ‬ؽاشف حٌاـ‪ٌ ،Client‬ىآ ِاع اِىخٔ‪١‬اخص حوزاش‬ ‫ك‪١‬غ طم‪ َٛ‬ربٔشخء حٌـ‪ Server‬رٕفغه ‪ٌٚ‬غض ِؼطشح ٌظؼز‪١‬ض‬ ‫حٌااـ ‪ IIS‬أ‪ ٚ‬غ‪١‬ااشٖ ِاآ حٌظطز‪١‬مااخص حٌ‪ٛ‬عاا‪١‬طش ٌالعااظفخدس ِاآ خااذِخص حٌااـ ‪، Remote Server‬‬ ‫‪ٚ‬طغااااظط‪١‬ع ِاااآ خالٌااااٗ طٕف‪١‬ااااز أ‪ ٞ‬عٍّ‪١‬ااااش ِعخٌـااااش عٍاااا‪ ٝ‬حٌااااـ ‪ِّ Server‬ااااخ ‪٠‬عااااضص ِاااآ ِزااااذأ‬ ‫حٌااـ‪ٚ Distributed Systems‬حٌااز‪ ٞ‬شااشكٕخٖ فاا‪ ٟ‬حٌـااضء حأل‪ٚ‬ي ِاآ ٘اازح حٌفظااً ك‪١‬ااغ طزماا‪ٝ‬‬ ‫حٌـ‪ ٚ methods‬عٍّ‪١‬ش حٌّعخٌـش حٌخخطاش ر‪ٙ‬اخ عٍا‪ ٝ‬حٌاـ ‪ Server‬فا‪ ٟ‬كا‪٠ ٓ١‬اظُ اسعاخي حٌاـ‪Result‬‬ ‫اٌا‪ ٝ‬حٌاـ ‪ Clients‬واـ ‪ XML Data‬أ‪ Binary Data ٚ‬كغاذ لٕاخس حالطظاخي حٌّغاظخذِش عا‪ٛ‬حء‬ ‫‪ HttpChannel‬أ‪ٚ ، TcpChannel ٚ‬طّشس اٌ‪ ٝ‬حٌـ ‪ Client‬عزش حٌاـ ‪ٚ Proxy Object‬حٌاز‪ٞ‬‬ ‫سرؾ حٌـ ‪ Remote Class‬حٌّ‪ٛ‬ؿ‪ٛ‬د عٍ‪ ٝ‬حٌـ ‪ِ Server‬ع حٌـ ‪ Client‬الكع حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪: Using Remoting in Dot Net -1‬‬ ‫‪ّ٠‬ىٓ حعظخذحَ حٌاـ ‪ Remoting‬رطاش‪٠‬مظ‪ ٓ١‬حأل‪ٌٚ‬ا‪ ٝ‬عزاش رش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي حٌاـ ‪ HTTP‬ك‪١‬اغ طاظُ عٍّ‪١‬اش‬ ‫حٌظشحعً وـ ‪ XML Data‬ر‪ ٓ١‬حٌـ ‪ٚ Server‬حٌـ ‪ٚ Clients‬طظُ رخعظخذحَ رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي‬ ‫حٌـ ‪ SOAP‬أِخ حٌطش‪٠‬مش حٌؼخٔ‪١‬ش فظظُ رخعاظخذحَ حٌاـ ‪ TCP Protocol‬ك‪١‬اغ طىا‪ ْٛ‬عٍّ‪١‬اش حٌظشحعاً‬ ‫وااـ ‪ Binary Data‬راا‪ ٓ١‬حٌااـ ‪ٚ Server‬رم‪١‬ااش حٌااـ ‪٠ٚ ، Clients‬فؼااً دحثّااخ حعااظخذحَ حٌااـ ‪TCP‬‬ ‫‪ Channel‬ف‪ ٟ‬حٌلخٌظ‪ ٓ١‬حٌظخٌ‪١‬ظ‪:ٓ١‬‬ ‫حأل‪ :ٌٝٚ‬ارح وخٔض لٕخس حالطظخي عش‪٠‬عش ٔغز‪١‬خ‬ ‫حٌؼخٔ‪١‬ااش‪ :‬ط‪ٛ‬حفم‪١‬اااش حٌز‪١‬جااخص ك‪١‬اااغ طغااظخذَ ٔظاااخَ حٌظشااغ‪ Microsoft Windows ً١‬فااا‪ ٟ‬ؿّ‪١‬اااع‬ ‫حٌـ‪٠ٚ ، clients‬عظزش ٘زٖ حألِش ِٓ أُ٘ ع‪ٛ١‬د حعاظخذحَ حٌاـ ‪ٚ TCP Channel‬خخطاش فا‪ ٟ‬كخٌاش‬ ‫حٌـ‪ Web‬ك‪١‬اغ ال طؼآّ حٌز‪١‬جاش حٌظا‪ ٟ‬عا‪١‬عًّ عٍ‪ٙ١‬اخ حٌاـ‪٠ٚ Client‬فؼاً فا‪٘ ٟ‬ازٖ حٌلخٌاش حعاظخذحَ‬ ‫حٌـ‪ٌ ، HTTP Channel‬ىٓ طزم‪ ٝ‬أدحث‪١‬ش حٌـ ‪ TCP Channel‬أفؼً ِٓ حٌـ ‪... HTTP‬‬ ‫‪ِٚ‬ااخ ‪١ّ٠‬ااض حٌااـ ‪٘ HTTP Channel‬اا‪ ٛ‬حعااظخذحِٗ رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي حٌااـ ‪ٚ SOAP‬حٌااز‪٠ ٞ‬ظعخِااً ِااع‬ ‫حٌـ‪ XML‬ف‪ ٟ‬عٍّ‪١‬ش حٌظشحعً ِّخ ‪٠‬ؼّٓ ط‪ٛ‬حفم‪١‬ظٗ ِع ؿّ‪١‬ع حٌز‪١‬جخص‪.‬‬ ‫‪ٍ٠‬ضَ حعظخذحَ حٌـ ‪ Remoting‬ف‪ ٟ‬حٌذ‪ٚ‬ص ٔ‪١‬ض ػالػش أِ‪ٛ‬س ‪:‬‬ ‫أ‪ٚ‬ال‪ ،‬طلذ‪٠‬ذ ؽز‪١‬عش حٌمٕخس حٌّغظخذِش ع‪ٛ‬حء عزش حٌـ ‪ HTTP‬وـ‪ XML‬أ‪ ٚ‬عزش حٌـ ‪TCP‬‬ ‫وـ‪ٚ Binary Formatter‬دعّض حٌذ‪ٚ‬ص ٔ‪١‬ض وال ِٕ‪ّٙ‬خ ف‪ ٟ‬حٌـ‪HttpChannel Class‬‬ ‫‪ٚ‬حٌّ‪ٛ‬ؿ‪ٛ‬د ػّٓ ‪System.Runtime.Remoting.Channels.Http Namespace‬‬ ‫‪ٚ‬حٌـ‪ٚ TcpChannel Class‬حٌّ‪ٛ‬ؿ‪ٛ‬د ػّٓ‬ ‫حٌـ‪٠) System.Runtime.Remoting.Channels.Tcp Namespace‬ـذ اػخفظٗ اٌ‪ٝ‬‬

‫~‪~245‬‬


Server ‫حٌـ‬ٚ Client ‫ٓ حٌـ‬١‫ وال حٌطشف‬ٟ‫خ ف‬ٙ‫ف‬٠‫ـذ طعش‬٠ ‫غ‬١‫ ك‬،( ٚ‫ حٌّشش‬ٟ‫ ف‬References‫حٌـ‬ :ٍٟ٠ ‫وّخ‬ٚ C#: HttpChannel http_Channel = new HttpChannel(Port_Number); VB.NET: Dim http_Channel As HttpChannel = New HttpChannel(Port_Number) :ٍٟ٠ ‫ وّخ‬TcpChannel ‫ كخٌش حعظخذحَ حٌـ‬ٟ‫ف‬ٚ C#: TcpChannel Tcp_Channel = new TcpChannel(Port_Number); VB.NET: Dim Tcp_Channel As TcpChannel = New TcpChannel(Port_Number) ّٓ‫دس ػ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ RegisterChannel ‫ً حٌمٕخس حٌّغظخذِش رخعظخذحَ حٌذحٌش‬١‫ـذ طغـ‬٠ ‫رعذ رٌه‬ System.Runtime.Remoting.Channels ‫ ػّٓ حٌـ‬ChannelServices Class‫حٌـ‬ :ٍٟ٠ ‫وّخ‬ٚ Server ‫حٌـ‬ٚ Client‫ؼخ حٌـ‬٠‫ٓ أ‬١‫ وال حٌطشف‬ٟ‫ظُ رٌه ف‬٠ٚ ، Namespace C#: ChannelServices.RegisterChannel(chan); VB.NET: ChannelServices.RegisterChannel(chan) َ‫ظُ رٌه رخعظخذح‬٠ٚ Server ‫ حٌـ‬ٍٝ‫ظُ ِشخسوظٗ ع‬١‫ ع‬ٞ‫ حٌز‬Class ‫ف حٌـ‬٠‫ـذ طعش‬٠ ‫رعذ رٌه‬ ّٓ‫دس ػ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ RegisterWellKnownServiceType ‫حٌذحٌش‬ ّٓ‫د ػ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ RemotingConfigurationClass‫حٌـ‬ :Server ‫ ؽشف حٌـ‬ٟ‫ ف‬ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ System.Runtime.Remoting Namespace‫حٌـ‬ C#: RemotingConfiguration.RegisterWellKnownServiceType (Type.GetType ("Class_File_Name, Distributed_Class_Name"), "unique_Service_Name", WellKnownObjectMode.SingleCall); VB.NET: RemotingConfiguration.RegisterWellKnownServiceType (Type.GetType ("Class_File_Name, Distributed_Class_Name"), "unique_Service_Name", WellKnownObjectMode.SingleCall) ‫ي‬ٚ‫ظشحص حأل‬١ِٚ‫ ػالػااش رااخس‬RegisterWellKnownServiceType Method ‫طؤخااز حٌااـ‬ٚ ٗ‫عا‬٠‫ص‬ٛ‫اذ ط‬٠‫ ٔش‬ٞ‫حٌاز‬ٚ ٖ‫ِغاخس‬ٚ Dll File ‫ ِع حعُ حٌاـ‬Remote Class‫ حٌخخص رخعُ حٌـ‬Type‫حٌـ‬ ْٛ‫ىا‬٠ ْ‫ـاذ أ‬٠ٚ ٗ‫عا‬٠‫ص‬ٛ‫اذ ط‬٠‫ ٔش‬ٞ‫ حٌاز‬Object ‫ حٌخخص رخٌـ‬URI ‫ حعُ حٌـ‬ٟٔ‫ظش حٌؼخ‬١ِٚ‫ؤخز حٌزخس‬٠ٚ ‫ؤخاااز‬٠ٚ ، Application Port‫ حٌاااـ‬ٜٛ‫ ِغاااظ‬ٝ‫ عٍااا‬unique ‫اااذ‬٠‫ حعاااُ فش‬URI Object ‫حٌاااـ‬ ‫اازح‬ٙ‫ ف‬SingleCall ‫ااخس‬١‫ فاابرح طااُ حخظ‬Remote Instance Object‫ حٌااـ‬ٛ‫ظش حٌؼخٌااغ ٔاا‬١ِٚ‫حٌزااخس‬ Remote ‫ ِآ حٌاـ‬Instance ‫َ ربٔشاخء‬ٛ‫ما‬٠ Client ً‫اذ ٌىا‬٠‫ ؿذ‬New Instance ‫ أشاخء‬ٟ‫عٕا‬٠ Remote Instance ‫ حعااظخذحَ ٔفااظ حٌااـ‬ٟ‫عٕاا‬٠ ‫اازح‬ٙ‫ ف‬Singleton ‫ااخس‬١‫ارح طااُ حخظ‬ٚ ،Class

~246~


‫ص‬ٛ‫ كخٌاااش واااخْ حٌٕظاااخَ حٌّااا‬ٟ‫ فااا‬SingleCall َ‫ٕظاااق حعاااظخذح‬٠ٚ ،Clients ‫ ٌىاااً حٌاااـ‬Object ‫زغ‬١‫ عا‬Server ‫ كخٌش وخْ حٌاـ‬ٟ‫ ف‬Singleton َ‫ٕظق رخعظخذح‬٠ٚ User ً‫ ٌى‬Session َ‫غظخذ‬١‫ع‬ ٛ‫ااف ٔاا‬٠‫ـااذ طعش‬١‫ ف‬Client ‫ حٌااـ‬ٟ‫ أِااخ فاا‬...‫ حٌشاازىش‬ٝ‫ عٍاا‬Clients ‫ وااً حٌااـ‬ٝ‫ِااخص اٌاا‬ٍٛ‫ٔفااظ حٌّع‬ ٟ‫خ فاا‬ِٙ‫ طااُ حعااظخذ‬ٟ‫ حٌمٕااخس حٌظاا‬ٛ‫ كغااذ ٔاا‬HTTP Channel ٚ‫ أ‬TCP ‫حء‬ٛ‫ عاا‬Channel‫حٌااـ‬ URI ‫ حٌاـ‬ٟ‫ػعٗ فا‬ٛ‫ ر‬ٟ‫ٔىظف‬ٚ Client Channel ‫ حٌـ‬ٟ‫ ف‬Port ‫ػع سلُ حٌـ‬ٚ ُ‫ظ‬٠ ‫ال‬ٚ Server‫حٌـ‬ :ٍٟ٠ ‫ وّخ‬Client ‫ حٌـ‬ٟ‫ف حٌمٕخس ف‬٠‫ظُ طعش‬٠ٚ Object C#: HttpChannel http_Channel = new HttpChannel VB.NET: Dim http_Channel As HttpChannel = New HttpChannel() :ٍٟ٠ ‫ وّخ‬TcpChannel ‫ كخٌش حعظخذحَ حٌـ‬ٟ‫ف‬ٚ C#: TcpChannel Tcp_Channel = new TcpChannel(); VB.NET: Dim Tcp_Channel As TcpChannel = New TcpChannel() :ٍٟ٠ ‫وّخ‬ٚ Server ‫ حٌـ‬ٟ‫ حٌلخي ف‬ٛ٘ ‫ وّخ‬Client ‫ حٌـ‬ٟ‫ ف‬RegisterChannel‫ً حٌمٕخس‬١‫ظُ طغـ‬٠ٚ C#: ChannelServices.RegisterChannel(chan); VB.NET: ChannelServices.RegisterChannel(chan) ْ‫ـاذ أ‬٠ ‫اغ‬١‫ ك‬Remote Client ‫ ِآ حٌاـ‬New Instance Object ‫اف‬٠‫َ رظعش‬ٛ‫رعاذ رٌاه ٔما‬ َٛ‫اغ ٔما‬١‫ ك‬Distributed Class ‫ حٌخاخص رخٌاـ‬Dll File ‫ حٌاـ‬ٝ‫ عٍا‬Client Project‫ حٌـ‬ٞٛ‫لظ‬٠ ‫اخص‬ٙ‫حْ حٌـ‬ٛ‫ظزع رعٕا‬٠ٚ َ‫ حٌّغظخذ‬Protocol ‫ حٌـ‬ٍٝ‫ ع‬ٞٛ‫لظ‬١‫ ع‬ٞ‫حٌز‬ٚ URI ‫ف حٌـ‬٠‫ش رظعش‬٠‫ حٌزذح‬ٟ‫ف‬ ‫اخ‬ٙ‫ف‬٠‫ طاُ طعش‬ٟ‫ حعُ حٌخذِش حٌظا‬ٚ َ‫ حٌّغظخذ‬Port‫ِٓ ػُ سلُ حٌـ‬ٚ Server ‫ حٌخخص رخٌـ‬DNS ‫ حٌـ‬ٚ‫أ‬ :ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ Server ‫ حٌـ‬ٟ‫ف‬ : TCP Channel َ‫ كخٌش حعظخذح‬ٟ‫ف‬ C#: string URI = "Tcp://"+Remote_IP.Text+":Port/ unique_Service_Name ";

~247~


VB.NET: Dim URI As String = "Tcp://" & Remote_IP.Text & ": Port/ unique_Service_Name " : HTTP Channel َ‫ كخٌش حعظخذح‬ٟ‫ف‬ C#: string URI = "Http://"+Remote_IP.Text+": Port / unique_Service_Name"; VB.NET: Dim URI As String = " Http://" & Remote_IP.Text & ": Port / unique_Service_Name " َ‫ظُ رٌه رخعظخذح‬٠ٚ Remote Class ‫ ِٓ حٌـ‬New Instance Object ‫َ ربٔشخء‬ٛ‫رعذ رٌه ٔم‬ٚ ‫خ‬ٌٙ ‫ّٔشس‬ٚ Activator Class ‫د ػّٓ حٌـ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ GetObject Method‫حٌـ‬ :ٍٟ٠ ‫وّخ‬ٚ ، ٖ‫ عشفٕخ‬ٞ‫ حٌز‬URI ‫ حٌـ‬ٚ Distributed Class Type‫حٌـ‬ C#: Distributed_Class_Name obj = (Distributed_Class_Name) Activator.GetObject (typeof (Distributed_Class_Name), URI); VB.NET: Dim obj As Distributed_Class_Name = CType(Activator.GetObject(GetType(Distributed_Class_Name), URI), Distributed_Class_Name) :‫ِالدظخ ٘بِخ‬ ٞ‫ حٌز‬Distributed Class ‫ حٌـ‬ٌٝ‫ ا‬MarshalByRefObject Class ‫غ حٌـ‬٠‫س‬ٛ‫ظُ ط‬٠ ْ‫ـذ أ‬٠ ‫غ‬٠‫س‬ٛ‫عٕذ ط‬ٚ System Namespace ّٓ‫د ػ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ ٗ‫ع‬٠‫ص‬ٛ‫ذ ط‬٠‫ٔش‬ ٚ‫خص أ‬١ٍّ‫ز وخفش حٌع‬١‫ظُ طٕف‬١‫ ع‬Distributed Class ‫ حٌـ‬ٌٝ‫ ا‬MarshalByRefObject‫حٌـ‬ ُ‫ٓ ارح ط‬١‫ ك‬ٟ‫ ف‬ٟ‫خث‬ٌٕٙ‫ ح‬Result ‫ حٌـ‬ٍٝ‫ ع‬Client ‫لظً حٌـ‬١‫ع‬ٚ Server ‫ حٌـ‬ٍٝ‫ ع‬Process‫حٌـ‬ ٓ‫ ٌى‬ٚ Remote Class ‫ظُ حعظخذحَ حٌـ‬١‫ عٕذ٘خ ع‬MarshalByValueObject‫حعظخذحَ حٌـ‬ ... Client Side ‫ حٌـ‬ٍٝ‫ش حٌّعخٌـش ع‬١ٍّ‫عظظُ ع‬ ٟ‫ُ ف‬١٘‫ك ٘زٖ حٌّفخ‬١‫ْ رظطز‬٢‫َ ح‬ٛ‫ض عٕم‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ ف‬Remoting ‫ش حعظخذحَ حٌـ‬١‫ف‬١‫ٕخ و‬١‫٘ىزح ر‬ٚ ‫عطق‬ٚ ‫شح ٌٍّلخػش‬١ِ‫سس حٌىخ‬ٛ‫خ ط‬ٙ١‫زغ ف‬١‫غ ع‬١‫ص ك‬ِٛ ّٟ١ٍ‫ْ ٔظخَ طع‬ٛ‫ى‬١‫ي ع‬ٚ‫ٓ حأل‬١‫ع‬ٚ‫ِشش‬ .‫ي ِظعذدس‬ٚ‫ د‬ٟ‫ٓ ف‬٠‫د‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ ‫ حٌطٍزش‬ٌٝ‫حٌّىظذ حٌخخص رٗ ا‬

~248~


‫أ‪ٚ‬ال‪ :‬إٔشبء ٔظبَ ‪: Distributed eLearning System‬‬ ‫إلٔشخء ٘زح حٌٕظخَ الرذ أ‪ٚ‬ال ِٓ ربٔشخء ‪٠ Distributed Class‬م‪ َٛ‬رعٍّ‪١‬ش حٌظمخؽ ٌظ‪ٛ‬سس عطق‬ ‫حٌّىظذ حٌخخص رخٌـ‪ٚ Server‬رؼ‪ٙ‬خ اٌ‪ ٝ‬حٌـ ‪ِ Client‬غظخذِخ حٌـ ‪ TcpChannel‬ر‪ ٓ١‬حٌـ ‪Server‬‬ ‫‪ٚ‬حٌـ ‪ٚ Client‬عٕفظشع ف‪٘ ٟ‬زح حٌّؼخي أشخء ‪ Remote Classroom‬ك‪١‬غ ‪٠‬م‪ َٛ‬حٌّعٍُ ربٌمخء‬ ‫ِلخػشس اٌ‪ ٝ‬ؽالرٗ ‪٠ٚ‬ظُ رغ ط‪ٛ‬سس حٌىخِ‪١‬شح ‪ٚ‬عطق حٌّىظذ حٌخخص رخٌّعٍُ عزش حإلٔظشٔض اٌ‪ٝ‬‬ ‫حٌطالد ف‪ ٟ‬حٌـ ‪ٚ Classroom‬حٌّ‪ٛ‬ؿ‪ٛ‬د‪ ٓ٠‬ف‪ ٟ‬د‪ٚ‬ي ِظعذدس ‪ٚ‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫عٕغااظخذَ فاا‪٘ ٟ‬اازح حٌّؼااخي حٌااـ ‪ٚ TCP Channel‬حٌااـ ‪ٚ HttpChannel‬عاإمخسْ حألدحء فاا‪ ٟ‬وااً‬ ‫ِٕ‪ّٙ‬خ ‪ ،‬ع‪١‬ى‪ ْٛ‬حٌشىً حٌعخَ ٌٍزشٔخِؾ شز‪ ٗ١‬رخٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~249‬‬


‫أ‪ٚ‬ال رشٔخِؾ حٌّلخػش )‪:(Server Project‬‬

‫رشٔخِؾ حٌـ ‪ّ٠ٚ Client‬ىٓ أْ ‪٠‬ى‪ ِٓ ْٛ‬خالي حإلٔظشٔض ف‪ ٟ‬كخٌش وخْ ٌذ‪٠‬ه ‪ Real IP‬أ‪ٚ‬‬ ‫ف‪ ٟ‬حٌشزىش حٌّلٍ‪١‬ش ‪ٚ‬وّخ ٘‪ِ ٛ‬ز‪ ٓ١‬ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٚ‬إلٔشااخء حٌااـ ‪ٚ Remote Class‬حٌااز‪ ٞ‬عاا‪١‬م‪ َٛ‬رـٍااذ طاا‪ٛ‬سس عااطق حٌّىظااذ ‪ ،‬عٕغااظخذَ د‪ٚ‬حي‬ ‫حٌاااـ‪ِٕٙٚ API‬اااخ حٌاااـ‪ٚ GetDesktopWindow Method‬حٌّ‪ٛ‬ؿااا‪ٛ‬دس ػااآّ حٌاااـ‪user32.dl‬‬ ‫‪ٚ‬حٌاـ‪ٌ BitBlt Method‬شعاُ حٌظا‪ٛ‬سس‪ ،‬ػاُ عإم‪ َٛ‬رظل‪٠ٛ‬اً حٌظا‪ٛ‬سس اٌا‪ٚ Byte Array ٝ‬كظا‪ٝ‬‬ ‫ٔغاااظط‪١‬ع اسعاااخٌ‪ٙ‬خ اٌااا‪ ٝ‬حٌاااـ ‪ٚ ، Clients‬رظؤو‪١‬اااذ عٕغاااظخذَ ؽش‪٠‬ماااش ‪MarshalByRefObject‬‬ ‫‪ٚ‬كظ‪ ٝ‬طظُ عٍّ‪١‬ش حٌظمخؽ ‪ِٚ‬عخٌـش حٌظ‪ٛ‬سس عٍ‪ ٝ‬حٌـ ‪٠ٚ ، Server Side‬ظُ رٌه وّخ ‪:ٍٟ٠‬‬

‫~‪~251‬‬


C#: using System; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.IO; public class ScreenCapture : System.MarshalByRefObject { [DllImport("user32.dll")] private static extern IntPtr GetDesktopWindow(); [DllImport("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, // handle to destination DC int nXDest, // x-coord of destination upper-left corner int nYDest, // y-coord of destination upper-left corner int nWidth, // width of destination rectangle int nHeight, // height of destination rectangle IntPtr hdcSrc, // handle to source DC int nXSrc, // x-coordinate of source upper-left corner int nYSrc, // y-coordinate of source upper-left corner System.Int32 dwRop // raster operation code ); private const Int32 SRCCOPY = 0xCC0020; [DllImport("user32.dll")] private static extern int GetSystemMetrics(int nIndex); private const int SM_CXSCREEN = 0; private const int SM_CYSCREEN = 1; public Size GetDesktopBitmapSize() { return new Size(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); } public byte[] GetDesktopBitmapBytes() { Size DesktopBitmapSize = GetDesktopBitmapSize(); Graphics Graphic = Graphics.FromHwnd(GetDesktopWindow()); Bitmap MemImage = new Bitmap(DesktopBitmapSize.Width, DesktopBitmapSize.Height, Graphic); Graphics MemGraphic = Graphics.FromImage(MemImage); IntPtr dc1 = Graphic.GetHdc();

~250~


IntPtr dc2 = MemGraphic.GetHdc(); BitBlt(dc2, 0, 0, DesktopBitmapSize.Width, DesktopBitmapSize.Height, dc1, 0, 0, SRCCOPY); Graphic.ReleaseHdc(dc1); MemGraphic.ReleaseHdc(dc2); Graphic.Dispose(); MemGraphic.Dispose(); Graphics g = System.Drawing.Graphics.FromImage(MemImage); System.Windows.Forms.Cursor cur = System.Windows.Forms.Cursors.Arrow; cur.Draw(g,new Rectangle(System.Windows.Forms.Cursor.Position.X10,System.Windows.Forms.Cursor.Position.Y10,cur.Size.Width,cur.Size.Height)); MemoryStream ms = new MemoryStream(); MemImage.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg); return ms.GetBuffer(); } } VB.NET Imports System Imports System.Drawing Imports System.Drawing.Imaging Imports System.Runtime.InteropServices Imports System.IO Public Class ScreenCapture : Inherits System.MarshalByRefObject <DllImport("user32.dll")> _ Private Shared Function GetDesktopWindow() As IntPtr End Function <DllImport("gdi32.dll")> _ Private Shared Function BitBlt(ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As System.Int32) As Boolean End Function Private Const SRCCOPY As Int32 = &HCC0020 <DllImport("user32.dll")> _ Private Shared Function GetSystemMetrics(ByVal nIndex As Integer) As Integer End Function

~252~


Private Const SM_CXSCREEN As Integer = 0 Private Const SM_CYSCREEN As Integer = 1 Public Function GetDesktopBitmapSize() As Size Return New Size(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)) End Function Public Function GetDesktopBitmapBytes() As Byte() Dim DesktopBitmapSize As Size = GetDesktopBitmapSize() Dim Graphic As Graphics = Graphics.FromHwnd(GetDesktopWindow()) Dim MemImage As Bitmap = New Bitmap(DesktopBitmapSize.Width, DesktopBitmapSize.Height, Graphic) Dim MemGraphic As Graphics = Graphics.FromImage(MemImage) Dim dc1 As IntPtr = Graphic.GetHdc() Dim dc2 As IntPtr = MemGraphic.GetHdc() BitBlt(dc2, 0, 0, DesktopBitmapSize.Width, DesktopBitmapSize.Height, dc1, 0, 0, SRCCOPY) Graphic.ReleaseHdc(dc1) MemGraphic.ReleaseHdc(dc2) Graphic.Dispose() MemGraphic.Dispose() Dim g As Graphics = System.Drawing.Graphics.FromImage(MemImage) Dim cur As System.Windows.Forms.Cursor = System.Windows.Forms.Cursors.Arrow cur.Draw(g, New Rectangle(System.Windows.Forms.Cursor.Position.X - 10, System.Windows.Forms.Cursor.Position.Y - 10, cur.Size.Width, cur.Size.Height)) Dim ms As MemoryStream = New MemoryStream MemImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Return ms.GetBuffer() End Function End Class ٞ‫ااز‬١‫ػااعٗ رـخٔااذ حٌٍّااف حٌظٕف‬ٚ ُ‫ ػاا‬Dll File ٝ‫ حٌغااخرك اٌاا‬Class ‫ااً حٌااـ‬٠ٛ‫ـااذ طل‬٠ ‫ااذ‬١‫رظؤو‬ٚ ‫ع‬١‫ ٔغااظط‬ٝ‫كظاا‬ٚ Client ‫ حٌااـ‬ٚ‫ ِشااش‬ٟ‫ فاا‬References ‫ؼااخ اػااخفظٗ ػاآّ حٌااـ‬٠‫أ‬ٚ ، ٚ‫ٌٍّشااش‬ . Sever‫ حٌمخدَ ِٓ حٌـ‬Object ‫ حٌـ‬ٍٝ‫ ع‬Casting ‫عًّ حٌـ‬

~253~


: Remoting Server ‫ أشخء حٌـ‬: ‫ال‬ٚ‫أ‬ :‫ش‬١ٌ‫س حٌظخ‬ِٛ‫ حأل‬ٍٝ‫ ع‬Server ‫ رشٔخِؾ حٌـ‬ٞٛ‫لظ‬١‫ع‬ Class pictureBox mainMenu WebCamCapture – External Dll File

Object Name pictureBox1 mainMenu1 WebCamCapture1

ُ‫ظ‬٠ٚ Server Object ‫ ػُ أشخء حٌـ‬TCP Remote Channel ً١‫طغـ‬ٚ ‫ْ ربٔشخء‬٢‫َ ح‬ٛ‫عٕم‬ :ٍٟ٠ ‫رٌه وّخ‬ C#: TcpChannel chan = new TcpChannel(6600); ChannelServices.RegisterChannel(chan); RemotingConfiguration.RegisterWellKnownServiceType(Type.GetTyp e("ScreenCapture, ScreenCapture"), "MyCaptureScreenServer",WellKnownObjectMode.Singleton); VB.NET Dim chan As TcpChannel = New TcpChannel(6600) ChannelServices.RegisterChannel(chan) RemotingConfiguration.RegisterWellKnownServiceType(Type.GetTyp e("ScreenCapture, ScreenCapture"), "MyCaptureScreenServer",WellKnownObjectMode.Singleton) Instance ‫عااش حٌااـ‬١‫ ؽز‬ٚ MyCaptureScreenServer ‫ رااـ‬Server Object ‫ش حٌااـ‬١ّ‫لّٕاخ رظغاا‬ ٟ‫ فا‬ٚ Clients ‫ ٌىاً حٌاـ‬Instance Object ‫ حعاظخذحَ ٔفاظ حٌاـ‬ٟٕ‫ع‬٠ ‫٘زح‬ٚ Singleton ْٛ‫ى‬١‫ع‬ ‫ـاذ حعاظخذحَ حٌاـ‬١‫ ف‬Client Request ً‫ ٌىا‬New Instance Object ‫كخٌاش ارح أسدٔاخ أشاخء‬ Server‫ حٌاـ‬ٝ‫ عٍا‬Load ‫اذ حٌاـ‬٠‫ض‬٠ ‫ ال‬ٝ‫كظ‬ٚ ‫ي‬ٚ‫ٕظق رخعظخذحَ حأل‬٠ ٖ‫ كخٌظٕخ ٘ز‬ٟ‫ف‬ٚ SingleCall ‫ حٌااـ‬ٝ‫ااخ اٌاا‬ٙ‫ااظُ رؼ‬٠ ٟ‫ِااخص حٌظاا‬ٍٛ‫ ار أْ حٌّع‬Clients ‫ااشس ِاآ حٌااـ‬١‫عااش وز‬ّٛ‫ ِـ‬ٝ‫ كخٌااش سرطااٗ عٍاا‬ٟ‫فاا‬ ... ‫خ‬ٙ‫ ٔفغ‬ٟ٘ Clients ‫ كااذع‬ٟ‫ فاا‬ٌٟ‫د حٌظااخ‬ٛ‫ ٔؼااع حٌىاا‬Picturebox ‫ حٌااـ‬ٟ‫ فاا‬WebCamCapture Class ‫ٌااشرؾ حٌااـ‬ٚ :ٍٟ٠ ‫وّخ‬ٚ WebCamCapture Class ‫ حٌخخص رخٌـ‬ImageCaptured C#: private void webCamCapture1_ImageCaptured(object source, WebCam_Capture.WebcamEventArgs e) { pictureBox1.Image = e.WebCamImage; }

~254~


VB.NET: Private Sub webCamCapture1_ImageCaptured(ByVal source As Object, ByVal e As WebCam_Capture.WebcamEventArgs) pictureBox1.Image = e.WebCamImage End Sub main ‫ حٌاـ‬ٟ‫د فا‬ٛ‫ؿا‬ٌّٛ‫ ح‬Start Button ‫ حٌاـ‬ٝ‫شح عٕاذ حٌؼاغؾ عٍا‬١ِ‫ً حٌىاخ‬١‫ع طشاغ‬١‫ْ ٔغاظط‬٢‫ح‬ٚ ‫اش‬١ٍّ‫ ٌىاً ع‬Period Time ‫ّٔاشس ٌاٗ حٌاـ‬ٚ ً١‫د حٌظشاغ‬ٛ‫اخ وا‬ٙ‫ حٌلذع حٌخخص ر‬ٟ‫ٔؼع ف‬ٚ Menu :ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ 1 Milliseconds ‫ ِؼال‬ٛ٘ٚ ‫حٌظمخؽ‬ C#: this.webCamCapture1.TimeToCapture_milliseconds = 1; this.webCamCapture1.Start(0); VB.NET: Me.webCamCapture1.TimeToCapture_milliseconds = 1 Me.webCamCapture1.Start(0) : Remoting Client ‫ أشخء حٌـ‬: ‫خ‬١ٔ‫ػخ‬ :‫ش‬١ٌ‫س حٌظخ‬ِٛ‫ حأل‬ٍٝ‫ؼخ ع‬٠‫ أ‬ٞٛ‫لظ‬٠ٚ Class pictureBox mainMenu Timer TextBox ScreenCapture Class – External Class in References

Object Name pictureBox1 mainMenu1 timer1 textBox1 ScreenCapture

:‫ ٌٍزشٔخِؾ‬Global Declaration ‫ حٌـ‬ٟ‫ش ف‬١ٌ‫ حٌظخ‬Objects ‫حٌـ‬ٚ ‫شحص‬١‫ف حٌّظغ‬٠‫َ رظعش‬ٛ‫عٕم‬ٚ C#: ScreenCapture obj; TcpChannel chan; string URI; VB.NET: Dim obj As ScreenCapture Dim chan As TcpChannel Dim URI As String Incoming Remote ‫ حٌاـ‬ٝ‫ عٍا‬Casting ‫ ٌعّاً حٌاـ‬ScreenCapture Object‫عٕغظخذَ حٌاـ‬ Remoting ‫ إلٔشااخء حٌااـ‬TcpChannel Object ‫عٕغااظخذَ حٌااـ‬ٚ ، Instance Object Server Object ‫ حٌخاخص رخٌاـ‬URI ‫ حٌاـ‬URI String Variable ‫ حٌـ‬ٟ‫عٕؼع ف‬ٚ Channel . Server ‫ حٌـ‬ٟ‫فٗ ف‬٠‫ طُ طعش‬ٞ‫حٌز‬ٚ ٟ‫ فاا‬Remote Object ‫حٌااـ‬ٚ TCP Channel ‫ش ٌٍااـ‬١‫فااخص حألعخعاا‬٠‫ػااع حٌظعش‬ٛ‫َ ر‬ٛ‫ػااُ عاإم‬ :ٍٟ٠ ‫وّخ‬ٚ ٚ‫ حٌخخص رخٌّشش‬Constructer‫حٌـ‬

~255~


C#: public Form1() { URI = "Tcp://"+textBox1.Text+":6600/MyCaptureScreenServer"; chan = new TcpChannel(); ChannelServices.RegisterChannel(chan); obj = (ScreenCapture)Activator.GetObject(typeof(ScreenCapture), URI); } VB.NET: URI = "Tcp://" & textBox1.Text & ":6600/MyCaptureScreenServer" chan = New TcpChannel() ChannelServices.RegisterChannel(chan) obj = CType(Activator.GetObject(GetType(ScreenCapture), URI), ScreenCapture) TextBox ‫ ِاآ حٌااـ‬Server ‫ حٌخااخص رخٌااـ‬DNS ‫ حٌااـ‬ٚ‫ أ‬Remote IP ‫ااش حٌااـ‬٠‫ظُ طّش‬١‫ااغ عاا‬١‫ك‬ ...Client ‫ حٌـ‬ٟ‫فٗ ف‬٠‫ طُ طعش‬ٞ‫ حٌز‬Remote Object ‫حٌـ‬ٚ Port ‫ظزعٗ سلُ حٌـ‬٠ٚ ‫ واً فظاشس‬Server ‫سس ِآ حٌاـ‬ٛ‫ـٍذ حٌظ‬٠ ‫غ‬١‫ ك‬Timer ٟ‫ ف‬ٌٟ‫د حٌظخ‬ٛ‫سس عٕؼع حٌى‬ٛ‫ٌـٍذ حٌظ‬ٚ :‫ِلذدس‬ C#: private void timer1_Tick(object sender, System.EventArgs e) { try { URI = "Tcp://"+textBox1.Text+":6600/MyCaptureScreenServer"; byte[] buffer = obj.GetDesktopBitmapBytes(); MemoryStream ms = new MemoryStream(buffer); pictureBox1.Image = Image.FromStream(ms); } catch(Exception ex){timer1.Enabled=false; MessageBox.Show(ex.Message);} } VB.NET: Private Sub timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Try URI = "Tcp://" & textBox1.Text & ":6600/MyCaptureScreenServer" Dim buffer As Byte() = obj.GetDesktopBitmapBytes() Dim ms As MemoryStream = New MemoryStream(buffer)

~256~


pictureBox1.Image = Image.FromStream(ms) Catch ex As Exception timer1.Enabled = False MessageBox.Show(ex.Message) End Try End Sub ٝ‫ اٌااا‬TcpChannel ‫اااش حٌاااـ‬١١‫ فماااؾ لاااُ رظغ‬Http Channel ٝ‫اااً لٕاااخس حالطظاااخي اٌااا‬٠ٛ‫ٌظل‬ٚ Internet ‫ عزاش حٌاـ‬Remote Methods ‫عٕاذ٘خ عاظظّىٓ ِآ ِشاخ٘ذس حٌاـ‬ٚ HttpChannel WSDL – Web Services Definition Language ‫ف حٌاـ‬١‫خ ٔؼا‬ٙ‫ٌّشاخ٘ذط‬ٚ Browser :Remote Object ‫ حٌخخص رخٌـ‬URI ‫ حٌـ‬ٌٝ‫ ا‬ٌٟ‫ حٌظخ‬Query http://10.0.0.10:6600/MyCaptureScreenServer?wsdl :ٌٟ‫ الكع حٌشىً حٌظخ‬XML ‫جش‬١ٙ‫ ر‬Remote Interface Class ‫ش ٌٕخ حٌـ‬ٙ‫عظظ‬ٚ

Dll ‫ حٌاـ‬ٍٝ‫ي ع‬ٛ‫ كخٌش ٌُ طظّىٓ ِٓ حٌلظ‬ٟ‫ ف‬Class ‫ذ حٌغخرك ٌٍـ‬١‫ع حالعظفخدس ِٓ حٌظشو‬١‫طغظط‬ٚ Dll ‫ ٍِاف‬ٝ‫ حٌغاخرك اٌا‬XML ‫اً حٌاـ‬٠ٛ‫ع طل‬١‫اغ طغاظط‬١‫ ك‬، Remote Class‫ حٌخاخص رخٌاـ‬File Metadata ‫ااظُ رٌااه رخعااظخذحَ حٌااـ‬٠ٚ Client ‫ رشٔااخِؾ حٌااـ‬ٟ‫ فاا‬References ‫ػااعٗ ِااع حٌااـ‬ٌٛ ‫ي حٌخاااخص‬ٚ‫ػاااع حٌـاااضء حأل‬ٛ٠ ‫اااغ‬١‫ ك‬w3cxsd2001 Standard ‫اااخ حٌاااـ‬ِٕٙٚ Namespace :‫ وّؼخي‬ٍٟ٠ ‫وّخ‬ٚ Serializable Attribute ‫ حٌـ‬ٟ‫ ف‬XML Namespace‫رخٌـ‬ C#: using System; using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting.Metadata; using System.Runtime.Remoting.Metadata.W3cXsd2001;

~257~


[Serializable,SoapType(XmlNamespace=@"http://http://schemas.micro soft.com/clr/nsassem/ScreenCapture/ScreenCapture%2C%20Version%3 D1.0.2314.30913%2C%20Culture%3Dneutral%2C%20PublicKeyToke n%3Dnull")] public class ScreenCapture : System.MarshalByRefObject {// Your Methods with Return Values Only} VB.NET: Imports System Imports System.Runtime.Remoting.Messaging Imports System.Runtime.Remoting.Metadata Imports System.Runtime.Remoting.Metadata.W3cXsd2001 <Serializable(), SoapTypeAttribute(XmlNamespace:="http://http://schemas.microsoft.co m/clr/nsassem/ScreenCapture/ScreenCapture%2C%20Version%3D1.0. 2314.30913%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3 Dnull"), Serializable(), SoapTypeAttribute(XmlNamespace:="http://http://schemas.microsoft.co m/clr/nsassem/ScreenCapture/ScreenCapture%2C%20Version%3D1.0. 2314.30913%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3 Dnull")> _ Public Class ScreenCapture : Inherits System.MarshalByRefObject „Your Methods with Return Values Only End Class Remote ‫ كخٌاش واخْ حٌاـ‬ٟ‫فؼاً دحثّاخ فا‬١‫ ف‬HTTP Channel ‫ حٌاـ‬ٚ‫ أ‬TCP ‫ٓ حٌاـ‬١‫اخس را‬١‫ٌالخظ‬ٚ ‫ رغازذ‬HTTP Channel ‫خص طظظاً ِعاٗ عزاش حإلٔظشٔاض حعاظخذحَ حٌاـ‬ٙ‫ ؿ‬ٍٝ‫د ع‬ٛ‫ؿ‬ِٛ Object ٖ‫اش‬١‫ غ‬ٚ‫ أ‬Windows ‫حء‬ٛ‫ ٔظاخَ عا‬ٞ‫حفاك ِاع أ‬ٛ‫ظ‬٠ ٗ‫ٔا‬ٛ‫ و‬ٝ‫ش عشعش حالطظخي رخإلػخفش اٌا‬٠‫د‬ٚ‫ِلذ‬ ... Local Network‫ حٌـ‬ٟ‫ أفؼً فمؾ ف‬TCP Channel ‫عشعش حٌـ‬ٚ ‫ أدحء‬ٝ‫زم‬٠ ٓ‫ٌى‬ Distributed ‫اش أشاخء‬١ٍّ‫ؽزمٕاخ ع‬ٚ ‫اض‬١ٔ ‫ص‬ٚ‫ حٌاذ‬ٟ‫ فا‬Remoting ‫ش حعظخذحَ حٌـ‬١‫ف‬١‫ٕخ و‬١‫٘ىزح ر‬ٚ ‫سس‬ٛ‫ ؿخٔاذ ٔماً طا‬ٌٝ‫ص ا‬ٛ‫ضس ٔمً حٌظ‬١ِ ‫ْ اػخفش‬٢‫ع ح‬١‫ذ طغظط‬١‫رظؤو‬ٚ ، eLearning System ‫ حٌفظاااً حٌخاااخص‬ٝ‫ِاااخص حسؿاااع اٌااا‬ٍٛ‫اااذ ِااآ حٌّع‬٠‫شح حٌخخطاااش رخٌّلخػاااش )ٌّض‬١ِ‫حٌىاااخ‬ٚ ‫حٌشخشاااش‬ Remote ‫اااش أشااخء رشٔاااخِؾ‬١‫ف‬١‫ ِاآ ٘ااازح حٌفظااً و‬ٌٟ‫ حٌـااضء حٌظاااخ‬ٟ‫ٓ فااا‬١‫عاإز‬ٚ ،(VOIP‫رخٌااـ‬ .ُ‫ش حٌظلى‬١‫ ِع خخط‬Desktop Application

~258~


Create an Advanced Remote Desktop ‫ إٔشتبء ثشٔتبِج اٌتزذىُ ػتٓ ثؼتذ‬: ‫تب‬١ٔ‫صب‬ : Application With Remote (Mouse/Keyboard) Control Features (X,Y) Mouse‫خص حٌاااـ‬١‫ اسعاااخي اكاااذحػ‬ٝ‫ ِؼاااً ٘ااازٖ حٌزاااشحِؾ عٍااا‬ٟ‫ش فااا‬١‫طعظّاااذ حٌفىاااشس حألعخعااا‬ ٟ‫دس فا‬ٛ‫ؿا‬ٌّٛ‫ح‬ٚ API ‫حي حٌـ‬ٚ‫رظُ وً رٌه رخعظخذحَ د‬ٚ Server ‫ حٌـ‬ٌٝ‫ ا‬Kay Press Event‫حٌـ‬ٚ ‫اخ‬ِٕٙٚ ‫حي‬ٚ‫ عذد ػاخُ ِآ حٌاذ‬ٍٝ‫ ٘زح حٌٍّف ع‬ٞٛ‫لظ‬٠ ‫غ‬١‫ ك‬user32.dll ‫ش‬١ٙ‫ٍِف حٌّغظخذَ حٌش‬ ٗ‫ا‬١ٍ‫ طاُ حٌؼاغؾ ع‬ٞ‫ حٌاز‬input Button Type ‫اخ حٌاـ‬ٌٙ‫ طشعً ِآ خال‬ٟ‫حٌظ‬ٚ SendInput ‫حٌذحٌش‬ ‫خص‬١‫طؤخز اكذحػ‬ٚ SetCursorPos ‫حٌذحٌش‬ٚ Mouse ‫ حٌـ‬ٚ‫ أ‬Keyboard ‫رخٌـ‬ ٓ‫ّىا‬٠ٚ ، ‫خص حٌّشعٍش‬١‫ حإلكذحػ‬ٍٝ‫ ع‬Mouse‫ػع ِئشش حٌـ‬ٚ ُ‫ظ‬٠ ‫غ‬١‫ ك‬Mouse ‫ ٌٍـ‬Y ‫حٌـ‬ٚ X ‫حٌـ‬ Server‫ ٌٍاااـ‬Desktop Screen ‫ ٌّعشفاااش كـاااُ حٌاااـ‬GetSystemMetrics ‫حعاااظخذحَ حٌذحٌاااش‬ :ٓ١‫مظ‬٠‫حي ٌظلىُ عٓ رعذ رطش‬ٚ‫ّىٓ حعظخذحَ ٘زٖ حٌذ‬٠ٚ ، (Height & Width) ُ‫ ػاا‬Socket ‫ عزااش حٌااـ‬Serialization Object ‫ وااـ‬Server ‫ حٌااـ‬ٝ‫خص اٌاا‬١‫ اسعااخي حإلكااذحػ‬-1 ٟ‫ماش ٘ا‬٠‫ ٘زٖ حٌطش‬ٟ‫ ٌىٓ حٌّشىٍش ف‬ٚ ، ‫حي‬ٚ‫ حٌذ‬ٌٝ‫خص حٌّغظمزٍش ا‬١‫ش حإلكذحػ‬٠‫ز٘خ رظّش‬١‫طٕف‬ٚ ‫خ‬ٌٙ‫حعظمزخ‬ ٓ‫ااه عاا‬١٘‫ش اػٕااخء حإلسعااخي ٔخ‬١‫لااذع طااؤخ‬٠ ْ‫ّىاآ أ‬٠ ‫ااغ‬١‫خص ك‬١‫ااش اسعااخي حإلكااذحػ‬١ٍّ‫ ع‬ٟ‫حٌاازؾء فاا‬ ... Control Object ‫ش اسعخي حٌـ‬١ٍّ‫ ع‬ٟ‫ عظلخؿٗ ف‬ٞ‫ حٌز‬Bandwidth‫حٌـ‬ Methods ‫ حٌاااـ‬Client ‫ حٌاااـ‬ٟ‫غاااظذع‬٠ ‫اااغ‬١‫اااش حٌاااظلىُ ك‬١ٍّ‫ ع‬ٟ‫ فااا‬Remoting ‫ حعاااظخذحَ حٌاااـ‬-2 ‫ّااشس‬٠ٚ Server Side ‫ حٌااـ‬ٝ‫ااخ عٍاا‬ٙ‫اش ِعخٌـظ‬١ٍّ‫ ع‬ٜ‫طـااش‬ٚ ُ‫ِاآ ػاا‬ٚ Server‫ حٌااـ‬ٝ‫دس عٍاا‬ٛ‫ؿا‬ٌّٛ‫ح‬ Server‫ حٌاـ‬ٝ‫دس عٍا‬ٛ‫ؿا‬ٌّٛ‫ ح‬Remote Methods‫ حٌـ‬ٌٝ‫خص حٌخخطش رخٌظلىُ ا‬١‫ حإلكذحػ‬Client‫حٌـ‬ ُ‫اظ‬٠ ‫اغ‬١‫ ك‬، Server‫ حٌاـ‬ٝ‫ِاخص حٌاظلىُ اٌا‬ٍٛ‫مش ِٓ أعاش حٌطاشق إلسعاخي ِع‬٠‫طعظزش ٘زٖ حٌطش‬ٚ ، ٝ‫ طٕفز رعاذ رٌاه عٍا‬ٚ Client‫ حٌـ‬ٍٝ‫خ ع‬ٙٔ‫وؤ‬ٚ Server ‫ حٌـ‬ٍٝ‫دس ع‬ٛ‫ؿ‬ٌّٛ‫ ح‬Methods ‫حعظذعخء حٌـ‬ . Server Side ‫حٌـ‬ ُ‫حي حٌخخطش راخٌظلى‬ٚ‫ وً حٌذ‬ٍٝ‫ ع‬ٞٛ‫لظ‬١‫ ع‬ٞ‫حٌز‬ٚ Distributed Class ‫َ ربٔشخء حٌـ‬ٛ‫ٌٍزذء عٕم‬ٚ ٝ‫ عٍااا‬Methods‫اااز واااً حٌاااـ‬١‫اااظُ طٕف‬٠ ٟ‫ٌىااا‬ٚ System.MarshalByRefObject َ‫عٕغاااظخذ‬ٚ ، ٟ‫ٌىاا‬ٚ Unsigned Variables ‫عااش ِاآ حٌااـ‬ّٛ‫ااش عاإعشف ِـ‬٠‫ حٌزذح‬ٟ‫ فاا‬، Server Side‫حٌااـ‬ Hex ‫ُ رخٌاـ‬١‫عش حٌما‬ّٛ‫خ ِـ‬ٌٙ ‫ّٔشس‬ٚ ‫خ‬ٙ‫ذ حٌظلىُ ر‬٠‫ ٔش‬ٟ‫ش حٌظ‬١ٍّ‫عش حٌع‬١‫ش ؽز‬٠‫خ الكمخ ٌظّش‬ِٙ‫ٔغظخذ‬ : ‫ش‬١ٍّ‫ طخض وً ع‬ٟ‫حٌظ‬ٚ Decimal C#: const uint MOUSEEVENTF_MOVE = 0x0001; //mouse move const uint MOUSEEVENTF_LEFTDOWN = 0x0002; // left button down const uint MOUSEEVENTF_LEFTUP = 0x0004; // left button up const uint MOUSEEVENTF_RIGHTDOWN = 0x0008; // right button down const uint MOUSEEVENTF_RIGHTUP = 0x0010; // right button up const uint MOUSEEVENTF_MIDDLEDOWN = 0x0020; // middle button down const uint MOUSEEVENTF_MIDDLEUP = 0x0040; // middle button up const uint MOUSEEVENTF_WHEEL = 0x0800; // wheel button rolled const uint MOUSEEVENTF_ABSOLUTE = 0x8000; // absolute move const uint KEYEVENTF_EXTENDEDKEY = 0x0001; const uint KEYEVENTF_KEYUP = 0x0002; const uint INPUT_MOUSE = 0; const uint INPUT_KEYBOARD = 1;

~259~


VB.NET: Const MOUSEEVENTF_MOVE As Integer = &H1 'mouse move Const MOUSEEVENTF_LEFTDOWN As Integer = &H2 ' left button down Const MOUSEEVENTF_LEFTUP As Integer = &H4 ' left button up Const MOUSEEVENTF_RIGHTDOWN As Integer = &H8 ' right button down Const MOUSEEVENTF_RIGHTUP As Integer = &H10 ' right button up Const MOUSEEVENTF_MIDDLEDOWN As Integer= &H20 'middle button down Const MOUSEEVENTF_MIDDLEUP As Integer = &H40 ' middle button up Const MOUSEEVENTF_WHEEL As Integer = &H800 ' wheel button rolled Const MOUSEEVENTF_ABSOLUTE As Integer = &H8000 ' absolute move Const KEYEVENTF_EXTENDEDKEY As Integer = &H1 Const KEYEVENTF_KEYUP As Integer = &H2 Const INPUT_MOUSE As Integer = 0 Const INPUT_KEYBOARD As Integer = 1 ٓ‫ ِا‬Kay Press Value ‫ش ادخخي حٌـ‬١ٍّ‫ ع‬ٟ‫خ ف‬ِٙ‫ العظخذح‬Structs ‫عش ِٓ حٌـ‬ّٛ‫ػُ عٕعشف ِـ‬ Mouse Buttons ‫ إلدخااخي‬MOUSE_INPUT ٟ‫٘اا‬ٚ Server ‫ حٌااـ‬ٝ‫ اٌاا‬Client ‫لزااً حٌااـ‬ Keyboard Button Press Value ‫ إلدخااخي‬KEYBD_INPUT‫حٌااـ‬ٚ Press Values :ٍٟ٠ ‫وّخ‬ٚ INPUT Struct ‫خ رخعظخذحَ حٌـ‬ِٕٙ ً‫ و‬ٝ‫طغظذع‬ٚ C#: struct MOUSE_INPUT { public uint dx; public uint dy; public uint mouseData; public uint dwFlags; public uint time; public uint dwExtraInfo; } struct KEYBD_INPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public uint dwExtraInfo; }

~261~


[StructLayout(LayoutKind.Explicit)] struct INPUT { [FieldOffset(0)] public uint type; // union [FieldOffset(4)] public MOUSE_INPUT mi; [FieldOffset(4)] public KEYBD_INPUT ki; } VB.NET: Friend Structure MOUSE_INPUT Public dx As System.UInt32 Public dy As System.UInt32 Public mouseData As System.UInt32 Public dwFlags As System.UInt32 Public time As System.UInt32 Public dwExtraInfo As System.UInt32 End Structure Friend Structure KEYBD_INPUT Public wVk As System.UInt16 Public wScan As System.UInt16 Public dwFlags As System.UInt32 Public time As System.UInt32 Public dwExtraInfo As System.UInt32 End Structure <StructLayout(LayoutKind.Explicit)> _ Friend Structure INPUT <FieldOffset(0)> _ Public type As System.UInt32 ' union <FieldOffset(4)> _ Public mi As MOUSE_INPUT <FieldOffset(4)> _ Public ki As KEYBD_INPUT End Structure :‫ش حٌظلىُ عٓ رعذ‬١ٍّ‫ز ع‬١‫ش ٌظٕف‬١ٌ‫ حٌظخ‬Methods ‫ف ٔغظخذَ حٌـ‬ٛ‫ع‬ٚ ‫ػااع ِئشااش‬ٚ ُ‫ااظ‬٠ ‫ااغ‬١‫ ك‬Mouse ‫ ٌٍااـ‬Y ‫حٌااـ‬ٚ X ‫خص حٌااـ‬١‫طؤخااز اكااذحػ‬ٚ SetCursorPos ‫ حٌذحٌااش‬‫اه ِئشاش حٌاـ‬٠‫اغ عظغاظخذَ ٌظلش‬١‫ ك‬، Client ‫خص حٌّشعاٍش ِآ حٌاـ‬١‫ حإلكاذحػ‬ٍٝ‫ رٕخء ع‬Mouse‫حٌـ‬ . Server ‫ حٌـ‬ٟ‫ ف‬Mouse

~260~


ٚ ‫اش‬١ٍّ‫ واً ع‬ٟ‫ي عاذد حإلدخاخالص فا‬ٚ‫ظشحص حأل‬١ِٚ‫خ ػالػاش راخس‬ٙ١‫عٕشعً ف‬ٚ SendInput ‫ حٌذحٌش‬Virtual ‫اخ طؤخاز حٌاـ‬ٙٔ‫ فب‬Keyboard ‫ كخٌاش حٌاـ‬ٟ‫اش حٌّذخٍاش ِاؼال فا‬١ٍّ‫ ٌٍع‬Reference Value SendInput Method ‫العااظخذحَ حٌااـ‬ٚ ،ٗ‫اا‬١ٍ‫ طااُ حٌؼااغؾ ع‬ٞ‫ حٌااز‬Button ‫ ٌٍااـ‬Kay Code SendKeystroke Method‫حٌاـ‬ٚ PressOrReleaseMouseButton Method ‫عٕ​ٕشات‬ Input Struct‫ ِآ حٌاـ‬Instance ‫اغ عإعشف‬١‫اشحص ك‬١‫عاش ِآ حٌّظغ‬ّٛ‫اخ ِـ‬ِٕٙ ً‫عإّشس ٌىا‬ٚ ٚ‫ أ‬Mouse ‫حء ِاآ حٌااـ‬ٛ‫ عاا‬Input Type ‫عاإّشس ٌااٗ حٌااـ‬ٚ ‫ااش حٌزشٔااخِؾ‬٠‫ رذح‬ٟ‫ عشفٕااخٖ فاا‬ٞ‫حٌااز‬ٚ ‫حء‬ٛ‫ عا‬Kay Button‫حٌاـ‬ٚ ‫خص حٌّئشاش‬١‫ ّٔاشس ٌاٗ اكاذحػ‬Mouse ‫ فبرح وخْ ِٓ حٌاـ‬Keyboard‫حٌـ‬ VirtualKeyCode‫ فغّٕشس ٌٗ حٌاـ‬Keyboard ‫ أِخ ارح وخْ حٌّذخً ِٓ حٌـ‬، Right ٚ‫ أ‬Left ... ٗ١ٍ‫ طُ حٌؼغؾ ع‬ٞ‫ حٌز‬Button ‫حٌخخص رخٌـ‬ C#: [DllImport("user32.dll")] private static extern uint SendInput( uint nInputs, // count of input events ref INPUT input, int cbSize // size of structure ); public void PressOrReleaseMouseButton(bool Press, bool Left, int X, int Y) { INPUT input = new INPUT(); input.type = INPUT_MOUSE; input.mi.dx = (uint) X; input.mi.dy = (uint) Y; input.mi.mouseData = 0; input.mi.dwFlags = 0; input.mi.time = 0; input.mi.dwExtraInfo = 0; if (Left) { input.mi.dwFlags = Press ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP; } else { input.mi.dwFlags = Press ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP; } SendInput(1, ref input, Marshal.SizeOf(input)); } [DllImport("user32.dll")] private static extern void SetCursorPos(int x, int y);

~262~


public void MoveMouse(int x, int y) {SetCursorPos(x, y);} public void SendKeystroke(byte VirtualKeyCode, byte ScanCode, bool KeyDown, bool ExtendedKey) { INPUT input = new INPUT(); input.type = INPUT_KEYBOARD; input.ki.wVk = VirtualKeyCode; input.ki.wScan = ScanCode; input.ki.dwExtraInfo = 0; input.ki.time = 0; if (!KeyDown) { input.ki.dwFlags |= KEYEVENTF_KEYUP; } if (ExtendedKey) { input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY; } SendInput(1, ref input, Marshal.SizeOf(input)); } VB.NET: <DllImport("user32.dll")> _ Private Shared Function SendInput(ByVal nInputs As System.UInt32, ByRef input As Input, ByVal cbSize As Integer) As System.UInt32 End Function Public Sub PressOrReleaseMouseButton(ByVal Press As Boolean, ByVal Left As Boolean, ByVal X As Integer, ByVal Y As Integer) Dim input As Input = New Input input.type = INPUT_MOUSE input.mi.dx = System.Convert.ToUInt32(X) input.mi.dy = System.Convert.ToUInt32(Y) input.mi.mouseData = 0 input.mi.dwFlags = 0 input.mi.time = 0 input.mi.dwExtraInfo = 0 If Left Then If Press Then

~263~


input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN Else input.mi.dwFlags = MOUSEEVENTF_LEFTUP End If Else If Press Then input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN Else input.mi.dwFlags = MOUSEEVENTF_RIGHTUP End If End If SendInput(1, input, Marshal.SizeOf(input)) End Sub <DllImport("user32.dll")> _ Private Shared Sub SetCursorPos(ByVal x As Integer, ByVal y As Integer) End Sub Public Sub MoveMouse(ByVal x As Integer, ByVal y As Integer) SetCursorPos(x, y) End Sub Public Sub SendKeystroke(ByVal VirtualKeyCode As Byte, ByVal ScanCode As Byte, ByVal KeyDown As Boolean, ByVal ExtendedKey As Boolean) Dim input As Input = New Input input.type = INPUT_KEYBOARD input.ki.wVk = VirtualKeyCode input.ki.wScan = ScanCode input.ki.dwExtraInfo = 0 input.ki.time = 0 If (Not KeyDown) Then input.ki.dwFlags = input.ki.dwFlags Or KEYEVENTF_KEYUP End If If ExtendedKey Then input.ki.dwFlags = input.ki.dwFlags Or KEYEVENTF_EXTENDEDKEY End If SendInput(1, input, Marshal.SizeOf(input)) End Sub

~264~


‫ فغٕغاظخذَ ٔفاظ‬Server ‫سس عطق حٌّىظذ حٌخخص رخٌاـ‬ٛ‫ ٌظ‬Bitmap ‫ظعٍك رـٍذ حٌـ‬٠ ‫ّخ‬١‫أِخ ف‬ٚ ‫ي‬ٛ‫عإل‬ٚ ‫ُ شخشاخص حٌزشٔاخِؾ‬١ّ‫َ رظظا‬ٛ‫ْ عإم‬٢‫ح‬ٚ ، ‫ حٌّؼاخي حٌغاخرك‬ٟ‫ عشفٕخ٘اخ فا‬ٟ‫حص حٌظا‬ٛ‫حٌخط‬ ‫ػاع رـخٔاذ‬ٛ١‫ع‬ٚ Reference ‫ واـ‬Client ‫شفك رخٌاـ‬١‫اغ عا‬١‫ ك‬Dll ‫ ٍِاف‬ٝ‫ حٌغاخرك اٌا‬Class‫حٌـ‬ : Server‫ حٌخخص رطشف حٌـ‬ٞ‫ز‬١‫حٌٍّف حٌظٕف‬ : Server ‫ال اٌـ‬ٚ‫أ‬ َٛ‫م‬١‫ عا‬ٞ‫حٌاز‬ٚ Remoting Registration Channel ‫ حٌاـ‬ٝ‫ عٍا‬Server‫ رشٔاخِؾ حٌاـ‬ٞٛ‫لظ‬١‫عا‬ ‫ّىٕ​ٕخ ِآ حالطظاخي‬١‫غ ع‬١‫ طُ أشخثٗ ك‬ٞ‫حٌز‬ٚ Control Class ‫ع حٌـ‬٠‫ص‬ٛ‫ط‬ٚ ‫ف لٕخس حالطظخي‬٠‫رظعش‬ :ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ ‫ ِلذد‬Port ‫ عزش‬Remote Class ‫ِع حٌـ‬ C#: TcpChannel chan = new TcpChannel(6600); ChannelServices.RegisterChannel(chan); RemotingConfiguration.RegisterWellKnownServiceType(Type.GetTyp e("ScreenCapture, ScreenCapture"), "MyCaptureScreenServer",WellKnownObjectMode.Singleton); VB.NET Dim chan As TcpChannel = New TcpChannel(6600) ChannelServices.RegisterChannel(chan) RemotingConfiguration.RegisterWellKnownServiceType(Type.GetTyp e("ScreenCapture, ScreenCapture"), "MyCaptureScreenServer",WellKnownObjectMode.Singleton) : Client ‫ب اٌـ‬١ٔ‫صب‬ ٗ‫َ ِآ خالٌا‬ٛ‫ حٌّؼاخي حٌغاخرك ٌىآ عإم‬ٟ‫ لّٕاخ ربٔشاخثٗ فا‬ٞ‫ حٌزشٔاخِؾ حٌاز‬Client ‫شزٗ رشٔاخِؾ حٌاـ‬٠ ‫ حٌخااااخص‬Virtual Kay Code ‫ حٌااااـ‬ٚ Mouse ‫خص حٌخخطااااش رخٌااااـ‬١‫ُ حإلكااااذحػ‬١‫ااااش لاااا‬٠‫رظّش‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫وّخ ف‬ٚ ‫ذ‬٠‫ ؿذ‬ٚ‫ٌٍزذء لُ ربٔشخء ِشش‬ٚ ، Keyboard Buttons‫رخٌـ‬

~265~


:‫ش‬١ٌ‫ حٌظخ‬Namespaces ‫ حعظخذحَ حٌـ‬ٌٝ‫عٕلظخؽ ا‬ System.Runtime.Remoting System.Runtime.Remoting.Channels System.Runtime.Remoting.Channels.Tcp System.IO System.Runtime.InteropServices System.Threading :‫ حٌزشٔخِؾ‬ٟ‫ ف‬Global Declaration ‫ ِٕطمش حٌـ‬ٌٝ‫ش ا‬١ٌ‫ف حٌظخ‬٠‫رعذ رٌه لُ ربػخفش حٌظعخس‬ C#: string URI; ScreenCapture obj; TcpChannel chan; bool connected = false; VB.NET: Dim URI As String Dim obj As ScreenCapture Dim chan As TcpChannel Dim connected As Boolean = False ‫ ٌـٍاذ‬user32.dll ‫خ ِآ حٌاـ‬ٙ١‫ عٕغاظذع‬ٟ‫حٌظا‬ٚ MapVirtualKey Method َ‫ف ٔغظخذ‬ٛ‫ع‬ٚ ِٗ‫ااغ عٕغااظخذ‬١‫ااٗ ك‬١ٍ‫ظُ حٌؼااغؾ ع‬١‫ عاا‬ٞ‫ حٌااز‬Button ‫ حٌخااخص رخٌااـ‬Virtual Kay Code ‫حٌااـ‬ Control ‫ حٌاـ‬ٚ‫ أ‬Shift‫خ اػٕخء وظخراش حألكاشف ِؼاً حٌاـ‬ٙ١ٍ‫ طُ حٌؼغؾ ع‬ٟ‫ٌّعشفش أصسحس حٌظلىُ حٌظ‬ :ٖ‫ش‬١‫ غ‬ٚ‫أ‬ C#: [DllImport("")] private static extern uint MapVirtualKey( uint uCode, // virtual-key code or scan code uint uMapType // translation to perform ); VB.NET: <DllImport("user32.dll")> _ Private Shared Function MapVirtualKey(ByVal uCode As System.UInt32, ByVal uMapType As System.UInt32) As System.UInt32 End Function :ٍٟ٠ ‫وّخ‬ٚ ‫ذس‬٠‫ ؿذ‬Start Method ٟ‫ف لٕخس حالطظخي ف‬٠‫د حٌخخص رظعش‬ٛ‫َ رىظخرش حٌى‬ٛ‫ػُ عٕم‬

~266~


C#: void start() { try { URI = "Tcp://"+textBox1.Text+":6600/MyCaptureScreenServer"; chan = new TcpChannel(); ChannelServices.RegisterChannel(chan); obj = (ScreenCapture)Activator.GetObject(typeof(ScreenCapture), URI); connected = true; timer1.Enabled = true; textBox1.ReadOnly = true; this.FormBorderStyle = FormBorderStyle.None;// Full Size Mode this.WindowState = FormWindowState.Maximized; textBox1.Visible = false; menuItem5.Enabled = true; } catch (Exception){stop();}; } VB.NET: Private Sub start() Try URI = "Tcp://" & textBox1.Text & ":6600/MyCaptureScreenServer" chan = New TcpChannel ChannelServices.RegisterChannel(chan) obj = CType(Activator.GetObject(GetType(ScreenCapture), URI), ScreenCapture) connected = True timer1.Enabled = True textBox1.ReadOnly = True Me.FormBorderStyle = FormBorderStyle.None ' Full Size Mode Me.WindowState = FormWindowState.Maximized textBox1.Visible = False menuItem5.Enabled = True End Try َٛ‫ٓ عاإم‬١‫ كاا‬ٟ‫ فاا‬Start monitoring ‫ حٌغااخرمش عٕااذ صس حٌااـ‬Start Method ‫ حٌااـ‬ٟ‫عٕغااظذع‬ٚ ٚ ٗ‫ طااُ أشااخث‬ٞ‫ حٌااز‬Remote Object ‫ش حٌااـ‬١ِ‫طااذ‬ٚ ‫ إلغااالق حالطظااخي‬ٜ‫ أخااش‬Method ‫ربٔشااخء‬ :Server‫سس عطق حٌّىظذ حٌخخص رخٌـ‬ٛ‫َ رـٍذ ط‬ٛ‫م‬٠ ٞ‫ حٌز‬Timer ‫مخف حٌـ‬٠‫إل‬

~267~


C#: void stop() { try { timer1.Enabled = false; textBox1.ReadOnly = false; connected = false; this.FormBorderStyle = FormBorderStyle.Sizable; // Normal Size Mode this.WindowState = FormWindowState.Normal; textBox1.Visible = true; this.Width = 584; this.Height = 440; ChannelServices.UnregisterChannel(chan);//to Un Register chan Channel } catch(Exception){} } VB.NET: Private Sub Stop() Try timer1.Enabled = False textBox1.ReadOnly = False connected = False Me.FormBorderStyle = FormBorderStyle.Sizable ' Normal Size Mode Me.WindowState = FormWindowState.Normal textBox1.Visible = True Me.Width = 584 Me.Height = 440 ChannelServices.UnregisterChannel(chan) 'to Un Register chan Channel End Try ‫اغ عٕؼاع ٘ازح‬١‫ ك‬ٟ‫ٍا‬٠ ‫ وّاخ‬Remote Object ‫سس عاطق حٌّىظاذ ِآ حٌاـ‬ٛ‫ش ؿٍاذ طا‬١ٍّ‫طظُ ع‬ٚ :Picture box ٍٝ‫سس ع‬ٛ‫عشع حٌظ‬ٚ ‫ش حٌـٍذ‬١ٍّ‫ش ع‬٠‫ ٌظىش‬Timer ٟ‫د ف‬ٛ‫حٌى‬ C#: try { URI = "Tcp://"+textBox1.Text+":6600/MyCaptureScreenServer"; byte[] buffer = obj.GetDesktopBitmapBytes(); MemoryStream ms = new MemoryStream(buffer); pictureBox1.Image = Image.FromStream(ms);} catch (Exception){stop();}

~268~


VB.NET Try URI = "Tcp://" & textBox1.Text & ":6600/MyCaptureScreenServer" Dim buffer As Byte() = obj.GetDesktopBitmapBytes() Dim ms As MemoryStream = New MemoryStream(buffer) pictureBox1.Image = Image.FromStream(ms) Catch e1 As Exception stop() End Try MoveMouse Method ‫َ رخعاظذعخء حٌاـ‬ٛ‫ عٕم‬Server ‫ حٌـ‬ٌٝ‫ ا‬Mouse ‫خص حٌـ‬١‫ش اكذحػ‬٠‫ٌظّش‬ٚ Mouse Move Event ٟ‫ػااع فاا‬ٛ٠ٚ ‫ حٌغااخرك‬remote Class ‫ حٌااـ‬ٟ‫ عشفٕخ٘ااخ فاا‬ٟ‫حٌظاا‬ٚ :ٍٟ٠ ‫وّخ‬ٚ Picture box‫ٌٍـ‬

C#: private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (connected == true) {obj.MoveMouse(e.X, e.Y);} } VB.NET: Private Sub pictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) If connected = True Then obj.MoveMouse(e.X, e.Y) End If End Sub PressOrReleaseMouseButton ‫ حٌااـ‬ٝ‫ اٌاا‬Mouse Button Event ‫عاإّشس حٌااـ‬ٚ ٖ‫طؤخاااز ٘اااز‬ٚ Mouse Down Events ‫حٌاااـ‬ٚ Mouse up‫خ ِااآ حٌاااـ‬ٙ‫ رخعاااظذعخث‬Method

~269~


ٛ‫ ٘ا‬Event ‫ فابرح واخْ حٌاـ‬False ٚ‫ أ‬True ‫ّاش‬١‫ّشس ٌٗ ل‬٠ ‫ي‬ٚ‫ظشحص حأل‬١ِٚ‫ أسرعش رخس‬Method‫حٌـ‬ Mouse up Event ‫ كخٌش حٌـ‬ٟ‫حٌعىظ ف‬ٚ True ‫خ‬ٙ‫ّظ‬١‫ْ ل‬ٛ‫ـذ أْ طى‬٠ ‫ عٕذ٘خ‬Mouse Down Right ٚ‫ أ‬Left ‫حء‬ٛ‫ عا‬Mouse ‫ٗ رخٌـ‬١ٍ‫ طُ حٌؼغؾ ع‬ٞ‫ حٌز‬Button ‫ حٌـ‬ٟٔ‫ظش حٌؼخ‬١ِٚ‫ؤخز حٌزخس‬٠ٚ ‫ فابرح‬MouseButtons.Left ‫ ِاع حٌاـ‬e.Button ‫اغ طماخسْ حٌاـ‬١‫ ك‬False ٚ‫ أ‬True ‫ّاش‬١‫ؤخز ل‬٠ٚ Left ٛ‫ااٗ ٘اا‬١ٍ‫ طااُ حٌؼااغؾ ع‬ٞ‫ حٌااز‬Mouse Button ‫ أْ حٌااـ‬ٝ‫ااذي عٍاا‬٠ ‫ فاابْ رٌااه‬True ‫وخٔااض‬ :‫ ٌٍّئشش‬Y ‫حٌـ‬ٚ X ‫خص حٌـ‬١‫حٌشحرع اكذحػ‬ٚ ‫ظش حٌؼخٌغ‬١ِٚ‫ؤخز حٌزخس‬٠ٚ Right ‫ كخٌش حٌـ‬ٟ‫حٌعىظ ف‬ٚ C#: private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (connected == true) { obj.PressOrReleaseMouseButton(true, e.Button == MouseButtons.Left, e.X, e.Y); } } private void pictureBox1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { if (connected == true) { obj.PressOrReleaseMouseButton(false, e.Button == MouseButtons.Left, e.X, e.Y); } } VB.NET: Private Sub pictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) If connected = True Then obj.PressOrReleaseMouseButton(True, e.Button = MouseButtons.Left, e.X, e.Y) End If End Sub Private Sub pictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) If connected = True Then obj.PressOrReleaseMouseButton(False, e.Button = MouseButtons.Left, e.X, e.Y) End If End Sub ٗ‫ااا‬١ٍ‫ طاااُ حٌؼاااغؾ ع‬ٞ‫ حٌاااز‬Keyboard ‫ حٌخاااخص رخٌاااـ‬Buttons ‫ ٌٍاااـ‬Kay Code ‫اااش حٌاااـ‬٠‫ٌظّش‬ٚ :ٍٟ٠ ‫وّخ‬ٚ Form ‫ حٌخخطش رخٌـ‬Kay up‫حٌـ‬ٚ Kay Down ‫عٕغظخذَ حألكذحع‬

~271~


C#: private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (connected == true) { e.Handled = true; obj.SendKeystroke((byte) e.KeyCode, (byte) MapVirtualKey((uint) e.KeyCode, 0), true, false); } } private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) { if (connected == true) { e.Handled = true; obj.SendKeystroke((byte) e.KeyCode, (byte) MapVirtualKey((uint) e.KeyCode, 0), false, false); } } VB.NET: Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) If connected = True Then e.Handled = True obj.SendKeystroke(CByte(e.KeyCode), CByte(MapVirtualKey(System.Convert.ToUInt32(e.KeyCode), 0)), True, False)

~270~


‫‪End If‬‬ ‫‪End Sub‬‬ ‫‪Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As‬‬ ‫)‪System.Windows.Forms.KeyEventArgs‬‬ ‫‪If connected = True Then‬‬ ‫‪e.Handled = True‬‬ ‫‪obj.SendKeystroke(CByte(e.KeyCode),‬‬ ‫‪CByte(MapVirtualKey(System.Convert.ToUInt32(e.KeyCode), 0)),‬‬ ‫)‪False, False‬‬ ‫‪End If‬‬ ‫‪End Sub‬‬ ‫لّٕخ رخٌزذح‪٠‬ش رب‪٠‬مخف فخعٍ‪١‬ش حٌـ ‪ Buttons‬رخعظخذحَ حٌـ‪ٚ e.Handled = True‬رعذ رٌه ِشسٔاخ حٌاـ‬ ‫‪ Kay code‬حٌااز‪ ٞ‬عاا‪١‬ظُ حٌؼااغؾ عٍ‪١‬ااٗ اٌاا‪ ٝ‬حٌااـ ‪ٚ SendKeystroke Method‬طؤخااز ٘اازٖ‬ ‫حٌـ‪ Method‬أسرعش رخس‪١ِٚ‬ظشحص عٍا‪ ٝ‬حٌٕلا‪ ٛ‬حٌظاخٌ‪ ،ٟ‬حأل‪ٚ‬ي ‪٠ٚ‬ؤخاز حٌاـ ‪ٌٍ Byte‬اـ ‪Virtual Kay‬‬ ‫‪ code‬حٌز‪ ٞ‬طُ حٌؼغؾ عٍ‪٠ٚ ٗ١‬ؤخز حٌؼاخٔ‪ ٟ‬حٌاـ ‪ٌ Scan Code‬لخٌاش حٌاـ‪ Keys‬عا‪ٛ‬حء ‪Shift Kay‬‬ ‫أ‪ Control Kay ٚ‬أ‪ ٚ‬ارح وٕااض طلااض حٌااـ ‪ Caps look Mode‬أ‪ ٚ‬غ‪١‬ااشٖ ِاآ أصسحس حٌااظلىُ‬ ‫حٌخخطش رخٌـ ‪٠ٚ Keyboard‬ظُ رٌاه رعاذ طّش‪٠‬اش لا‪ ُ١‬حٌاـ ‪ unassigned Integer Code‬حٌشحؿاع‬ ‫ِٓ حٌـ‪ e.KayCode‬اٌ‪ ٝ‬حٌـ ‪ MapVirtualKey‬حٌظ‪ ٟ‬عشفٕخ٘خ ف‪ ٟ‬رذح‪٠‬ش حٌزشٔخِؾ ‪...‬‬ ‫أِخ حٌزاخس‪١ِٚ‬ظش حٌؼخٌاغ ف‪١‬ؤخاز ل‪ّ١‬اش ‪ True‬فا‪ ٟ‬كخٌاش واخْ حٌلاذع ٘ا‪ False ٚ KayDown ٛ‬فا‪ٟ‬‬ ‫كخٌاااش واااخْ حٌلاااذع ٘ااا‪٠ٚ KayUp ٛ‬ؤخاااز حٌزاااخس‪١ِٚ‬ظش حٌشحراااع ل‪ّ١‬اااش ‪ false‬ك‪١‬اااغ ٌااآ طغاااظخذَ‬ ‫حٌـ‪ Extended Keys‬أ‪ ٞ‬حٌؼغؾ حٌّط‪ٛ‬ي‪...‬‬ ‫‪٘ٚ‬ىتتزا ث‪ٕ١‬تتب و‪١‬ف‪١‬تتخ ثٕتتبء ٔظتتبَ ٌتتزذىُ ػتتٓ ثؼتتذ ثبعتتزخذاَ اٌتتـ ‪ٚ Remoting‬ؽتتشق اعتتزخذاَ‬ ‫اٌتتـ‪ Serialization‬فتت‪ ٟ‬اٌتتذ‪ٚ‬د ٔ‪١‬تتذ ‪ٚ‬ؽتتشق ثٕتتبء ‪ٚ‬رظتتّ‪ ُ١‬األٔظّتتخ اٌّ‪ٛ‬صػتتخ‪ ,‬عتتٕزذذس فتت‪ٟ‬‬ ‫اٌفظً اٌزبٌ‪ ٟ‬ػٓ ؽشق اعزخذاَ اٌـ ‪ SMTP‬إلسعبي ‪ٚ Emil’s‬اٌـ ‪ٌ POP3‬مشاءح اٌـ ‪Mail‬‬ ‫‪ Box‬ف‪ ٟ‬اٌذ‪ٚ‬د ٔ‪١‬ذ‪...‬‬

‫~‪~272‬‬


Chapter 16 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

~273~


‫‪: SMTP & POP3 Programming :16‬‬ ‫ع‪ٛ‬ف ٔظلذع ف‪٘ ٟ‬زح حٌـضء عٓ رشِـش حٌـ‪ٚ SMTP‬حٌّغج‪ٛ‬ي عآ اسعاخي حٌشعاخثً عزاش حٌزش‪٠‬اذ‬ ‫حإلٌىظش‪ ٟٔٚ‬اٌ‪ ٝ‬حٌاـ‪ ٚ Mail Server‬حٌاـ‪ٚ POP3‬حٌّغاج‪ٛ‬ي عآ عٍّ‪١‬اش حٌاـ ‪ٌ Download‬شعاخٌش‬ ‫ِٓ حٌـ‪ Mail Server‬اٌ‪ ٝ‬ؿ‪ٙ‬خص حٌضر‪... ْٛ‬‬ ‫أ‪ٚ‬ال‪SMTP – Simple Mail Transfer Protocol Programming :‬‬ ‫ِٓ حٌّعش‪ٚ‬ف أْ حٌـ‪٠ Mail Server‬م‪ َٛ‬رظـضثاش عٍّ‪١‬اخص اسعاخي ‪ ٚ‬حعاظمزخي حٌزش‪٠‬اذ حإلٌىظش‪ٔٚ‬ا‪ٟ‬‬ ‫عزش حإلٔظشٔض اٌ‪ ٝ‬ػالػش أؿضحء ‪ ٟ٘ٚ‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫‪ٚ Message Transfer Agent – MTA‬حٌّغااج‪ٛ‬ي عاآ حإلسعااخي ‪ٚ Outgoing‬حٌظ‪ٛ‬طاا‪ً١‬‬ ‫‪ٌٍ Incoming‬شعخثً‬ ‫‪ ٚ Message Delivery Agent -MDA‬حٌّغاج‪ٛ‬ي عآ عٍّ‪١‬اخص حٌاـ ‪ٚ filtering‬حٌظؤواذ ِآ‬ ‫‪ٚ‬ط‪ٛ‬ي حٌشعخٌش‬ ‫‪ٚ Message User Agent -MUA‬حٌّغااج‪ٛ‬ي عاآ عٍّ‪١‬ااش لااشحءس ‪ ٚ‬طخااض‪ ٓ٠‬حٌشعااخٌش فاا‪ٟ‬‬ ‫‪ٌ Database‬ااذ‪ ٜ‬حٌّغااظمزً ‪ٚ Client‬طااظُ ٘اازٖ حٌعٍّ‪١‬ااش رخعااظخذحَ رش‪ٚ‬ط‪ٛ‬واا‪ٛ‬ي ‪POP - Post‬‬ ‫‪ Office Protocol‬حٔظش اٌ‪ ٝ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫‪٠ ٚ‬غااظخذَ رشط‪ٛ‬واا‪ٛ‬ي حٌااـ‪ SMTP Simple Mail Transfer Protocol‬رشااىً أعخعاا‪ ٟ‬فاا‪ٟ‬‬ ‫حٌـ‪ MTA‬أ‪ ٞ‬عٍّ‪١‬خص اسعخي ‪ٚ Outgoing‬ط‪ٛ‬ط‪ Incoming ً١‬حٌشعخثً ‪.‬‬

‫~‪~274‬‬


‫ٌظطز‪١‬ك ‪٠‬ـذ أ‪ٚ‬ال حٌظؤوذ ِٓ أٔه طٍّه كغخد ‪ ِٓ SMTP‬حٌـ‪ Internet Provider‬حٌخاخص راه‬ ‫طغظط‪١‬ع طـشرش حٌاـ‪ Account‬حٌخاخص راه ِآ خاالي رشٔاخِؾ حٌاـ‪ Outlook Express‬حٌّ‪ٛ‬ؿا‪ٛ‬د‬ ‫ِع حٌـ‪ Windows‬ارح وٕض ال طٍّاه كغاخد ‪ SMTP‬طغاظط‪١‬ع طـشراش حٌزشٔاخِؾ ِآ خاالي أشاخء‬ ‫‪ Virtual SMTP Server‬عآ ؽش‪٠‬اك حٌاـ‪ٚ IIS‬رٌاه رظؼز‪١‬ظ‪ٙ‬اخ ِآ ‪Control Panel >> :‬‬ ‫‪ Add/Remove Programs‬طؤوذ ِٓ طفع‪ ً١‬وً ِٓ حٌـ‪ٚ IIS‬حٌـ‪ SMTP‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫ػُ اعذحد حٌـ‪ ِٓ Server‬حٌـ‪ IIS‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫طاااااااذعُ حٌاااااااذ‪ٚ‬ص ٔ‪١‬اااااااض حعاااااااظخذحَ رش‪ٚ‬ط‪ٛ‬وااااااا‪ٛ‬ي حٌاااااااـ‪ِ SMTP‬ااااااآ خاااااااالي ‪Namespace‬‬ ‫‪ ٚ System.Web.Mail‬طلظ‪ ٞٛ‬عٍ‪ ٝ‬حٌىالط ‪ٚ SmtpMail‬حٌظ‪ ِٓ ٟ‬خالٌ‪ٙ‬خ ٔغاظخذَ حٌذحٌاش‬ ‫‪ٚSend‬حٌظ‪ ٟ‬طغاظخذَ إلسعاخي حٌشعاخٌش عزاش حٌاـ ‪٘ٚ 25 Port‬ا‪ ٛ‬حٌاـ‪ Port‬حٌّخظاض ٌزش‪ٚ‬ط‪ٛ‬وا‪ٛ‬ي‬ ‫‪ ٚ SMTP‬طعظزش حٌذحٌش ‪ " overloaded Method " Send‬ك‪١‬غ طؤخز عذس أشىخي ار ربِىخٔاه‬

‫~‪~275‬‬


َ‫ ٔغااااظخذ‬ٟ‫رشااااىً حفظشحػاااا‬ٚ ، ‫ظشحص‬١ِٚ‫ أسرعااااش رااااخس‬ٝ‫حكااااذ اٌاااا‬ٚ ‫ظش‬١ِٚ‫خ ِااااع رااااخس‬ِٙ‫حعااااظخذح‬ : ‫ش‬١ٌ‫ظشحص حٌظخ‬١ِٚ‫حٌزخس‬ SmtpMail.Send(string from, string to, string subject, string body) ٚ ٗ‫ااا‬١ٌ‫حْ حٌّشعاااً ا‬ٛ‫اااٗ عٕااا‬١‫ػاااع ف‬ٛ٠ ٟٔ‫حٌؼاااخ‬ٚ ً‫حْ حٌّشعااا‬ٛ‫اااٗ عٕااا‬١‫ػاااع ف‬ٛ٠ ‫ي‬ٚ‫ظش حأل‬١ِٚ‫حٌزاااخس‬ . ‫حٌشحرع ٌٕض حٌشعخٌش‬ٚ ‫حْ حٌشعخٌش‬ٕٛ‫ظش حٌؼخٌغ ٌع‬١ِٚ‫حٌزخس‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ وّخ ف‬New Form ‫ لُ ربٔشخء‬ٟٔٚ‫ذ حإلٌىظش‬٠‫َ ربسعخي حٌزش‬ٛ‫م‬٠ ‫ٌعًّ رشٔخِؾ‬ٚ

‫ لاُ رابدسحؽ‬.Mail ‫ه‬٠‫اش ٌاذ‬ٙ‫ ) ارح ٌاُ طظ‬، System.Web.Mail Namespace ‫ػُ لاُ ربػاخفش‬ : ٌٟ‫د حٌظخ‬ٛ‫ ( ػُ لُ رىظخرش حٌى‬References‫ حٌـ‬ٌٝ‫ ا‬System.Web Namespace 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); }

~276~


catch (Exception ex) { MessageBox.Show(ex.Message); } 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 Server ٟ‫فاٗ ِغازمخ فا‬٠‫ طاُ طعش‬ٞ‫حٌاز‬ٚ) SMTP‫ حٌخخص رخٌاـ‬IP ‫حٌـ‬ٚ ‫حٌغخرك‬ ُ‫ااذع‬٠ ‫ه‬٠‫ ٌااذ‬SMTP Server‫ؼااخ ِاآ حٌااـ‬٠‫ـااذ حٌظؤوااذ أ‬٠ ، SMTP Server Textbox ‫رخٌااـ‬ CDO2 - Microsoft Collaboration Data Objects Version 2 ‫حعاظخذحَ حٌّىظزاش‬ ، CDO2 Object ٝ‫ي اٌا‬ٛ‫ط‬ٌٛ‫ع ح‬١‫غظط‬٠ ‫خزشن رؤٔٗ ال‬٠ Exception ٍٝ‫ف طلظً ع‬ٛ‫اال ع‬ٚ ٟ‫طعّاً رشاىً حفظشحػا‬ٚ Windows 2000 ٚ Windows XP ‫خ ِاع‬ِٙ‫اظُ حعاظخذ‬٠ ‫ حٌعاخدس‬ٟ‫فا‬ ‫ أِاخ‬Microsoft Exchange Server2003 ‫ ِع‬ٚ‫ أ‬SMTP Virtual Server‫ض حٌـ‬١‫عٕذ طؼز‬ Exception‫ حٌااـ‬ٝ‫ف طلظااً عٍاا‬ٛ‫ فغاا‬5.5 ٚ‫ أ‬Exchange Version 5 َ‫ارح وٕااض طغااظخذ‬ . ‫حٌغخرك حٌزوش‬

~277~


SMTP Advanced Programming :َ‫اٌجضء األوضش رمذ‬ ٟ‫فاا‬ٚ ، CDO2 َ‫ رخعااظخذح‬SMTP ‫ؾ إلسعااخي سعااخثً عزااش حٌااـ‬١‫عظزااش حٌّؼااخي حٌغااخرك ِؼااخي رغاا‬٠ ‫ رخإلػاخفش‬HTML Format‫اظُ حعاظخذحَ حٌاـ‬٠ Outlook‫حٌعخدس عٕذ أشخء رشحِؾ ِؼً رشٔخِؾ حٌاـ‬ ٟ‫ٔا‬ٚ‫اذ حإلٌىظش‬٠‫ حعاظمزخي حٌزش‬ٚ ‫اخسحص إلسعاخي‬١‫اه عاذس خ‬١‫عط‬٠ ‫ؽزعاخ‬ٚ ‫ش اسعخي ٍِلماخص‬١ٔ‫اال اِىخ‬ ... POP3‫ حٌـ‬ٚ‫ أ‬HTTP‫ً٘ رخعظخذحَ حٌـ‬ SMTP‫ رخعاظخذحَ حٌاـ‬ٟ‫ٔا‬ٚ‫اذ حإلٌىظش‬٠‫حعاظمزخي حٌزش‬ٚ ‫َ ربسعخي‬ٛ‫م‬٠ ‫ؾ‬١‫َ ربٔشخء رشٔخِؾ رغ‬ٛ‫ف ٔم‬ٛ‫ع‬ ‫اض‬١‫َ رظؼز‬ٛ‫ أْ طما‬ٚ‫ أ‬POP3 ‫ه كغاخد‬٠‫فش ٌاذ‬ٛ‫ظ‬٠ ْ‫ـذ أ‬١‫ ف‬POP3‫ رٕغزش العظخذحَ حٌـ‬POP3 ‫حٌـ‬ٚ Microsoft َ‫ أْ طغااظخذ‬ٚ‫ أ‬Windows Server ‫ ِااع‬ٟ‫ طااؤط‬ٟ‫حٌظاا‬ٚ POP3 Service‫حٌااـ‬ ‫ف طلظاخؽ‬ٛ‫ ار عٕاذ٘خ عا‬POP3‫غاظخذَ حٌاـ‬٠ ‫اغ‬١‫اعاذحدٖ رل‬ٚ ‫اخصن‬ٙ‫ ؿ‬ٝ‫ عٍا‬Exchange Server ٝ‫ رخإلػاخفش اٌاا‬Windows Server ٚ ‫اخص‬ٙ‫ حٌـ‬ٝ‫ ِؼزاض عٍاا‬Domain Controller ‫د‬ٛ‫ؿا‬ٌٛ .ٗ١ٍ‫ ع‬Active Directory‫ض حٌـ‬١‫طؼز‬ Namespace ‫رٌاااه ِااآ خاااالي‬ٚ ‫حص‬ٛ‫اااض دعاااُ ِّظاااخص العاااظخذحَ ٘ااازٖ حٌخااا‬١ٔ ‫ص‬ٚ‫لاااذِض حٌاااذ‬ ٚ HTML Format‫ ٌااذعُ حٌااـ‬MailMessage ‫رخعااظخذحَ حٌىااالط‬ٚ System.Web.Mail POP3‫ٌىٓ ٌزشِـش حٌاـ‬ٚ ‫ش اسعخي ٍِلمخص ِع حٌشعخٌش‬١ٔ‫ ٌذعُ اِىخ‬MailAttachment ‫حٌىالط‬ System.IO ٚ System.Net ٚ System.Net.Socket Namespace َ‫ٍااااااااضَ حعااااااااظخذح‬٠ ٟ‫فا‬ٚ ‫اذس‬٠‫د سعاخثً ؿذ‬ٛ‫ؿا‬ٚ ‫اش طفلاض‬١ٍّ‫اخَ رع‬١‫ ٌٍم‬Server‫ خخص ِع حٌـ‬Session ًّ‫ظُ ع‬٠ ‫غ‬١‫ك‬ ٝ‫عٕااذ حٌؼااغؾ عٍاا‬ٚ ‫ كغااذ حٌلخؿااش‬Treelist ٚ‫ أ‬List Box ٟ‫ااخ فاا‬ٙ‫َ رظعزجظ‬ٛ‫ماا‬٠ ‫د٘ااخ‬ٛ‫ؿ‬ٚ ‫كخٌااش‬ Advanced ً‫ٌعّا‬ٚ Mail Server‫ ٌشعخٌش ِٓ حٌاـ‬Download ًّ‫ رع‬Client‫َ حٌـ‬ٛ‫م‬٠ ‫اكذح٘خ‬ : ٍٟ٠ ‫ وّخ‬MailMessage ‫ ِٓ حٌىالط‬Object ‫ لُ رؤخز‬SMTP eMail Sender 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; mm.Headers.Add("Reply-To", "fadi822000@yahoo.com"); mm.Headers.Add("Comments", "This is a test HTML message"); mm.Priority = MailPriority.High; mm.BodyFormat = MailFormat.Html; mm.Body = "<html><body><h1>" + textBox4.Text + "</h1></html>"; SmtpMail.Send(mm); } catch (Exception ex) {MessageBox.Show(ex.Message);} VB.NET: imports System.Web.Mail;

~278~


Try Dim mm As MailMessage = New MailMessage mm.From = textBox1.Text mm.To = textBox2.Text mm.Subject = textBox3.Text mm.Headers.Add("Reply-To", "fadi822000@yahoo.com") mm.Headers.Add("Comments", "This is a test HTML message") mm.Priority = MailPriority.High mm.BodyFormat = MailFormat.Html mm.Body = "<html><body><h1>" + textBox4.Text + "</h1></html>" SmtpMail.Send(mm) Catch ex As Exception Msgbox(ex.Message) End Try ٞ‫ أ‬ٚ‫ كـاُ أ‬ٚ‫ْ أ‬ٛ‫ ٌا‬ٞ‫ػاع أ‬ٚ ٓ‫ّىٕه ِا‬٠ ‫٘زح‬ٚ HTML‫د حٌـ‬ٛ‫غظخذَ و‬٠ ‫الكع أْ ؿغُ حٌشعخٌش‬ ‫ـااذ‬٠ ‫ اسعااخي ٍِلمااخص‬ٝ‫ٌـعااً حٌزشٔااخِؾ لااخدس عٍاا‬ٚ ، HTML‫ّىاآ عٍّااٗ رخعااظخذحَ حٌااـ‬٠ ‫ء‬ٟ‫شاا‬ : ‫د‬ٛ‫ رخٌى‬ٍٟ٠ ‫وّخ‬ٚ ٗ١‫ادسحؽ حعُ حٌٍّف ف‬ٚ MailAttachment ‫حعظخذحَ حٌىالط‬ C#: MailAttachment myattach = new MailAttachment("Your_Attached_File_path.extension", MailEncoding.Base64); VB.NET: Dim myattach As MailAttachment = New MailAttachment("Your_Attached_File_path.extension", MailEncoding.Base64) ‫ش٘اخ طعظّاذ‬١‫غ‬ٚ Design ‫اش حي‬١ٍّ‫ ؽزعخ ع‬، ًِ‫ رشىً وخ‬SMTP‫ٕخ ِٓ رشٔخِؾ حٌـ‬١ٙ‫٘ىزح لذ حٔظ‬ٚ .‫خزشس حٌّزشِؾ‬ٚ ‫روخء‬ٚ ‫ق‬ٚ‫ كغذ ر‬ٍٝ‫ع‬

~279~


‫صبٔ‪١‬ب ‪POP3- Post Office Protocol Version 3 Programming :‬‬ ‫وّاخ طلاذػٕخ عاخرمخ فابْ ‪ٚ‬ظ‪١‬فاش رشط‪ٛ‬وا‪ٛ‬ي حٌاـ‪ٚ POP3‬حٌاز‪٠ ٞ‬عّاً فا‪ ٟ‬ؿاضء حٌاـ ‪MUA - Mail‬‬ ‫‪ User Agent‬عٍ‪ 112 Port ٝ‬ػّٓ رشط‪ٛ‬و‪ٛ‬ي حٌـ‪ TCP‬طىّٓ فا‪ ٟ‬و‪ٔٛ‬اٗ حٌّغاج‪ٛ‬ي عآ عٍّ‪١‬اش‬ ‫ط‪ٛ‬ط‪ ً١‬حٌشعخٌش اٌ‪ ٝ‬حٌضر‪ ِٓ Client ْٛ‬خالي عّاً ‪ٌٙ Download‬اخ ِآ حٌاـ‪Mail Server‬‬ ‫ك‪١‬اغ طلفااع حٌشعااخثً فاا‪ ٟ‬حٌااـ‪ٚ Mail Folder‬حٌّ‪ٛ‬ؿاا‪ٛ‬د أعخعااخ فاا‪ ٟ‬ؿ‪ٙ‬ااخص حٌااـ‪ Client‬أٔظااش اٌاا‪ٝ‬‬ ‫حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ِٚ‬آ حٌزاذحثً ٌٍاـ ‪ POP3‬رشط‪ٛ‬وا‪ٛ‬ي ‪ Interactive Mail Access Protocol – IMAP‬فّآ‬ ‫خالٌٗ ‪٠‬غظط‪١‬ع حٌّغظخذَ أشخء ‪ Mail Folder‬خخطش رٗ ‪ٌٚ‬ىآ فا‪ ٟ‬حٌاـ‪ٌٚ Mail server‬ا‪١‬ظ‬ ‫ف‪ ٟ‬ؿ‪ٙ‬خص حٌضر‪ٚ ْٛ‬طعظزش ٘زٖ ِٓ ِ‪١‬ضحص حٌـ‪ٚ IMAP‬عا‪١‬جخطٗ رإفظ حٌ‪ٛ‬لاض ار أْ لاشحءس حٌشعاخٌش‬ ‫طظُ ِزخششس ِٓ خالي حٌـ‪ Server‬ك‪١‬غ طغظط‪١‬ع لشحءط‪ٙ‬خ ِٓ أوؼش ِٓ ‪ٌٚ Client‬ىآ حٌّشاىٍش ف‪١‬اٗ‬ ‫٘ا‪ ٟ‬طلىاُ ِاذ‪٠‬ش خاخدَ حٌشعاخثً ‪ Mail Server Administrator‬رلـاُ حٌاـ‪ Mail Folder‬ار‬ ‫طى‪ ْٛ‬ف‪ ٟ‬حٌعخدس ععظ‪ٙ‬خ ِلذ‪ٚ‬دس أٔظش اٌ‪ ٝ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫الكااااع أْ حٌااااـ‪٠ Mail Folder‬مااااع ػاااآّ ‪٠ٚ Mail Server‬ااااظُ لشحءطااااٗ رعااااذ حٌظلمااااك‬ ‫‪ِ Authentication‬اآ حعااُ حٌّغااظخذَ ‪ٚ‬وٍّااش حٌّااش‪ٚ‬س ٌىاآ وّااخ لٍٕااخ فاابْ ِشااىٍظٗ طىّاآ فاا‪ٟ‬‬ ‫ِلذ‪ٚ‬د‪٠‬ااش عااعش حٌااـ‪ٌ Mail Folder‬اازح ‪ٕ٠‬ظااق ٌشااشوخص حٌىز‪١‬ااشس حعااظخذحَ حٌااـ‪ POP3‬و‪ٔٛ‬ااٗ غ‪١‬ااش‬ ‫ِلاااذ‪ٚ‬د حٌغاااعش فخٌاااز‪٠ ٞ‬اااظلىُ فااا‪ ٟ‬حٌغاااعش ٘ااا‪ ٛ‬حٌاااـ‪ٚ Client‬ال دخاااً ٌاااـ ‪Mail Server‬‬ ‫‪ Administrator‬ر‪ٙ‬خ‪.‬‬

‫~‪~281‬‬


‫‪ٚ‬رّااخ إٔٔااخ لشسٔااخ حعظّااخد حٌااـ‪ٌ POP3‬عٍّ‪١‬ااش لااشحءس حٌشعااخثً عاا‪ٛ‬ف ٔزااذأ رزشِـظااٗ ار ‪ٍ٠‬ااضَ حألِااش‬ ‫حعااظخذحَ ‪ System.IO ٚ System.Net ٚ System.Net.Socket Namespace‬ك‪١‬ااغ ‪٠‬ااظُ‬ ‫عًّ ‪ Session‬خخص ِع حٌـ‪ Server‬رخعظخذحَ حٌاـ‪ٌٍ Socket‬م‪١‬اخَ رعٍّ‪١‬اش طفلاض ‪ٚ‬ؿا‪ٛ‬د سعاخثً‬ ‫ؿذ‪٠‬ااذس ‪ٚ‬فاا‪ ٟ‬كخٌااش ‪ٚ‬ؿ‪ٛ‬د٘ااخ ‪٠‬ماا‪ َٛ‬رظعزجااش عٕخ‪ٕٙ٠ٚ‬ااخ فاا‪ List Box ٟ‬أ‪ Treelist ٚ‬خااخص كغااذ‬ ‫حٌلخؿاش ‪ٚ‬عٕاذ حٌؼاغؾ عٍا‪ ٝ‬اكاذح٘خ ‪٠‬ما‪ َٛ‬حٌاـ‪ Client‬رعّاً ‪ٌ Download‬شعاخٌش ِآ حٌاـ ‪Mail‬‬ ‫‪ Server‬اٌ‪ ٝ‬حٌـ‪ Mail Folder‬ػُ عشػ‪ٙ‬خ ف‪.Textbox ٟ‬‬ ‫‪ٌٚ‬ظطز‪١‬ك لُ ربٔشخء ‪ New Form‬ؿذ‪٠‬ذ وّخ ‪٠‬ظ‪ٙ‬ش ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫ػُ لُ ربػخفش ‪ Namespaces‬حٌظخٌ‪١‬ش ‪:‬‬ ‫‪C#:‬‬ ‫;‪using System.Net‬‬ ‫;‪using System.Net.Socket‬‬ ‫;‪using System.IO‬‬ ‫‪VB.NET:‬‬ ‫‪imports System.Net‬‬ ‫‪imports System.Net.Socket‬‬ ‫‪imports System.IO‬‬ ‫الكع حٔٗ ‪٠‬ظُ حٌظعخًِ ِع حٌـ‪ٚ Socket‬حٌـ‪ Stream‬إلٔشخء ‪ِ Session‬ع حٌـ‪ Server‬رخعظخذحَ‬ ‫رشط‪ٛ‬و‪ٛ‬ي حٌـ‪ٚ TCP‬لشحءس حٌشعخٌش ِٓ حٌـ‪٠ٚ ،POP3 Server‬غظخذَ حٌـ ‪Stream Socket‬‬ ‫حٌغخرك ٌظّش‪٠‬ش حٌـ ‪ Commands‬اٌ‪ ٝ‬حٌـ‪:ٟ٘ٚ Server‬‬

‫~‪~280‬‬


USER (USER USER_NAME) PASS (PASS PASSWORD) RETR (RETR Message_Number) STAT QUIT

Password ‫حٌـ‬ٚ User Name ‫ادخخي حٌـ‬ ‫خص حٌظلمك حٌـ‬١ٍّ‫إلؿشحء ع‬ Authentication POP3 ‫طغظخذَ ٌـٍذ حٌشعخٌش ِٓ حٌـ‬ٚ ... Byte Array ‫طشؿع وـ‬ٚ ً‫عذد حٌشعخث‬ٚ ‫ذس‬٠‫د سعخثً ؿذ‬ٛ‫ؿ‬ٚ ‫ٌّعشفش‬ inbox ‫ حٌـ‬ٟ‫ذس ف‬٠‫حٌـذ‬ POP3 Server ‫ ِع حٌـ‬Session ‫اغالق حٌـ‬

‫ ِٕطماش‬ٟ‫ – فا‬ٟ‫غا‬١‫ف حٌىالط حٌشث‬٠‫ رعذ طعش‬ٞ‫ش حٌزشٔخِؾ )أ‬٠‫ رذح‬ٟ‫ش ف‬١ٌ‫ف حٌظخ‬٠‫ػُ لُ ربػخفش حٌظعخس‬ : (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";// ..‫ذ‬٠‫ حٌزشٔخِؾ ٌعًّ عطش ؿذ‬ٟ‫خ ف‬ِٙ‫العظخذح‬ 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 Server = new TcpClient(POPServ.Text,110); try { // initialization NetStrm = Server.GetStream(); RdStrm= new StreamReader(Server.GetStream()); Status.Items.Add(RdStrm.ReadLine()); // Login Process Data = "USER "+ User.Text+CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

~282~


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‫ حٌـ‬ٌٝ‫ ا‬ٌٟ‫د حٌظخ‬ٛ‫لُ ربػخفش حٌى‬ C#: // 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(); 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)

~283~


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

~284~


‫‪Else‬‬ ‫)‪Status.Items.Add(szTemp‬‬ ‫‪End If‬‬ ‫‪Catch err As InvalidOperationException‬‬ ‫)‪Status.Items.Add("Error: " + err.ToString‬‬ ‫‪End Try‬‬ ‫‪٘ٚ‬ىزح ر‪ٕ١‬خ و‪١‬ف‪١‬ش عًّ حٌاـ‪ٚ POP3‬رشِـظاٗ فا‪ ٟ‬حٌاذ‪ٚ‬ص ٔاض ‪٘ٚ‬ازح ِؼاخي رغا‪١‬ؾ طغاظط‪١‬ع حٌزاذء ِٕاٗ‬ ‫ٌعّااً ِشااش‪ ٚ‬وخِااً شااز‪ ٗ١‬رخٌااـ‪ Outlook‬حٌخااخص رّ‪١‬ىش‪ٚ‬عاا‪ٛ‬فض ك‪١‬ااغ طغااظط‪١‬ع حعااظخذحَ ٍِااف‬ ‫حٌاـ‪ DLL‬حٌخااخص رخإلٔظشٔاض اوغاازٍ‪ٛ‬سس ٌعاشع حٌشعااخثً حٌا‪ٛ‬حسدس رااذال ِآ عشػاا‪ٙ‬خ عٍا‪ ٝ‬شااىً‬ ‫‪ HTML Code‬وّخ طغظط‪١‬ع عًّ ‪ٌٛ Tree List‬ػع حٌشعخثً حٌ‪ٛ‬حسدس ك‪١‬غ ‪٠‬ى‪ٌ ْٛ‬ىاً سعاخٌش‬ ‫سلااُ طغٍغااٍ‪٠ ٟ‬ااظُ ‪ٚ‬ػااعٗ فاا‪ ٟ‬حٌىاا‪ٛ‬د حٌغااخرك ٌمشحءط‪ٙ‬ااخ ك‪١‬ااغ حعااظخذِض حٌااشلُ ‪ 1‬رشااىً حفظشحػاا‪ٟ‬‬ ‫‪ٚ‬حٌز‪٠ ٞ‬م‪ َٛ‬رمشحءس حٌشعخٌش حألخ‪١‬شس حٌ‪ٛ‬حسدس ‪،‬‬ ‫ع‪١‬زُ اٌذذ‪٠‬ش ف‪ ٟ‬اٌفظً اٌزبٌ‪ ٟ‬ػٓ اٌـ ‪ٚ FTP‬ؽشق اٌزؼبًِ ِؼٗ ف‪ ٟ‬ث‪١‬ئخ اٌذ‪ٚ‬د ٔ‪١‬ذ‪.‬‬

‫~‪~285‬‬


Chapter 17 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

~286~


‫‪: FTP – File Transfer Protocol Programming 17‬‬ ‫ع‪ٛ‬ف ٔزذأ ٕ٘خ رششف رشط‪ٛ‬و‪ٛ‬ي أخاش ِآ رشط‪ٛ‬وا‪ٛ‬الص حٌاـ‪٘ٚ Application Layer‬ا‪ ٛ‬رشط‪ٛ‬وا‪ٛ‬ي‬ ‫حٌـ‪ٚ FTP‬حٌز‪٠ ٞ‬غظخذَ رشىً أعخع‪ ٟ‬ف‪ ٟ‬عٍّ‪١‬ش حٌـ ‪ ٚ downloading‬حٌاـ ‪ uploading‬حٌٍّفاخص‬ ‫ِآ ‪ٚ‬اٌا‪ ٝ‬حٌاـ‪ٚ FTP Server‬وخٌعاخدس فا‪ ٟ‬حغٍاذ رشِـ‪١‬اخص حٌشازىخص ‪ ٚ‬حٌظا‪ ٟ‬طعظّاذ عٍا‪ٚ ٝ‬ؿا‪ٛ‬د‬ ‫‪ Client/Server‬ك‪١‬اااغ ‪٠‬مااا‪ َٛ‬حٌاااـ‪ Server‬رظظااإض عٍااا‪ ٝ‬حٌاااـ‪ Port‬حٌّخظاااض ٌٍاااـ ‪٘ٚ FTP‬ااا‪ٛ‬‬ ‫حٌاـ‪ 21 Port‬رخعاظخذحَ حٌاـ‪TCP Connection Oriented Protocol‬ك‪١‬اغ ‪٠‬زما‪ ٝ‬حٌاـ‪Server‬‬ ‫ر‪ٛ‬ػااع حالٔظظااخس ٌاا‪ٛ‬س‪ٚ‬د ؽٍااذ ِاآ حٌااـ‪ Client‬ربٔشااخء ‪ِ Session‬عااٗ ‪ٚ‬رعااذ اؿااشحء عٍّ‪١‬ااخص‬ ‫حٌظلمك ‪ٚ Authentication‬حٌظؤواذ ِآ حٌظاالك‪١‬خص ‪٠‬اظُ حٌّ‪ٛ‬حفماش عٍا‪ ٝ‬حٌزاذء رخٌـٍغاش ك‪١‬اغ ‪٠‬اظُ‬ ‫طلذ‪٠‬ذ سلُ حٌـ‪ٚ Port‬حٌز‪ ٞ‬ع‪ٛ‬ف ‪٠‬ظُ حعظمزخي حٌز‪١‬خٔخص ِٓ خالٌٗ ‪٠ٚ‬ظُ حإلسعخي اٌ‪ ٝ‬ؿ‪ٙ‬اخص حٌضرا‪ْٛ‬‬ ‫عزش حٌـ‪ 22 Port‬ف‪ ٟ‬حي‪ٚ Server‬طظؼق ٘زٖ حٌعٍّ‪١‬ش وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫ِالدظخ‪ٌ :‬ظفع‪ ً١‬خذِش حٌـ‪ٌ FTP‬اذ‪٠‬ه رل‪١‬اغ ‪٠‬عّاً ؿ‪ٙ‬اخصن واـ ‪٠ FTP Server‬ـاذ أ‪ٚ‬ال حٌظؤواذ‬ ‫ِٓ أْ حٌـ‪ِ FTP Services‬ؼزظش ٌذ‪٠‬ه ِع حٌـ‪ ٚ IIS‬وّخ ‪٠‬ظ‪ٙ‬ش ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫~‪~287‬‬


‫‪ ِٓٚ‬ػُ حٌظؤوذ ِٓ طفع‪ٍٙ١‬اخ راـ ‪ِ Services‬آ ‪ Control Panel‬ػاُ ‪Administrative Tools‬‬ ‫ػُ ‪ٚ Services‬وّخ ‪٠‬ظ‪ٙ‬ش ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫ػُ حٌظؤوذ ِٕٗ ف‪ ٟ‬حٌـ‪ IIS‬رل‪١‬غ ‪٠‬ظ‪ٙ‬ش وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫~‪~288‬‬


‫أ‪ٚ‬ال ‪FTP Commands :‬‬ ‫طشزٗ عٍّ‪١‬ش حالطظخي ‪ ٚ‬حالعظخذحَ ٌٍـ ‪ FTP‬عٍّ‪١‬ش حٌـ‪ Telnet‬اٌ‪ ٝ‬كذ وز‪١‬ش ك‪١‬اغ ‪٠‬اذعُ رشط‪ٛ‬وا‪ٛ‬ي‬ ‫حٌااـ‪ِ FTP‬ـّ‪ٛ‬عااش ِاآ حأل‪ٚ‬حِااش ‪ٚ‬حٌظاا‪٠ ٟ‬ااظُ ِاآ خالٌ‪ٙ‬ااخ عٍّ‪١‬ااش حٌظخخؽااذ ِااع حٌ اـ‪ Server‬أ‪ِ ٚ‬ااع‬ ‫حٌـ‪ٚ Remote Host‬طؼق ٘زٖ حٌعٍّ‪١‬ش وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪: ٟ‬‬

‫‪ٕ٘ٚ‬خ ششف ألُ٘ حٌـ‪:FTP Commands‬‬ ‫‪USER <username> & PASS‬‬ ‫>‪<password‬‬ ‫>‪ RETR <filename‬أ‪RECV ٚ‬‬ ‫>‪ STOR <filename‬أ‪SEND ٚ‬‬ ‫>‪TYPE <type indicator‬‬

‫‪PASV‬‬

‫ِطٍ‪ٛ‬رش ٌعٍّ‪١‬ش حٌظلمك إلٔشخء حٌـٍغش‬ ‫‪٠ٚ‬غظخذَ ٌظٕض‪ٍِ ً٠‬ف ِٓ حٌـ‪ Server‬رعذ‬ ‫طلذ‪٠‬ذ حعُ حٌٍّف‬ ‫‪٠ٚ‬غظخذَ ٌشفع حٌٍّف اٌ‪ ٝ‬حٌـ‪ Server‬رعذ‬ ‫طلذ‪٠‬ذ حعُ حٌٍّف‬ ‫ٌظلذ‪٠‬ذ ؽز‪١‬عش أ‪١٘ ٚ‬جش حٌز‪١‬خٔخص حٌظ‪٠ ٟ‬ظُ ٔمٍ‪ٙ‬خ‬ ‫‪ٚ‬وّخ ‪: ٍٟ٠‬‬ ‫‪-a ASCII –e EBCDIC – I for‬‬ ‫‪Binary Data‬‬ ‫‪- L<Byte‬‬ ‫>‪ٚSize‬حٌز‪ ٞ‬ع‪١‬ظُ ٔمٍٗ‬ ‫ٌظلذ‪٠‬ذ ٔ‪ ٛ‬حٌـٍغش ع‪ٛ‬حء ‪ Passive‬أ‪ٚ‬‬

‫~‪~289‬‬


ً١‫ظُ طفع‬٠ Passive‫ كخٌش حٌـ‬ٟ‫ ار حٔٗ ف‬Active ‫ ٍِف‬ٞ‫ سفع أ‬ٚ‫د أ‬ٚ‫س‬ٚ ‫ كخٌش‬ٟ‫حالطظخي فمؾ ف‬ . Server‫ حٌـ‬ٌٝ‫ ا‬ٚ ِٓ uploading & ٚ ‫ٌفلض كخٌش حالطظخي‬ Downloading ‫ حٌظعخًِ ِع‬ٟ‫ٗ ف‬١ٍ‫ ِظعخسف ع‬ٛ٘ ‫ وّخ‬ٟ٘ٚ DOS‫ ٔظخَ حٌـ‬ٟ‫ حٌّـٍذحص ف‬ٚ ‫حٌٍّفخص‬ Remote Host‫خء حٌـٍغش ِع حٌـ‬ٙٔ‫إل‬

Status ٚ‫ أ‬STAT Delete , cd , mkdir , rename … Close ٚ‫ أ‬QUIT

: COM Components َ‫ذ ثبعزخذا‬١ٔ ‫د‬ٚ‫ اٌذ‬ٟ‫ ف‬FTP‫ اٌزؼبًِ ِغ اٌـ‬: ‫ب‬١ٔ‫صب‬ ‫ ؿاضء‬ٛ‫٘ا‬ٚ ITC – Internet Transfer Control ‫ عزاش‬FTP‫اض حعاظخذحَ حٌاـ‬١ٔ ‫ص‬ٚ‫طاذعُ حٌاذ‬ New Windows ‫ٌٍزاااذء لاااُ ربٔشاااخء‬ٚ COM Components Controls‫ِااآ حٌاااـ‬ : ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ وّخ ف‬Application

: ‫ش‬١ٌ‫ حٌظخ‬Namespaces ‫ػُ لُ ربػخفش‬ 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;

~291~


ITC.InvokeMember("execute", BindingFlags.InvokeMethod,null, ITCObject, parameter); } 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 Namespace ّٓ‫د ػاا‬ٛ‫ؿاا‬ٌّٛ‫ح‬ٚ Type Class ‫ ِاآ خااالي حٌاـ‬ITC‫ااف حٌااـ‬٠‫ااش طعش‬٠‫ حٌزذح‬ٟ‫طااُ فاا‬ ُ‫اش حعا‬٠‫ طّش‬ٟ‫خ فا‬ِٙ‫رٌه العظخذح‬ٚ Object ٌٕٛ‫ ِٓ ح‬Array ‫ ػُ عشفٕخ‬System.Reflection ITC Control ‫دس ػّٓ حٌاـ‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ InvokeMember ‫ حٌذحٌش‬ٌٝ‫ ا‬FTP Server‫ حٌـ‬ٚ ‫حٌٍّف‬ ... Object : ‫ حٌّـٍذ‬ٟ‫ظُ سفعٗ ف‬١‫ ع‬ٞ‫ف طـذ حٌٍّف حٌز‬ٛ‫ع‬ C:\Inetpub\ftproot

~290~


: Web Class‫ذ ثبعزخذاَ اٌـ‬١ٔ ‫د‬ٚ‫ اٌذ‬ٟ‫ ف‬FTP‫ اٌزؼبًِ ِغ اٌـ‬: ‫صبٌضب‬ Namespaces ّٓ‫دس ػااااا‬ٛ‫ؿااااا‬ٌّٛ‫ح‬ٚ web Class َ‫ رخعاااااظخذح‬FTP‫ّىااااآ رشِـاااااش حٌاااااـ‬٠ ٚ WebRequest ‫ حٌظعخِاااً ِاااع حٌاااـ‬ٟ‫اااش حٌظعخِاااً ِعاااٗ وّاااخ فااا‬١ٍّ‫طشااازٗ ع‬ٚ System.Net ‫ّىٕ​ٕاااخ‬٠ ‫اااغ‬١‫ ك‬HTTP‫ رشِـاااش حٌاااـ‬ٟ‫اااخ فااا‬ٙ‫ طعخٍِٕاااخ ِع‬ٟ‫ حٌظااا‬ٚ Classes webResponse‫حٌاااـ‬ : ٍٟ٠ ‫ وّخ‬ٟ٘ٚ FTP Protocol‫خ ٌظعخًِ ِع حٌـ‬ِٕٙ ‫حالعظفخدس‬ ٞ‫حٌاز‬ٚ WebClient ‫ حعظخذحَ حٌىاالط‬dot net Framework 2 ُ‫ ار طُ دع‬WebClient ٗ‫فا‬٠‫اظُ طعش‬٠ٚ System.Net Namespaces ٓ‫ظُ حعظذعخثٗ ِا‬٠ ٞ‫حٌز‬ٚ 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

~292~


: ٍٟ٠ ‫عشف وّخ‬٠ٚ FTP‫رذأ حٌعًّ ِع حٌـ‬ٚ ً١‫غظخذَ ٌظغـ‬٠ٚ FtpRequestCreator 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 download or upload a file on an FTP ًّ‫غظخذَ ٌع‬٠ٚ FtpWebRequest : ٍٟ٠ ‫خ وّخ‬ٙ‫ف‬٠‫ظُ طعش‬٠ٚ server C#: using System; using System.Net; namespace FTP {

~293~


public class FtpWebRequest : WebRequest { private string username = "Fadi"; internal string password = "fff"; 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; } } }

~294~


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

~295~


Public Overloads Overrides Property Method() As String Get Return method End Get 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 :ٍٟ٠ ‫خ وّخ‬ٙ‫ف‬٠‫ظُ طعش‬٠ٚ Server‫ش حٌشد ِٓ لزً حٌـ‬١ٍّ‫غظخذَ ٌع‬٠ٚ FtpWebResponse C#: using System; using System.IO; using System.Net; using System.Net.Socket; namespace FTP { public class FtpWebResponse : WebResponse { private FtpWebRequest request; private FtpClient client; internal FtpWebResponse(FtpWebRequest request) { this.request = request; } } } VB.NET: Imports System Imports System.IO Imports System.Net Imports System.Net.Socket Public Class FtpWebResponse Inherits WebResponse Private request As FtpWebRequest

~296~


Private client As FtpClient Friend Sub New(ByVal request As FtpWebRequest) Me.request = request End Sub End Class ً‫اااش حٌٕمااا‬١ٍّ‫غاااظخذَ ٌع‬٠ ‫ف‬ٛ‫ عااا‬ٞ‫حٌاااز‬ٚ Stream‫اااف حٌاااـ‬٠‫غاااظخذَ ٌظعش‬٠ٚ FtpWebStream :ٍٟ٠ ‫ وّخ‬ٟ‫عشف رشىً ِزذث‬٠ٚ C#: using System; using System.IO; using System.Net.Socket; namespace FTP { internal class FtpWebStream : Stream { private FtpWebResponse response; private NetworkStream dataStream; public FtpWebStream(NetworkStream dataStream, FtpWebResponse response) { this.dataStream = dataStream; this.response = response; } } } VB.NET: Imports System Imports System.IO Imports System.Net.Socket 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

~297~


Stream‫ ثبعزخذاَ اٌـ‬Server ‫بص‬ٙ‫ ج‬ٌٝ‫ إ‬Client ‫بص‬ٙ‫ ٌشفغ ٍِف ِٓ ج‬ٟ‫م‬١‫ ِضبي رطج‬: ‫ساثؼب‬ :Socket‫اٌـ‬ٚ Stream ‫رظعخِااً ِااع حٌاـ‬ٚ Client / Server ٓ١‫َ ربٔشااخء رشٔااخِـ‬ٛ‫ف ٔماا‬ٛ‫ ٘اازح حٌـااضء عاا‬ٟ‫فاا‬ َ‫ رخعاظخذح‬Stream‫ اسعاخٌٗ عزاش حٌاـ‬ٚ Byte Array ٝ‫اً حٌٍّاف اٌا‬٠ٛ‫َ رظل‬ٛ‫ف ٔما‬ٛ‫ عا‬Library ‫ لُ ربٔشاخء‬Client‫ حٌـ‬ٚ‫ٌزشِـش حٌـضء حٌخخص رخإلسعخي أ‬ٚ ، TCP Connectionٚ Socket‫حٌـ‬ : ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ذ وّخ ف‬٠‫ ؿذ‬ٚ‫ِشش‬

: ‫ش‬١ٌ‫ حٌظخ‬Namespaces َ‫ف ٔغظخذ‬ٛ‫ع‬ C#: using System.IO; using System.Net; using System.Net.Socket; using System.Text; VB.NET: imports System.IO imports System.Net imports System.Net.Socket imports System.Text : ٌٟ‫د حٌظخ‬ٛ‫ لُ رىظخرش حٌى‬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);}

~298~


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‫اسعااخٌٗ عزااش حٌااـ‬ ‫رعاذ رٌاه لّٕاخ‬ٚ FileStream ّٓ‫دس ػا‬ٛ‫ؿ‬ٌّٛ‫ح‬ٚ Read ‫ ػُ طعزجظٗ رخعظخذحَ حٌذحٌش‬FileBuffer ‫ااخص‬٠ٛ‫ااغ طااُ اسعااخي ِلظ‬١‫ ك‬TCP Connection‫ رخعااظخذحَ حٌااـ‬Server‫ربٔشااخء حطظااخي ِااع حٌااـ‬ ... NetworkStream Class َ‫ رخعظخذح‬Server‫ حٌـ‬ٌٝ‫ ا‬FileBuffer‫حٌـ‬ ‫اذ وّاخ‬٠‫ ؿذ‬ٚ‫ٕٗ لُ ربٔشخء ِشش‬٠‫طخض‬ٚ ‫ي عٓ حعظمزخي حٌٍّف‬ٛ‫ حٌّغج‬ٛ٘ٚ Server ‫ٌزشِـش ؿضء‬ٚ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ش ف‬ٙ‫ظ‬٠

: ‫ش‬١ٌ‫ حٌظخ‬Namespaces ‫ف ٔغظخذَ حٌـ‬ٛ‫ع‬ C#: using System.Threading; using System.Net; using System.Net.Socket; using System.Text; using System.IO; VB.NET: imports System.Threading imports System.Net imports System.Net.Socket imports System.Text imports System.IO

~299~


: ٍٟ٠ ‫وّخ‬ٚ handlerThread ‫خ‬ّٙ‫ىٓ حع‬١ٌٚ ‫ش‬١ٌ‫ حٌظخ‬Method‫ػُ اػخفش حٌـ‬ C#: public void handlerThread() { Socket handlerSocket = (Socket)alSocket[alSocket.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; } VB.NET: Public Sub handlerThread() Dim handlerSocket As Socket = CType(alSocket(alSocket.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

~311~


lbConnections.Items.Add("File Written") handlerSocket = Nothing End SyncLock End Sub ٛ‫٘ا‬ٚ 8880 Port ‫ حٌاـ‬ٝ‫ عٍا‬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.ToStri ng() + " connected."); lock (this) { alSocket.Add(handlerSocket); } ThreadStart thdstHandler = new ThreadStart(handlerThread); Thread thdHandler = new Thread(thdstHandler); thdHandler.Start(); } } } 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 alSocket.Add(handlerSocket) End SyncLock Dim thdstHandler As ThreadStart = New ThreadStart(handlerThread)

~310~


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(); alSocket = new ArrayList(); Thread thdListener = new Thread(new ThreadStart(listenerThread)); thdListener.Start();} 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 alSocket = New ArrayList Dim thdListener As Thread = New Thread(New ThreadStart(listenerThread)) thdListener.Start() End Sub ‫ااف‬٠‫ااخ رظعش‬ٙ١‫ لّٕااخ ف‬ٟ‫حٌظاا‬ٚ listenerThread Method ‫ااز حٌااـ‬١‫ طااُ طٕف‬Thread‫رخعااظخذحَ حٌااـ‬ Client‫ ِآ حٌاـ‬ٟ‫اؤط‬٠ ‫ ؽٍاذ‬ٞ‫ي أ‬ٛ‫ظُ لز‬١‫غ ع‬١‫ ك‬8882 Port ‫ حٌـ‬ٍٝ‫ٍٗ ع‬١‫طفع‬ٚ TcpListener‫حٌـ‬ ‫ااخ حعااظمزخي‬ٙ١‫ظُ ف‬١‫ عاا‬ٟ‫حٌظاا‬ٚ handlerThread ‫رعااذ رٌااه حعااظذعخء حٌذحٌااش‬ٚ Port ‫ ٘اازح حٌااـ‬ٝ‫عٍاا‬ ‫ حٌّىااخْ حٌّلااذد‬ٟ‫ااخ فاا‬ٕٙ٠‫طخض‬ٚ ‫ااخ‬ٙ‫ ػااُ لشحءط‬Byte Array ٟ‫ااخ فاا‬ٕٙ٠‫طخض‬ٚ Stream Data‫حٌااـ‬ ‫ حعاُ حٌٍّاف‬ٝ‫ عٍا‬ٞٛ‫لظا‬٠ ٞ‫حٌاز‬ٚ Stream‫غ ِشسٔخ ٌٗ حٌاـ‬١‫ ك‬fileStream.Write‫رخعظخذحَ حٌـ‬ٚ . DataByte Array‫حٌـ‬ٚ thisRead

~312~


ٝ‫تبص إٌت‬ٙ‫ إلسعبي ٍِف ِتٓ ج‬FileStream Class ‫اٌـ‬ٚ Serialization ‫خبِغب اعزخذاَ اٌـ‬ :‫خش‬ ٓ٠‫ظُ طخض‬٠ ‫خطٗ ار‬٠ٛ‫ إلسعخي حعُ حٌٍّف ِع ِلظ‬Serialization‫ضس حٌـ‬١ِ ِٓ ‫ّىٕ​ٕخ حالعظفخدس‬٠ ‫ْ حٌشىً حٌعخَ ٌٍزشٔخِؾ وّخ‬ٛ‫ى‬١‫ع‬ٚ ، ٍٟ‫ حعُ حٌٍّف حألط‬ٍٝ‫خش رٕخءح ع‬٢‫ حٌطشف ح‬ٍٝ‫حٌٍّف ع‬ :‫ وّؼخي‬ٍٟ٠

:‫ال رشٔخِؾ حإلسعخي‬ٚ‫أ‬ ‫ وّخ‬، Byte Array ٌٝ‫ً حٌٍّف حٌّشحد اسعخٌٗ ا‬٠ٛ‫ ٌظل‬FileStream Class ‫ٗ حٌـ‬١‫عٕغظخذَ ف‬ٚ Serialization ‫ظُ اسعخٌٗ وـ‬٠ ٝ‫كظ‬ٚ ‫ ٌـٍذ حعُ حٌٍّف‬FileInfo Class‫عٕغظخذَ حٌـ‬ٚ :ٍٟ٠ ‫ش وّخ‬١ٍّ‫طظُ ٘زٖ حٌع‬ٚ BinaryFormatter Class‫ رخعظخذحَ حٌـ‬Object C# string FileName; . . openFileDialog1.ShowDialog(); textBox1.Text = openFileDialog1.FileName; FileInfo TheFile = new FileInfo(textBox1.Text); // Get The File Name FileName = TheFile.Name; . . FileStream fs = new FileStream(textBox1.Text,FileMode.Open); byte[] buffer = new byte[fs.Length]; int len = (int)fs.Length; fs.Read(buffer,0,len); fs.Close(); BinaryFormatter br = new BinaryFormatter (); TcpClient myclient = new TcpClient (text_IP.Text,7000); NetworkStream myns = myclient.GetStream (); br.Serialize (myns,FileName); BinaryWriter mysw = new BinaryWriter (myns); mysw.Write(buffer); mysw.Close (); myns.Close (); myclient.Close (); VB.NET: Private FileName As String . .

~313~


openFileDialog1.ShowDialog() textBox1.Text = openFileDialog1.FileName Dim TheFile As FileInfo = New FileInfo(textBox1.Text) ' Get The File Name FileName = TheFile.Name . . Dim fs As FileStream = New FileStream(textBox1.Text,FileMode.Open) Dim buffer As Byte() = New Byte(fs.Length - 1) Dim len As Integer = CInt(fs.Length) fs.Read(buffer,0,len) fs.Close() Dim br As BinaryFormatter = New BinaryFormatter () Dim myclient As TcpClient = New TcpClient (text_IP.Text,7000) Dim myns As NetworkStream = myclient.GetStream () br.Serialize (myns,FileName) Dim mysw As BinaryWriter = New BinaryWriter (myns) mysw.Write(buffer) mysw.Close () myns.Close () myclient.Close () :‫خ رشٔخِؾ حالعظمزخي‬١ٔ‫ػخ‬ C#: NetworkStream myns; TcpListener mytcpl; Socket mysocket; Thread myth; BinaryReader bb; void File_Receiver() { mytcpl = new TcpListener (7000); mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); BinaryFormatter br = new BinaryFormatter (); Object op= br.Deserialize (myns); // Deserialize the Object from Stream bb = new BinaryReader (myns); byte[] buffer = bb.ReadBytes(Buffer_Size); FileStream fss = new FileStream(@textBox1.Text + (string) op, FileMode.CreateNew, FileAccess.Write); fss.Write(buffer,0,buffer.Length); fss.Close();

~314~


mytcpl.Stop(); listBox1.Items.Add ("Successfully Saved to: " + textBox1.Text + (string) op); if (mysocket.Connected ==true) { while (true) { File_Receiver(); } } } VB.NET: Private myns As NetworkStream Private mytcpl As TcpListener Private mysocket As Socket Private myth As Thread Private bb As BinaryReader Private Sub File_Receiver() mytcpl = New TcpListener (7000) mytcpl.Start () mysocket = mytcpl.AcceptSocket () myns = New NetworkStream (mysocket) Dim br As BinaryFormatter = New BinaryFormatter () Dim op As Object op= br.Deserialize (myns) ' Deserialize the Object from Stream bb = New BinaryReader (myns) Dim buffer As Byte() = bb.ReadBytes(Buffer_Size) Dim fss As FileStream = New FileStream(textBox1.Text + CStr(op), FileMode.CreateNew, FileAccess.Write) fss.Write(buffer,0,buffer.Length) fss.Close() mytcpl.Stop() listBox1.Items.Add ("Successfully Saved to: " & textBox1.Text + CStr(op)) If mysocket.Connected =True Then Do While True File_Receiver() Loop End If End Sub ُ‫ز‬١‫ عتت‬, ‫تتذ‬١ٔ ‫د‬ٚ‫ئتتخ اٌتتذ‬١‫ ث‬ٟ‫ؽتتشق ثشِجزتتٗ فتت‬ٚ FTP ‫ي اٌتتـ‬ٛ‫وتت‬ٛ‫ر‬ٚ‫متتخ ػّتتً ثش‬٠‫ٕتتب ؽش‬١‫٘ىتتزا ث‬ٚ Network ‫ اٌتتـ‬ٟ‫ب فتت‬ِٙ‫اعتتزخذا‬ٚ ‫ش‬١‫اع اٌزشتتف‬ٛ‫أٔتت‬ٚ ‫ ػتتٓ ؽتتشق‬ٌٟ‫ اٌجتتضء اٌزتتب‬ٟ‫ش فتت‬٠‫اٌذتتذ‬ . Security Programming

~315~


Part 5

Network Security Programming

Chapter18 Cryptography & Network Security Programming Chapter19 Socket Permissions

~316~


Chapter 18 Cryptography & Network Security Programming

- Cryptography in Dot Net:  Symmetric Encryption  DES (Data Encryption Standard)  Asymmetric Encryption  RSA (Rivest Shamir Adleman)  Digital Signature Algorithms  Hashing Algorithms  Using Security Encryption Standards With Network Applications  Create an Advanced RSA Client Server Chat System.

~317~


‫‪: Network Security Programming : 18‬‬ ‫طظٍخض حٌفىشس ِٓ حألِٓ رلّخ‪٠‬ش حٌز‪١‬خٔخص ِٓ حٌذخ‪ٛ‬ي غزش حٌّخ‪ٛ‬ي ‪unauthorized Access‬‬ ‫رخعظخذحَ عذس أعخٌ‪١‬ذ ‪ٚ‬أّ٘‪ٙ‬خ ‪:‬‬ ‫‬‫‬‫‪-‬‬

‫‪ Data Encryption & Decryption‬حٌظشف‪١‬ش ‪ٚ‬فه حٌظشف‪١‬ش‬ ‫‪ Authentications‬حٌظلمك ِٓ ٘‪٠ٛ‬ش حٌشخض ِشعً حٌشعخٌش‬ ‫‪ Set Policies & Permissions‬طلذ‪٠‬ذ ‪ٚ‬طٕف‪١‬ز حٌغ‪١‬خعخص ‪ ٚ‬حٌظالك‪١‬خص‬

‫دعّااض فاا‪ ٟ‬حٌااذ‪ٚ‬ص ٔ‪١‬ااض ؿّ‪١‬ااع أعااخٌ‪١‬ذ حٌلّخ‪٠‬ااش حٌظاا‪ ٟ‬روشٔخ٘ااخ عااخرمخ رخعااظخذحَ حٌااـ ‪Security‬‬ ‫‪ٚ Namespaces‬حٌظ‪ ٟ‬طلظ‪ ٞٛ‬عٍ‪ِ ٝ‬ـّ‪ٛ‬عش ػخّش ِٓ حٌّىظزخص حٌفشع‪١‬ش ‪ ٟ٘ٚ‬وّخ ف‪ ٟ‬حٌشاىً‬ ‫حٌظخٌ‪ٟ‬‬

‫أ‪ٚ‬ال ‪: Cryptography Namespace Overview :‬‬ ‫‪٘ٚ :Cryptography in .NET‬ا‪ ٟ‬حٌّىظزاش حٌظا‪ ٟ‬ط‪ٙ‬اظُ رىاً ِاخ ‪٠‬خاض عٍّ‪١‬اخص طشاف‪١‬ش ‪ٚ‬فاه‬ ‫طشف‪١‬ش حٌز‪١‬خٔخص ِٓ ‪ Clear Text‬اٌ‪ٚ Cipher Text ٝ‬رخٌعىظ ‪ٚ‬طغاظخذَ رشاىً أعخعا‪ٌ ٟ‬ظشاف‪١‬ش‬ ‫حٌز‪١‬خٔخص لزً عٍّ‪١‬ش حإلسعخي ‪ٚ‬فه طشف‪١‬ش٘خ عٕذ حالعظالَ ‪ٔٚ ،‬غظط‪١‬ع طمغ‪ ُ١‬ؽشق حٌظشف‪١‬ش ف‪ٙ١‬خ اٌا‪ٝ‬‬ ‫ػالػش ألغخَ سث‪١‬غ‪١‬ش ٘‪:ٟ‬‬ ‫‪ :Symmetric algorithms -A‬حألعٍ‪ٛ‬د حٌّظّخػً ‪ٚ‬ف‪٠ ٗ١‬غظخذَ حٌّفظخف حٌغش‪ ٞ‬رحطاٗ ٌعٍّ‪١‬اش‬ ‫حٌظشف‪١‬ش ‪ٚ‬فه حٌظشف‪١‬ش ‪ ٟ٘ٚ‬ؽش‪٠‬مش عش‪٠‬عش إلؿشحء عٍّ‪١‬ش حٌظشاف‪١‬ش ‪ٚ‬فاه حٌظشاف‪١‬ش ٌىٕ‪ٙ‬اخ ٌ‪١‬غاض إِٓاش‬ ‫وطش‪٠‬مااش حٌغ‪١‬ااش حٌّظّخػٍااش ‪ٚ‬دعّااض حٌااذ‪ٚ‬ص ٔ‪١‬ااض حٌظشااف‪١‬ش حٌّظّخػااً رّـّ‪ٛ‬عااش ِاآ حٌااـ‪Classes‬‬ ‫‪:ٟ٘ٚ Algorithms‬‬ ‫ حٌىالط حٌز‪٠ ٞ‬ذعُ حٌظشف‪١‬ش رخعظخذحَ حٌـ ‪: DES-Data Encryption Standard‬‬‫‪DESCryptoServiceProvider‬‬ ‫ حٌىالط حٌز‪٠ ٞ‬ذعُ ‪RC2CryptoServiceProvider : RC2 Algorithms‬‬‫ حٌىالط حٌز‪٠ ٞ‬ذعُ ‪RijndaelManaged : Rijndael Managed Algorithms‬‬‫حٌطش‪٠‬مش حٌّعظخدس ف‪ ٟ‬حٌظشف‪١‬ش رخألعٍ‪ٛ‬د حٌّظّخػاً ٘ا‪ ٟ‬طشاف‪١‬ش حٌشعاخٌش ‪ٚ‬اسعاخٌ‪ٙ‬خ عزاش حٌشازىش ٌىآ‬ ‫رخعظخذحَ ٘زٖ حٌطش‪٠‬مش فبْ ٔغزش حٌخطؤ حٌظ‪ ٟ‬لذ طى‪ ْٛ‬عخٌ‪١‬ش ؿذح ‪ٚ‬لذ ٔفمذ رعاغ ٘ازٖ حٌز‪١‬خٔاخص ِّاخ‬ ‫‪٠‬ئد‪ ٞ‬اٌ‪ ٝ‬فمذ حٌشعخٌش أ‪ ٚ‬لذ طغشق ‪ٚ‬طـش‪ ٜ‬عٍ‪ٙ١‬خ عٍّ‪١‬خص ٌّلخ‪ٌٚ‬ش فه حٌشفشس ٔخ٘‪١‬اه عآ حٌلـاُ‬ ‫حٌ‪ٙ‬خثاً حٌظا‪ ٟ‬لاذ طلـاضٖ ِآ حٌاـ‪ٚ.. Network Bandwidth‬طاُ كاً ٘ازٖ حٌّشاىٍش رـعاً عٍّ‪١‬اش‬ ‫حٌظشااف‪١‬ش طااظُ عٍاا‪ِ ٝ‬غااظ‪ ٜٛ‬حٌااـ‪ٔ Stream‬فغااٗ ‪٠ٚ‬غااظخذَ ٌ‪ٙ‬اازٖ حٌعٍّ‪١‬ااش حٌااـ ‪CryptoStream‬‬ ‫‪ Class‬ك‪١‬ااغ ‪٠‬ااظُ حعااظخذحَ ِفظااخك‪ٌ ٓ١‬ظشااف‪١‬ش ِفظااخف حٌظشااف‪١‬ش ‪ِٚ Encryption Kay‬فظااخف ٌفااه‬ ‫حٌظشف‪١‬ش ‪٠ٚ IV Installation Victor Decryption‬شظشؽ حعظخذحَ ٔفظ حٌّفظخك‪ ٓ١‬ف‪ ٟ‬عٍّ‪١‬اش‬ ‫حٌظشف‪١‬ش ‪ٚ‬فه حٌظشاف‪١‬ش ‪٠ٚ‬غاظخذَ حٌىاالط حٌغاخرك ِاع حٌاـ‪ MemoryStream‬أ‪FileStream ٚ‬‬ ‫ك‪١‬غ ّٔشس ٌاٗ حٌاـ‪ٔٚ Stream Data‬ا‪ ٛ‬حٌظشاف‪١‬ش عا‪ٛ‬حء ‪ DES‬أ‪ TripleDES ٚ‬أ‪ِٚ RC2 ٚ‬آ‬ ‫حٌلٍ‪ٛ‬ي حألخش‪ ٜ‬حعظخذحَ حٌظشف‪١‬ش عٍ‪ِ ٝ‬غظ‪ ٜٛ‬حٌـ ‪ Socket‬ك‪١‬غ ‪٠‬اظُ طشاف‪١‬ش حٌمٕاخس ٔفغا‪ٙ‬خ ‪٠ٚ‬غاّ‪ٝ‬‬

‫~‪~318‬‬


َ‫غاظخذ‬٠ ٞ‫ش حٌاز‬١‫ح حٌظشاف‬ٛ‫ش أٔا‬ٙ‫ ِآ أشا‬ٛ‫٘ا‬ٚ SSL – Socket Secure Layer ‫ حٌاـ‬ٛ‫٘زح حٌٕا‬ َ‫ف ٔغااظخذ‬ٛ‫وّؼااخي عاا‬ٚ ، ‫ااش‬١‫ااخص حٌزٕى‬١ٍّ‫ اؿااشحء حٌع‬ٟ‫خخطااش فاا‬ٚ ‫ حإلٔظشٔااض رشااىً خااخص‬ٟ‫فاا‬ :ٌٟ‫ حٌّؼخي حٌظخ‬ٟ‫وّخ ف‬ٚ 16 Bits ِٓ ٓ١‫ْ وال حٌّفظخك‬ٛ‫ظى‬٠ ‫ ار‬TripleDES‫حٌـ‬ 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))

~319~


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 ‫د‬ٍٛ‫ أوؼااش أِخٔااخ ِاآ حألعاا‬ٛ‫٘اا‬ٚ ً‫ااش ِظّخػاا‬١‫د حٌغ‬ٍٛ‫ حألعاا‬:Asymmetric algorithms -B ‫غااظخذَ ِفظااخف‬٠ ‫ش‬١‫ٌفااه حٌظشااف‬ٚ Public Kay َ‫خٔااخص رخعااظخذحَ ِفظااخف عااخ‬١‫حٌّظّخػااً ار طشاافش حٌز‬ ٛ‫٘ا‬ٚ ‫ش‬١‫ ٌظشاف‬128 Bits َ‫غاظخذ‬٠ٚ ٓ١‫ٓ حٌّفظاخك‬١‫ْ ٕ٘اخن عاللاش را‬ٛ‫ىا‬٠ٚ Private Kay ‫خاخص‬ ‫ش‬١‫اذعُ طشاف‬٠ ٞ‫حٌاز‬ٚ ً‫اش ِظّخػا‬١‫ش حٌغ‬١‫اض حٌظشاف‬١ٔ ‫ص‬ٚ‫دعّاض حٌاذ‬ٚ ‫خٔاخص‬١‫ش ٌٍز‬١‫ذ حٌظشاف‬١ٌ‫أفؼً أعخ‬ :ٟ٘ٚ Tow Algorithms Classes َ‫ رخعظخذح‬Private Kay ‫حٌّفظخف حٌخخص‬ 1- RSACryptoServiceProvider 2- DSACryptoServiceProvider for Digital Signature Algorithm :RSACryptoServiceProvider :‫ال‬ٚ‫أ‬ ‫اش‬٠‫ حٌزذح‬ٟ‫ ف‬non inherited Class ٛ٘ٚ ً‫ش ِظّخػ‬١‫ش حٌغ‬١‫فه حٌظشف‬ٚ ‫ش‬١‫ اؿشحء حٌظشف‬ٟ‫غظخذَ ف‬٠ٚ ‫ااذ حٌّفظااخف‬١ٌٛ‫رٌااه ٌظ‬ٚ RSACryptoServiceProvider‫ااذ ِاآ حٌاـ‬٠‫ ؿذ‬instance ‫ف ٕٔشاات‬ٛ‫عا‬ َ‫َ حٌّغااظٍُ رفااه حٌشعااخٌش رخعااظخذح‬ٛ‫ماا‬٠ ُ‫ِاآ ػاا‬ٚ ‫ٔشفااك حٌّفظااخف حٌعااخَ ِااع حٌشعااخٌش‬ٚ ‫حٌخااخص‬ٚ َ‫حٌعااخ‬ :ٌٟ‫حٌّفظخف حٌخخص الكع حٌشىً حٌظخ‬

~301~


‫عٕم‪ َٛ‬ح‪ ْ٢‬ربٔشخء ِشش‪ ٚ‬طشف‪١‬ش ‪ٚ‬فه طشف‪١‬ش ‪٠‬غظخذَ ؽش‪٠‬ماش حٌاـ‪ ، RSA Algorithm‬عا‪١‬ى‪ْٛ‬‬ ‫حٌشىً حٌعخَ ٌٍزشٔخِؾ وّخ ‪:ٍٟ٠‬‬

‫عاإم‪ َٛ‬رخٌزذح‪٠‬ااش ربٔشااخء ‪ Tow Methods‬حأل‪ٌٚ‬اا‪ّٔ ٝ‬ااشس ٌ‪ٙ‬ااخ حٌااـ‪String Plain Message‬‬ ‫‪ٚ‬حٌـ‪ٚ PrivateKay‬رٌه ٌظشف‪١‬ش حٌشعاخٌش رٕاخءح عٍ‪١‬اٗ ‪ٚ ،‬أخاش‪ٌ ٜ‬فاه حٌظشاف‪١‬ش ‪ّٔٚ‬اشس ٌ‪ٙ‬اخ حٌشعاخٌش‬ ‫‪ٚ Byte‬حٌّفظاااااااااخف حٌخاااااااااخص واااااااااـ‪ٚ ، String‬عٕغاااااااااظخذَ‬ ‫حٌّشااااااااافشس واااااااااـ ‪Array‬‬ ‫‪ٌ RSACryptoServiceProvider‬ظشااااااااااف‪١‬ش حٌشعااااااااااخٌش رخعااااااااااظخذحَ‬ ‫حٌااااااااااـ‪Class‬‬ ‫حٌاااـ‪ّٔٚ ، RSAAlgorithms‬اااشس ٌاااٗ حٌاااـ ‪ Private Kay‬واااـ ‪CspParameters Object‬‬ ‫‪ٚ‬رخعااااااااااااااااااظخذحَ حٌااااااااااااااااااـ ‪ٚ EncryptMethod‬حٌااااااااااااااااااـ ‪ DecryptMethod‬ػاااااااااااااااااآّ‬ ‫حٌـخٌاـ‪ٔ RSACryptoServiceProvider Class‬اظُّ عٍّ‪١‬اش حٌظشاف‪١‬ش ‪ٚ‬فاه حٌظشاف‪١‬ش ‪ّٔٚ‬اشس ٌ‪ٙ‬اخ‬ ‫حٌشعااخٌش حٌّااشحد طشااف‪١‬ش٘خ أ‪ ٚ‬فااه طشااف‪١‬ش٘خ رخإلػااخفش اٌاا‪ ٝ‬ل‪ّ١‬ااش ‪ True‬أ‪ٌ False ٚ‬ظفع‪١‬ااً ؽش‪٠‬مااش‬ ‫حٌظشااف‪١‬ش وااـ‪٠ٚ FOAEP‬ااذعُ ٘اازح حألعااٍ‪ٛ‬د اطااذحسحص حٌااـ ‪ِٚ Windows XP‬ااخ رعااذ٘خ ‪ٌ ،‬اازٌه‬ ‫‪٠‬فؼً حخظ‪١‬خس ‪ False‬دحثّخ ‪ٌٚ‬ؼّخْ حٌظ‪ٛ‬حفم‪١‬ش ِع حإلطذحسحص حأللذَ ِٓ ٔظخَ حٌظشغ‪... ً١‬‬

‫~‪~300‬‬


C#: public byte[] Encrypt(string strData,CspParameters PrivateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey); byte[] data = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), false); return data; } public byte[] Decrypt(byte[] en_data,CspParameters PrivateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey); byte[] data = rsa.Decrypt(en_data, false); return data; } VB.NET: Public Function Encrypt(ByVal strData As String, ByVal PrivateKey As CspParameters) As Byte() Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey) Dim data As Byte() = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), False) Return data End Function Public Function Decrypt(ByVal en_data As Byte(), ByVal PrivateKey As CspParameters) As Byte() Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey) Dim data As Byte() = rsa.Decrypt(en_data, False) Return data End Function ٓ‫ ِااااااا‬Instance Object ‫ال أشاااااااخء‬ٚ‫ـاااااااذ أ‬٠ ‫ حٌغاااااااخرمش‬Methods ‫العاااااااظخذحَ حٌاااااااـ‬ٚ KeyContainerName ‫ حٌااـ‬ٝ‫ لاااُ ّٔاااشس حٌّفظااخف حٌعاااخَ اٌااا‬CspParameters Class‫حٌااـ‬ :ٍٟ٠ ‫وّخ‬ٚ CspParameters Class‫ حٌخخص رخٌـ‬Instance Object ‫ ػّٓ حٌـ‬Proparity C#: public byte[] mymsg; Try //‫ش‬١‫ٌظشف‬ { CspParameters cp = new CspParameters(); cp.KeyContainerName = text_private.Text;

~302~


mymsg = Encrypt(text_msg_to_send.Text,cp); text_encrypted.Text = Encoding.Unicode.GetString(mymsg); } catch (Exception ex){MessageBox.Show(ex.Message);} try//‫ش‬١‫ٌفه حٌظشف‬ { CspParameters cp = new CspParameters(); cp.KeyContainerName = text_private1.Text; byte[] my_msg = Decrypt(mymsg,cp); text_decrypted.Text = Encoding.Unicode.GetString(my_msg); } catch (Exception ex){MessageBox.Show(ex.Message);} VB.NET: Public mymsg As Byte() Try '‫ش‬١‫ٌظشف‬ Dim cp As CspParameters = New CspParameters cp.KeyContainerName = text_private.Text mymsg = Encrypt(text_msg_to_send.Text,cp) text_encrypted.Text = Encoding.Unicode.GetString(mymsg) Catch ex As Exception MessageBox.Show(ex.Message) End Try Try '‫ش‬١‫ٌفه حٌظشف‬ Dim cp As CspParameters = New CspParameters cp.KeyContainerName = text_private1.Text Dim my_msg As Byte() = Decrypt(mymsg, cp) text_decrypted.Text = Encoding.Unicode.GetString(my_msg) Catch ex As Exception MessageBox.Show(ex.Message) End Try ٓ‫ ِا‬RSA‫اش حٌاـ‬١ٔ‫ اِىخ‬ٟ٘ DES‫حٌـ‬ٚ RSA ‫ش حٌـ‬١‫د حٌظشف‬ٍٛ‫ٓ حعظخذحَ أع‬١‫ق ر‬ٚ‫الكع أْ ِٓ حٌفش‬ ‫ حعاظخذِٕخ ٔفاظ‬ٛ‫ ٌا‬ٝ‫كظا‬ٚ ، ‫ش‬١‫ش عآ ِفظاخف فاه حٌظشاف‬١‫خظٍف ِفظاخف حٌظشاف‬٠ ‫ٓ وّخ‬١‫حعظخذحَ ِفظخك‬ ٟ‫ فا‬،‫اخ ٔفاظ حٌّفظاخف‬ٙ١‫خظٍف عٕاذ واً ِاشس ٔغاظخذَ ف‬١‫ش عا‬١‫ش فبْ ٔاخطؾ حٌظشاف‬١‫ش حٌظشف‬١ٍّ‫حٌّفظخف ٌع‬ RSA Algorithms ‫ ٌٍاـ‬ٜ‫ِآ حالعاظخذحِخص حألخاش‬ٚ ، ٛ‫ وّاخ ٘ا‬DES ‫ حٌاـ‬ٟ‫ حٌٕخطؾ ف‬ٝ‫زم‬٠ ٓ١‫ك‬ .ً‫ ِٓ ٘زح حٌفظ‬ٌٟ‫ حٌـضء حٌظخ‬ٟ‫ٕٗ ف‬١‫ ِخ عٕز‬ٛ٘ٚ Digital Signature‫حٌـ‬

~303~


‫ػخٔ‪١‬خ‪DSACryptoServiceProvider for Digital Signature Algorithm :‬‬ ‫حٌظ‪ٛ‬حل‪١‬ع حٌشلّ‪١‬ش ‪ٚ:‬حٌ‪ٙ‬ذف ِٕ‪ٙ‬خ حٌظلمك ِٓ ٘‪٠ٛ‬ش حٌشاخض ِشعاً حٌشعاخٌش ‪ٚ‬وّؼاخي ‪٠‬ما‪ َٛ‬حٌّشعاً‬ ‫رظ‪١ٌٛ‬ذ ٍِخاض ٌشعاخٌش رخعاظخذحَ حٌاـ‪ٚ Hash Function‬رعاذ رٌاه ‪٠‬ما‪ َٛ‬رظشاف‪١‬ش ٍِخاض حٌشعاخٌش‬ ‫حٌز‪ ٞ‬طُ ط‪١ٌٛ‬ذٖ ٌظى‪ ٓ٠ٛ‬حٌّفظخف حٌخخص ‪ٚ‬حٌز‪ ٞ‬ع‪١‬غظخذَ وظ‪ٛ‬ل‪١‬ع سلّا‪ٌٍّ ٟ‬شعاً ػاُ ‪٠‬شعاً حٌّفظاخف‬ ‫حٌعااخَ ِااع حٌشعااخٌش‪ ،‬أِااخ رّااخ ‪٠‬ظعٍااك رخٌّغااظٍُ ف‪١‬ماا‪ َٛ‬رفااه طشااف‪١‬ش حٌٍّخااض رخعااظخذحَ حٌّفظااخف حٌعااخَ‬ ‫‪٠ٚ‬ـذ أْ ‪٠‬ظُ رٌه رخعظخذحَ ٔفظ حٌخ‪ٛ‬حسصِ‪١‬ش حٌظ‪ ٟ‬حطزع‪ٙ‬خ حٌّشعً ف‪ ٟ‬طشف‪١‬ش حٌٍّخاض‪ ،‬فابرح واخْ‬ ‫ٍِخض حٌشعخٌش حٌظ‪ٌٚ ٟ‬ذ٘خ حٌّغظٍُ ٘‪ٔ ٟ‬فغ‪ٙ‬خ حٌظ‪ٌٚ ٟ‬ذ٘خ حٌّشعً عٕذ٘خ ‪٠‬ظلمك ِآ أْ حٌشاخض‬ ‫ِشعً حٌشعخٌش ٘‪ٔ ٛ‬فغٗ‪.‬‬ ‫فاا‪ ٟ‬حٌزذح‪٠‬ااش عاا‪ٛ‬ف ٕٔشاات ‪ِ instance‬اآ حٌااـ‪ٌ DSACryptoServiceProvider‬ظ‪١ٌٛ‬ااذ حٌّفظااخف‬ ‫حٌعاخَ ‪ٚ‬حٌخااخص ػاُ ٔىاا‪ ْٛ‬حٌاـ‪ٔٚ Hash sign Value‬خضٔااٗ فا‪ٌٚ Byte Array ٟ‬فلظااٗ ٔ‪ٌٛ‬ااذ‬ ‫‪ hash sign value‬ؿذ‪٠‬ااذ ‪ٔٚ‬مخسٔااٗ رخٌغااخرك فاابرح طشااخر‪ٙ‬خ عٕااذ٘خ ٔمااشس أْ حٌشااخض ٘اا‪ٔ ٛ‬فغااٗ‬ ‫طاااااااااخكذ حٌشعاااااااااخٌش حٌّشعاااااااااٍش ‪ ،‬عااااااااإم‪ َٛ‬ح‪ ْ٢‬ربٔشاااااااااخء ِشاااااااااش‪ٔ ٚ‬غاااااااااظخذَ ف‪١‬اااااااااٗ‬ ‫حٌااـ‪ٌ DSACryptoServiceProvider‬ظ‪١ٌٛ‬ااذ ط‪ٛ‬حل‪١‬ااع سلّ‪١‬ااش ػااُ اؿااشحء عٍّ‪١‬ااش حٌظلمااك عٍ‪١‬ااٗ ‪،‬‬ ‫‪ٚ‬ع‪١‬ى‪ ْٛ‬حٌشىً حٌعخَ ٌٍزشٔخِؾ وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫عاإم‪ َٛ‬ربٔشااخء ‪ ، Four Methods‬حٌااـ ‪ٌ GetHash‬ظ‪١ٌٛ‬ااذ حٌااـ ‪ٌ Hash Code‬ظ‪ٛ‬ل‪١‬ااع حٌشلّاا‪ٟ‬‬ ‫‪ٚ‬عااا‪١‬ؤخز ‪ٚ String Message‬عااا‪١‬شؿع حٌاااـ ‪ Hash Code‬واااـ ‪ٚ Byte Array‬ع‪١‬غاااظخذَ‬ ‫حٌااـ‪ِ ComputeHash Method‬اآ حٌااـ ‪MD5CryptoServiceProvider Instance‬‬ ‫‪ٌ Object‬ظ‪١ٌٛ‬اذ حٌاـ ‪ Hash Code‬حٌغاخرك ‪،‬حٌاـ‪ٔٚ VerifyHash method‬غاظط‪١‬ع ِآ خالٌ‪ٙ‬اخ‬ ‫حٌّمخسٔااش راا‪ ٓ١‬حٌااـ‪ Message‬حٌّشعااٍش ‪ٚ‬حٌااـ ‪ Hash Code‬حٌّ‪ٌٛ‬ااذ ِاآ حٌشعااخٌش ٌظؤوااذ ِاآ طاالش‬ ‫ططخرك حٌٕض ِع حٌـ ‪ Hash‬حٌّ‪ٌٛ‬ذ ‪ ،‬حٌـ ‪ٚ CreateSignature Method‬عظغظخذَ ٌظ‪١ٌٛ‬اذ ط‪ٛ‬ل‪١‬اع‬ ‫سلّ‪ ِٓ ٟ‬حٌـ‪ Hash Code‬حٌّ​ّشس ك‪١‬غ عٕغظخذَ حٌـ ‪RSAPKCS1SignatureFormatter‬‬ ‫‪ّٔٚ Class‬ااشس ٌ اٗ حٌااـ‪ٚ RSACryptoServiceProvider Instance Object‬حٌااـ ‪Hash‬‬ ‫‪ CreateSignature‬عاااااإ‪ٌٛ‬ذ حٌظ‪ٛ‬ل‪١‬ااااااع حٌشلّاااااا‪، ٟ‬‬ ‫‪ٚ gorithm‬رخعااااااظخذحَ حٌااااااـ‪Method‬‬ ‫حٌـ‪ٚ VerifySignature Method‬عظغظخذَ ٌٍّمخسٔاش را‪ ٓ١‬حٌاـ ‪ٚ Hash Code‬حٌظ‪ٛ‬ل‪١‬اع حٌشلّا‪ٟ‬‬ ‫حٌّ‪ٌٛ‬ذ فبرح ططخرك ‪٠‬شؿع ل‪ّ١‬ش ‪ٚ True‬حٌعىظ ‪٠‬شؿع ‪٠ٚ ، False‬ظُ وً رٌه وّخ ‪:ٍٟ٠‬‬ ‫‪C#:‬‬ ‫;‪using System‬‬ ‫;‪using System.Security.Cryptography‬‬ ‫;‪using System.Text‬‬ ‫‪public class MD5HashHelper‬‬ ‫{‬ ‫)‪public byte[] GetHash(string message‬‬

‫~‪~304‬‬


{ byte[] data; data = UTF8Encoding.ASCII.GetBytes(message); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); return md5.ComputeHash(data, 0, data.Length); } public bool VerifyHash(string message, byte[] hash) { byte[] data; data = UTF8Encoding.ASCII.GetBytes(message); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] hashTemp = md5.ComputeHash(data, 0, data.Length); for (Int32 counter = 0; counter <= hash.Length - 1; counter += 1) { if (hash[counter] != hashTemp[counter]) { return false; } } return true; } } public class DigitalSignatureHelper { private RSAParameters m_public; public byte[] CreateSignature(byte[] hash) { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA); RSAFormatter.SetHashAlgorithm("MD5"); m_public = RSA.ExportParameters(false); return RSAFormatter.CreateSignature(hash); } public bool VerifySignature(byte[] hash, byte[] signedhash) { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSAParameters RSAKeyInfo = new RSAParameters(); RSAKeyInfo.Modulus = m_public.Modulus; RSAKeyInfo.Exponent = m_public.Exponent;

~305~


RSA.ImportParameters(RSAKeyInfo); RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA); RSADeformatter.SetHashAlgorithm("MD5"); return RSADeformatter.VerifySignature(hash, signedhash); } } VB.NET: Imports System Imports System.Security.Cryptography Imports System.Text Public Class MD5HashHelper Public Function GetHash(ByVal message As String) As Byte() Dim data As Byte() data = UTF8Encoding.ASCII.GetBytes(message) Dim md5 As MD5CryptoServiceProvider = New MD5CryptoServiceProvider Return md5.ComputeHash(data, 0, data.Length) End Function Public Function VerifyHash(ByVal message As String, ByVal hash As Byte()) As Boolean Dim data As Byte() data = UTF8Encoding.ASCII.GetBytes(message) Dim md5 As MD5CryptoServiceProvider = New MD5CryptoServiceProvider Dim hashTemp As Byte() = md5.ComputeHash(data, 0, data.Length) Dim counter As Int32 = 0 Do While counter <= hash.Length - 1 If hash(counter) <> hashTemp(counter) Then Return False End If counter += 1 Loop Return True End Function End Class Public Class DigitalSignatureHelper Private m_public As RSAParameters Public Function CreateSignature(ByVal hash As Byte()) As Byte() Dim RSA As RSACryptoServiceProvider = New RSACryptoServiceProvider

~306~


Dim RSAFormatter As RSAPKCS1SignatureFormatter = New RSAPKCS1SignatureFormatter(RSA) RSAFormatter.SetHashAlgorithm("MD5") m_public = RSA.ExportParameters(False) Return RSAFormatter.CreateSignature(hash) End Function Public Function VerifySignature(ByVal hash As Byte(), ByVal signedhash As Byte()) As Boolean Dim RSA As RSACryptoServiceProvider = New RSACryptoServiceProvider Dim RSAKeyInfo As RSAParameters = New RSAParameters RSAKeyInfo.Modulus = m_public.Modulus RSAKeyInfo.Exponent = m_public.Exponent RSA.ImportParameters(RSAKeyInfo) Dim RSADeformatter As RSAPKCS1SignatureDeformatter = New RSAPKCS1SignatureDeformatter(RSA) RSADeformatter.SetHashAlgorithm("MD5") Return RSADeformatter.VerifySignature(hash, signedhash) End Function End Class :‫ حٌغخرمش‬Methods ‫إلعظخذحَ حٌـ‬ٚ C#: DigitalSignatureHelper ds = new DigitalSignatureHelper(); byte[] hash1; byte[] hash2; byte[] signedhash; . . . try //ّٟ‫ع حٌشل‬١‫ل‬ٛ‫ذ حٌظ‬١ٌٛ‫ط‬ { MD5HashHelper md5 = new MD5HashHelper(); hash1 = md5.GetHash(textBox1.Text); signedhash = ds.CreateSignature(hash1); MessageBox.Show("Signature Created Successfully!"); } catch(Exception ex){MessageBox.Show(ex.Message);} . . . try //‫ع‬١‫ل‬ٛ‫ٌظؤوذ ِٓ طلش حٌظ‬ { MD5HashHelper md5 = new MD5HashHelper();

~307~


hash2 = md5.GetHash(textBox2.Text); if (ds.VerifySignature(hash2, signedhash)) { MessageBox.Show("Signatures verified Successfully!"); } else { MessageBox.Show("Signatures verification failed!"); } } catch(Exception ex){MessageBox.Show(ex.Message);} VB.NET: Dim ds As DigitalSignatureHelper = New DigitalSignatureHelper() Dim hash1 As Byte() Dim hash2 As Byte() Dim signedhash As Byte() . . . Try'ّٟ‫ع حٌشل‬١‫ل‬ٛ‫ذ حٌظ‬١ٌٛ‫ط‬ Dim md5 As MD5HashHelper = New MD5HashHelper() hash1 = md5.GetHash(textBox1.Text) signedhash = ds.CreateSignature(hash1) MessageBox.Show("Signature Created Successfully!") Catch ex As Exception MessageBox.Show(ex.Message) End Try . . . Try '‫ع‬١‫ل‬ٛ‫ٌظؤوذ ِٓ طلش حٌظ‬ Dim md5 As MD5HashHelper = New MD5HashHelper() hash2 = md5.GetHash(textBox2.Text) If ds.VerifySignature(hash2, signedhash) Then MessageBox.Show("Signatures verified Successfully!") Else MessageBox.Show("Signatures verification failed!") End If Catch ex As Exception MessageBox.Show(ex.Message) End Try

~308~


َ‫ رخعااظخذح‬Digital Signature Algorithms ‫ااذ حٌااـ‬١ٌٛ‫ااش أشااخء رشٔااخِؾ ٌظ‬١‫ف‬١‫ٕااخ و‬١‫٘ىاازح ر‬ٚ ‫خ‬ِٙ‫حعاظخذح‬ٚ Hash Algorithms ‫ح حٌاـ‬ٛ‫ ِآ ٘ازح حٌفظاً حٔا‬ٌٟ‫ حٌـضء حٌظخ‬ٟ‫ٓ ف‬١‫ عٕز‬،RSA‫حٌـ‬ .‫ض‬١ٔ ‫ص‬ٚ‫جش حٌذ‬١‫ ر‬ٟ‫ف‬ ٓ‫ّىٕ​ٕخ ِا‬٠ ‫خٔخص ار‬١‫ش حٌز‬١‫ش ؿذح ٌظشف‬٠ٛ‫ذ حٌم‬١ٌ‫عظزش ِٓ حألعخ‬٠ٚ :Hashing algorithms -‫صبٌضب‬ Message ‫رٌاه رخعاظخذحَ حٌاـ‬ٚ 128 bits ٓ‫ رذال ِا‬512 bits ٌٝ‫ طظً ا‬algorithm َ‫حعظخذح‬ ‫ااخ‬ٙ‫ كخٌظ‬ٝ‫ااخ اٌاا‬ٙ‫اسؿخع‬ٚ ‫ش حٌشعااخٌش‬١‫ع فااه طشااف‬١‫ٕ٘ااخ ٌاآ طغااظط‬ٚ MAC Digest Algorithms Digital ‫اش‬١ّ‫اع حٌشل‬١‫حل‬ٛ‫اذ حٌظ‬١ٌٛ‫ ط‬ٟ‫فا‬ٚ Passwords‫اذ حٌاـ‬١ٌٛ‫ ٌظ‬ٟ‫غاظخذَ رشاىً أعخعا‬٠ٚ ‫حٌغاخرمش‬ Database‫ حٌاـ‬ٟ‫ فا‬Password ‫س‬ٚ‫ٓ وٍّش حٌّاش‬٠‫ حغٍذ حٌلخالص طغظخذَ ٌظخض‬ٟ‫ف‬ٚ Signature .ِٓ‫رشىً ح‬ SHA384Managed‫حٌـ‬ٚSHA256Managed‫حٌـ‬ٚ SHA1Managed‫غظخذَ حٌـ‬٠ٚ ComputeHash ‫ِٕٗ ٔغظخذَ حٌـ‬ٚ Hash Object ‫ف‬٠‫ ٌظعش‬SHA512Managed‫حٌـ‬ٚ :‫ وّؼخي‬ٍٟ٠ ‫وّخ‬ٚ byte Array ٟ‫ٕٗ ف‬٠‫طخض‬ٚ hash code‫ذ حٌـ‬١ٌٛ‫ ٌظ‬Method 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));

~309~


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)) ٓ‫ ِا‬ٌٟ‫ حٌـضء حٌظخ‬ٟ‫ٓ ف‬١‫ عٕز‬،... Hash Codes ‫ٓ حٌـ‬١‫مش حٌغخرمش ٌٍّمخسٔش ر‬٠‫ّىٓ حعظخذحَ حٌطش‬٠ٚ ...‫خص حٌشزىخص‬١‫ رشِـ‬ٟ‫ش ف‬١‫ش حٌظشف‬١٠‫ش حعظخذحَ ِعخ‬١‫ف‬١‫٘زح حٌفظً و‬ Using Security Encryption Standards With Network - C :Applications ‫ذ‬١ٌ‫ ِاآ حألعااخ‬ٞ‫خٔااخص حٌّشعااٍش رخعااظخذحَ أ‬١‫ش حٌز‬١‫ااش رظشااف‬٠‫ حٌزذح‬ٟ‫َ فاا‬ٛ‫ااخص حٌشاازىخص ٔماا‬١‫ رشِـ‬ٟ‫فاا‬ َ‫ رخعااظخذح‬Socket‫خ عزااش حٌااـ‬ٌٙ‫ إلسعااخ‬Stream ٝ‫خٔااخص حٌّشاافشس اٌاا‬١‫ي حٌز‬ٛ‫ش ػااُ ٔلاا‬١‫حٌغااخرمش ٌظشااف‬ َ‫َ حٌطاااشف حٌّغاااظمزً رخعاااظمزخي حٌشعاااخٌش رخعاااظخذح‬ٛ‫مااا‬٠ ُ‫ ػااا‬،‫ وّؼاااخي‬Network Stream‫حٌاااـ‬ ٟ‫ش وّاااخ ٘ااا‬١‫اااش فاااه حٌظشاااف‬١ٍّ‫ْ ع‬ٛ‫ـاااذ أْ طىااا‬٠ٚ، Socket‫ عزاااش حٌاااـ‬Network Stream‫حٌاااـ‬ ‫ع‬١‫ ػااُ ٔغااظط‬، ‫ااش‬١ّ‫ااع حٌشل‬١‫حل‬ٛ‫ حٌظ‬ٚ‫ أ‬DES ٚ‫ أ‬RSA ‫حء‬ٛ‫ش عاا‬١‫ااش حٌّغااظخذِش اػٕااخء حٌظشااف‬١ِ‫حسص‬ٛ‫حٌخ‬ ‫رعاذ‬ٚ ، Stream Data‫اغ عظغاظمزً حٌشعاخٌش واـ‬١‫ ك‬Memory stream‫ حٌاـ‬ٝ‫طلّاً حٌشعاخٌش اٌا‬ ‫ الكاع‬،ٜ‫ سعاخٌش ِاشس أخاش‬ٝ‫اخ اٌا‬ٍٙ٠ٛ‫ش٘خ ٌظل‬١‫ ٌفاه طشاف‬Byte Array ٝ‫خ اٌا‬ٍٙ٠ٛ‫ّىٓ طل‬٠ ‫رٌه‬ :ٌٟ‫حٌشىً حٌظخ‬

~321~


‫عٕم‪ َٛ‬ح‪ ْ٢‬ربٔشخء رشٔخِؾ رغ‪١‬ؾ )‪ (Client / Server‬إلسعخي ٔض ِٓ ؿ‪ٙ‬خص اٌ‪ ٝ‬آخش ‪ٚ‬عإخذَ‬ ‫ف‪١‬ااٗ حٌااـ ‪ٌ RSA‬ظشااف‪١‬ش حٌاإض حٌّشعااً ك‪١‬ااغ عاا‪١‬ظفك حٌطشفااخْ عٍاا‪ ٝ‬حٌااـ ‪ٚ Private Kay‬حٌااز‪ٞ‬‬ ‫ع‪١‬غظخذَ ٌظشف‪١‬ش ‪ ٚ‬فه طشف‪١‬ش حٌشعخٌش‪...‬‬ ‫‪ ٚ‬عاا‪١‬ى‪ ْٛ‬حٌشااىً حٌعااخَ ٌٍزشٔااخِؾ وّااخ فاا‪ ٟ‬حٌشااىً حٌظااخٌ‪٠ٚ ٟ‬زاا‪ ٓ١‬ؽشفااخْ ِشعااً ‪ِٚ‬غااظمزً ‪٠ٚ‬ماا‪َٛ‬‬ ‫حٌّشعً رظشف‪١‬ش حٌشعخٌش رخعظخذحَ حٌّفظخف حٌعخَ ‪٠ٚ‬ظفك حٌطشفخْ عٍ‪ ٝ‬حٌّفظخف حٌخخص ‪ٚ‬حٌاز‪ ٞ‬عا‪١‬ظُ‬ ‫فه حٌشعخٌش ِٓ خالٌٗ‪:‬‬

‫أ‪ٚ‬ال حٌّشعً أ‪ ٚ‬حٌـ ‪: Client‬‬ ‫‪ٚ‬عٕغظخذَ ف‪ ٗ١‬حٌطش‪٠‬مش حٌّعش‪ٚ‬فش ٌظشف‪١‬ش حٌشعخثً رخعاظخذحَ حٌاـ ‪ RSA algorithms‬ك‪١‬اغ عا‪١‬ظُ‬ ‫طل‪ ً٠ٛ‬حٌشعخٌش حٌّشفشس اٌ‪ٚ Byte Array ٝ‬عٕغظخذَ حٌـ ‪ Serialization‬إلسعاخٌ‪ٙ‬خ ك‪١‬اغ عا‪١‬ظُ‬ ‫اسعخٌ‪ٙ‬خ وـ ‪٠ٚ Serialization Object‬ظُ وً رٌه وّخ ‪:ٍٟ٠‬‬

‫~‪~320‬‬


C#: using System.Text; using System.Security.Cryptography; using System.Net.Sockets; using System.Net; using System.IO; using System.Runtime.Serialization.Formatters.Binary; . . . public byte[] mymsg; public byte[] Encrypt(string strData,CspParameters PrivateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey); byte[] data = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), false); return data; } . . . try { CspParameters cp = new CspParameters(); cp.KeyContainerName = text_private.Text; mymsg = Encrypt(text_msg_to_send.Text,cp); text_encrypted.Text = Encoding.Unicode.GetString(mymsg); object op = (object) mymsg; BinaryFormatter br = new BinaryFormatter (); TcpClient myclient = new TcpClient (text_IP.Text,7000); NetworkStream myns = myclient.GetStream (); br.Serialize (myns,op); myns.Close (); myclient.Close (); } catch (Exception ex){MessageBox.Show(ex.Message);}

~322~


VB.NET: Imports System.Text Imports System.Security.Cryptography Imports System.Net.Sockets Imports System.Net Imports System.IO Imports System.Runtime.Serialization.Formatters.Binary . . . Public mymsg As Byte() Public Function Encrypt(ByVal strData As String, ByVal PrivateKey As CspParameters) As Byte() Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey) Dim data As Byte() = rsa.Encrypt(Encoding.Unicode.GetBytes(strData), False) Return data End Function . . . Try Dim cp As CspParameters = New CspParameters cp.KeyContainerName = text_private.Text mymsg = Encrypt(text_msg_to_send.Text,cp) text_encrypted.Text = Encoding.Unicode.GetString(mymsg) Dim op As Object = CObj(mymsg) Dim br As BinaryFormatter = New BinaryFormatter Dim myclient As TcpClient = New TcpClient(text_IP.Text, 7000) Dim myns As NetworkStream = myclient.GetStream() br.Serialize (myns,op) myns.Close () myclient.Close () Catch ex As Exception MessageBox.Show(ex.Message) End Try : Server ‫ حٌـ‬ٚ‫خ حٌّغظمزً أ‬١ٔ‫ػخ‬ ُ‫ ػا‬Encrypted Message as an Object ‫اظُ حعاظمزخي حٌاـ‬٠ Server ‫ ؽشف حٌّغظمزً حٌاـ‬ٟ‫ف‬ٚ ٍُ‫ حٌّغاظ‬Byte Array ‫ِٓ ػُ ّٔاشس حٌاـ‬ٚ ‫خ‬ٙ١ٍ‫ ع‬Casting ‫ رعذ عًّ حٌـ‬Byte Array ٌٝ‫ي ا‬ٛ‫طل‬ ُ‫ طا‬ٞ‫حٌاز‬ٚ ‫ش٘خ رخعاظخذحَ حٌّفظاخف حٌخاخص‬١‫اظُ فاه طشاف‬١ٌ RSA Decryption Method ‫ حٌاـ‬ٌٝ‫ا‬ . ٗ١ٍ‫حالطفخق ع‬

~323~


C#: using System.Text; using System.Security.Cryptography; using System.Net.Sockets ; using System.IO; using System.Threading; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters; . . . public byte[] mymsg; NetworkStream myns; TcpListener mytcpl; Socket mysocket; Thread myth; public byte[] Decrypt(byte[] en_data,CspParameters PrivateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(PrivateKey); byte[] data = rsa.Decrypt(en_data, false); return data; } . . . void RSA_Server ()//‫حعظمزخي حٌشعخٌش رشىً ِشفش‬ { mytcpl = new TcpListener (7000); mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); BinaryFormatter br = new BinaryFormatter (); object op; op= br.Deserialize (myns); // Deserialize the Object from Stream mymsg = (byte[]) op; text_encrypted.Text = Encoding.Unicode.GetString(mymsg);

mytcpl.Stop(); while (true) { RSA_Server();

~324~


} } . . . try // ‫ش حٌشعخٌش‬١‫فه طشف‬ { CspParameters cp = new CspParameters(); cp.KeyContainerName = text_private1.Text; byte[] my_msg = Decrypt(mymsg,cp); text_decrypted.Text = Encoding.Unicode.GetString(my_msg); } catch (Exception ex){MessageBox.Show(ex.Message);} VB.NET: Imports System.Text Imports System.Security.Cryptography Imports System.Net.Sockets Imports System.IO Imports System.Threading Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization.Formatters . . . Public mymsg As Byte() Private myns As NetworkStream Private mytcpl As TcpListener Private mysocket As Socket Private myth As Thread Public Function Decrypt(ByVal en_data As Byte(), ByVal PrivateKey As CspParameters) As Byte() Dim rsa As RSACryptoServiceProvider = New RSACryptoServiceProvider(PrivateKey) Dim data As Byte() = rsa.Decrypt(en_data, False) Return data End Function . . . Private Sub RSA_Server() '‫حعظمزخي حٌشعخٌش رشىً ِشفش‬ mytcpl = New TcpListener(7000)

~325~


mytcpl.Start() mysocket = mytcpl.AcceptSocket() myns = New NetworkStream(mysocket) Dim br As BinaryFormatter = New BinaryFormatter Dim op As Object op = br.Deserialize(myns) ' Deserialize the Object from Stream mymsg = CType(op, Byte()) text_encrypted.Text = Encoding.Unicode.GetString(mymsg) mytcpl.Stop() Do While True RSA_Server() Loop End Sub . . . Try ' ‫ش حٌشعخٌش‬١‫فه طشف‬ Dim cp As CspParameters = New CspParameters cp.KeyContainerName = text_private1.Text Dim my_msg As Byte() = Decrypt(mymsg, cp) text_decrypted.Text = Encoding.Unicode.GetString(my_msg) Catch ex As Exception MessageBox.Show(ex.Message) End Try ‫ش‬١‫تبد اٌزشتف‬١ٍّ‫ إلجتشاء ػ‬Cryptography‫تخ اٌزؼبِتً ِتغ اٌتـ‬١‫ف‬١‫ ٘زا اٌفظتً و‬ٟ‫ٕب ف‬١‫٘ىزا ث‬ٚ ٚ DES ‫ش ِضتً اٌتـ‬١‫ش اٌزشتف‬٠‫ٕب ؽشق اعزخذاَ ِؼتب‬١‫ وّب ث‬, ‫ اٌّشعٍخ ػجش اٌشجىخ‬Data ‫ اٌـ‬ٍٝ‫ػ‬ ٟ‫ش فت‬٠‫زُ اٌذتذ‬١‫ عت‬, ‫تذ‬١ٔ ‫د‬ٚ‫ئخ اٌذ‬١‫ ث‬ٟ‫ ف‬Digital Signature ‫اٌـ‬ٚ RSA‫اٌـ‬ٚ Hashing‫اٌـ‬ ‫تبد‬١‫ثشِج‬ٚ ‫تذ‬١ٔ ‫د‬ٚ‫ئتخ اٌتذ‬١‫ ث‬ٟ‫ب فت‬ِٙ‫اعتزخذا‬ٚ Socket Permission ‫ ػتٓ اٌتـ‬ٌٟ‫اٌفظً اٌزتب‬ .‫اٌشجىبد‬

~326~


Chapter 19 Socket Permissions - Permission Namespace Overview - Security Action - Socket Access property - Socket Permissions

~327~


: Permission Namespace Overview : 19 ‫ حٌاـ‬ٟ‫٘ا‬ٚ ‫خص‬١‫ح ِآ حٌظاالك‬ٛ‫اض ػالػاش أٔا‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ ف‬Permission Namespace‫طذعُ حٌـ‬ٚ Role- based ‫حٌاااـ‬ٚ Identity Permissions‫حٌاااـ‬ٚ Code access permissions ...permissions :‫ش‬١ٌ‫ حٌظخ‬Classes‫ وً ِٓ حٌـ‬ٍٝ‫ ع‬Code access permissions ‫ططزك حٌـ‬ WebPermission: The ability to make/accept connection to/from the web. OleDbPermission: The ability to access databases with OLEDB. SQLClientPermission: The ability to access SQL databases. UIPermission: The ability to use User Interface. PrintingPermission: The ability to print. FileIOPermission: The ability to work with files. SocketPermission: The ability to make/accept TCP/IP connections on a transport address. SecurityPermission: The ability to execute, assert permissions, call into unmanaged code, skip verification and other rights. :‫ش‬١ٌ‫ حٌظخ‬Classes ‫ حٌـ‬ٍٝ‫ ع‬Identity permissions‫ططزك حٌـ‬ٚ PublisherIdentityPermission: Software publisher's digital signature StrongNameIdentityPermission: Assembly's strong Name URLIdentityPermission: URL from which the code is originated ZoneIdentityPermission: Zone from which the assembly is originated SiteIdentityPermission: Location of web site from which the code is originated .‫ فمؾ‬PrincipalPermission Class ‫ حٌـ‬ٍٝ‫ ع‬Role- based permissions ‫ططزك حٌـ‬ٚ ‫ااخص‬١‫ رشِـ‬ٟ‫ فاا‬Socket‫خص حعااظخذحَ حٌااـ‬١‫ااذ طااالك‬٠‫طّىٕااه ِاآ طلذ‬ٚ :Socket Permission ّٓ‫ ػااااااا‬SocketPermissionAttribute ٚ SocketPermission َ‫حٌشااااااازىخص رخعاااااااظخذح‬ ‫ع‬١‫وّؼااخي ٔغااظط‬ٚ System.Security.Permissions Namespaces‫حٌااـ‬ٚ System.Net‫حٌااـ‬ ‫ظُ رٌاه‬٠ٚ ، Listener Application‫ٓ ِٓ حالطظخي ِع حٌـ‬١‫ ِع‬Client Host Address ‫ِٕع‬ ٚ Access Kind‫حٌااـ‬ٚ ‫ اش‬١ٍّ‫ حٌع‬ٛ‫ااخ ٔاا‬ٙ١‫ ٔلااذد ف‬SocketPermission Attribute ‫ااف‬٠‫رظعش‬ ‫حء‬ٛ‫ عا‬Transport‫ حٌاـ‬ٛ‫ٔا‬ٚ Port‫سلاُ حٌاـ‬ٚ Permission‫ٗ حٌـ‬١ٍ‫طزك ع‬١‫ ع‬ٞ‫ حٌز‬Host‫حْ حٌـ‬ٕٛ‫ع‬ .UDP ٚ‫ أ‬TCP ٗ‫ؿ‬ِٛ ‫ش‬١‫ غ‬ٚ‫ؿٗ أ‬ِٛ ‫ع‬١ّ‫ عزش ؿ‬Socket‫ رخٌـ‬loopback 127.0.0.1 Address‫ ٘زح حٌّؼخي ِٕع حطظخي حٌـ‬ٟ‫ذ ف‬٠‫ٔش‬ .َ‫ حٌّغظخذ‬Socket‫ حٌـ‬ٛٔ ٓ‫رغغ حٌٕظش ع‬ٚ Ports‫حٌـ‬ [SocketPermission(SecurityAction.Deny, Access="Connect", Host="127.0.0.1",Port="All", Transport="All")]

~328~


‫‪ّ٠‬ىٕ​ٕخ حٌـ‪ ِٓ SecurityAction object‬طلذ‪٠‬ذ ٔ‪ ٛ‬حٌعٍّ‪١‬ش حٌظ‪ٔ ٟ‬ش‪٠‬ذ٘خ ‪ٚ‬وّخ ‪:ٍٟ٠‬‬

‫‪ٚ :Assert‬طعٕ‪ ٟ‬حٌغّخف ‪ِ Client Host‬ع‪ ِٓ ٓ١‬اؿشحء عٍّ‪١‬ش ِلذدس‬ ‫‪ٚ :Demand‬طعٕ‪ ٟ‬ططز‪١‬ك حٌظالك‪١‬خص عٍ‪ ٝ‬ؿّ‪١‬ع حٌاـ‪ Classes‬حٌظا‪ ٟ‬طماع فا‪ِٕ ٟ‬طماش حٌاـ‪Stack‬‬ ‫أعٍ‪ ٝ‬حٌـ‪Defined Abstract‬‬ ‫‪ٚ :Deny‬طعٕ‪ِٕ ٟ‬ع حٌـ‪ ِٓ Client Host‬اؿشحء عٍّ‪١‬ش ِع‪ٕ١‬ش‪.‬‬ ‫‪ٚ : InheritanceDemand‬ف‪ٙ١‬اخ ططزااك حٌظاالك‪١‬خص عٍاا‪ ٝ‬حٌاـ‪ Class‬حٌااز‪ ٞ‬عا‪١‬شع حٌااـ‪Class‬‬ ‫حٌلخٌ‪.ٟ‬‬ ‫‪ٚ :PermitOnly‬ف‪ّٕ٠ ٗ١‬ع ؿّ‪١‬ع حٌـ‪ Access‬عذح حٌـ‪ Client User‬حٌّلذد ‪....‬‬ ‫‪ٚ‬ف‪ ٟ‬حي‪ٔ Access property‬لذد ٔ‪ ٛ‬عٍّ‪١‬ش حٌّٕع أ‪ ٚ‬حٌغّخف ‪ٚ‬طؤخز خ‪١‬خس‪ّ٘ ٓ٠‬خ ‪:‬‬ ‫‪ٌّٕ Accept‬ااع أ‪ ٚ‬حٌغااّخف ٌ اـ ‪ِ Client Socket‬اآ عّااً ‪ِ Binding‬ااع حٌااـ‪ٚ IP Address‬‬ ‫حٌـ‪ Port‬حٌّلذد‪.‬‬ ‫‪ٌّٕ Connect‬ع أ‪ ٚ‬حٌغاّخف ٌاـ ‪ِ Client Socket‬آ عّاً ‪ِ connect‬اع حٌاـ‪Remote Host‬‬ ‫حٌّلذد‪.‬‬ ‫ف‪ ٟ‬حٌـ‪ٚ Host‬حٌـ‪ٔ Port‬لذد عٕ‪ٛ‬حْ حٌـ‪ Host‬حٌز‪ ٞ‬ع‪١‬طزك عٍ‪ ٗ١‬حٌـ‪ ٚ Permission‬سلُ حٌـ‪Port‬‬ ‫حٌظ‪٠ ٟ‬ظظً ر‪ٙ‬خ ) ف‪ ٟ‬حٌـ‪ٔ Port property‬غظط‪١‬ع طّش‪٠‬ش وٍّش ‪ٌ all‬ذالٌش عٍ‪ ٝ‬ططز‪١‬ك حٌظالك‪١‬ش‬ ‫عٍ‪ ٝ‬ؿّ‪١‬ع حٌـ‪( Ports‬‬ ‫‪ٚ‬أخ‪١‬شح ٔلذد حٌـ‪ٚ Transport property‬حٌظا‪ ٟ‬عإعشف ف‪ٙ١‬اخ ٔا‪ ٛ‬حٌاـ‪ Socket‬حٌّغاظخذَ ‪ٚ‬طؤخاز‬ ‫حٌخ‪١‬خسحص حٌظخٌ‪١‬ش‪:‬‬ ‫‪ All‬رااذ‪ ْٚ‬طلذ‪٠‬ااذ ٔاا‪ ٛ‬حٌااـ‪ Socket‬ار ططزااك ٘اازٖ حٌااـ‪ Permission‬عٍاا‪ ٝ‬ؿّ‪١‬ااع حٌااـ ‪Socket‬‬ ‫‪.Types‬‬ ‫‪ Connectionless‬ارح وخٔاااض حٌاااـ‪ Socket‬طغاااظخذَ ‪ٚ Datagram Protocols‬وّؼاااخي‬ ‫رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي ‪.UDP‬‬ ‫‪ ConnectionOriented‬ارح وخٔااض حٌااـ‪ Socket‬طغااظخذَ ‪ٚ Oriented Protocols‬وّؼااخي‬ ‫رش‪ٚ‬ط‪ٛ‬و‪ٛ‬ي ‪.TCP‬‬ ‫‪ TCP‬ار طغظط‪١‬ع طلذ‪٠‬ذٖ ِزخششس‪.‬‬ ‫‪ UDP‬ار طغظط‪١‬ع طلذ‪٠‬ذٖ ِزخششس‪.‬‬ ‫‪ّ٠ٚ‬ىآ أ‪٠‬ؼاخ حعاظخذحَ حٌاـ ‪ِ Socket Permission‬آ خاالي حشاظمخق ‪ِ Instance Object‬آ‬ ‫حٌاـ‪ SocketPermission Class‬ػاُ طلذ‪٠‬اذ ٔا‪ ٛ‬حٌاـ ‪ Permission‬حٌّاشحد ‪ٚ‬ػاعٗ ‪ّ٠ٚ‬ىٕاه أْ‬ ‫طّشس ٌٗ اِخ حٌـ ‪ٚ Permission State‬رٌاه ٌغاّخف أ‪ِٕ ٚ‬اع حٌاـ ‪ Permission‬حٌّلاذد أ‪ ٚ‬طّش‪٠‬اش‬ ‫حٌـ ‪ Permission‬حٌز‪ ٞ‬طش‪٠‬ذ ِٓ خالي طلذ‪٠‬ذ حٌـ ‪ Network Access‬ع‪ٛ‬حء حطظخي ‪Connect‬‬

‫~‪~329‬‬


ٚ‫ أ‬TCP ‫حء‬ٛ‫ي حٌّغااظخذَ عاا‬ٛ‫واا‬ٛ‫ط‬ٚ‫ حٌزش‬ٛ‫ااذ ٔاا‬٠‫ ػااُ طلذ‬Accept Incoming ٚ‫ أ‬Outgoing ‫ كخٌاش‬ٟ‫ فا‬Remote Machine ‫ ٌٍاـ‬IP Address ‫رعاذ رٌاه ّٔاشس حٌاـ‬ٚ ‫ٓ ِعاخ‬١‫ حالػٕا‬ٚ‫ أ‬UDP ‫ كخٌااش حٌااـ‬ٟ‫ فاا‬Local Machine ‫ ٌٍااـ‬IP ‫ حٌااـ‬ٚ‫ أ‬Access incoming ‫ حٌّٕااع ٌٍااـ‬ٚ‫حٌغااّخف أ‬ :ٍٟ٠ ‫ظُ رٌه وّخ‬٠ٚ ، Connect Outgoing

State ‫ ار ٔلاذد ٌاٗ حٌاـ‬SocketPermission Class‫ ٌٍاـ‬Socket State ‫ّىآ اعإخد حٌاـ‬٠ٚ ‫وّاخ‬ :ٍٟ٠ ‫وّخ‬ٚ ‫ سفغ حالطظخي‬ٚ‫حء رغّخف أ‬ٛ‫ع‬

‫رعاذ‬ٚ ، Union Method ‫رٌه رخعاظخذحَ حٌاـ‬ٚ Socket Permission ِٓ ‫ّىٓ دِؾ أوؼش‬٠ ‫وّخ‬ :‫ وّؼخي‬ٍٟ٠ ‫وّخ‬ٚ ‫ذ‬٠‫ ؿذ‬SocketPermission Object ٌٝ‫رٌه طغٕذ ا‬ C#: SocketPermission mySocketPermission1= new SocketPermission(PermissionState.None); mySocketPermission1.AddPermission(NetworkAccess.Accept, TransportType.Tcp, IP, Port); SocketPermission mySocketPermission2 =new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, IP, Port); SocketPermission mySocketPermissionUnion = (SocketPermission)mySocketPermission1.Union(mySocketPermission2 ); VB.NET: Dim mySocketPermission1 As SocketPermission = New SocketPermission(PermissionState.None) mySocketPermission1.AddPermission(NetworkAccess.Accept, TransportType.Tcp, IP, Port) Dim mySocketPermission2 As SocketPermission = New SocketPermission(NetworkAccess.Connect, TransportType.Tcp, IP, Port)

~331~


Dim mySocketPermissionUnion As SocketPermission = CType(mySocketPermission1.Union(mySocketPermission2), SocketPermission) Intersect ‫رٌه رخعظخذحَ حٌـ‬ٚ Union Permission List ِٓ ‫ؼخ دِؾ أوؼش‬٠‫ّىٓ أ‬٠ ‫وّخ‬ :ٍٟ٠ ‫وّخ‬ٚ Method C#: SocketPermission mySocketPermissionIntersect = (SocketPermission)mySocketPermission1.Intersect(mySocketPermissio nUnion); VB.NET: Dim mySocketPermissionIntersect As SocketPermission = CType(mySocketPermission1.Intersect(mySocketPermissionUnion), SocketPermission) ٓ‫ااخ ِاا‬ٍٙ٠ٛ‫ّىاآ طل‬٠ٚ XML Data ٝ‫ حٌغااخرمش اٌاا‬Permission List ‫ؼااخ ٔمااً حٌااـ‬٠‫ع أ‬١‫ٔغااظط‬ٚ ‫ ٌٍماشحءس‬FromXml Method ‫رٌه رخعظخذحَ حٌـ‬ٚ ٜ‫ ِشس أخش‬Permission List ٌٝ‫ ا‬XML :‫ وّؼخي‬ٍٟ٠ ‫وّخ‬ٚ XML ٌٝ‫ ا‬Permission‫ً حٌـ‬٠ٛ‫ ٌظل‬ToXml Method ‫حٌـ‬ٚ XML ِٓ C#: mySocketPermission1.FromXml(mySocketPermission1.ToXml()); VB.NET: mySocketPermission1.FromXml(mySocketPermission1.ToXml()); ، Deny) ِٓ ‫حكذس‬ٚ ‫خس‬١‫ رخخظ‬Security Permissions ‫ك حٌـ‬١‫ع ططز‬١‫ٔغظط‬ٚ :(Assert,PermitOnly C#: SocketPermission sp = new SocketPermission(PermissionState.None); sp.AddPermission(NetworkAccess.Accept,TransportType.Tcp,"0.0.0.0" ,0); sp.AddPermission(NetworkAccess.Connect,TransportType.Tcp,"0.0.0.0 ",0) // sp.Deny; // ‫حٌّٕع‬ // sp.Assert;//‫حٌغّخف‬ sp.PermitOnly(); VB.NET: Dim sp As SocketPermission = New SocketPermission(PermissionState.None) sp.AddPermission(NetworkAccess.Accept,TransportType.Tcp,"0.0.0.0" ,0) sp.AddPermission(NetworkAccess.Connect,TransportType.Tcp,"0.0.0.0 ",0)

~330~


' sp.Deny; // ‫حٌّٕع‬ ' sp.Assert;//‫حٌغّخف‬ sp.PermitOnly() ً‫ ٌّٕاع حالطظاخي ِآ لزا‬Socket Permissions ‫ٗ حٌاـ‬١‫ؾ ٔغظخذَ ف‬١‫ك ِؼخي رغ‬١‫ْ رظطز‬٢‫َ ح‬ٛ‫عٕم‬ ‫سس‬ٛ‫ ٔماً طا‬ٟ‫ فىاشس حٌزشٔاخِؾ طىّآ فا‬، ٗ‫ ِٕعا‬ٚ‫ رخالطظاخي أ‬Client ‫ حٌغّخف ٌٍـ‬ٚ‫ي ِخ أ‬ٛ‫و‬ٛ‫ط‬ٚ‫رش‬ ‫خص‬١‫ػاع طاالك‬ٚ ُ‫ِآ ػا‬ٚ Socket ‫ رخعاظخذحَ حٌاـ‬Server‫ حٌـ‬ٌٝ‫ ا‬Client ‫خص حٌـ‬ٙ‫شح ِٓ ؿ‬١ِ‫حٌىخ‬ ... Server ‫ٌالطظخي ِع حٌـ‬ : Server ‫ال رشٔخِؾ حٌـ‬ٚ‫أ‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ وّخ ف‬Picturebox ٍٝ‫ ع‬ٞٛ‫لظ‬٠ٚ

C#: void StartMethod () { TcpListener mytcpl; Socket mysocket; NetworkStream myns; SocketPermission sp = new SocketPermission(PermissionState.None); sp.AddPermission(NetworkAccess.Accept,TransportType.Tcp,"0.0.0.0" ,0); sp.AddPermission(NetworkAccess.Connect,TransportType.Tcp,"0.0.0.0 ",0); // sp.Deny; // ‫حٌشفغ‬ // spAssert;//‫حٌغّخف‬ sp.PermitOnly(); mytcpl = new TcpListener (5020); mytcpl.Start (); mysocket = mytcpl.AcceptSocket (); myns = new NetworkStream (mysocket); pictureBox1.Image = Image.FromStream(myns); mytcpl.Stop();

~332~


if (mysocket.Connected ==true) { while (true) { StartMethod (); } } } VB.NET: Private Sub StartMethod() Dim mytcpl As TcpListener Dim mysocket As Socket Dim myns As NetworkStream Dim sp As SocketPermission = New SocketPermission(PermissionState.None) sp.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "0.0.0.0", 5020) sp.AddPermission(NetworkAccess.Connect, TransportType.Tcp, "0.0.0.0", 5020) ' sp.Deny; // ‫حٌشفغ‬ ' spAssert;//‫حٌغّخف‬ sp.PermitOnly() mytcpl = New TcpListener(5020) mytcpl.Start() mysocket = mytcpl.AcceptSocket() myns = New NetworkStream(mysocket) pictureBox1.Image = Image.FromStream(myns) mytcpl.Stop() If mysocket.Connected = True Then Do While True StartMethod() Loop End If End Sub

~333~


: Client ‫خ رشٔخِؾ حٌـ‬١ٔ‫ػخ‬

C#: private void timer1_Tick(object sender, System.EventArgs e) { try{ MemoryStream ms = new MemoryStream();// Store it in Binary Array as Stream pictureBox1.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jp eg); byte[] arrImage = ms.GetBuffer(); ms.Close(); TcpClient myclient = new TcpClient (txt_host.Text,int.Parse(text_Port.Text));//Connecting with server NetworkStream myns = myclient.GetStream (); BinaryWriter mysw = new BinaryWriter (myns); mysw.Write(arrImage);//send the stream to above address mysw.Close (); myns.Close (); myclient.Close ();} catch (Exception ex){timer1.Enabled=false; listBox1.Items.Add(ex.Message ); } VB.NET: Private Sub timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Try Dim ms As MemoryStream = New MemoryStream ' Store it in Binary Array as Stream pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg) Dim arrImage As Byte() = ms.GetBuffer() ms.Close() Dim myclient As TcpClient = New TcpClient(txt_host.Text, Integer.Parse(text_Port.Text)) 'Connecting with server Dim myns As NetworkStream = myclient.GetStream()

~334~


Dim mysw As BinaryWriter = New BinaryWriter(myns) mysw.Write(arrImage) 'send the stream to above address mysw.Close() myns.Close() myclient.Close() Catch ex As Exception timer1.Enabled = False listBox1.Items.Add(ex.Message) End Try SocketPermission‫حٌـ‬ٚ‫ أ‬Permission Attribute ‫ػع حٌـ‬ٚ ٓ١‫خس ر‬١‫ّىٕه حالخظ‬٠ ٗٔ‫الكع أ‬ ‫ذ‬٠‫طش‬ٚ ً١‫خص اػٕخء حٌظشغ‬١‫ػع حٌظالك‬ٚ ‫ذ‬٠‫ كخٌش وٕض طش‬ٟ‫خ ف‬ِٕٙ ٞ‫ٓ حعظخذحَ أ‬١‫ حٌفشق ر‬ٝ‫زم‬٠ٚ SocketPermission ‫فؼً حعظخذحَ حٌـ‬١‫ ف‬Runtime ‫خص اػٕخء‬١‫ش ٘زٖ حٌظالك‬١١‫ش طغ‬١ٔ‫اِىخ‬ ٍٝ‫ع‬ٚ ‫ش٘خ‬١‫ش طغ‬١ٔ‫ْ اِىخ‬ٚ‫رذ‬ٚ ُ‫خص رشىً دحث‬١‫ػع حٌظالك‬ٚ ‫ أِخ ارح أسدص‬instance Object ... Attribute‫فؼً حعظخذحَ حٌـ‬٠ ‫ عٕذ٘خ‬، ‫ ٌٍزشٔخِؾ وخِال‬Scope ‫ حٌـ‬ٜٛ‫ِغظ‬ ‫ش‬٠‫زُ اٌذتذ‬١‫ عت‬, ‫تذ‬١ٔ ‫د‬ٚ‫ئتخ اٌتذ‬١‫ ث‬ٟ‫ ف‬Socket Permission ‫ٕب ؽشق اٌزؼبًِ ِغ اٌـ‬١‫٘ىزا ث‬ٚ .‫ذ‬١ٔ ‫د‬ٚ‫ئخ اٌذ‬١‫ ث‬ٟ‫ب ف‬ِٙ‫اعزخذا‬ٚ Multithreading ‫ ػٓ اٌـ‬ٌٟ‫ اٌجضء اٌزب‬ٟ‫ف‬

~335~


Part 6

Multithreading - Chapter 22 Multithreading (Using & Managing)

~336~


Chapter 20 Multithreading Using & Managing - Introduction to Threading in Dot Net - Threading Classes & Members - Multithreading & Network Applications

~337~


‫‪: The Concept of Threading : 20.1‬‬

‫عضص ِف‪ َٛٙ‬حٌـ ‪ِ Multithreading‬ف‪ َٛٙ‬حٌـ ‪ Multitasking‬ف‪ ٟ‬أٔظّش حٌظشاغ‪ ً١‬رل‪١‬اغ أْ أ‪ٞ‬‬ ‫رشٔخِؾ ‪ّ٠‬ىٕٗ أْ ‪٠‬عّاً عٍا‪ِٕ Thread ٝ‬فظاً عآ حألخاش رخإلػاخفش اال اِىخٔ‪١‬اش أْ ‪٠‬عّاً ٔفاظ‬ ‫حٌزشٔخِؾ عٍ‪ ٝ‬أوؼاش ِآ ‪ ،Thread‬أطا‪٘ ٝ‬ازح حٌّف‪ٙ‬ا‪ َٛ‬رعاذ ططا‪٠ٛ‬ش فىاشس حٌاـ ‪ Multitasking‬فا‪ٟ‬‬ ‫أٔظّش حٌظشغ‪٠ٚ ، ً١‬ظُ ادحسس ٘زٖ حٌعٍّ‪١‬خص ِٓ لزاً ٔظاخَ حٌظشاغ‪ ً١‬حٌاز‪٠ ٞ‬ما‪ َٛ‬رظمغا‪ ُ١‬حٌّ‪ٙ‬اخَ عٍا‪ٝ‬‬ ‫حٌّعخٌؾ ‪ٚ‬فك حأل‪٠ٌٛٚ‬خص ٌىً ‪ٚ Thread‬عٍ‪ ٝ‬فظاشحص صِٕ‪١‬اش ‪ّ٠ٚ ،‬ىآ ِشاخ٘ذس ٘ازٖ حٌعٍّ‪١‬اخص فا‪ٟ‬‬ ‫ٔظخَ حٌظشغ‪ ِٓ ً١‬خالي حٌـ ‪ٚ Task Manager‬وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫الكع أْ وً رشٔخِؾ ‪٠‬لـض ِمذحس ِع‪ ِٓ ٓ١‬حٌّعخٌؾ رٕخء عٍ‪ ٝ‬كخؿظٗ ‪٠ٚ‬م‪ٔ َٛ‬ظخَ حٌظشغ‪ ً١‬رظمغا‪ُ١‬‬ ‫حٌّ‪ٙ‬خَ عٍ‪ ٝ‬حٌّعخٌؾ ‪ٚ‬فك حٌلخؿش ‪ ٚ‬حأل‪٠ٌٛٚ‬خص الكع حٌشىً حٌظخٌ‪:ٟ‬‬

‫~‪~338‬‬


‫‪ٚ‬رظؤو‪١‬ااذ ‪ّ٠‬ىاآ حٌااظلىُ رااؤ‪ Thread ٞ‬فاا‪ٔ ٟ‬ظااخَ حٌظشااغ‪ ً١‬ار ‪ّ٠‬ىٕ​ٕااخ ِاآ عّااً ‪ٌ Interrupt‬ااٗ وّااخ‬ ‫‪ّ٠‬ىٕ​ٕااخ ا‪٠‬مخفااٗ رشااىً ِئلااض‪ٚ ،‬أ‪٠‬ؼااخ اٌغخثااٗ رعّااً ‪ٌ Abort‬ااٗ ‪ ،‬وااً ٘اازٖ حٌعٍّ‪١‬ااخص ِظخكااش ٌااذ‪ٜ‬‬ ‫حٌـ‪ٌٍ User‬م‪١‬خَ ر‪ٙ‬خ ‪ٚ‬أ‪٠‬ؼخ ِظخف حعظخذحِ‪ٙ‬خ رشِـ‪١‬خ‪.‬‬

‫‪: Threading in Dot Net : 20.2‬‬ ‫لّٕخ عخرمخ رخعظخذحَ حٌـ ‪ Threading‬ف‪ ٟ‬رشِـ‪١‬اخص حٌشازىخص ‪ٚ ،‬الكظٕاخ حٔاٗ ال ‪ّ٠‬ىآ أْ ‪٠‬غاظمزً‬ ‫حٌزشٔخِؾ أ‪ ٞ‬ش‪ٟ‬ء فا‪ ٟ‬كخٌاش و‪ٔٛ‬اٗ ‪٠‬عّاً عٍا‪ٔ ٝ‬فاظ حٌاـ ‪ Thread‬حٌخاخص رخٌاـ ‪ِّ Form‬اخ ‪ّٕ٠‬اع‬ ‫طٕف‪١‬ز أ‪ ٞ‬عٍّ‪١‬ش أخش‪ ٜ‬اال رعاذ حٔظ‪ٙ‬اخء حٌعٍّ‪١‬اش حٌـخس‪٠‬اش ‪٘ٚ‬ا‪ِ ٛ‬اخ ٌآ ‪٠‬لاذع أراذح ‪ ،‬ار إٔٔاخ حعاظخذِٕخ‬ ‫‪ٌ Infinity Loop‬زشٔاخِؾ حالعاظمزخي ِّااخ عا‪١‬ئد‪ ٞ‬اٌا‪ ٝ‬عاذَ طٕف‪١‬ااز أ‪ ٞ‬أِاش آخاش ‪ٚ‬عا‪ٛ‬ف ‪٠‬ظ‪ٛ‬لااف‬ ‫حٌزشٔخِؾ عٓ حالعظـخرش ‪ ٚ ،‬حٌلً ٌ‪ٙ‬زٖ حٌّشىٍش حالخظ‪١‬خس ر‪ ٓ١‬أِش‪: ٓ٠‬‬ ‫حأل‪ٚ‬ي‪ ،‬حالرظعاخد عآ حعاظخذحَ حٌزشِـاش حٌّظضحِٕاش ‪ ٚ Synchronous Programming‬حٌظ‪ٛ‬ؿاٗ‬ ‫ٔل‪ ٛ‬حٌزشِـش غ‪١‬ش حٌّظضحِٕش ‪ِ ٛ٘ٚAsynchronous Programming‬خ طاُ شاشكٗ فا‪ ٟ‬حٌـاضء‬ ‫حٌخخص رخٌـ ‪ٚ Streaming‬حٌـ ‪.Asynchronous Socket‬‬ ‫حٌؼااخٔ‪ ، ٟ‬فظااً حٌااـ ‪ Infinity Loop‬عاآ حٌااـ ‪ Thread‬حٌخااخص رخٌزشٔااخِؾ ‪ٚ‬ؿعٍااٗ ‪٠‬عّااً عٍاا‪ٝ‬‬ ‫‪ Thread‬آخش ِٕفظً ‪٘ٚ ،‬زح ِخ ‪٠‬غّ‪ ٝ‬رخٌـ ‪ Multithreading‬ك‪١‬غ ع‪١‬ظُ طمغ‪ ُ١‬حٌّعخٌـاش عٍا‪ٝ‬‬ ‫حٌـ ‪ Thread‬حٌخخص رخٌزشٔخِؾ ‪ٚ‬حٌـ ‪ Thread‬حٌز‪ ٞ‬طُ أشخثٗ ‪ ،‬الكع حٌشىً حٌظخٌ‪:ٟ‬‬

‫‪ٚ‬ع‪١‬عًّ ف‪٘ ٟ‬زٖ حٌلخٌش رشىً ِظ‪ٛ‬حص‪ِ ٞ‬ع حٌزشٔخِؾ ‪١ٌٚ‬ظ رشىً طغٍغٍ‪ ٟ‬وّخ ف‪ ٟ‬حٌغخرك‪.‬‬

‫~‪~339‬‬


‫‪ٚ‬العااظخذحَ حٌااـ ‪ Threading‬فاا‪ ٟ‬حٌااذ‪ٚ‬ص ٔ‪١‬ااض ‪٠‬ـااذ أ‪ٚ‬ال طعش‪٠‬ااف حٌااـ ‪System.Threading‬‬ ‫‪ٌٚ ،Namespaces‬ظعش‪٠‬ف ‪ Thread‬ؿذ‪٠‬ذ ٔم‪ َٛ‬رخشظمخق ‪ ِٓ Instance Object‬حٌـ ‪Thread‬‬ ‫‪ Class‬ػااُ ّٔااشس حعااُ حٌااـ ‪ Method‬حٌظاا‪ٔ ٟ‬ش‪٠‬ااذ عّااً ‪ٌٙ Thread‬ااخ اٌاا‪ ٝ‬حٌااـ ‪Thread Start‬‬ ‫‪ّ٠ Delegate‬ىٓ عًّ وً رٌه ِزخششس ‪ٚ‬رخط‪ٛ‬س ‪ٚ‬حكذس وّخ ‪:ٍٟ٠‬‬ ‫‪C#:‬‬ ‫;))‪Thread my_thread = new (new ThreadStart (my_method‬‬ ‫‪VB.NET:‬‬ ‫)‪Dim my_thread As Thread = New (AddressOf my_method‬‬

‫الكع حٔٗ ‪ّ٠‬ىٕه حٌظلىُ رـّ‪١‬اع حٌعٍّ‪١‬اخص حٌظا‪ ٟ‬طخاض حٌاـ ‪ِ Threading‬آ خاالي حٌاـ ‪Thread‬‬ ‫‪ Object‬حٌااز‪ ٞ‬طااُ حشااظمخلٗ ‪ِٚ‬اآ أ٘ااُ ٘اازٖ حٌعٍّ‪١‬ااخص حٌااـ ‪ٚ Start‬حٌااـ ‪ٚ Stop‬حٌظاا‪ ٟ‬طغااظخذَ ٌظفع‪١‬ااً‬ ‫‪ٚ‬ا‪٠‬مخف حٌـ ‪ٚ Thread‬وّخ ٔغظخذَ حٌـ ‪ Abort‬إلٌغخء حٌـ ‪ٙٔ Thread‬خث‪١‬خ ِٓ حٌّعخٌـش‪.‬‬ ‫أ‪ٚ‬ال ‪ :‬أُ٘ حٌـ ‪Thread Class Methods‬‬ ‫‪ٚ Start‬طغظخذَ ٌزذأ حٌـ ‪ Thread‬ف‪ ٟ‬واً ِاشس ‪٠‬اظُ حعاظذعخث‪ٙ‬خ ‪٠‬اظُ طٕف‪١‬از ‪ Thread‬آخاش ٌإفظ حٌاـ‬ ‫‪ Method‬حٌظ‪ ٟ‬طُ طّش‪٠‬ش٘خ‪.‬‬ ‫‪ٚJoin‬طغظخذَ ٌظلىُ رخٌفظشس حٌظ‪ ٟ‬ع‪١‬ظُ ف‪ٙ١‬خ أ‪ٙ‬خء حٌـ ‪ Thread‬عٕذ عًّ ‪.ٌٗ Abort‬‬ ‫‪ٚ Suspend‬طغااااظخذَ إل‪٠‬مااااخف حٌااااـ ‪ Thread‬حٌلااااخٌ‪ ٟ‬رشااااىً ِئلااااض ‪ٚ‬ال ٔلظااااً عٍاااا‪ ٝ‬أ‪ٞ‬‬ ‫‪ Exception‬ف‪ ٟ‬كخٌش وخْ حٌـ‪ Thread‬ف‪ٚ ٟ‬ػع حٌظ‪ٛ‬لف‪.‬‬ ‫‪ٚ Abort‬طغظخذَ إل‪٠‬مخف حٌـ ‪ Thread‬رشىً ٔ‪ٙ‬خث‪ٚ ٟ‬اٌغخثٗ ِٓ حٌازحوشس‪٠ٚ ،‬فؼاً ‪ٚ‬ػاع ٘ازٖ حٌاـ‬ ‫‪ Method‬ف‪ ٟ‬حٌـ‪ Closing Event‬حٌخخص رخٌزشٔخِؾ ٌى‪ ٟ‬ال ‪٠‬زم‪ ٝ‬حٌـ ‪ Thread‬ف‪ ٟ‬حٌزحوشس‪.‬‬ ‫‪ٚ Resume‬طغظخذَ إلسؿخ طٕف‪١‬ز حٌـ ‪ Thread‬رعذ ا‪٠‬مخفٗ رشىً ِئلض رخعظخذحَ‬ ‫حٌـ ‪. Suspend‬‬ ‫‪ٚ Sleep‬طغظخذَ إل‪٠‬مخف حٌـ ‪ Thread‬فظشس صِٕ‪١‬ش ِع‪ٕ١‬ش‪.‬‬ ‫ػخٔ‪١‬خ ‪ :‬أُ٘ حٌـ ‪Thread Class Properties‬‬ ‫‪ٚ Name‬طؤخز ‪ Get‬أ‪ٌ Set ٚ‬ظلذ‪٠‬ذ أ‪ِ ٚ‬عشفش حعاُ حٌاـ ‪ Thread‬حٌاز‪ ٞ‬طاُ حٔشاخث‪ٙ‬ش ‪ٚ‬حٌ‪ٙ‬اذف ِٕ‪ٙ‬اخ‬ ‫طغ‪ ً١ٙ‬حٌظعخًِ ِع حٌـ‪ Multithreads‬ف‪ ٟ‬حٌزشٔخِؾ‪.‬‬ ‫‪ٚ CurrentCulture‬طؤخز ‪ Get‬أ‪ٌ Set ٚ‬ظلذ‪٠‬ذ أ‪ِ ٚ‬عشفش حٌٍغش حٌّعشفش ٌ‪ٙ‬زح حٌـ ‪.Thread‬‬ ‫‪ٚ CurrentUICulture‬طؤخز ‪ٌّ Get‬عشفش حٌٍغش حٌّغظخذِش ف‪ٔ ٟ‬ظخَ حٌظشغ‪.ً١‬‬ ‫‪ٚ IsAlive‬طؤخز ‪ٌّ Get‬عشفش ارح وخْ حٌـ ‪ Thread‬حٌلخٌ‪ ٟ‬ل‪١‬ذ حٌظشغ‪ ً١‬أَ ال‪.‬‬

‫~‪~341‬‬


ًّ‫ع‬١‫ عا‬ٚ‫عّاً أ‬٠ Thread ‫ ِعشفش ارح وخْ حٌاـ‬ٚ‫ذ أ‬٠‫ ٌظلذ‬Set ٚ‫ أ‬Get ‫طؤخز‬ٚ IsBackground .Backgrount Proccess‫ حٌـ‬ٟ‫ف‬ Pool queue َ‫غاظخذ‬٠ Thread ‫ ٌّعشفاش ارح واخْ حٌاـ‬Get ‫طؤخز‬ٚ IsThreadPoolThread .‫ أَ ال‬Thread‫عش ِٓ حٌـ‬ّٛ‫ٌّـ‬ .ٌٟ‫ حٌلخ‬Thread ‫ حٌخخص رخٌـ‬Unique ID ‫ ٌّعشفش حٌـ‬Get ‫طؤخز‬ٚ ManagedThreadId ‫ػااع‬ٌٛ‫ ح‬ٟ‫فاا‬ٚ ٌٟ‫ حٌلااخ‬Thread ‫ااش ٌٍااـ‬٠ٌٛٚ‫ ِعشفااش حأل‬ٚ‫ااذ أ‬٠‫ ٌظلذ‬Set ٚ‫ أ‬Get ‫طؤخااز‬ٚ Priority :ٍٟ٠ ‫ش٘خ وّخ‬١‫ّىٓ طغ‬٠ٚ Normal ْٛ‫ طى‬ٟ‫ع‬١‫حٌطز‬

.‫ش حٌّعخٌـش‬٠ٌٛٚ‫خ رخٌٕغزش أل‬ٙ‫ظ‬١ّ٘‫ ح‬ٜ‫خ ِذ‬ٙ١‫لذد ف‬٠ ‫غ‬١‫ك‬ ‫طشؿااع‬ٚ ‫عّااً أَ ال‬٠ ٛ‫ ٘ااً ٘اا‬ٌٟ‫ حٌلااخ‬Thread ‫ ٌّعشفااش كخٌااش حٌااـ‬Get ‫طؤخااز‬ٚ ThreadState . False ٚ‫ أ‬True :First Thread Program in Dot Net ‫ض‬١ٔ ‫ص‬ٚ‫ حٌذ‬ٟ‫ ف‬Thread ‫ؾ ٌـ‬١‫ِؼخي رغ‬ :ٌٟ‫ حٌشىً حٌظخ‬ٟ‫ وّخ ف‬New Form ُ١ّ‫ش رظظ‬٠‫ حٌزذح‬ٟ‫َ ف‬ٛ‫عٕم‬

: ‫ذ‬٠‫ ؿذ‬Thread ‫إلٔشخء‬ C#: using System.Threading; . . Thread th; . . private void Start_New_Thread_Click(object sender, EventArgs e) { th = new Thread(new ThreadStart(xx)); th.Start(); } VB.NET: Imports System.Threading .. Private th As Thread

~340~


.. Private Sub Start_New_Thread_Click(ByVal sender As Object, ByVal e As EventArgs) th = New Thread(AddressOf xx) th.Start() End Sub :‫ رشىً ِئلض‬Thread ‫مخف حٌـ‬٠‫إل‬ th.Suspend() :‫ ِٓ حٌزحوشس‬ٟ‫خث‬ٙٔ ً‫ رشى‬Thread ‫مخف حٌـ‬٠‫إل‬ th.Abort() َٛ‫ماا‬٠ ‫ااغ‬١‫ ٌٍزشٔااخِؾ رل‬Closing Event ‫ عاآ حٌااـ‬Abort Method ‫ػااع حٌااـ‬ٚ ‫فؼااً دحثّااخ‬٠ٚ .‫ عٕذ اؽفخء حٌزشٔخِؾ‬Thread ‫ربغالق حٌـ‬ :ٌٟ‫ حٌلخ‬Thread ‫ِخص عٓ حٌـ‬ٍٛ‫ٌّعشفش وخفش حٌّع‬ listBox1.Items.Add(th.ApartmentState) listBox1.Items.Add(th.CurrentCulture) listBox1.Items.Add(th.CurrentUICulture) listBox1.Items.Add(th.IsAlive) listBox1.Items.Add(th.IsBackground) listBox1.Items.Add(th.IsThreadPoolThread) listBox1.Items.Add(th.ManagedThreadId) listBox1.Items.Add(th.Priority) listBox1.Items.Add(th.ThreadState) ‫ـاش‬١‫طزاع حٌٕظ‬٠ٚ ‫حكاذ‬ٚ ‫ رّماذحس‬I ‫اذ واً ِاشس حٌاـ‬٠‫ض‬٠ Infinity Loop ٝ‫ عٍا‬Method ‫ حٌـ‬ٞٛ‫طلظ‬ٚ ‫ ِآ أ٘اُ ِاخ دعخٔاخ إلعاظخذحَ حٌاـ‬Infinity Loop ‫عظزاش حعاظخذحَ حٌاـ‬٠ٚ ، Form Text ‫ حٌاـ‬ٝ‫عٍا‬ :‫ ٘زٖ حٌلخٌش‬ٟ‫ ف‬Thread C#: void xx() { int i = 0; while (true) { i++; this.Text = i.ToString(); } } VB.NET: Private Sub xx() Dim i As Integer = 0 Do While True i += 1 Me.Text = i.ToString() Loop End Sub

~342~


‫‪ٚ‬ع‪١‬ى‪ ْٛ‬حٌـ ‪ٌٍ Output‬زشٔخِؾ وّخ ف‪ ٟ‬حٌشىً حٌظخٌ‪:ٟ‬‬

‫اعزخذاَ اٌـ ‪ Multithreading‬ف‪ ٟ‬ثشِج‪١‬بد اٌشجىبد‪:‬‬ ‫‪ٕ٠‬ظق رخعاظخذحَ حٌاـ ‪ Multithreading‬فا‪ ٟ‬رشِـ‪١‬اخص حٌشازىخص حٌظا‪ ٟ‬طعظّاذ حٌزشِـاش حٌّظضحِٕاش‬ ‫‪ Synchronous Programming‬ار أْ ؽز‪١‬عاش حٌظٕف‪١‬از فا‪٘ ٟ‬ازٖ حٌزشِـ‪١‬اخص ِظغٍغاٍش ‪٘ٚ‬ا‪ِ ٛ‬ااخ‬ ‫ع‪ٛ‬ف ‪ّٕ٠‬ع ِٓ طٕف‪١‬ز عٍّ‪١‬خص أخاش‪ٌ ٜ‬لا‪ ٓ١‬حالٔظ‪ٙ‬اخء ِآ حٌعٍّ‪١‬اش حٌـخس‪٠‬اش ‪ ،‬ار أٔاٗ ‪ِٚ‬آ حٌّفؼاً‬ ‫حعظخذحَ ‪ِٕ Thread‬فظً ٌىً عٍّ‪١‬ش لاذ ططشٔاخ اٌا‪ ٝ‬حالٔظظاخس فظاشس ؽ‪ٍ٠ٛ‬اش أ‪ ٚ‬أْ حٌعٍّ‪١‬اش عاظزم‪ٝ‬‬ ‫ف‪ٚ ٟ‬ػع حٌظٕف‪١‬ز ؽ‪ٍ١‬ش فظشس طشغ‪ ً١‬حٌزشٔخِؾ‪.‬‬ ‫‪ -1‬حعظخذحَ حٌـ ‪ Threading‬ف‪ ٟ‬رشِـ‪١‬خص حٌضر‪: Clients ْٛ‬‬ ‫ حعااظخذحَ دحٌااش حٌااشرؾ ‪ Connect‬فاا‪ ٟ‬حالطظااخي حٌّظااضحِٓ‪ :‬فاا‪ ٟ‬كخٌااش حعااظخذحَ حٌااـ ‪Connect‬‬‫‪ٚ Method‬ف‪ ٟ‬كخٌش وخْ حٌـ‪ Server‬رط‪ٟ‬ء فبْ عٍّ‪١‬ش حٌّ‪ٛ‬حفمش عاظؤخز رعاغ حٌ‪ٛ‬لاض ِّاخ ‪٠‬ائد‪ٞ‬‬ ‫اٌ‪ ٝ‬ط‪ٛ‬لف حٌزشٔاخ ِؾ عآ حالعاظـخرش ٌلا‪ ٓ١‬اطّاخَ عٍّ‪١‬اش حٌمزا‪ٛ‬ي ‪٠ٚ‬فؼاً فا‪٘ ٟ‬ازٖ حٌلخٌاش حعاظخذحَ‬ ‫‪ِٕ Thread‬فظً ٌٍم‪١‬خَ رعٍّ‪١‬ش حالطظخي‪.‬‬ ‫ حعااظخذحَ حٌااـ ‪ Client‬فاا‪ ٟ‬عٍّ‪١‬ااش حإلسعااخي ‪ ٚ‬حالعااظمزخي حٌّظااضحِٓ ‪٠ ،‬فؼااً فاا‪ ٟ‬كخٌااش حإلسعااخي‬‫حٌّظااضحِٓ عااذَ حعااظخذحَ ‪ِٕ Thread‬فظااً ٌىااً عٍّ‪١‬ااش ‪ٚ‬خخطااش ارح وااخْ حٌ‪ٙ‬ااذف ِاآ حٌزشٔااخِؾ‬ ‫اسعاخي ِـّ‪ٛ‬عااش ِاآ حٌظعٍ‪ّ١‬ااخص حٌّخظٍفااش اٌاا‪ٔ ٝ‬فاظ حٌااـ‪ Server‬ك‪١‬ااغ عاا‪١‬ى‪ِٕ ْٛ‬شااغً رخعااظمزخي‬ ‫حٌظعٍ‪ّ١‬خص حٌظ‪ ٟ‬طُ ‪٠‬ظُ اسعخٌ‪ٙ‬خ ‪٠ٚ ،‬فؼً ف‪٘ ٟ‬زٖ حٌلخٌش حعاظخذحَ حٌزشِـاش غ‪١‬اش حٌّظضحِٕاش ارح واخْ‬ ‫حإلسعخي ألوؼش ِٓ طعٍ‪ّ١‬ش ‪ٌٚ‬إفظ حٌـ‪ٙ‬اش‪ ،‬أِاخ فا‪ ٟ‬كخٌاش حالعاظمزخي حٌّظاضحِٓ فاال راذ ِآ حعاظخذحَ‬ ‫حٌـ‪ Thread‬ألْ عذَ حعظخذحَ حٌـ ‪ Thread‬ع‪١‬ئد‪ ٞ‬اٌ‪ ٝ‬ط‪ٛ‬لف حٌزشٔخِؾ عٓ حالعظـخرش‪.‬‬

‫~‪~343‬‬


: Server َ‫خص حٌخخد‬١‫ رشِـ‬ٟ‫ ف‬Threading ‫ حعظخذحَ حٌـ‬-2 َ‫ كخٌاش حعاظخذح‬ٟ‫ ِٕفظً ف‬Thread َ‫ الرذ ِٓ حعظخذح‬، AcceptSocket ‫ي‬ٛ‫ حعظخذحَ دحٌش حٌمز‬ٟ‫لف حٌزشٔخِؾ عٓ حإلعاظـخرش فا‬ٛ‫ظ‬١‫ حٌزشِـش حٌّظضحِٕش ار حٔٗ ع‬ٟ‫ ف‬AcceptSocket ‫ي‬ٛ‫دحٌش حٌمز‬ Infinity ٟ‫ػااع عااخدس فاا‬ٛ‫ااغ ط‬١‫ ك‬AcceptSocket ‫ ِااع حٌااـ‬Thread ‫كخٌااش عااذَ حعااظخذحَ حٌااـ‬ .Loop :‫دبٌخ خبطخ‬ ‫غاظمزً أوؼاش‬١‫ ع‬Server ‫ كخٌاش ارح واخْ حٌاـ‬ٟ‫ش حٌّظضحِٕاش فا‬١‫ حٌزشِـش غ‬ٌٝ‫ء ا‬ٛ‫ حٌٍـ‬ٌٝ‫لذ طؼطش ا‬ ‫٘ازح‬ٚ ‫اش‬١‫سفاغ حٌزم‬ٚ ‫ي ؽٍاذ‬ٚ‫ي أ‬ٛ‫ لزا‬ٝ‫ اٌا‬ٞ‫ئد‬١‫لض ِّخ عا‬ٌٛ‫ ٔفظ ح‬ٟ‫ ف‬Client Reqouest ِٓ ‫لاخص‬ٚ‫أ‬ٚ Clients ‫أْ عاذد حٌاـ‬ٚ ‫ حإلٔظشٔاض‬ٝ‫عًّ عٍا‬١‫خخطش ارح وخْ حٌزشٔخِؾ عا‬ٚ ‫ش فعخي‬١‫حِش غ‬ ‫اااش حٌّظضحِٕاااش‬١‫ حٌزشِـاااش غ‬ٝ‫ء اٌااا‬ٛ‫ ٘ااازٖ حٌلخٌاااش الراااذ ِااآ حٌٍـااا‬ٟ‫فااا‬ٚ ، ‫فاااش‬ٚ‫اااش ِعش‬١‫ُ غ‬ٌٙٛ‫دخااا‬ .‫ي‬ٛ‫ش حٌمز‬١ٍّ‫ إلطّخَ ع‬asynchronous Programming :‫بد اٌشجىبد اٌّزضإِخ‬١‫ ثشِج‬ٟ‫ ف‬Multithreading ‫ اعزخذاَ اٌـ‬ٍٝ‫ِضبي ػ‬ ٚ Text ‫ اسعخي‬Client ‫ّىٓ ٌٍـ‬٠ ‫غ‬١‫ ك‬Client/Server ٓ١‫ ٘زح حٌّؼخي رشٔخِـ‬ٟ‫ف ٕٔشت ف‬ٛ‫ع‬ Tow Threads َ‫ رخعظخذح‬Text ‫حٌـ‬ٚ ‫س‬ٛ‫ حٌظ‬Server ‫غظمزً حٌـ‬١‫ع‬ٚ Server‫ حٌـ‬ٌٝ‫ ا‬Images : ٞ‫حص‬ٛ‫عّالْ رشىً ِظ‬٠

: Client ‫ال رشٔخِؾ حإلسعخي حٌـ‬ٚ‫أ‬ C#: void send(byte[] arrImage) { try { TcpClient myclient = new TcpClient (txt_host.Text,5000); 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 );} } void send(string msg) // overloading method

~344~


{ try { TcpClient myclient = new TcpClient (txt_host.Text,7000); NetworkStream myns = myclient.GetStream (); StreamWriter mysw = new StreamWriter (myns); mysw.Write(msg); mysw.Close (); myns.Close (); myclient.Close (); } catch (Exception ex){MessageBox.Show(ex.Message );} } VB.NET: Private Sub send(ByVal arrImage As Byte()) Try Dim myclient As TcpClient = New TcpClient (txt_host.Text,5000) 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 MessageBox.Show(ex.Message) End Try End Sub Private Sub send(ByVal msg As String) „ overloading method Try Dim myclient As TcpClient = New TcpClient (txt_host.Text,7000) Dim myns As NetworkStream = myclient.GetStream () Dim mysw As StreamWriter = New StreamWriter (myns) mysw.Write(msg) mysw.Close () myns.Close () myclient.Close () Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub : Server ‫خ رشٔخِؾ حإلعظمزخي حٌـ‬١ٔ‫ػخ‬ C#: Thread myth1;

~345~


Thread myth2; private void Form1_Load(object sender, System.EventArgs e) { myth1= new Thread (new System.Threading .ThreadStart(Image_Receiver)); myth1.Start (); // Start Thread 1 myth2= new Thread (new System.Threading .ThreadStart(text_Receiver)); myth2.Start ();// Start Thread 2 } NetworkStream ns; TcpListener tcp; Socket sock; StreamReader sr; void text_Receiver() { tcp = new TcpListener (7000);// Open The Port tcp.Start ();// Start Listening on That Port sock = tcp.AcceptSocket ();// Accept Any Request From Client and Start a Session ns = new NetworkStream (sock);// Receives The Binary Data From Port sr = new StreamReader (ns);// Convert Received Data to String textBox1.Text = sr.ReadLine(); tcp.Stop(); while (true) { text_Receiver();// Back to First Method } } NetworkStream myns; TcpListener mytcpl; Socket mysocket; 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); mytcpl.Stop(); if (mysocket.Connected ==true)//if Connected Start Again

~346~


{ while (true) { Image_Receiver();// Back to First Method } } } VB.NET: Private myth1 As Thread Private myth2 As Thread Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) myth1 = New Thread(New System.Threading.ThreadStart(AddressOf Image_Receiver)) myth1.Start() ' Start Thread 1 myth2 = New Thread(New System.Threading.ThreadStart(AddressOf text_Receiver)) myth2.Start() ' Start Thread 2 End Sub Private ns As NetworkStream Private tcp As TcpListener Private sock As Socket Private sr As StreamReader Private Sub text_Receiver() tcp = New TcpListener(7000) ' Open The Port tcp.Start() ' Start Listening on That Port sock = tcp.AcceptSocket() ' Accept Any Request From Client and Start a Session ns = New NetworkStream(sock) ' Receives The Binary Data From Port sr = New StreamReader(ns) ' Convert Received Data to String textBox1.Text = sr.ReadLine() tcp.Stop() Do While True text_Receiver() ' Back to First Method Loop End Sub Private myns As NetworkStream Private mytcpl As TcpListener Private mysocket As Socket Private Sub Image_Receiver() mytcpl = New TcpListener(5000) ' Open The Port

~347~


mytcpl.Start() ' Start Listening on That Port mysocket = mytcpl.AcceptSocket() myns = New NetworkStream(mysocket) pictureBox1.Image = Image.FromStream(myns) mytcpl.Stop() If mysocket.Connected = True Then 'if Connected Start Again Do While True Image_Receiver() ' Back to First Method Loop End If End Sub ‫ اغالق وً ِخ ٌٗ عاللش‬ٛ٘ٚ Threading Aport‫ حٌـ‬ٟ‫ أِش ٘خَ ف‬ٌٝ‫ـذ حإلٔظزخٖ ا‬٠ٚ ... Form‫ ٌٍـ‬Closing‫ كذع حٌـ‬ٟ‫ ف‬Thread‫ لزً اغالق حٌـ‬Tcplistener‫ ِؼً حٌـ‬Socket‫رخٌـ‬

~348~


Appendixes (A) - System.Net Namespace - System.Net.Socket Namespace - Socket Option Members - System.Threading Namespace - TAPI 2 Telephony Functions - Remoting TCP / HTTP Channels Members

~349~


1- System.Net Namespace Classes Transport ‫ اٌـ‬ٚ Application Layer ‫ ثشِجخ اٌـ‬Namespace ‫رذػُ ٘زٖ اٌـ‬ٚ :‫ب‬ٙ‫اعزخذاِبر‬ٚ Classes ‫ِٓ اُ٘ ٘زٖ اٌـ‬ٚ Web Protocols ‫اٌـ‬ٚ Layer Class Authorization

Description 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. Global default proxy instance for all HTTP requests. Defines the HTTP version numbers supported by the HttpWebRequest and HttpWebResponse classes. HTTP-specific implementation of the WebRequest class. HTTP-specific implementation of the WebResponse class. Internet Protocol (IP) address.

GlobalProxySelection HttpVersion

HttpWebRequest HttpWebResponse IPAddress IPEndPoint IPHostEntry NetworkCredential

SocketAddress SocketPermission WebClient

WebException

WebPermission

A network endpoint consisting of an IP address and a port number. Container class for Internet host address information. Provides credentials for password-based authentication schemes such as basic, digest, NTLM, and Kerberos authentication. Stores serialized information from EndPointderived classes. Controls rights to make or accept socket connections. Provides common methods for sending data to and receiving data from a resource identified by a URI. The exception that is thrown when an error occurs while accessing resources via the HTTP protocol. Controls rights to access HTTP Internet

~351~


Class

Description resources. WebPermissionAttribute Specifies permission to access Internet resources. WebProxy WebRequest WebResponse

Contains HTTP proxy settings for the WebRequest class. Makes a request to a Uniform Resource Identifier (URI). This class is abstract. Provides a response from a Uniform Resource Identifier (URI). This class is abstract.

2- System.Net.Socket Namespace Classes TCP & UDP ‫خبطتخ‬ٚ Transport Layer‫ ثشِجتخ اٌتـ‬ٝ‫ ػٍت‬ٟ‫رشوض ثشتىً اعبعت‬ٚ :‫ب‬ّٙ‫ رذػ‬ٟ‫ اٌز‬Classes‫ِٓ اُ٘ اٌـ‬ٚ Socket Programming Class LingerOption

Description 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 Socket 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. 3- Socket Options Class: ‫غّخ ٌه‬٠ ٗٔ‫خبطخ أ‬ٚ ‫بد اٌشجىبد‬١‫ ثشِج‬ٟ‫ّخ ف‬ٌّٙ‫ ا‬Classes ‫ؼزجش ٘زا اٌىالط ِٓ اٌـ‬٠ٚ ٚ‫ أ‬Network Layer ‫ اٌـ‬ٜٛ‫ ِغز‬ٍٝ‫اء ػ‬ٛ‫خ االرظبي ع‬١ٍّ‫ أِش ٌٗ ػاللخ ثؼ‬ٞ‫ً أ‬٠‫ثزؼذ‬ ‫غخ اٌؼبِخ ٌٗ وّب‬١‫اٌظ‬ٚ ٗ‫ ٔفغ‬Socket ‫ اٌـ‬ٜٛ‫ ِغز‬ٍٝ‫ ػ‬ٝ‫ دز‬ٚ‫ أ‬Transport Layer‫اٌـ‬ :ٍٟ٠

~350~


‫ذ إعٕبد اٌـ‬٠‫ ٔش‬ٟ‫ اٌز‬Socket Option ‫ اٌـ‬ٜٛ‫ي ِغز‬ٚ‫ األ‬ٟ‫ذذد ف‬٠ ‫زشاد‬١ِٚ‫أخز صالصخ ثبس‬٠ٚ ‫ب‬ٙ‫ ِٕؼ‬ٚ‫ب أ‬ٍٙ١‫ذ رفؼ‬٠‫ ٔش‬ٟ‫ اٌز‬Option ‫خ اٌـ‬١‫ػ‬ٛٔ ٟٔ‫زش اٌضب‬١ِٚ‫ اٌجبس‬ٟ‫ذذد ف‬٠ٚ ,‫ب‬ٙ١ٌ‫ إ‬Option ٟ٘ ‫خ‬١ٍّ‫ فئرا وبٔذ اٌؼ‬Object Value ‫ش‬١‫زش األخ‬١ِٚ‫أخز اٌجبس‬٠ٚ , ‫ب‬ّٙ١‫ ل‬ٟ‫ش ف‬١١‫ رغ‬ٚ‫أ‬ ‫ّخ‬١‫ُ ِب فزأخز اٌم‬١‫ذ ل‬٠‫ رذذ‬ٚ‫ش أ‬١١‫إرا وبٔذ رغ‬ٚ False ٚ‫ أ‬True ‫ اٌشفغ فزأخز إِب‬ٚ‫اٌغّبح أ‬ :ٌٟ‫ اٌزب‬Socket Option Name ‫ِٓ أُ٘ اٌـ‬ٚ , ‫ش٘ب‬١١‫ذ رغ‬٠‫ ٔش‬ٟ‫اٌز‬

Member name AcceptConnection AddMembership AddSourceMembership BlockSource Broadcast BsdUrgent

ChecksumCoverage Debug DontFragment DontLinger DontRoute DropMembership DropSourceMembership Error ExclusiveAddressUse Expedited

Description Socket is listening. Add an IP group membership. Join a source group. Block data from a source. Permit sending broadcast messages on the socket. Use urgent data as defined in RFC-1222. This option can be set only once, and once set, cannot be turned off. Set or get UDP checksum coverage. Record debugging information. Do not fragment IP datagrams. Close socket gracefully without lingering. Do not route; send directly to interface addresses. Drop an IP group membership. Drop a source group. Get error status and clear. Enables a socket to be bound for exclusive access. Use expedited data as defined in

~352~


ReceiveBuffer

RFC-1222. This option can be set only once, and once set, cannot be turned off. Indicates application is providing the IP header for outgoing datagrams. Specifies IP options to be inserted into outgoing datagrams. Set the IP header time-to-live field. Send keep-alives. Linger on close if unsent data is present. Maximum queue length that can be specified by Listen. Set the interface for outgoing multicast packets. IP multicast loopback. IP multicast time to live. Send UDP datagrams with checksum set to zero. Disables the Nagle algorithm for send coalescing. Receives out-of-band data in the normal data stream. Return information about received packets. Send low water mark.

ReceiveLowWater

Receive low water mark.

ReceiveTimeout

Receive time out.

ReuseAddress

Allows the socket to be bound to an address that is already in use. Specifies the total per-socket buffer space reserved for sends. This is unrelated to the maximum message size or the size of a TCP window. Specifies the total per-socket buffer space reserved for receives. This is unrelated to the maximum message size or the size of a TCP window.

HeaderIncluded

IPOptions

IpTimeToLive KeepAlive Linger MaxConnections MulticastInterface MulticastLoopback MulticastTimeToLive NoChecksum NoDelay OutOfBandInline PacketInformation

SendBuffer

SendLowWater

~353~


SendTimeout Type TypeOfService UnblockSource UseLoopback

Send timeout. Get socket type. Change the IP header type of service field. Unblock a previously blocked source. Enable Or Disable a Loop Back Connection

4- System.Threading Namespace Classes ‫ اٌجشٔتبِج‬ٟ‫ اٌّغتزخذِخ فت‬session‫ ِٕفظتٍخ ػتٓ اٌتـ‬Session ًّ‫ ٌؼ‬Threading‫غزخذَ اٌـ‬٠ ٓ‫ػتتتخ ِتتت‬ّٛ‫ ِج‬System.Threading ُ‫رتتتذػ‬ٚ Asynchronous‫ة اختتتش ٌٍتتتـ‬ٍٛ‫ أعتتت‬ٛ‫٘تتت‬ٚ :ٍٟ٠ ‫ وّب‬ٟ٘ٚ Threading‫بد اٌـ‬١ٍّ‫ اداسح ػ‬ٟ‫ رغزخذَ ف‬ٟ‫اٌز‬ٚ Classes‫اٌـ‬ Class AutoResetEvent Interlocked

ManualResetEvent

Monitor Mutex

Description This event notifies one or more waiting threads that an event has occurred. This class protects against errors by providing atomic operations for variables that are shared by multiple threads. This event occurs when notifying one or more waiting threads that an event has occurred. This class provides a mechanism that synchronizes access to objects. 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 ThreadAbortException

This class creates and controls a thread, sets its priority, and gets its status. This exception is thrown when a call is

~354~


Class ThreadExceptionEventArgs ThreadInterruptedException

ThreadPool

ThreadStateException

Timeout

Timer

WaitHandle

Description made to the Abort() method. This class provides data for the ThreadException event. This exception is thrown when a thread is interrupted while it is in a waiting state. 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. This is the exception that is thrown when a thread is in an invalid state for the method call. This class simply contains a constant integer used when we want to specify an infinite amount of time. This class provides a mechanism for executing methods at specified intervals. This class encapsulates operating system-specific objects that wait for exclusive access to shared resources.

: ‫ذ‬١ٔ ‫د‬ٚ‫ اٌذ‬ٟ‫ ف‬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()

GetDomain()

This static method retrieves the value from the specified slot on the current thread, within the current thread's current domain. This static method returns the current domain

~355~


Public Method Name GetDomainID()

Description in which the current thread is running. 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. This static method cancels an Abort() requested for the current thread. This method resumes a thread that has been suspended.

ResetAbort() Resume() SetData()

Sleep()

SpinWait()

Start()

Suspend()

Public Property Name ApartmentState CurrentContext CurrentCulture

This static method sets the data in the specified slot on the currently running thread, for that thread's current domain. This static and overloaded method blocks the current thread for the specified number of milliseconds. This static method causes a thread to wait the number of times defined by the iterations parameter. This method causes the operating system to change the state of the current instance to ThreadState.Running. This method will either suspend the thread, or if the thread is already suspended, has no effect. : Threading‫ اٌخبطخ ثبٌـ‬Properties‫ِٓ اُ٘ اٌـ‬ٚ Description Sets or gets the apartment state of this thread. This static property gets the current context in which the thread is executing. Sets or gets the culture for the current thread.

~356~


Public Property Name CurrentPrincipal

CurrentThread CurrentUICulture

IsAlive IsBackground

Description This static property sets or gets the thread's current principal. It is used for role-based security. This static property gets the currently running thread. Used at run time, this property sets or gets the current culture used by the Resource Manager to look up culture-specific resources. Gets a value that indicates the execution status of the current thread. 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 Priority

Sets or gets the name of the thread. 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.

5- TAPI 2 Telephony Functions:

TAPI Initialization and Shutdown Function

Description

lineInitializeEx

Initializes the TAPI line abstraction for use by the invoking application. Synchronous. API Example: public static extern int lineInitialize(ref int hTAPI, int hInst, LineCallBackDelegate fnPtr,ref int szAppName, ref int dwNumLines);

lineShutdown

Shuts down the application's use of TAPI's line abstraction. Synchronous. API Example: [DllImport("Tapi32.dll", SetLastError = true)] public static extern int lineShutdown(int hLineApp);

Line Version Negotiation

~357~


Function

Description

lineNegotiateAPIVersion

Allows an application to negotiate a TAPI version to use. Synchronous. API Example: [DllImport("Tapi32.dll", SetLastError = true)]public static extern int lineNegotiateAPIVersion(int hTAPI, int dwDeviceID, int dwAPILowVersion, int dwAPIHighVersion, ref int lpdwAPIVersion, ref lineextensionid lpExtensionID);

Line Status and Capabilities Function

Description

lineGetDevCaps

Returns the capabilities of a given line device. Synchronous. API Example: [DllImport("Tapi32.dll", SetLastError = true)]public static extern int lineGetDevCaps(int hLineApp, int dwDeviceID, int dwAPIVersion, int dwExtVersion,ref linedevcaps lpLineDevCaps);

lineGetDevConfig

Returns configuration of a media stream device. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetDevConfig(long dwDeviceID, ref VARSTRING lpDeviceConfig, string lpszDeviceClass);

lineGetLineDevStatus

Returns current status of the specified open line device. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetLineDevStatus(long hLine, ref LINEDEVSTATUS lpLineDevStatus);

lineSetDevConfig

Sets the configuration of the specified media stream device. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineSetDevConfig(long dwDeviceID, Any lpDeviceConfig,

~358~


long dwSize, string lpszDeviceClass); lineSetStatusMessages

Specifies the status changes for which the application needs to be notified. Synchronous. API Example: [DllImport("Tapi32.dll", SetLastError = true)] public static extern int lineSetStatusMessages(int hLine,int dwLineStates, int dwAddressStates);

lineGetStatusMessages

Returns the application's current line and address status message settings. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetStatusMessages(long hLine, ref long lpdwLineStates, ref long lpdwAddressStates);

lineGetID

Retrieves a device ID associated with the specified open line, address, or call. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetID(long hLine, long dwAddressID, long hCall, long dwSelect, ref VARSTRING lpDeviceID, string lpszDeviceClass);

lineGetIcon

Allows an application to retrieve an icon for display to the user. Synchronous API Example: [DllImport("tapi32.dll")] static extern long lineGetIcon(long dwDeviceID, string lpszDeviceClass, ref long lphIcon);.

lineConfigDialog

Causes the provider of the specified line device to display a dialog box that allows the user to configure parameters related to the line device. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineConfigDialog(long dwDeviceID, long hwndOwner, string

~359~


lpszDeviceClass); lineConfigDialogEdit

Displays a dialog box allowing the user to change configuration information for a line device. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineConfigDialogEdit(long dwDeviceID, long hwndOwner, string lpszDeviceClass, Any lpDeviceConfigIn, long dwSize, ref VARSTRING lpDeviceConfigOut);

Addresses Function

Description

lineGetAddressCaps

Returns the telephony capabilities of an address. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetAddressCaps(long hLineApp, long dwDeviceID, long dwAddressID, long dwAPIVersion, long dwExtVersion, ref LINEADDRESSCAPS lpAddressCaps);

lineGetAddressStatus

Returns current status of a specified address. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetAddressStatus(long hLine, long dwAddressID, ref LINEADDRESSSTATUS lpAddressStatus);

lineGetAddressID

Retrieves the address ID of an address specified using an alternate format. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetAddressID(long hLine, ref long lpdwAddressID, long dwAddressMode, string lpsAddress, long dwSize);

Opening and Closing Line Devices Function

Description

lineOpen

Opens a specified line device for providing subsequent monitoring and/or control of the line.

~361~


Synchronous. API Example: [DllImport("Tapi32.dll", SetLastError = true)] public static extern int lineOpen(int hLineApp, int dwDeviceID, ref int lphLine, int dwAPIVersion,int dwExtVersion, ref int dwCallbackInstance,int dwPrivileges, int dwMediaModes,ref int lpCallParams);

lineClose

Closes a specified opened line device. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineClose(long hLine);

Address Formats Function

Description

lineTranslateAddress

Translates between an address in canonical format and an address in dialable format. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineTranslateAddress(long hLineApp, long dwDeviceID, long dwAPIVersion, string lpszAddressIn, long dwCard, long dwTranslateOptions, ref LINETRANSLATEOUTPUT lpTranslateOutput);

lineSetCurrentLocation

Sets the location used as the context for address translation. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineSetCurrentLocation (long hLineApp, long dwLocation);

lineSetTollList

Manipulates the toll list. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineSetTollList(long hLineApp, long dwDeviceID, string

~360~


lpszAddressIn, long dwTollListOption); lineGetTranslateCaps

Returns address translation capabilities. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetTranslateCaps(long hLineApp, long dwAPIVersion, ref LINETRANSLATECAPS lpTranslateCaps);

Call States and Events Function

Description

lineGetCallInfo

Returns fixed information about a call. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetCallInfo(long hCall, ref LINECALLINFO lpCallInfo);

lineGetCallStatus

Returns complete call status information for the specified call. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetCallStatus(long hCall, ref LINECALLSTATUS lpCallStatus);

lineSetAppSpecific

Sets the application-specific field of a call's information structure. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineSetAppSpecific(long hCall, long dwAppSpecific);

Making Calls Function

Description

lineMakeCall

Makes an outbound call and returns a call handle for it. Asynchronous. API Example: [DllImport("tapi32.dll")] static extern long lineMakeCall(long hLine, ref

~362~


long lphCall, string lpszDestAddress, long dwCountryCode, ref LINECALLPARAMS lpCallParams); lineDial

Dials (parts of one or more) dialable addresses. Asynchronous. API Example: [DllImport("tapi32.dll")] static extern long lineDial(long hCall, string lpszDestAddress, long dwCountryCode);

Answering Incoming Calls Function

Description

lineAnswer

Answers an incoming call. Asynchronous. API Example: [DllImport("Tapi32.dll", SetLastError = true)] public static extern int lineAnswer(int hCall, ref string lpsUserUserInfo, int dwSize);

Toll Saver Support Function

Description

lineSetNumRings

Indicates the number of rings after which incoming calls are to be answered. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineSetNumRings(long hLine, long dwAddressID, long dwNumRings);

lineGetNumRings

Returns the minimum number of rings requested with lineSetNumRings. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetNumRings(long hLine, long dwAddressID, ref long lpdwNumRings);

Call Privilege Control Function

Description

lineSetCallPrivilege

Sets the application's privilege to the privilege specified. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long

~363~


lineSetCallPrivilege(long hCall, long dwCallPrivilege);

~364~


Call Drop Functions Function

Description

lineDrop

Disconnects a call, or abandons a call attempt in progress. Asynchronous. API Example: [DllImport("Tapi32.dll", SetLastError = true)] public static extern int lineDrop(int hCall, string lpsUserUserInfo, int dwSize);

lineDeallocateCall

Deallocates the specified call handle. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineDeallocateCall(long hCall);

Call Handle Manipulation Function

Description

lineHandoff

Hands off call ownership and/or changes an application's privileges to a call. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineHandoff(long hCall, string lpszFileName, long dwMediaMode);

lineGetNewCalls

Returns call handles to calls on a specified line or address for which the application does not yet have handles. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetNewCalls(long hLine, long dwAddressID, long dwSelect, ref LINECALLLIST lpCallList);

lineGetConfRelated Calls

Returns a list of call handles that are part of the same conference call as the call specified as a parameter. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetConfRelatedCalls(long hCall, ref LINECALLLIST lpCallList);

~365~


Location and Country/Region Information

Function

Description

lineTranslateDialog

Displays a dialog box allowing the user to change location and calling card information. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineTranslateDialog(long hLineApp, long dwDeviceID, long dwAPIVersion, long hwndOwner, string lpszAddressIn);

lineGetCountry

Retrieves dialing rules and other information about a given country/region. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetCountry(long dwCountryID, long dwAPIVersion, ref LINECOUNTRYLIST lpLineCountryList);

Request Recipient Services The following two functions are used only in support of Assisted Telephony. Function

Description

lineRegisterRequestRecipient

Registers or deregisters the application as a request recipient for the specified request mode. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineRegisterRequestRecipient(long hLineApp, long dwRegistrationInstance, long dwRequestMode, long bEnable);

lineGetRequest

Gets the next request from the Telephony dynamic link library. Synchronous. API Example: [DllImport("tapi32.dll")] static extern long lineGetRequest(long hLineApp, long dwRequestMode, Any lpRequestBuffer);

~366~


6- Remoting TCP / HTTP Channels Members

Member Name allowAutoRedirect

bindTo

:‫ب‬ٙ‫ اٌخبطخ ث‬Members ‫ِٓ أُ٘ اٌـ‬ٚ HTTP Channel ‫ال اٌـ‬ٚ‫أ‬ Availability Description Client A Boolean value that determines whether the client will handle HTTP redirects. Server

A string representing an IP address for the server to bind to.

clientConnectionLimit Client

An integer defining how many concurrent connections can be opened to the server.

connectionGroupName Client

A string representing a group name if the unsafeAuthenticatedConnectionSh aring property is set.

credentials

Client

An ICredentials instance that allows a client to pass credentials for password- based authentication schemes such as Kerberos authentication.

exclusiveAddressUse

Server

A Boolean value that forces the server to use the listening IP address and port exclusively so that another application cannot steal the listening TCP port.

listen

Server

A Boolean value that determines whether to allow activation to hook into the outside listener service.

name

Client and A string representing the name of server the channel.

port

Server

priority

Client and An integer value that defines the server priority of the channel when multiple channels are available.

proxyName

Client

A string identifying a proxy if the client communication must pass through a proxy.

proxyPort

Client

An integer identifying the port on

An integer value that specifies what TCP port the server will listen on or what port the client will send TCP packets from. If the value 0 is selected, the infrastructure will choose a port automatically.

~367~


Member Name

Availability Description which a proxy is listening for communication from a client.

suppressChannelData

Server

A Boolean value that prevents the server channel from returning channel properties.

timeout

Client

An integer that specifies how long the client channel will wait for a server response.

unsafeAuthenticatedC Client onnectionSharing

A Boolean value that indicates the client will supply credentials and a group name for the connection.

useAuthenticatedConn Client ectionSharing

A Boolean value that tells the server to reuse a connection from an authenticated user.

useIpAddress

Server

A Boolean value that forces the channel to use a specific IP address instead of using the machineName property.

machineName

Client and A string representing the machine server name of the listening server.

:‫ب‬ٙ‫ اٌخبطخ ث‬Members ‫ِٓ أُ٘ اٌـ‬ٚ TCP Channel ‫ب اٌـ‬١ٔ‫صب‬ Member Name Availability Description Server A string representing an IP address bindTo for the server to bind to. exclusiveAddre Server ssUse

A Boolean value that forces the server to use the listening IP address and port exclusively so that another application cannot steal the listening TCP port.

machineName Client and server A string representing the machine name of the listening server. Name

Client and server A string representing the name

Port

Server

Priority

Client and server An integer value that defines the priority of the channel when multiple channels are available. A larger value indicates greater priority.

rejectRemoteR Server

An integer value that specifies what TCP port the server will listen on or what port the client will send TCP packets from.

A Boolean value that determines

~368~


Member Name Availability

Description

equests

whether the server will only accept requests from the local host.

suppressChan Server nelData

A Boolean value that prevents the server channel from returning channel properties.

useIpAddress

Server

A Boolean value that forces the channel to use a specific IP address rather than the machineName property.

~369~


Appendixes (B)

- ASCII Code Table - References - Useful Sites

~371~


ASCII Code Table: Table 1:

~370~


Table 2:

~372~


References: - Microsoft MSDN - Bechrouz A. Forouzan, TCP/IP Protocol Suite Third Edition. - Microsoft, Network Programming for the Microsoft.NET. - Richard Blum, C# Network Programming, Sybex. - Fiach Reid, Network Programming in .NET , ELSEVIER. - Wrox, Professional .NET Network Programming - O'Reilly Programming.NET Security. - Tobin Titus , A Press, C-Sharp Threading Handbook

Useful Sites: - Fadi Abdel-qader, Free Online Courses www.SocketCoder.Com - All API Functions http://www.pinvoke.net - Microsoft MSDN, http://msdn.microsoft.com - C# Corner, www.c-sharpcorner.com - Code Project www.codeproject.com - The Definitive .NET Companion http://www.classdotnet.com/ - Ethereal http://www.ethereal.com

ISBN 9957-09-255-3

:َ‫اإلطذاس اٌمبد‬ ُ‫حٌٕظ‬ٚ ‫ رشِـش حٌشزىخص‬ٟ‫ذس ف‬٠‫خص حٌـذ‬١ٕ‫غ ألُ٘ حٌظم‬٠‫ طلذ‬ٍٝ‫جش هللا ع‬١‫ حإلطذحس حٌمخدَ رّش‬ٞٛ‫لظ‬١‫ع‬ ‫ رشِـش‬ٌٝ‫ رخإلػخفش ا‬RTP‫ ِؼً حٌـ‬VOIP ‫الص حٌـ‬ٛ‫و‬ٛ‫ط‬ٚ‫ ششف رشِـش رش‬ٟ‫عع ف‬ٛ‫صعش وزٌه حٌظ‬ٌّٛ‫ح‬ :ّٟ‫لع حٌشع‬ٌّٛ‫ ح‬ٍٝ‫ذ ع‬٠‫ سحرؾ حإلطذحس حٌـذ‬.Silverlight َ‫أٔظّش حٌّئطّشحص رخعظخذح‬ http://www.socketcoder.com/ArticleFile.aspx?index=2&ArticleID=67 ***************************************************************

ٗ‫رـــــــُ ثذـــــــــــــــّذ اٌـــــٍـــــ‬ ***************************************************************

~373~


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.