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â&#x20AC;&#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/audiovideo/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 â&#x20AC;&#x201C; 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 ď&#x201A;ˇ 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 â&#x20AC;&#x201C; 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 StandardDESCryptoServiceProvider حٌىالط حٌز٠ ٞذعُ 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~