Giáo trình Lập trình Socket

pdf 117 trang phuongnguyen 4310
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình Socket", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_socket.pdf

Nội dung text: Giáo trình Lập trình Socket

  1. CHƯƠNG1:CÁCKINTHCCƠBNVMNGMÁYTÍNH 3 1.1.Môhìnhthamkho7tngOSI 3 1.2.HgiaothcTCP/IP 5 1.3.SosánhgiahaigiaothcTCPvàUDP 6 1.4.Cnggiaothc 7 1.5.ðachIP,cácñachIPdànhriêng 7 1.6.ðachtênmin:loiA,loiMX 8 1.7.Mtsgiaothctngngdng:HTTP,SMTP,POP3,FTP 8 CHƯƠNG2:LPTRÌNHMNGTRONG.NETFRAMEWORK 9 2.1.Sockethưngktni(TCPSocket) 9 2.1.1.GiithiuvNameSpaceSystem.NetvàSystem.Net.Sockets 10 2.1.2.Vitchươngtrìnhchophíamáych 11 2.1.3.Vitchươngtrìnhchophíamáykhách 13 2.1.4.SdngcáclungnhpxutviSocket 14 2.2.Socketkhônghưngktni(UDPSocket) 17 2.2.1.Vitchươngtrìnhchophíamáych 17 2.2.2.Vitchươngtrìnhchophíamáykhách 18 2.2.3.SdnglpSystem.IO.MemoryStreamñtovùngñmnhpxut 20 2.3.SdngcáclphtrñưcxâydngtlpSoket 20 2.3.1.LpTCPClient 21 2.3.2.LpTCPListener 22 2.3.3.LpUDPClient 24 2.4.Socketkhôngñngb 26 2.4.1.Môhìnhxlýskincawindows 26 2.4.2.SdngSocketkhôngñngb 27 2.4.3.VídvSocketkhôngñngb 28 2.4.4.SdngcácphươngthcNonblocking 35 2.5.SdngThreadtrongcácngdngmng 39 2.5.1.SdngThreadtrongchươngtrình.Net 40 2.5.2.SdngThreadtrongcácchươngtrìnhServer 41 2.5.3.SdngThreadñgi/nhndliu 41 2.5.4.SdngThreadPooltrongcácchươngtrình.Net 43 2.5.5.SdngThreadPooltrongcácchươngtrìnhServer 47 2.6.KthutIPMulticasting 48 2.6.1.Broadcastinglàgì? 48 2.6.2.SdngBroadcastingñgidliuñnnhiumáytrongmngccb 48 2.6.3.Multicastinglàgì? 49 2.6.4.SocketMulticastingtrong.Net 50 2.7Bàitpápdng 53 CHƯƠNG3:XÂYDNGNGDNGMNG 55 3.1.GiaothcICMP 55 3.1.1.SdngRawSocket 55 3.1.2.SdnggiaothcICMPvàRawSocketñxâydngchươngtrìnhPing 57 3.1.3.SdnggiaothcICMPvàRawSocketñxâydngchươngtrìnhTraceRoute .58 3.2.GiaothcSMTP,POP3 60 3.2.1.CơbnvhthngMailvàgiaothcSMTP,POP3 60 3.2.2.CàiñtSMTP,POP3Client/Server 60 3.3.GiaothcHTTP 67 3.3.1.CơbnvgiaothcHTTP 67 3.3.2.CàiñtHTTPClient/Server 68 3.4.GiaothcFTP 74 3.4.1.CơbnvgiaothcFTP 74 3.4.2.CàiñtFTPClient/Server 84 1
  2. 3.5.DNS(DomainNameServer) 88 3.5.1.Vnñphângiitênmin 88 3.5.2.TrinkhaiDNSMX(MailExchange) 89 3.6Tholunvcácngdngkhácthưnggp 93 3.7Bàitpápdng 93 CHƯƠNG4:XÂYDNGNGDNGNHIULP 94 4.1.Môhình2lp(twotier),3lp(threetier)vànlp. 94 4.2.Remoting 98 4.2.1.GiithiuvRemoting 102 4.2.2.Khaibáo,càiñtvàñăngkýgiaodintxa 102 4.2.3.Triugiphươngthctxa 107 4.3.WebSerive 107 4.3.1.GiithiuvWebSerives 107 4.3.2.GiaothcSOAP 109 4.3.3.XâydngWebServices 112 4.3.4.TriugiWebServicestngdng.NET,Javavàcácngônngkhác 114 4.4Tholunvcácngdngphântán 116 4.5.Bàitpápdng 116 2
  3. CHƯƠNG1:CÁCKINTHCCƠBNVMNGMÁYTÍNH 1.1.Môhìnhthamkho7tngOSI MôhìnhktnihthngmñưcTchcquctvtiêuchunhoáISO (InternationalOrganizaitonforStandardization)ñưaranhmcungcpmtmôhình chunchocácnhàsnxutvàcungcpsnphmvinthôngápdngtheoñphát trincácsnphmvinthông.Ýtưngmôhìnhhoáñưctoracònnhmhtrcho vicktnigiacáchthngvàmodunhoácácthànhphnphcvmngvinthông. a.ChcnăngcamôhìnhOSI: Cungcpkinthcvhotñngcaktniliênmng ðưaratrìnhtcôngvicñthitlpvàthchinmtgiaothcchoktnicácthit btrênmng. MôhìnhOSIcòncómtsthunlisau: Chianhcáchotñngphctpcamngthànhcácphncôngvicñơngin. Chophépcácnhàthitkcókhnăngpháttrintrêntngmodunchcnăng. Cungcpcáckhnăngñnhnghĩacácchungiaotipcótínhtươngthíchcao “plugandplay”vàtíchhpnhiunhàcungcpsnphm. b.CutrúcmôhìnhOSI: MôhìnhOSIgm7lp(level),milpthchincácchcnăngriêngchohotñng ktnimng. Hình11MôtbylpOSI.4lpñuñnhnghĩacáchthcchoñucuithitlpkt nivinhauñtraoñidliu.3lptrêndùngñpháttrincácngdngññu cuiktnivinhauvàngưidùng. Aplication Application Presentation (UpperLayer) Session TransportLayer NetworkLayer DataLowerLayer DataLink Physical Cáclptrên 3lptrêncùngcamôhìnhOSIthưngñưcgilàcáclpngdng(Application layers)haycòngilàcáclpcao.Cáclpnàythưngliênquantigiaotipvi ngưidùng,ñnhdngcadliuvàphươngthctruynhpcácngdngñó. Hình12 Môtcáclptrênvàcungcpthôngtinvicácchcnăngcanóquaví d: Lp ng dng: chc năng giao Telnet,HTTP 3
  4. Application tip gia ngưi s dng và các chươngtrìnhngdng Lp trình bày: cách thc chun ASSCII hoádliuvàtrìnhbàysliu Presentation EBCDIC Cóchcnăngñcbitlàmãhoá JPEC dliungưisdung Lp phiên: thit lp, duy trì và NFS,SQL hubmtphiênlàmvic Session TransportLayer NetworkLayer DataLink Physical Applicationlayer:ñâylàlpcaonhttrongmôhình.Nólànơimàngưis dnghocktnicácchươngtrìnhngdngvicácthtcchophéptruynhpvào mng. Presentationlayer:Lppresentationcungcpcácmãvàchcnăngñchuyn ñimàñưccungcpbilpngdng.Cácchcnăngñóñmborngdliut lpngdngtrongmththngcóthñưcñcbilpngdngcamththng khác.VD:dùngñmãhoádliutlpngdng:nhưmãhoánhjpeg,gif.Mãñó chophéptacóthhinlêntrangweb. Sessionlayer:ñưcsdngñthitlp,duytrìvàktthúcphiênlàmvic giacáclppresentation.Victraoñithôngtinlpnàybaogmyêucudchv vàñápngyêucucacácngdngtrênthitbkhác. Cáclpdưi. 4lpdưicamôhìnhOSIsdngññnhnghĩalàmthnàoñdliuñưc truynñitrongcácdâynivtlý,cácthitbmngvàñiñntrmñucuicuicùng làñncáclpngdng.Qunsáchnàytachquantâmñn4lpcui.Vàsxemxét tnglpmtcáchchititgiaothipgiacáclptrongmôhìnhOSI: Sdngphươngphápprotocalstackñktnigiahaithitbtrongmng.Protocal stacklàmttphpcácquyñnhdùngññnhnghĩalàmthnàoñdliutruyn quamng. Vídvi:TCP/IPmiLayerchophépdliutruynqua.Cáclpñótraoñicác thôngtinñcungcpcucliênlcgiahaithitbtrongmng.Cáclpgiaotipvi nhausdngProtocalDataUnit(PDU).ThôngtinñiukhincaPDUñưcthêm 4
  5. vàovidliulptrên.Vàthôngtinñiukhinnàynmtrongtrưnggilàtrưng headervàtrailer. Hình13Dataencapsulation Application Presentation UpperLayerData Session TCPHeader UpperLayerData Transport Segment IPHeader Data Network Packet LLCHeader Data FCS DataLink Frame MACHeader Data FCS Physical Bits 0101110101001000010 1.2.HgiaothcTCP/IP CáctngcagiaothcTCP/IPsovicctngcamôhìnhOSI Application:Xácnhnquyn,néndliuvàcácdchvchongưidùng Transport:Xlýdliugiacáchthngvacungcpvictruycpmngchocác ngdng Network:Tìmñưngchocácpacket 5
  6. Link:McOShoccácthitbgiaotipmngtrênmtmáytính MtsñimkhácnhaucaTCP/IPvàmôhìnhOSI +LpngdngtrongTCP/IPxlýchcnăngcalp5,6,7trongmôhìnhOSI +LptransporttrongTCP/IPcungcpcchUDPtruynkhôngtincy,transport trongOSIluônñmbotruyntincy +TCP/IPlàmttpcacácprotocols(mtbgiaothc) +TCP/IPxâydngtrưcOSI QuytrìnhñónggóidliutrongmôhìnhTCP/IPnhưsau: 1.3.SosánhgiahaigiaothcTCPvàUDP 6
  7. 1.4.Cnggiaothc Làmtsnămtrongkhong1 65535dùngñphânbitgia2ngdngmng vinhaugnviñachIPvàSocket Mtscngvàcácgiaothcthôngdng: +FTP:21 +Telnet:23 +SMTP:25 +POP3:110 +HTTP:80 1.5.ðachIP,cácñachIPdànhriêng 0 1 2 3 4 8 16 24 Class A 0 Netid Hostid Class B 1 0 Netid Hostid Class C 1 1 0 Netid Hostid Class D 1 1 1 0 Multicast address Class E 1 1 1 1 0 Reverved for future use 7
  8. 1.6.ðachtênmin:loiA,loiMX 1.7.Mtsgiaothctngngdng:HTTP,SMTP,POP3,FTP Chúngtasnghiêncuchititcácgiaothcnàychương3 8
  9. CHƯƠNG2:LPTRÌNHMNGTRONG.NETFRAMEWORK 2.1.Sockethưngktni(TCPSocket) Socketlàmtgiaodinlptrìnhngdng(API)mng Thôngquagiaodinnàychúngtacóthlptrìnhñiukhinvictruynthônggia haimáysdngcácgiaothcmcthplàTCP,UDP Socketlàstrutưnghoámccao,cóthtưngtưngnónhưlàthitbtruyn thônghaichiugi–nhndliugiahaimáytínhvinhau.  CácloiSocket  Sockethưngktni(TCPSocket)  Socketkhônghưngktni(UDPSocket)  RawSocket  ðcñimcaSockethưngktni  Có1ñưngktniogia2tintrình  Mttrong2tintrìnhphiñitintrìnhkiayêucuktni.  CóthsdngñliênlctheomôhìnhClient/Server  TrongmôhìnhClient/ServerthìServerlngnghevàchpnhnmtyêu cuktni  Mithôngñipgiñucóxácnhntrv  Cácgóitinchuynñitunt  ðcñimcaSocketkhônghưngktni  Haitintrìnhliênlcvinhaukhôngktnitrctip  Thôngñipgiñiphikèmtheoñachcangưinhn  Thôngñipcóthginhiuln  Ngưigikhôngchcchnthôngñiptitayngưinhn  Thôngñipgisaucóthñnñíchtrưcthôngñipgitrưcñó.  ShiucngcaSocket 9
  10.  ðcóththchincáccucgiaotip,mttronghaiquátrìnhphicông bshiucngcasocketmàmìnhsdng.  Micnggiaotipthhinmtñachxácñnhtronghthng.Khiquá trìnhñưcgánmtshiucng,nócóthnhndliugiñncng nàytcácquátrìnhkhác.  Quátrìnhcònlicũngyêucutoramtsocket. 2.1.1.GiithiuvNameSpaceSystem.NetvàSystem.Net.Sockets  Cungcpmtgiaodinlptrìnhñơnginchortnhiucácgiaothcmng.  Córtnhiulpñlptrình  TaquantâmlpIPAdress,IPEndPoint,DNS,  LpIPAdress  MtsFieldcnchúý:  Any:CungcpmtñachIPñchrarngServerphilngnghetrên ttccácCardmng  Broadcast:CungcpmtñachIPqungbá  Loopback:TrvmtñachIPlp  AdressFamily:TrvhñachcaIPhinhành  LpIPAddress  Mtsphươngthccnchúý:  Phươngthckhito  IPAddress(Byte[])  IPAddress(Int64)  IsLoopback:Chobitñachcóphiñachlpkhông  Parse:ChuynIPdngxâuvIPchun  ToString:TrñachIPvdngxâu  TryParse:KimtraIPdngxâucóhplkhông?  LpIPEndPoint  Mtsphươngthccnchúý:  Phươngthckhito  IPEndPoint(Int64,Int32)  IPEndPoint(IPAddress,Int32)  Create :TomtEndPointtmtñachSocket  ToString :TrvñachIPvàshiucngtheokhuôndngðaCh: Cng,víd:192.168.1.1:8080  LpDNS  Mtsthànhphncalp:  HostName:Chobittêncamáyñưcphângii  GetHostAddress:TrvttcIPcamttrm  GetHostEntry:Giiñáptênhocñachtruynvàovàtrvñitưng IPHostEntry 10
  11.  GetHostName:Lyvtêncamáytínhccb  NameSpaceSystem.Net.Sockets  Mtslphaydùng:TcpClient,UdpClient,TcpListener,Socket, NetworkStream,  ðtoraSocket  Socket(AddressFamily af ,SocketType st ,ProtocolType pt ) SocketType Protocoltype Description Dgram Udp Connectionlesscommunication Stream Tcp Connectionoriented communication Raw Icmp InternetControlMessage Protocol Raw Raw PlainIPpacketcommunication usingSystem.Net; usingSystem.Net.Sockets; classSockProp{ publicstaticvoidMain(){ IPAddressia=IPAddress.Parse("127.0.0.1"); IPEndPointie=newIPEndPoint(ia,8000); Sockettest=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); Console.WriteLine("AddressFamily:{0}",test.AddressFamily); Console.WriteLine("SocketType:{0}",test.SocketType); Console.WriteLine("ProtocolType:{0}",test.ProtocolType); Console.WriteLine("Blocking:{0}",test.Blocking); test.Blocking=false; Console.WriteLine("newBlocking:{0}",test.Blocking); Console.WriteLine("Connected:{0}",test.Connected); test.Bind(ie); IPEndPointiep=(IPEndPoint)test.LocalEndPoint; Console.WriteLine("LocalEndPoint:{0}",iep.ToString()); test.Close(); Console.ReadKey(); } } 2.1.2.Vitchươngtrìnhchophíamáych  Vitchươngtrìnhchophíamáych  TomtSocket  LiênktvimtIPEndPointccb  Lngnghektni  Chpnhnktni  Ginhndliutheogiaothcñãthitk 11
  12.  ðóngktnisaukhiñãhoànthànhvàtrlitrngtháilngnghech ktnimi  Vitchươngtrìnhchophíamáych IPEndPointipep=newIPEndPoint(IPAddress.Any,9050); Socketnewsock=Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Socketclient=newsock.Accept(); //Ginhndliutheogiaothcñãthitk . newsock.Close(); ChươngtrìnhServer: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; classServer{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2008); Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(10); Console.WriteLine("Choketnoituclient"); Socketclient=server.Accept(); Console.WriteLine("Chapnhanketnoitu:{0}", client.RemoteEndPoint.ToString()); strings="ChaobandenvoiServer"; //Chuyenchuoisthanhmangbyte byte[]data=newbyte[1024]; data=Encoding.ASCII.GetBytes(s); //guinhandulieutheogiaothucdathietke client.Send(data,data.Length,SocketFlags.None); while(true){ data=newbyte[1024]; intrecv=client.Receive(data); if(recv==0)break; //ChuyenmangbyteDatathanhchuoivainramanhinh s=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("Clienguilen:{0}",s); //NeuchuoinhanduoclaQuitthithoat if(s.ToUpper().Equals("QUIT"))break; //Guitralaichoclientchuois s=s.ToUpper(); data=newbyte[1024]; 12
  13. data=Encoding.ASCII.GetBytes(s); client.Send(data,data.Length,SocketFlags.None); } client.Shutdown(SocketShutdown.Both); client.Close(); server.Close(); } } 2.1.3.Vitchươngtrìnhchophíamáykhách  Vitchươngtrìnhchophíamáykhách  XácñnhñachcaServer  ToSocket  KtniñnServer  Ginhndliutheogiaothcñãthitk  ðóngSocket  Vitchươngtrìnhchophíamáykhách IPEndPointipep=newIPEndPoint(Ipaddress.Parse("192.168.1.6"),9050); Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); server.Connect(ipep); ChươngtrìnhClient: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; classClient{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2008); Socketclient=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); client.Connect(iep); byte[]data=newbyte[1024]; intrecv=client.Receive(data); strings=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("Servergui:{0}",s); stringinput; while(true){ input=Console.ReadLine(); //Chuyeninputthanhmangbyteguilenchoserver data=newbyte[1024]; data=Encoding.ASCII.GetBytes(input); client.Send(data,data.Length,SocketFlags.None); if(input.ToUpper().Equals("QUIT"))break; data=newbyte[1024]; recv=client.Receive(data); 13
  14. s=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("Servergui:{0}",s); } client.Disconnect(true); client.Close(); } } 2.1.4.SdngcáclungnhpxutviSocket TSockettacóthtoralungñnhpxutviSocketñólàsdnglp NetworkStream Property Description CanRead IstrueiftheNetworkStreamsupportsreading CanSeek IsalwaysfalseforNetworkStreams CanWrite IstrueiftheNetworkStreamsupportswriting DataAvailable Istrueifthereisdataavailabletoberead VídchươngtrìnhClient/ServersdngNetworkStreamñgivànhndliu ChươngtrìnhClientsdngNetworkStream: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; 14
  15. classProgram{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2009); Socketclient=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); client.Connect(iep); NetworkStreamns=newNetworkStream(client); byte[]data=newbyte[1024]; while(true){ stringinput=Console.ReadLine(); data=Encoding.ASCII.GetBytes(input); ns.Write(data,0,data.Length); if(input.ToUpper().Equals("QUIT"))break; data=newbyte[1024]; intrec=ns.Read(data,0,data.Length); strings=Encoding.ASCII.GetString(data,0,rec); Console.WriteLine(s); } client.Close(); } } ChươngtrìnhServersdngNetworkStream: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; classProgram{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2009); Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(10); Socketclient=server.Accept(); byte[]data; NetworkStreamns=newNetworkStream(client); while(true){ data=newbyte[1024]; intrec=ns.Read(data,0,data.Length); strings=Encoding.ASCII.GetString(data,0,rec); Console.WriteLine(s); data=newbyte[1024]; s=s.ToUpper(); if(s.Equals("QUIT"))break; data=Encoding.ASCII.GetBytes(s); ns.Write(data,0,data.Length); } 15
  16. client.Close(); server.Close(); } } TrêncscaNetworkStreamtacóthnithêmcáclungñnhpxuttheohưng kýtnhưStreamReader,StreamWriter SauñâylàmtvídvchươngtrìnhClient/Serversdnglungnhpxut,chương trìnhServerchépphépClientgilênyêucu,nuyêuculàGetDatekhôngphânbit chhoachthưngthìServertrvchoClientngàyhinti,nuyêuculàGetTime khôngphanbithoathưngthìServertrvgihinti,nulàQuitthìServerngt ktniviClient,khôngphicáctrưnghptrênthìthôngbáokhônghiulênh. ChươngtrìnhphíaClient: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.IO; usingSystem.Threading; classDateTimeClient{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),9999); Socketclient=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); client.Connect(iep); NetworkStreamns=newNetworkStream(client); StreamReadersr=newStreamReader(ns); StreamWritersw=newStreamWriter(ns); while(true){ stringinput=Console.ReadLine(); sw.WriteLine(input); sw.Flush(); if(input.ToUpper().Equals("QUIT"))break; stringkq=sr.ReadLine(); Console.WriteLine(kq); } sr.Close(); sw.Close(); ns.Close(); client.Close(); } } ChươngtrìnhphíaServer: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; 16
  17. usingSystem.Net.Sockets; usingSystem.IO; classDateTimeServer{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2009); Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(10); Socketclient=server.Accept(); NetworkStreamns=newNetworkStream(client); StreamReadersr=newStreamReader(ns StreamWritersw=newStreamWriter(ns); stringkq=""; while(true){ strings=sr.ReadLine(); s=s.ToUpper(); if(s.Equals("QUIT"))break; if(s.Equals("GETDATE")) kq=DateTime.Now.ToString("dd/MM/yyyy"); else if(s.Equals("GETTIME")) kq=DateTime.Now.ToString("hh:mm:ss"); else kq="Khonghieulenh"; sw.WriteLine(kq); sw.Flush(); } sr.Close(); sw.Close(); client.Close(); } } 2.2.Socketkhônghưngktni(UDPSocket)  Chươngtrìnhphíamáych  TomtSocket  LiênktvimtIPEndPointccb  Ginhndliutheogiaothcñãthitk  ðóngSocket  Chươngtrìnhphíamáykhách  XácñnhñachServer  ToSocket  Ginhndliutheogiaothcñãthitk  ðóngSocket 2.2.1.Vitchươngtrìnhchophíamáych usingSystem; 17
  18. usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; classProgram{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2008); Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); server.Bind(iep); //taoramotEndpottuxadenhandulieuve IPEndPointRemoteEp=newIPEndPoint(IPAddress.Any,0); EndPointremote=(EndPoint)RemoteEp; byte[]data=newbyte[1024]; intrecv=server.ReceiveFrom(data,refremote); strings=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("nhanvetuClient:{0}",s); data=Encoding.ASCII.GetBytes("Chaoclient"); server.SendTo(data,remote); while(true){ data=newbyte[1024]; recv=server.ReceiveFrom(data,refremote); s=Encoding.ASCII.GetString(data,0,recv); if(s.ToUpper().Equals("QUIT"))break; Console.WriteLine(s); data=newbyte[1024]; data=Encoding.ASCII.GetBytes(s); server.SendTo(data,0,data.Length,SocketFlags.None,remote); } server.Close(); } } 2.2.2.Vitchươngtrìnhchophíamáykhách usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; classProgram{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2008); Socketclient=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); Strings="Chaoserver"; byte[]data=newbyte[1024]; data=Encoding.ASCII.GetBytes(s); client.SendTo(data,iep); EndPointremote=(EndPoint)iep; 18
  19. data=newbyte[1024]; intrecv=client.ReceiveFrom(data,refremote); s=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("NhanvetuServer{0}",s); while(true){ s=Console.ReadLine(); data=newbyte[1024]; data=Encoding.ASCII.GetBytes(s); client.SendTo(data,remote); if(s.ToUpper().Equals("QUIT"))break; data=newbyte[1024]; recv=client.ReceiveFrom(data,refremote); s=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine(s); } client.Close(); } } SdngSocketkhônghưngktnivitchươngtrìnhchatgiưa2máynhư sau:(SaunàychúngtacóthsdnglpUdpClient) usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Threading; publicpartialclassForm1:Form{ privateSocketudp1; privateIPEndPointipremote,iplocal; publicForm1(){ InitializeComponent(); CheckForIllegalCrossThreadCalls=false; } privatevoidbtStart_Click(objectsender,EventArgse){ udp1=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); iplocal=newIPEndPoint(IPAddress.Parse("127.0.0.1"), int.Parse(txtLocalPort.Text)); udp1.Bind(iplocal); ipremote=newIPEndPoint(IPAddress.Parse(txtIp.Text), int.Parse(txtRemotePort.Text)); Threadtuyen=newThread(newThreadStart(NhanDL)); tuyen.Start(); 19
  20. } privatevoidbtSend_Click(objectsender,EventArgse){ byte[]data=newbyte[1024]; data=Encoding.ASCII.GetBytes(txtSend.Text); udp1.SendTo(data,ipremote); } privatevoidNhanDL(){ while(true){ byte[]data=newbyte[1024]; IPEndPointipe=newIPEndPoint(IPAddress.Any,0); EndPointremote=(EndPoint)ipe; intrec=udp1.ReceiveFrom(data,refremote); strings=Encoding.ASCII.GetString(data,0,rec); txtNoidung.Text+=s+"\r\n"; } } privatevoidbutton1_Click(objectsender,EventArgse){ MessageBox.Show(txtSend.Text.Substring(0,txtSend.Text.IndexOf(""))); } } 2.2.3.SdnglpSystem.IO.MemoryStreamñtovùngñmnhpxut 2.3.SdngcáclphtrñưcxâydngtlpSoket 20
  21. 2.3.1.LpTCPClient McñíchcalpUDPClienttrênlàdùngcholptrìnhvigiaothcUDP, vigiaothcnàythìhaibênkhôngcnphithitlpktnitrưckhigidovymc ñtincykhôngcao.ðñmboñtincytrongcácngdngmng,ngưitacòn dùng mt giao thc khác, gi là giao thc có kt ni : TCP (Transport Control Protocol).TrênInternetchyulàdùngloigiaothcnày,vídnhưTelnet,HTTP, SMTP,POP3 ðlptrìnhtheogiaothcTCP,MS.NETcungcphailpcótênlà TCPClientvàTCPListener. CácthànhphncalpTcpClient +Phươngthckhito: ConstructorMethod Name Description TcpClient() TomtñitưngTcpClient .Chưañtthôngsgì. TcpClient TomtTcpClient vàgnchonómtEndPointccb. (IPEndPoint) (Gánñachmáyccbvàshiucngñsdngtrao ñithôngtinvsau) TcpClient TomtñitưngTcpClient vàktniñnmtmáycó (RemoteHost:String, ñachvàshiucngñưctruynvào RemoteHostcó Int32) thlàñachIPchunhoctênmáy. +Mtsthuctính: Name Description Available Chobitsbyteñãnhnvtmngvàcósn ññc. Client TrvSocketngviTCPClienthinhành. Connected TrngtháichobitñãktniñưcñnServerhaychưa? +Mtsphươngthc: Name Description Close GiiphóngñitưngTcpClient nhưng khôngñóngktni. Connect KtniñnmtmáyTCPkháccóTênvà (RemoteHost, shiucng. Port) 21
  22. GetStream TrvNetworkStream ñtñógiúpta gihaynhndliu.(Thưnglàmtham skhitoStreamReadervà StreamWriter). Khi ñã gn vào StreamReader và StreamWriterrithìtacóthgivànhn d liu thông qua các phương thc Readln, writeline tương ng ca các lp này. TasdnglpTcpClientvitlichươngtrìnhDateTimeClientnhưsau: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.IO; usingSystem.Threading; classDateTimeClient{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),9999); TcpClientclient=newTcpClient(); client.Connect(iep); StreamReadersr=newStreamReader(client.GetStream()); StreamWritersw=newStreamWriter(client.GetStream()); while(true){ stringinput=Console.ReadLine(); sw.WriteLine(input); sw.Flush(); if(input.ToUpper().Equals("QUIT"))break; stringkq=sr.ReadLine(); Console.WriteLine(kq); } sr.Close(); sw.Close(); client.Close(); } } 2.3.2.LpTCPListener TCPListernerlà mtlpcho phép ngưilptrìnhcó th xây dng các ng dng Server (Ví d như SMTP Server, FTP Server, DNS Server, POP3 Server hay servertñnhnghĩa .).ngdngserverkhácvingdngClientchnóluôn luônthchinlngnghevàchpnhncácktniñntClient. 22
  23. CácthànhphncalpTcpListener: +Phươngthckhito: Constructormethod Name Description TcpListener(Port: TomtTcpListener vàlngngheticngchñnh. Int32) TcpListener TomtTcpListener vigiátrEndpointtruynvào. (IPEndPoint) TcpListener TomtTcpListener vàlngnghecácktniñnti (IPAddress,Int32) ñachIPvàcngchñnh. +Cácphươngthckhác Name Description AcceptSocket Chpnhnmtyêucuktniñangch. AcceptTcpClient Chpnhnmtyêucuktniñangch.(ngdngs dngtilnhnàychoñnkhinàocómtktniñn) Pending Chobitliucóktninàoñangchñikhông?(True =có). Start Btñulngnghecácyêucuktni. Stop Dngvicnghe. SdnglpTcpListenertavitlichươngtrìnhDateTimeServernhưsau: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.IO; classDateTimeServer{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2009); TcpListenerserver=newTcpListener(iep); server.Start(); TcpClientclient=server.AcceptTcpClient(); StreamReadersr=newStreamReader(client.GetStream()); StreamWritersw=newStreamWriter(client.GetStream()); stringkq=""; while(true){ 23
  24. strings=sr.ReadLine(); s=s.ToUpper(); if(s.Equals("QUIT"))break; if(s.Equals("GETDATE")) kq=DateTime.Now.ToString("dd/MM/yyyy"); else if(s.Equals("GETTIME")) kq=DateTime.Now.ToString("hh:mm:ss"); else kq="Khonghieulenh"; sw.WriteLine(kq); sw.Flush(); } sr.Close(); sw.Close(); client.Close(); } } 2.3.3.LpUDPClient GiaothøcUDP(UserDatagramProtocolhayUserDefineProtocol)lmétgiaothøc phikÕtnèi(Connectionless)cãnghÜalmétbªncãthÓgöid÷liÖuchobªnkiamkh«ngcÇn biÕtlbªn®ã®s½nsnghaych−a?(Nãic¸chkh¸clkh«ngcÇnthiÕtlËpkÕtnèigi÷ahai bªnkhitiÕnhnhtrao®æith«ngtin).Giaothøcnykh«ngtincËyb»nggiaothøcTCPnh−ng tèc®él¹inhanhvdÔci®Æt.Ngoira,víigiaothøcUDPtacßncãthÓgöic¸cgãitinqu¶ng b¸(Broadcast)cho®ångthêinhiÒum¸y. Trong.NET,líp UDPClient (n»mtrong System.Net.Sockets )®ãnggãic¸cchøcn¨ng cñagiaothøcUDP. Constructor methosd Description UdpClient() T¹omét®èit−îng(thÓhiÖn)míicñalíp UDPClient. UdpClient(AddressFamily) T¹omét®èit−îng(thÓhiÖn)míicñalíp UDPClient.Thuécmétdßng®ÞachØ (AddressFamily)®−îcchØ®Þnh. UdpClient(Int32) T¹omét UdpClient vg¾n(bind)métcængchonã. UdpClient(IPEndPoint) T¹omét UdpClient vg¾n(bind)métIPEndpoint (g¸n®ÞachØIPvcæng)chonã. UdpClient(Int32,AddressFamily) T¹omét UdpClient vg¸nsèhiÖucæng, AddressFamily 24
  25. UdpClient(String,Int32) T¹omét UdpClient vthiÕtlËpvíiméttr¹mtõxa mÆc®Þnh. PUBLIC Method Name Description BeginReceive NhËnd÷liÖuKh«ng®ångbétõm¸yëxa. BeginSend Göikh«ng®ångbéd÷liÖutíim¸yëxa Close §ãngkÕtnèi. Connect ThiÕtlËpmétDefaultremotehost. EndReceive KÕtthócnhËnd÷liÖukh«ng®ångbéëtrªn EndSend KÕtthócviÖcgöid÷liÖukh«ng®ångbéëtrªn Receive NhËn d÷ liÖu (®ång bé) do m¸y ë xa göi. (§ång bé cã nghÜalc¸clÖnhngaysaulÖnhReceivechØ®−îcthùcthinÕu Receive ® nhËn ®−îc d÷ liÖu vÒ . Cßn nÕu nã ch−a nhËn ®−îc–dïchØmétchót–th×nãvÉncøchê(blocking)) Send Göi d÷ liÖu (®ång bé) cho m¸y ë xa. VídsdngUdpClientvitchươngtrìnhChatgia2máy: Dochươngtrình2máylànhưnhautachcnvitmtchươngtrìnhcopyrañs dng. Hìnhnhcanónhưsau: usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; 25
  26. usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Threading; namespaceUdpChat{ publicpartialclassForm1:Form{ publicForm1(){ InitializeComponent(); CheckForIllegalCrossThreadCalls=false; } privatevoidbtSend_Click(objectsender,EventArgse){ UdpClientsend=newUdpClient(); IPEndPointiepRemote=newIPEndPoint(IPAddress.Parse(txtIp.Text), int.Parse(txtRemotePort.Text)); byte[]data=newbyte[1024]; data=Encoding.UTF8.GetBytes(txtSend.Text); send.Send(data,data.Length,iepRemote); txtReceive.Text+="Sender:"+txtSend.Text+"\r\n"; txtSend.Clear(); if(txtSend.Text.ToUpper().Equals("QUIT"))this.Dispose(); } privatevoidbtConnect_Click(objectsender,EventArgse){ Threadtuyen=newThread(newThreadStart(NhanDl)); tuyen.Start(); } privatevoidNhanDl(){ UdpClientreceiver=newUdpClient(int.Parse(txtLocalPort.Text)); IPEndPointiep=newIPEndPoint(IPAddress.Any,0); while(true){ byte[]data=newbyte[1024]; data=receiver.Receive(refiep); strings=Encoding.UTF8.GetString(data); if(s.Trim().ToUpper().Equals("QUIT"))break; txtReceive.Text+="Receiver:"+s+"\r\n"; } } } } 2.4.Socketkhôngñngb 2.4.1.Môhìnhxlýskincawindows 26
  27. MôhìnhxlýskincaWindowsñưcthhinquahìnhsau: Nhưvythôngquamôhìnhnàytacóthynhimchomtthtcnàoñóthc hinkhiskinsyratrêncácControl Víd: usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; namespaceEventDemo{ publicpartialclassForm1:Form{ publicForm1(){ InitializeComponent(); button1.Click+=newEventHandler(NhanTiep); } privatevoidbutton1_Click(objectsender,EventArgse){ MessageBox.Show("Bacdanhanem"); } privatevoidNhanTiep(objectsender,EventArgse){ MessageBox.Show("Baclainhanemroi"); } } } vídtrênchúngtangoàiskinClickcabutton1chúngtathêmmtx kinkhibutton1ñưcnhnñólàskinNhanTiep. 2.4.2.SdngSocketkhôngñngb ðlptrìnhkhôngñngbviSocketchúngtasdngcácphươngthccho vicsdngbtñngb 27
  28. Cácphươngthcchoviclptrìnhbtñngbñưcchialàm2lithưngbt ñubngBeginvàEnd:  PhươngthcbtñubngBegin,btñumtchcnăngvàñưcñăng kýviphươngthcAsyncCallback  BtñubngEndchchcnănghoànthànhkhiAsyncCallbackñưc gi. RequestsStartedBy DescriptionofRequest RequestsEndedBY BeginAccept() To accept an incoming EndAccept() connection BeginConnect() To connect to a remote EndConnect() host BeginReceive() To retrieve data from a EndReceive() socket BeginReceiveFrom() To retrieve data from a EndReceiveFrom() specific remote host BeginSend() To send data from a EndSend() socket BeginSendTo() To send data to a EndSendTo() specific remote host ðchpnhnktnibtñngbtasdngphươngthcBeginAccept()và EndAccept()nhưsau:  PhươngthcBeginAccept()vàEndAccept() IAsyncResultBeginAccept(AsyncCallbackcallback,objectstate) SocketEndAccept(IAsyncResultiar);  Thưngñưcdùngnhưsau: Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); IPEndPointiep=newIPEndPoint(IPAddress.Any,9050); sock.Bind(iep); sock.Listen(5); sock.BeginAccept(newAsyncCallback(CallAccept),sock); TrongñóphươngthcCallAcceptthưngñưcvitnhưsau: privatestaticvoidCallAccept(IAsyncResultiar){ Socketserver=(Socket)iar.AsyncState; Socketclient=server.EndAccept(iar); ... } ðthitlpktnitheocáchbtñngbchúngtasdngphươngthc BeginConnect()vàEndConnect()nhưsau:  PhươngthcBeginConnect()vàEndConnect() 28
  29. Socketnewsock=newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),9050); newsock.BeginConnect(iep,newAsyncCallback(Connected),newsock); TrongñóphươngthcConnectedthưngñưcvitnhưsau: publicstaticvoidConnected(IAsyncResultiar){ Socketsock=(Socket)iar.AsyncState; try{ sock.EndConnect(iar); }catch(SocketException){ Console.WriteLine("Unabletoconnecttohost"); } } ðgidliubtñngbchúngtalàmnhưsau: +PhươngthcBeginSend()vàEndSend() +BeginSend() IAsyncResultBeginSend(byte[] buffer ,int offset ,int size ,SocketFlags sockflag , AsyncCallback callback ,object state ) Víd: sock.BeginSend(data,0,data.Length,SocketFlags.None,new AsyncCallback(SendData),sock); +EndSend() intEndSend(IAsyncResultiar) TrongñóphươngthcSendDatathưngñưcvitnhưsau: privatestaticvoidSendData(IAsyncResultiar){ Socketserver=(Socket)iar.AsyncState; intsent=server.EndSend(iar); } Tươngtnhưgiaothchưngktninutasdnggidliutheogiaothc khônghưngktnichúngtacũngthchintươngtnhưsau:  PhươngthcBeginSendTo()vàEndSendTo() IAsyncResultBeginSendTo(byte[]buffer,intoffset,intsize,SocketFlags sockflag,EndPointep,AsyncCallbackcallback,objectstate) Víd: IPEndPointiep=newEndPoint(IPAddress.Parse("192.168.1.6"),9050); sock.BeginSendTo(data,0,data.Length,SocketFlags.None,iep,new AsynCallback(SendDataTo),sock); intEndSendTo(IAsyncResultiar) ðnhndliubtñngbtathchinnhưsau: +Nhndliuvigiaothchưngktni:  PhươngthcBeginReceivevàEndReceive() 29
  30. sock.BeginReceive(data,0,data.Length,SocketFlags.None,new AsyncCallback(ReceivedData),sock); ViReceivedDatañưcñnhnghĩanhưsau: voidReceivedData(IAsyncResultiar){ Socketremote=(Socket)iar.AsyncState; intrecv=remote.EndReceive(iar); stringreceivedData=Encoding.ASCII.GetString(data,0, recv); Console.WriteLine(receivedData); } +Nhndliubtñngbvigiaothckhônghưngktni.  PhươngthcBeginReceiveFrom()andEndReceiveFrom() sock.BeginReceive(data,0,data.Length,SocketFlags.None,refiep,new AsyncCallback(ReceiveData),sock); voidReceiveData(IasyncResultiar){ Socketremote=(Socket)iar.AsyncState; intrecv=remote.EndReceiveFrom(iar); stringstringData=Encoding.ASCII.GetString(data,0, recv); Console.WriteLine(stringData); } 2.4.3.VídvSocketkhôngñngb Sauñâychúngtassdngcácphươngthckhôngñngbvitchươngtrình Client/ServertheoSocketbtñngb,mikhiClientgidliulênServer,nósin ravàgitrlichoClient.Môhìnhcaclient/serversdngcácphươngthcbt ñngbnhưsau: 30
  31. ChươngtrìnhphíaClient: usingSystem; usingSystem.Drawing; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; usingSystem.Windows.Forms; classAsyncTcpClient:Form { privateTextBoxnewText; privateTextBoxconStatus; privateListBoxresults; privateSocketclient; privatebyte[]data=newbyte[1024]; privateintsize=1024; publicAsyncTcpClient() { Text="AsynchronousTCPClient"; Size=newSize(400,380); Labellabel1=newLabel(); label1.Parent=this; label1.Text="Entertextstring:"; label1.AutoSize=true; label1.Location=newPoint(10,30); newText=newTextBox(); newText.Parent=this; newText.Size=newSize(200,2*Font.Height); newText.Location=newPoint(10,55); results=newListBox(); results.Parent=this; results.Location=newPoint(10,85); results.Size=newSize(360,18*Font.Height); Labellabel2=newLabel(); label2.Parent=this; 31
  32. label2.Text="ConnectionStatus:"; label2.AutoSize=true; label2.Location=newPoint(10,330); conStatus=newTextBox(); conStatus.Parent=this; conStatus.Text="Disconnected"; conStatus.Size=newSize(200,2*Font.Height); conStatus.Location=newPoint(110,325); Buttonsendit=newButton(); sendit.Parent=this; sendit.Text="Send"; sendit.Location=newPoint(220,52); sendit.Size=newSize(5*Font.Height,2*Font.Height); sendit.Click+=newEventHandler(ButtonSendOnClick); Buttonconnect=newButton(); connect.Parent=this; connect.Text="Connect"; connect.Location=newPoint(295,20); connect.Size=newSize(6*Font.Height,2*Font.Height); connect.Click+=newEventHandler(ButtonConnectOnClick); Buttondiscon=newButton(); discon.Parent=this; discon.Text="Disconnect"; discon.Location=newPoint(295,52); discon.Size=newSize(6*Font.Height,2*Font.Height); discon.Click+=newEventHandler(ButtonDisconOnClick); } voidButtonConnectOnClick(objectobj,EventArgsea) { conStatus.Text="Connecting "; Socketnewsock=newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),9050); newsock.BeginConnect(iep,newAsyncCallback(Connected),newsock); } voidButtonSendOnClick(objectobj,EventArgsea) { byte[]message=Encoding.ASCII.GetBytes(newText.Text); newText.Clear(); client.BeginSend(message,0,message.Length,SocketFlags.None, newAsyncCallback(SendData),client); } voidButtonDisconOnClick(objectobj,EventArgsea) { client.Close(); conStatus.Text="Disconnected"; } voidConnected(IAsyncResultiar) { 32
  33. client=(Socket)iar.AsyncState; try { client.EndConnect(iar); conStatus.Text="Connectedto:"+client.RemoteEndPoint.ToString(); client.BeginReceive(data,0,size,SocketFlags.None, newAsyncCallback(ReceiveData),client); }catch(SocketException) { conStatus.Text="Errorconnecting"; } } voidReceiveData(IAsyncResultiar) { Socketremote=(Socket)iar.AsyncState; intrecv=remote.EndReceive(iar); stringstringData=Encoding.ASCII.GetString(data,0,recv); results.Items.Add(stringData); } voidSendData(IAsyncResultiar) { Socketremote=(Socket)iar.AsyncState; intsent=remote.EndSend(iar); remote.BeginReceive(data,0,size,SocketFlags.None, newAsyncCallback(ReceiveData),remote); } publicstaticvoidMain() { Application.Run(newAsyncTcpClient()); } } ChươngtrìnhphíaServer: usingSystem; usingSystem.Drawing; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; usingSystem.Windows.Forms; classAsyncTcpSrvr:Form { privateTextBoxconStatus; privateListBoxresults; privatebyte[]data=newbyte[1024]; privateintsize=1024; privateSocketserver; publicAsyncTcpSrvr() { Text="AsynchronousTCPServer"; Size=newSize(400,380); 33
  34. results=newListBox(); results.Parent=this; results.Location=newPoint(10,65); results.Size=newSize(350,20*Font.Height); Labellabel1=newLabel(); label1.Parent=this; label1.Text="Textreceivedfromclient:"; label1.AutoSize=true; label1.Location=newPoint(10,45); Labellabel2=newLabel(); label2.Parent=this; label2.Text="ConnectionStatus:"; label2.AutoSize=true; label2.Location=newPoint(10,330); conStatus=newTextBox(); conStatus.Parent=this; conStatus.Text="Waitingforclient "; conStatus.Size=newSize(200,2*Font.Height); conStatus.Location=newPoint(110,325); ButtonstopServer=newButton(); stopServer.Parent=this; stopServer.Text="StopServer"; stopServer.Location=newPoint(260,32); stopServer.Size=newSize(7*Font.Height,2*Font.Height); stopServer.Click+=newEventHandler(ButtonStopOnClick); server=newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); IPEndPointiep=newIPEndPoint(IPAddress.Any,9050); server.Bind(iep); server.Listen(5); server.BeginAccept(newAsyncCallback(AcceptConn),server); } voidButtonStopOnClick(objectobj,EventArgsea) { Close(); } voidAcceptConn(IAsyncResultiar) { Socketoldserver=(Socket)iar.AsyncState; Socketclient=oldserver.EndAccept(iar); conStatus.Text="Connectedto:"+client.RemoteEndPoint.ToString(); stringstringData="Welcometomyserver"; byte[]message1=Encoding.ASCII.GetBytes(stringData); client.BeginSend(message1,0,message1.Length,SocketFlags.None, newAsyncCallback(SendData),client); } voidSendData(IAsyncResultiar) { Socketclient=(Socket)iar.AsyncState; 34
  35. intsent=client.EndSend(iar); client.BeginReceive(data,0,size,SocketFlags.None, newAsyncCallback(ReceiveData),client); } voidReceiveData(IAsyncResultiar) { Socketclient=(Socket)iar.AsyncState; intrecv=client.EndReceive(iar); if(recv==0) { client.Close(); conStatus.Text="Waitingforclient "; server.BeginAccept(newAsyncCallback(AcceptConn),server); return; } stringreceivedData=Encoding.ASCII.GetString(data,0,recv); results.Items.Add(receivedData); byte[]message2=Encoding.ASCII.GetBytes(receivedData); client.BeginSend(message2,0,message2.Length,SocketFlags.None, newAsyncCallback(SendData),client); } publicstaticvoidMain() { Application.Run(newAsyncTcpSrvr()); } } 2.4.4.SdngcácphươngthcNonblocking ðlptrìnhbtñngbchúngtacóthsdngcácphươngthcNon– blokingnhưphươngthcPoll()vàphươngthcSelect: +PhươngthcPoll() boolPoll(intmicroseconds,SelectModemode);  SelectRead:Poll()trvtruenumttrongnhngñiukinsauñưc tho:  NuphươngthcAccept()thànhcông  NucódliutrênSocket  Nuktniñãñóng  SelectWrite:Poll()trvtruenuthomttrongnhngñiukinsau:  PhươngthcConnect()thànhcông  NucódliutrênSocketñgi  SelectError:Poll()trvtruenumttrongnhngñiukinsauñưc tho:  NuphươngthcConnect()thtbi  Nucódliungoàibăngthôngchungiñnnhưngthuctính OutOfBandInlinekhôngñưcthitlplàtrue. +PhươngthcSelect(): 35
  36. Socket.Select(IListcheckRead,IListcheckWrite,IListcheckError,int microseconds) •checkRead monitorsthespecifiedsocketsfortheabilitytoreaddatafromthe socket. •checkWrite monitorsthespecifiedsocketsfortheabilitytowritedatatothe socket. •checkError monitorsthespecifiedsocketsforerrorconditions. VídngdngServersdngphươngthcPoll() usingSystem; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; classTcpPollSrvr { publicstaticvoidMain() { intrecv; byte[]data=newbyte[1024]; IPEndPointipep=newIPEndPoint(IPAddress.Any, 9050); Socketnewsock=new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Waitingforaclient "); boolresult; inti=0; while(true) { i++; Console.WriteLine("pollingforaccept#{0} ",i); result=newsock.Poll(1000000,SelectMode.SelectRead); if(result) { break; } } Socketclient=newsock.Accept(); IPEndPointnewclient= (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Connectedwith{0}atport{1}", newclient.Address,newclient.Port); stringwelcome="Welcometomytestserver"; data=Encoding.ASCII.GetBytes(welcome); client.Send(data,data.Length, SocketFlags.None); 36
  37. i=0; while(true) { Console.WriteLine("pollingforreceive#{0} ",i); i++; result=client.Poll(3000000,SelectMode.SelectRead); if(result) { data=newbyte[1024]; i=0; recv=client.Receive(data); if(recv==0) break; Console.WriteLine( Encoding.ASCII.GetString(data,0,recv)); client.Send(data,recv,0); } } Console.WriteLine("Disconnectedfrom{0}", newclient.Address); client.Close(); newsock.Close(); } } SauñâychúngtasvitmtchươngtrìnhServersdngphươngthcSelect() ñchpnhn2ktniñntclientvàxlýtngktni. ChươngtrìnhSelectServer: usingSystem; usingSystem.Collections; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; classSelectTcpSrvr { publicstaticvoidMain() { ArrayListsockList=newArrayList(2); ArrayListcopyList=newArrayList(2); Socketmain=newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); IPEndPointiep=newIPEndPoint(IPAddress.Any,9050); byte[]data=newbyte[1024]; stringstringData; 37
  38. intrecv; main.Bind(iep); main.Listen(2); Console.WriteLine("Waitingfor2clients "); Socketclient1=main.Accept(); IPEndPointiep1=(IPEndPoint)client1.RemoteEndPoint; client1.Send(Encoding.ASCII.GetBytes("Welcometomyserver")); Console.WriteLine("Connectedto{0}",iep1.ToString()); sockList.Add(client1); Console.WriteLine("Waitingfor1moreclient "); Socketclient2=main.Accept(); IPEndPointiep2=(IPEndPoint)client2.RemoteEndPoint; client2.Send(Encoding.ASCII.GetBytes("Welcometomyserver")); Console.WriteLine("Connectedto{0}",iep2.ToString()); sockList.Add(client2); main.Close(); while(true) { copyList=newArrayList(sockList); Console.WriteLine("Monitoring{0}sockets ",copyList.Count); Socket.Select(copyList,null,null,10000000); foreach(SocketclientincopyList) { data=newbyte[1024]; recv=client.Receive(data); stringData=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("Received:{0}",stringData); if(recv==0) { iep=(IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Client{0}disconnected.",iep.ToString()); client.Close(); sockList.Remove(client); if(sockList.Count==0) { Console.WriteLine("Lastclientdisconnected,bye"); return; } } else client.Send(data,recv,SocketFlags.None); 38
  39. } } } } ChươngtrìnhClient: usingSystem; usingSystem.Collections; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; classSelectTcpClient { publicstaticvoidMain() { Socketsock=newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),9050); byte[]data=newbyte[1024]; stringstringData; intrecv; sock.Connect(iep); Console.WriteLine("Connectedtoserver"); recv=sock.Receive(data); stringData=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("Received:{0}",stringData); while(true) { stringData=Console.ReadLine(); if(stringData=="exit") break; data=Encoding.ASCII.GetBytes(stringData); sock.Send(data,data.Length,SocketFlags.None); data=newbyte[1024]; recv=sock.Receive(data); stringData=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("Received:{0}",stringData); } sock.Close(); } } 2.5.SdngThreadtrongcácngdngmng 39
  40. Mtskháinim ðanhim(Multitasking):Làkhnănghñiêuhànhlàmnhiucôngvictimtthi ñim Tintrình(Process):Khichymtngdng,hñiuhànhscpphátriêngchong dngñóbnhvàcáctàinguyênkhác.Bnhvàtàinguyênvtlýriêngbitnày ñưcgilàmttintrình.Cáctàinguyênvàbnhcamttintrìnhthìchtin trìnhñóñưcphéptruycp. Tuyn(Thread):Tronghthng,mttintrìnhcóthcómthocnhiuchuithc hintáchbitnhauvàcóthchyñngthi.Michuithchinnàyñưcgilàmt tuyn(Thread).Trongmtngdng,ThreadkhitoñutiêngilàThreadsơcp hayThreadchính. 2.5.1.SdngThreadtrongchươngtrình.Net ðsdngThreadtrong.NettasdngNameSpaceSystem.Threading Mtsphươngthcthưngdùng PublicMethod Môt Name Abort() KtthúcThread Join() Bucchươngtrìnhphichchothreadktthúc(Block)thìmithchin tip(cáccâulnhñngsauJoin). Resume() Tiptcchythreadñãbtmngưngsuspended. Sleep() Staticmethod:Tmdngthreadtrongmtkhongthigian. Start() Btñuchy(khiñng)mtthread.Saukhigiphươngthcnày,trng tháicathreadchuynttrngtháihinhànhsangRunning. Suspend() Tmngưng(ngh)thread.(Phươngthcnàyñãbloikhiphiênbn VS.NET2005) Mtsthuctínhthưngdùng: PublicProperty Môt Name CurrentThread Thisstaticproperty:Trvthreadhinhànhñangchy. IsAlive Trvgiátrchobittrngtháithcthicathreadhinhành. IsBackground Setsorgetsgiátrchobitlàthreadlàbackgroundhayforeground thread. IsThreadPoolThread Getsavalueindicatingwhetherathreadispartofathreadpool. Priority Setsorgetsgiátrñchñnhñưutiên(dànhnhiuhayítCPUcho thread).Caonhtlà4,thpnhtlà0. 40
  41. PublicProperty Môt Name ThreadState Lyvtrngtháicathread(ñangdng,hayñangchy ) TomttuyntrongC# ThreadnewThread=newThread(newThreadStart(newMethod)); . } voidnewMethod(){ ... } 2.5.2. SdngThreadtrongcácchươngtrìnhServer ðatuyênhayñưcngdngtrongcácchươngtrìnhServer,cácchươngtrình ñòihitimtthiñimchpnhnnhiuktniñntcácClient. ðcácchươngtrìnhServercóthxlýnhiuClienttimtthiñimtacó môhìnhngdngñatuynnhưsau: SauñâychúngtavitlichươngtrìnhDateTimeServercósdngThreadnhưsau: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Threading; usingSystem.IO; classProgram{ staticvoidMain(string[]args){ IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),2009); TcpListenerserver=newTcpListener(iep); server.Start(); while(true){ 41
  42. //chapnhanketnoi TcpClientclient=server.AcceptTcpClient(); //TaoratuyenmoidexulymoiClient newClientThread(client); } server.Stop(); } } classClientThread{ privateThreadtuyen; privateTcpClientclient; publicClientThread(TcpClientclient){ this.client=client; tuyen=newThread(newThreadStart(GuiNhanDL)); tuyen.Start(); } privatevoidGuiNhanDL(){ StreamReadersr=newStreamReader(client.GetStream()); StreamWritersw=newStreamWriter(client.GetStream()); stringkq=""; while(true) { strings=sr.ReadLine(); s=s.ToUpper(); if(s.Equals("QUIT"))break; if(s.Equals("GETDATE")) kq=DateTime.Now.ToString("dd/MM/yyyy"); else if(s.Equals("GETTIME")) kq=DateTime.Now.ToString("hh:mm:ss"); else kq="Khonghieulenh"; sw.WriteLine(kq); sw.Flush(); } client.Close(); } } 2.5.3.SdngThreadñgi/nhndliu ngdngñatuyntrongvicginhndliuchúngtavitchươngtrìnhChat theogiaothcTCPnhưsau: 42
  43. ngdngmôhìnhxlýskincaWindowsvàñatuynvàSocketkhông ñngbtachcnvitmtchươngtrìnhsauñódchra,tachyngdngnhnListen nóslngnghetrongvaitròServercònkhitachyvànhnConnectnósñóngvai tròClientvàktnitiServer. Vănbnchươngtrìnhnhưsau: usingSystem; usingSystem.Drawing; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; usingSystem.Threading; 43
  44. usingSystem.Windows.Forms; classTcpChat:Form { privatestaticTextBoxnewText; privatestaticListBoxresults; privatestaticSocketclient; privatestaticbyte[]data=newbyte[1024]; publicTcpChat() { Text="TCPChatProgram"; Size=newSize(400,380); Labellabel1=newLabel(); label1.Parent=this; label1.Text="Entertextstring:"; label1.AutoSize=true; label1.Location=newPoint(10,30); newText=newTextBox(); newText.Parent=this; newText.Size=newSize(200,2*Font.Height); newText.Location=newPoint(10,55); results=newListBox(); results.Parent=this; results.Location=newPoint(10,85); results.Size=newSize(360,18*Font.Height); Buttonsendit=newButton(); sendit.Parent=this; sendit.Text="Send"; sendit.Location=newPoint(220,52); sendit.Size=newSize(5*Font.Height,2*Font.Height); sendit.Click+=newEventHandler(ButtonSendOnClick); Buttonconnect=newButton(); connect.Parent=this; connect.Text="Connect"; connect.Location=newPoint(295,20); connect.Size=newSize(6*Font.Height,2*Font.Height); connect.Click+=newEventHandler(ButtonConnectOnClick); Buttonlisten=newButton(); listen.Parent=this; listen.Text="Listen"; listen.Location=newPoint(295,52); listen.Size=newSize(6*Font.Height,2*Font.Height); listen.Click+=newEventHandler(ButtonListenOnClick); } voidButtonListenOnClick(objectobj,EventArgsea) { results.Items.Add("Listeningforaclient "); Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 44
  45. IPEndPointiep=newIPEndPoint(IPAddress.Any,9050); newsock.Bind(iep); newsock.Listen(5); newsock.BeginAccept(newAsyncCallback(AcceptConn),newsock); } voidButtonConnectOnClick(objectobj,EventArgsea) { results.Items.Add("Connecting "); client=newSocket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); IPEndPointiep=newIPEndPoint(IPAddress.Parse("127.0.0.1"),9050); client.BeginConnect(iep,newAsyncCallback(Connected),client); } voidButtonSendOnClick(objectobj,EventArgsea) { byte[]message=Encoding.ASCII.GetBytes(newText.Text); newText.Clear(); client.BeginSend(message,0,message.Length,0, newAsyncCallback(SendData),client); } voidAcceptConn(IAsyncResultiar) { Socketoldserver=(Socket)iar.AsyncState; client=oldserver.EndAccept(iar); results.Items.Add("Connectionfrom:"+client.RemoteEndPoint.ToString()); Threadreceiver=newThread(newThreadStart(ReceiveData)); receiver.Start(); } voidConnected(IAsyncResultiar) { try { client.EndConnect(iar); results.Items.Add("Connectedto:"+client.RemoteEndPoint.ToString()); Threadreceiver=newThread(newThreadStart(ReceiveData)); receiver.Start(); }catch(SocketException) { results.Items.Add("Errorconnecting"); } } voidSendData(IAsyncResultiar) { Socketremote=(Socket)iar.AsyncState; intsent=remote.EndSend(iar); } voidReceiveData() { intrecv; 45
  46. stringstringData; while(true) { recv=client.Receive(data); stringData=Encoding.ASCII.GetString(data,0,recv); if(stringData=="bye") break; results.Items.Add(stringData); } stringData="bye"; byte[]message=Encoding.ASCII.GetBytes(stringData); client.Send(message); client.Close(); results.Items.Add("Connectionstopped"); return; } publicstaticvoidMain() { Application.Run(newTcpChat()); } } 2.5.4.SdngThreadPooltrongcácchươngtrình.Net Method Description BindHandle() Bindsanoperatingsystemhandletothe threadpool GetAvailableThreads() Getsthenumberofworkerthreads availableforuseinthethreadpool GetMaxThreads() Getsthemaximumnumberofworker threadsavailableinthethreadpool QueueUserWorkItem() Queuesauserdelegatetothethread pool RegisterWaitForSingleObject() Registersadelegatewaitingfora WaitHandleobject UnsafeQueueUserWorkItem() Queuesanunsafeuserdelegatetothe threadpoolbutdoesnotpropagatethe callingstackontotheworkerthread UnsafeRegisterWaitForSingleObject() Registersanunsafedelegatewaitingfor aWaitHandleobject using System; using System.Threading; class ThreadPoolSample { 46
  47. public static void Main() { ThreadPoolSample tps = new ThreadPoolSample(); } public ThreadPoolSample() { int i; ThreadPool.QueueUserWorkItem(new WaitCallback(Counter)); ThreadPool.QueueUserWorkItem(new WaitCallback(Counter2)); for(i = 0; i < 10; i++) { Console.WriteLine("main: {0}", i); Thread.Sleep(1000); } } void Counter(object state) { int i; for (i = 0; i < 10; i++) { Console.WriteLine(" thread: {0}", i); Thread.Sleep(2000); } } void Counter2(object state) { int i; for (i = 0; i < 10; i++) { Console.WriteLine(" thread2: {0}", i); Thread.Sleep(3000); } } } 2.5.5.SdngThreadPooltrongcácchươngtrìnhServer using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; class ThreadPoolTcpSrvr { private TcpListener client; public ThreadPoolTcpSrvr() { client = new TcpListener(9050); client.Start(); Console.WriteLine("Waiting for clients "); while(true) { while (!client.Pending()) { Thread.Sleep(1000); } ConnectionThread newconnection = new ConnectionThread(); newconnection.threadListener = this.client; ThreadPool.QueueUserWorkItem(new WaitCallback(newconnection.HandleConnection)); } } public static void Main() { ThreadPoolTcpSrvr tpts = new ThreadPoolTcpSrvr(); 47
  48. } } class ConnectionThread { public TcpListener threadListener; private static int connections = 0; public void HandleConnection(object state) { int recv; byte[] data = new byte[1024]; TcpClient client = threadListener.AcceptTcpClient(); NetworkStream ns = client.GetStream(); connections++; Console.WriteLine("New client accepted: {0} active connections", connections); string welcome = "Welcome to my test server"; data = Encoding.ASCII.GetBytes(welcome); ns.Write(data, 0, data.Length); while(true) { data = new byte[1024]; recv = ns.Read(data, 0, data.Length); if (recv == 0) break; ns.Write(data, 0, recv); } ns.Close(); client.Close(); connections—; Console.WriteLine("Client disconnected: {0} active connections", connections); } } 2.6.KthutIPMulticasting 2.6.1.Broadcastinglàgì? Broadcast,tingVitgilàqungbá.Tronghthngmnghutuyn,qungbálà thutngdùngñchvicgimtgóithôngtinñnttcácnútmngtrongmng.ð thchinhìnhthcqungbá,ñachñncagóitinslàñachqungbá. Cóhailoilà:LocalBroadcastvàGlobalBroadcast 2.6.2.SdngBroadcastingñgidliuñnnhiumáytrongmngccb GigóidliuBroadcast usingSystem; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.Text; classBadBroadcast{ publicstaticvoidMain(){ Socketsock=newSocket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); IPEndPointiep=newIPEndPoint(IPAddress.Broadcast,9050); byte[]data=Encoding.ASCII.GetBytes("Thisisatestmessage"); sock.SendTo(data,iep); sock.Close(); } 48
  49. } Chúngtaphithitlpnhưsau: classBroadcst{ publicstaticvoidMain(){ Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPointiep1=newIPEndPoint(IPAddress.Broadcast,9050); IPEndPointiep2=newIPEndPoint(IPAddress.Parse("192.168.1.255"),9050); stringhostname=Dns.GetHostName(); byte[]data=Encoding.ASCII.GetBytes(hostname); sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast,1); sock.SendTo(data,iep1); sock.SendTo(data,iep2); sock.Close(); } } NhngóidliuBroadcast classRecvBroadcst{ publicstaticvoidMain(){ Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPointiep=newIPEndPoint(IPAddress.Any,9050); sock.Bind(iep);EndPointep=(EndPoint)iep; Console.WriteLine("Readytoreceive ");byte[]data=newbyte[1024]; intrecv=sock.ReceiveFrom(data,refep); stringstringData=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("received:{0}from:{1}",stringData,ep.ToString()); data=newbyte[1024];recv=sock.ReceiveFrom(data,refep); stringData=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("received:{0}from:{1}",stringData,ep.ToString()); sock.Close(); } } 2.6.3.Multicastinglàgì? Mtñachmulticastchophépthitbgidliutimttpxácñnhtrưccáchost, ñưcbitñnnhưcácnhómmulticast,trongcácmngconkhácnhau. MtsñachMulticast ðachmulticast Chcnăng 224.0.0.0 ðachcơs 224.0.0.1 Ttccáchthngtrênmngconnày 224.0.0.2 TtccácRoutertrênmngconnày 49
  50. 224.0.0.5 CácDRtrongOSPF 224.0.1.9 NhómñachRIPv2 224.0.1.24 NhómñachWINSserver Có2kthutMulticastñưcsdng +PeertoPeer +CentralServer 2.6.4.SocketMulticastingtrong.Net  SdngphươngthcSetSocketOption() 50
  51.  Socketoptioncóthñưcsdngñ  ThêmmtSocketvàonhómMulticast  LoimtSocketkhinhómMulticast  SetSocketOption(SocketOptionLevel,SocketOptionName,optionValue)  SocketOptionName  AddMembership  DropMembership  SdngphươngthcSetSocketOption()  Socketoptioncóthñưcsdngñ  optionValuelàmtñitưngcalpMulticastOption MulticastOption(IPAddress)MulticastOption(IPAddress,IPAddress)  VídthêmmtSocketvàonhómMulticast224.100.0.1 sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,new MulticastOption(IPAddress.Parse("224.100.0.1")); GidliuMulticast classMultiSend{ publicstaticvoidMain(){ Socketserver=newSocket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); IPEndPointiep=new IPEndPoint(IPAddress.Parse("224.100.0.1"),9050); byte[]data=Encoding.ASCII.GetBytes("Thisisatestmessage"); server.SendTo(data,iep); server.Close(); } } NhndliuMulticast classMultiRecv{ publicstaticvoidMain(){ Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); Console.WriteLine("Readytoreceive "); IPEndPointiep=newIPEndPoint(IPAddress.Any,9050); EndPointep=(EndPoint)iep; sock.Bind(iep); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, newMulticastOption(IPAddress.Parse("224.100.0.1"))); byte[]data=newbyte[1024]; intrecv=sock.ReceiveFrom(data,refep); stringstringData=Encoding.ASCII.GetString(data,0,recv); Console.WriteLine("received:{0}from:{1}",stringData,ep.ToString()); sock.Close(); } } 51
  52. GidliuMulticastviTTL classNewMultiSend{ publicstaticvoidMain(){ Socketserver=newSocket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); IPEndPointiep=newIPEndPoint(IPAddress.Any,9051); IPEndPointiep2=newIPEndPoint(IPAddress.Parse("224.100.0.1"),9050); server.Bind(iep); byte[]data=Encoding.ASCII.GetBytes("Thisisatestmessage"); server.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, newMulticastOption(IPAddress.Parse("224.100.0.1"))); server.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive,50); server.SendTo(data,iep2); server.Close(); } }  MulticastvilpUdpClient  JoinMulticastGroup()  DropMulticastGroup()  JoinMulticastGroup()làphươngthcoverload  JoinMulticastGroup(IPAddress)  JoinMulticastGroup(IPAddress,int) classUdpClientMultiSend{ publicstaticvoidMain(){ UdpClientsock=newUdpClient(); IPEndPointiep=newIPEndPoint(IPAddress.Parse("224.100.0.1"),9050); byte[]data=Encoding.ASCII.GetBytes("Thisisatestmessage"); sock.Send(data,data.Length,iep); sock.Close(); } } classUdpClientMultiRecv { publicstaticvoidMain() { UdpClientsock=newUdpClient(9050); Console.WriteLine("Readytoreceive "); sock.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"),50); IPEndPointiep=newIPEndPoint(IPAddress.Any,0); byte[]data=sock.Receive(refiep); stringstringData=Encoding.ASCII.GetString(data,0,data.Length); Console.WriteLine("received:{0}from:{1}",stringData,iep.ToString()); sock.Close(); } } 52
  53. 2.7Bàitpápdng classMulticastChat:Form{ TextBoxnewText; ListBoxresults; Socketsock; Threadreceiver; IPEndPointmultiep=newIPEndPoint(IPAddress.Parse("224.100.0.1"),9050); publicMulticastChat(){ Text="MulticastChatProgram"; Size=newSize(400,380); Labellabel1=newLabel(); label1.Parent=this; label1.Text="Entertextstring:"; label1.AutoSize=true; label1.Location=newPoint(10,30); newText=newTextBox(); newText.Parent=this; newText.Size=newSize(200,2*Font.Height); newText.Location=newPoint(10,55); results=newListBox(); results.Parent=this; results.Location=newPoint(10,85); results.Size=newSize(360,18*Font.Height); Buttonsendit=newButton(); sendit.Parent=this; sendit.Text="Send"; sendit.Location=newPoint(220,52); sendit.Size=newSize(5*Font.Height,2*Font.Height); sendit.Click+=newEventHandler(ButtonSendOnClick); Buttoncloseit=newButton(); closeit.Parent=this; closeit.Text="Close"; closeit.Location=newPoint(290,52); closeit.Size=newSize(5*Font.Height,2*Font.Height); closeit.Click+=newEventHandler(ButtonCloseOnClick); sock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPointiep=newIPEndPoint(IPAddress.Any,9050); sock.Bind(iep); sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, 53
  54. newMulticastOption(IPAddress.Parse("224.100.0.1"))); receiver=newThread(newThreadStart(packetReceive)); receiver.IsBackground=true; receiver.Start(); } voidButtonSendOnClick(objectobj,EventArgsea){ byte[]message=Encoding.ASCII.GetBytes(newText.Text); newText.Clear(); sock.SendTo(message,SocketFlags.None,multiep); } voidButtonCloseOnClick(objectobj,EventArgsea){ receiver.Abort(); sock.Close(); Close(); } voidpacketReceive(){ EndPointep=(EndPoint)multiep; byte[]data=newbyte[1024]; stringstringData; intrecv; while(true){ recv=sock.ReceiveFrom(data,refep); stringData=Encoding.ASCII.GetString(data,0,recv); results.Items.Add("from"+ep.ToString()+":"+stringData); } } publicstaticvoidMain(){ Application.Run(newMulticastChat()); } } 54
  55. CHƯƠNG3:XÂYDNGNGDNGMNG 3.1.GiaothcICMP GiithiugiaothcICMP(InternetworkControlMessageProtocol) GiaothcICMPhotñngtrênlayer2InternetworktrongmôhìnhTCP/IPhoc layer3NetworktrongmôhìnhOSI ChophépkimtravàxácñnhlicaLayer3InternetworktrongmôhìnhTCP/IP bngcáchñnhnghĩaracácloithôngñipcóthsdngñxácñnhxemmnghin ticóthtruynñưcgóitinhaykhông. Trongthct,ICMPcncácthànhphncamigóitinIPñcóthhotñngñưc. CutrúccagóitinIPvàICMP +Type:cóthlàmtqueryhaymtli +Code:Xácñnhñâylàloiqueryhaythôngñipli +Checksum:KimtravàsalichodliuICMP +Message:TuỳthucvàoTypevàCode 3.1.1.SdngRawSocket GóitinICMPkhôngsdngTCPhocUDPnênchúngtakhôngthsdngcáclp ñưchtrnhưTcpClienthayUdpClientmàphisdngmtRawSocket Mun to Raw Socket khi to ra Socket bn s dng SocketType.Raw, giao thc ICMP ToRawSocketnhưsau Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); RawSocketFormat Value Description Ggp GatewaytoGatewayProtocol Icmp InternetControlMessageProtocol 55
  56. Idp IDPProtocol Igmp InternetGroupManagementProtocol IP ArawIPpacket Ipx NovellIPXProtocol ND NetDiskProtocol Pup XeroxPARCUniversalProtocol(PUP) Raw ArawIPpacket Spx NovellSPXProtocol SpxII NovellSPXVersion2Protocol Unknown Anunknownprotocol Unspecified Anunspecifiedprotocol  GigóidliuRaw  ICMPlàgiaothckhônghưngktni  SdngphươngthcSendTo()calpSocketñgi  CngtronggiaothcICMPkhôngquantrng IPEndPointiep=newIPEndPoint(IPAddress.Parse("192.168.1.2"),0); sock.SendTo(packet,iep);  NhngóidliuRaw  SdngphươngthcReceiveFormcalpSocket  DliunhnvlàmtgóitinIPchúngtaphitáchrañlygóitinICMP RawSocketkhôngtñngñnhdnggóitinICMPchochúngta.Chúngtaphitlàm DataVariable Size Type Type 1byte Byte Code 1byte Byte Checksum 2bytes Unsigned16bitinteger Message multibyte Bytearray ðnhnghĩalpvàphươngthckhitomcñnh classICMP{ publicbyteType; publicbyteCode; publicUInt16Checksum; publicintMessagesize; publicbyte[]Message=newbyte[1024]; publicICMP(){ } }  ToragóitinICMP ICMPpacket=newICMP(); 56
  57. packet.Type=0x08; packet.Code=0x00; packet.Checksum=0; publicICMP(byte[]data,intsize){ Type=data[20]; Code=data[21]; Checksum=BitConverter.ToUInt16(data,22); MessageSize=size24; Buffer.BlockCopy(data,24,Message,0,MessageSize); } publicbyte[]getBytes(){ byte[]data=newbyte[MessageSize+9]; 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); returndata; } publicUInt16getChecksum(){ UInt32chcksm=0; byte[]data=getBytes(); intpacketsize=MessageSize+8; intindex=0; while(index >16)+(chcksm&0xffff); chcksm+=(chcksm>>16); return(UInt16)(~chcksm); } 3.1.2.SdnggiaothcICMPvàRawSocketñxâydngchươngtrìnhPing 57
  58. classProgram{ staticvoidMain(string[]args){ byte[]data=newbyte[1024]; intrecv; Sockethost=newSocket(AddressFamily.InterNetwork,SocketType.Raw, ProtocolType.Icmp); IPEndPointiep=newIPEndPoint(IPAddress.Parse(argv[0]),0); EndPointep=(EndPoint)iep; ICMPpacket=newICMP(); packet.Type=0x08; packet.Code=0x00; packet.Checksum=0; Buffer.BlockCopy(BitConverter.GetBytes((short)1),0,packet.Message,0,2); Buffer.BlockCopy(BitConverter.GetBytes((short)1),0,packet.Message,2,2); data=Encoding.ASCII.GetBytes("testpacket"); Buffer.BlockCopy(data,0,packet.Message,4,data.Length); packet.MessageSize=data.Length+4; intpacketsize=packet.MessageSize+4; UInt16chcksum=packet.getChecksum(); packet.Checksum=chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout,3000); host.SendTo(packet.getBytes(),packetsize,SocketFlags.None,iep); try{ data=newbyte[1024]; recv=host.ReceiveFrom(data,refep); }catch(SocketException){ Console.WriteLine("Noresponsefromremotehost"); return; } ICMPresponse=newICMP(data,recv); Console.WriteLine("responsefrom:{0}",ep.ToString()); Console.WriteLine("Type{0}",response.Type); Console.WriteLine("Code:{0}",response.Code); intIdentifier=BitConverter.ToInt16(response.Message,0); 58
  59. intSequence=BitConverter.ToInt16(response.Message,2); Console.WriteLine("Identifier:{0}",Identifier); Console.WriteLine("Sequence:{0}",Sequence); stringstringData=Encoding.ASCII.GetString(response.Message,4, response.MessageSize4); Console.WriteLine("data:{0}",stringData); host.Close(); } } 3.1.3.SdnggiaothcICMPvàRawSocketñxâydngchươngtrình TraceRoute classTraceRoute{ publicstaticvoidMain(string[]argv){ byte[]data=newbyte[1024]; intrecv,timestart,timestop; Sockethost=newSocket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.Icmp); IPHostEntryiphe=Dns.Resolve(argv[0]); IPEndPointiep=newIPEndPoint(iphe.AddressList[0],0); EndPointep=(EndPoint)iep; ICMPpacket=newICMP(); 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("testpacket"); Buffer.BlockCopy(data,0,packet.Message,4,data.Length); packet.MessageSize=data.Length+4; intpacketsize=packet.MessageSize+4; UInt16chcksum=packet.getCchecksum(); packet.Checksum=chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout,3000); intbadcount=0; for(inti=1;i<50;i++){ host.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive,i); timestart=Environment.TickCount; host.SendTo(packet.getBytes(),packetsize,SocketFlags.None,iep); try{ data=newbyte[1024]; recv=host.ReceiveFrom(data,refep); timestop=Environment.TickCount; ICMPresponse=newICMP(data,recv); if(response.Type==11) Console.WriteLine("hop{0}:responsefrom{1},{2}ms", i,ep.ToString(),timestoptimestart); if(response.Type==0){ Console.WriteLine("{0}reachedin{1}hops,{2}ms.", ep.ToString(),i,timestoptimestart); break; 59
  60. } badcount=0; }catch(SocketException){ Console.WriteLine("hop{0}:Noresponsefromremotehost",i); badcount++; if(badcount==5){ Console.WriteLine("Unabletocontactremotehost"); break; } } } host.Close(); } } 3.2.GiaothcSMTP,POP3 3.2.1.CơbnvhthngMailvàgiaothcSMTP,POP3 60
  61. *GiaothcSMTP MtslnhcơbncagiaothcSMTP: Lnh Môt HELO Hello.Sdngñxácñnhngưigiñin.Lnhnàynàyñi kèmvitêncahostgiñin.TrongESTMP(extended protocol),thìlnhnàyslàEHLO. MAIL Khitomtgiaodchgithư.Nókthp"from"ñxácñnh ngưigithư. RCPT Xácñnhngưinhnthư. DATA Thôngbáobtñunidungthcscabcñin(phnthân cathư).Dliuñưcmãthànhdngmã128bitASCIIvànó ñưcktthúcvimtdòngñơnchaduchm(.). RSET Hubgiaodchthư VRFY Sdngñxácthcngưinhnthư. NOOP Nólàlnh"nooperation"xácñnhkhôngthchinhành ñnggì QUIT Thoátkhitintrìnhñktthúc SEND Chohostnhnbitrngthưcònphigiñnñucuikhác. MtslnhkhôngyêucuphicóñưcxácñnhbngRFC821 SOML Sendormail.Báovihostnhnthưrngthưphi giñnñucuikháchochpthư. SAML Sendandmail.Nóivihostnhnrngbcñin phigitingưidùngñucuivàhpthư. EXPN Sdngmrngchomtmailinglist. HELP Yêucuthôngtingiúpñtñunhnthư. TURN Yêucuñhostnhngivaitròlàhostgithư. MãtrngtháicaSMTP KhimtMTAgimtlnhSMTPtiMTAnhnthìMTAnhnstrlivi mtmãtrngtháiñchongưigibitñangcóvicgìxyrañunhn.Vàdưiñây làbngmãtrngtháicaSMTPtheotiêuchunRFC821.Mcñcatrngtháiñưc 61
  62. xácñnhbisñutiêncamã(5xxlàlinng,4xxlàlitmthi,1xx–3xxlàhot ñngbìnhthưng). MtsmãtrngtháicaSMTP 211Tìnhtrnghthng,hayreplygiúpñhthng 214Thôngñipgiúpñ. 220 dchvsnsàng 221 dchvñóngkênhgiaochuyn 250HànhñngmailyêucuOK,hoànthành 251Userkhôngccb;shưngñn 354Khiñngvicnhpmail;ktthúcvi . 421 dchvkhôngsdngñưc,ñóngkênhgiaochuyn 450Khônglyhànhñngmailyêucu;mailboxkhônghiulc 451Khôngnhnhànhñngñưcyêucu;lưutrcahthng khôngñ. 500Licúpháp;khôngchpnhnlnh 501Licúpháptrongthamshayñis 502 Lnhkhôngñưccungcp 503 Dònglnhsai 504Thamscadònglnhkhôngñưccungcp 550Khôngnhnhànhñngñưcyêucu;mailboxkhônghiulc [nhưmailboxkhôngtìmthyhaykhôngtruycpñưc] 551Userkhôngccb;vuilòngth 552Bquahànhñngmàmailyêucu,vưtquáchñnhlưutr 554Khôngnhnhànhñngñưcyêucu;tênmailboxkhôngñưc chpnhn.[nhưsaicúphápmailbox]giaochuynsai. ðnhdngcamtbcthưthôngthưngkhôngcóphnñínhkèmnhưsau: *GiaothcPOP3 Giaothcdùngñlythư,POP3Serverlngnghetrêncng110,môttrong RFC1939 62
  63. MtslnhcaPOP3 USERXácñnhusername PASS Xácñnhpassword STATYêucuvtrngtháicahpthưnhưslưngthưvàñlncathư LIST Hindanhsáchcathư RETRNhnthư DELEXoámtbcthưxácñnh NOOPKhônglàmgìc RSETKhôiphclinhưthưñãxoá(rollback) QUITThchinvicthayñivàthoátra 3.2.2.CàiñtSMTP,POP3Client/Server VitchươngtrìnhgiMailñơngintheogiaothcSMTP usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; usingSystem.Net.Sockets; usingSystem.IO; classProgram{ staticvoidMain(string[]args){ stringnguoigui,nguoinhan,tieude,body; stringdiachimaychu; intportmaychu; Console.Write("NhapdichuSMTPServer:"); diachimaychu=Console.ReadLine(); Console.Write("Nhapcongcuamaychu:"); portmaychu=int.Parse(Console.ReadLine()); Console.Write("Nhapdiachinguoigui:"); nguoigui=Console.ReadLine(); Console.Write("Nhapdiachinguoinhan:"); nguoinhan=Console.ReadLine(); Console.Write("Nhaptieudebucthu:"); tieude=Console.ReadLine(); Console.Write("Nhapnoidungbucthu:"); body=Console.ReadLine(); //TaoEndpoitcuamaychu IPEndPointiep=newIPEndPoint(IPAddress.Parse(diachimaychu),portmaychu); TcpClientclient=newTcpClient(); client.Connect(iep); stringData="Helo"; StreamReadersr=newStreamReader(client.GetStream()); StreamWritersw=newStreamWriter(client.GetStream()); sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); 63
  64. //Guidiachinguyoigui Data="MAILFROM: "; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Guidiachinguyoigui Data="RCPTTO: "; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Batdauguinoidungbucthu Data="Data"; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Guinoidungbucthu Data="SUBJECT:"+tieude+"\r\n"+body+"\r\n"+"."+"\r\n"; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); //Ngatketnoi Data="QUIT"; sw.WriteLine(Data); sw.Flush(); //DocthongbaotuServerguivevaxulyneucanthiet Console.WriteLine(sr.ReadLine()); sr.Close(); sw.Close(); client.Close(); Console.ReadLine(); } } 64
  65. VitchươngtrìnhlythưñơngintheogiaothcPOP3 usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.Drawing; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Threading; usingSystem.IO; usingSystem.Net; usingSystem.Net.Sockets; namespaceMyPop3{ publicpartialclassForm1:Form{ TcpClientpopclient; StreamReadersr; StreamWritersw; publicForm1(){ InitializeComponent(); CheckForIllegalCrossThreadCalls=false; 65
  66. } privatevoidbtLogin_Click(objectsender,EventArgse){ IPEndPointiep=newIPEndPoint(IPAddress.Parse(txtPOP.Text), int.Parse(txtPort.Text)); popclient=newTcpClient(); popclient.Connect(iep); sr=newStreamReader(popclient.GetStream()); sw=newStreamWriter(popclient.GetStream()); sr.ReadLine(); stringdata=""; data="User"+txtUser.Text; sw.WriteLine(data); sw.Flush(); sr.ReadLine(); data="PASS"+txtPass.Text; sw.WriteLine(data); sw.Flush(); sr.ReadLine(); data="LIST"; sw.WriteLine(data); sw.Flush(); lstHeader.Items.Clear(); strings=sr.ReadLine(); char[]ch={''}; string[]tam=s.Split(ch); //MessageBox.Show("sobucthula:"+tam[1]); while((s=sr.ReadLine())!="."){ lstHeader.Items.Add(s); } } privatevoidlstHeader_SelectedIndexChanged(objectsender,EventArgse){ inti=lstHeader.SelectedIndex+1; //Laybucthuvevatienhanhphantich stringdata="RETR"+i.ToString(); sw.WriteLine(data); sw.Flush(); strings; //MessageBox.Show(sr.ReadLine()); //Layphanheader while((s=sr.ReadLine().Trim())!=null){ //MessageBox.Show(s); if(s.Length==0)break; if(s.ToUpper().StartsWith("DATE")){ DateTimedt=DateTime.Parse(s.Substring(5,s.Length5)); txtDate.Text=dt.ToShortDateString()+""+dt.ToLongTimeString(); } if(s.ToUpper().StartsWith("FROM")) 66
  67. txtFrom.Text=s.Substring(5,s.Length5); if(s.ToUpper().StartsWith("TO")) txtTo.Text=s.Substring(3,s.Length3); if(s.ToUpper().StartsWith("SUBJECT")) txtSubject.Text=s.Substring(8,s.Length8); } //Layphanbody textBox4.Clear(); //MessageBox.Show("Laybody"); while(!sr.EndOfStream){ s=sr.ReadLine().Trim(); if(s.Equals("."))break; textBox4.Text+=s+"\r\n"; } //MessageBox.Show("Hetnoidungbucthu"); } } } 3.3.GiaothcHTTP 3.3.1.CơbnvgiaothcHTTP HTTP(HypertextTransferProtocol)giaothctruynsiêuvănbn.HTTPlà giaothctngngdngchoWeb.Nóhotñngtheomôhìnhclient/server. Client:browseryêucu,nhn,hinthcácñitưngWeb. Server:Webservergicácñitưng HaiphiênbncagiaothcHTTPhinñưcphbinlàHTTP1.0ñưcñct trongRFC1945vàHTTP1.1ñưcñcttrongRFC2068. HTTPlàgiaothc“khôngtrngthái”serverkhônglưulicácyêucucaclient. HTTPsdnggiaothcTCPcatnggiaovn.Cácbưctinhànhtkhiclientkt nitiserversauñógivànhnktqutservergivnhưsau: 67
  68. +clientkhitoktniTCP(tosocket)viserver,quacng80 +serverchpnhnktniTCPtclient +CácthôngñipHTTP(thôngñiptngngdng)ñưctraoñigiabrowser (HTTPclient)vàWebserver(HTTPserver) +ðóngktniTCP. ChúngtaxemmtvídvquátrìnhtraoñigiabrowservàWebservernhưsau: User nh p URL (baogmtext, www.someSchool.edu/someDepartment/home.index thamchiuti10 nhdngjpeg) 1a. HTTPclientkhitoktni TCPtiHTTPserver(tin trình)tiñach 1b. HTTPserverñich www.someSchool.edu.Cng www.someSchool.eduñi mcñnhlà80. ktniTCPcng80,chp nhnktni,thôngbáoli 2. HTTPclientgithôngñipyêu choclient. cu HTTP (bao gm URL) vào trong TCP connection 3. HTTP server nhn thông ñip yêu socket cu,lycácñitýngñýcyêucu gi vào trong thông ñip tr li, (someDepartment/home.index) gi thôngñipvàosocket 4. HTTPserverñóngktniTCP. 5. HTTP client nhn thông ñip tr li bao gm tp html, hin th html.Phân tích tp html file, tìm 10 jpeg ñi týngñýcthamchiu time 6.Cácbưct1ñn5ñưclp lichotngñitưngtrong 10ñitưngjpeg CóhaikiuthôngñipHTTPlàyêucu(Request)vàtrli(Response).Các thôngñipñưcñnhdngkiumãASCII. ðnhdngthôngñipyêucuHTTP 68
  69. Dòngyêucu (lnh GET,POST, GET /somedir/page.html HTTP/1.0 HEAD ) User-agent: Mozilla/4.0 Nhngdòngheader Accept: text/html, image/gif,image/jpeg Accept-language:fr (CR,LF) CR,LF,kíhiukt thúcthôngñip ðnhdngthôngñiptrliHTTP Dòngtrngthái (mãtrngthái) HTTP/1.0 200 OK Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modif ied: Mon, 22 Jun 1998 Nhngdòngheader Content-Length: 6821 Content-Type: text/html data data data data data dliu,e.g., tphtmlñýc yêucu 69
  70. QuátrìnhtraoñigiaBrowservàWebServercóthñưcminhhanhưhìnhsau: MãtrngtháitrongthôngñipHTTPResponse:ðưcghidòngñutiêntrongthông ñipresponsetservervclient. Mtsmãthưnggp: 200OK Yêucuthànhcông,cácñitưngñưcyêucuphnsauthôngñip. 301MovedPermanently ðitưngñưcyêucuñãñưcchuynvàñachmicañitưngñưcñt trongtrưngLocation: 400BadRequest Serverkhônghiuñưcthôngñipyêucu 404NotFound Tàiliuñưcyêucukhôngcótrongserver 505HTTPVersionNotSupported ServerkhônghtrversioncagiaothcHTTP. ðkimtracáclnhcaHTTPbênphíaClientchúngtacóththchinnhưsau: +TelnettiWebserver 70