2009-07-22-Giao Trinh Lap Trinh Mang Moi

Embed Size (px)

Citation preview

TRNG I HC LT KHOA CNG NGH THNG TIN

BI GING TM TT

LP TRNH MNGDnh cho sinh vin ngnh Cng Ngh Thng Tin (Lu hnh ni b)

Lt 2009

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LI NI U Gio trnh Lp trnh mng c bin son theo chng trnh o to h thng tn ch ca trng i Hc Lt. Mc ch bin son gio trnh nhm cung cp cho sinh vin ngnh Cng Ngh Thng Tin nhng kin thc v lp trnh mng. Tuy c rt nhiu c gng trong cng tc bin son nhng chc chn rng gio trnh ny cn nhiu thiu st. Chng ti xin trn trng tip thu tt c nhng kin ng gp ca cc ng nghip cng nh cc bn sinh vin, trong lnh vc ny hon thin gio trnh, phc v tt hn cho vic dy v hc tin hc ang ngy cng pht trin nc ta.

Khoa Cng Ngh Thng Tin Trng i Hc Lt

Trang 2

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

MC LCICHNG I: NHNG KIN THC C BN V LP TRNH MNG.............7 IITNG QUAN.................................................................................................................7IIITng Ethernet..........................................................................................................7 IVa ch Ethernet.......................................................................................................9 VEthernet Protocol Type...........................................................................................10 VIData payload ........................................................................................................11 VIIChecksum ............................................................................................................11

VIIITNG IP..............................................................................................................11IXTrng a ch........................................................................................................12 X Cc c phn on..................................................................................................12 XITrng Type of Service .........................................................................................13 XIITrng Protocol.....................................................................................................13

XIIITNG TCP..........................................................................................................14XIV TCP port..............................................................................................................15 XVC ch m bo tin cy truyn ti cc gi tin .................................................17 XVIQu trnh thnh lp mt phin lm vic TCP........................................................18

XVIITNG UDP.........................................................................................................19 XVIIICHNG II: LP TRNH SOCKET HNG KT NI.........................22 XIXSOCKET................................................................................................................22 XXIPADDRESS ............................................................................................................25 XXIIPENDPOINT ......................................................................................................26 XXIILP TRNH SOCKET HNG KT NI......................................................................26XXIIILp trnh pha Server ........................................................................................27 XXIVLp trnh pha Client..........................................................................................30 XXVVn vi b m d liu .................................................................................33 XXVIX l vi cc b m c kch thc nh.............................................................34 XXVIIVn vi cc thng ip TCP.........................................................................35 XXVIIIGii quyt cc vn vi thng ip TCP........................................................39XXVIII.1.1.1.S dng cc thng ip vi kch thc c nh.................................................40 XXVIII.1.1.2.Gi km kch thc thng ip cng vi thng ip ........................................45 XXVIII.1.1.3.S dng cc h thng nh du phn bit cc thng ip .........................51

XXIXS dng C# Stream vi TCP .............................................................................51XXIX.1.1.1.Lp NetworkStream............................................................................................51 XXIX.1.1.2.Lp StreamReader v StreamWriter...................................................................55

XXXCHNG III: LP TRNH SOCKET PHI KT NI..................................60 XXXITNG QUAN........................................................................................................60 XXXIILP TRNH PHA SERVER ...................................................................................61 XXXIIILP TRNH PHA CLIENT...................................................................................63Trang 3

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XXXIVS dng phng thc Connect() trong chng trnh UDP Client......................65 XXXVPhn bit cc thng ip UDP..........................................................................66

XXXVINGN CN MT D LIU ..................................................................................68 XXXVIINGN CN MT GI TIN..................................................................................71XXXVII.1.1.S dng Soket Time-out..........................................................................72

XXXVIIIIU KHIN VIC TRUYN LI CC GI TIN ....................................................74 XXXIXCHNG IV: S DNG CC LP HELPER CA C# SOCKET........80 XLLP TCP CLIENT...................................................................................................80 XLILP TCPLISTENER...............................................................................................83 XLIILP UDPCLIENT..................................................................................................86 XLIIICHNG V: A NHIM TIU TRNH......................................................90 XLIVKHI NIM TIN TRNH V TIU TRNH CA WINDOWS............................................90 XLVM HNH.............................................................................................................90 XLVICC K THUT TRONG .NET TO TIU TRNH ......................................................91XLVIITo tiu trnh trong Thread-pool.......................................................................91 XLVIIITo tiu trnh bt ng b ...............................................................................94XLVIII.1.1.1.Phng XLVIII.1.1.2.Phng XLVIII.1.1.3.Phng XLVIII.1.1.4.Phng XLVIII.1.1.5.Phng thc thc thc thc thc BlockingExample..........................................................................97 PollingExample.............................................................................98 WaitingExample...........................................................................99 WaitAllExample .........................................................................100 CallbackExample........................................................................101

XLIXThc thi phng thc bng Timer....................................................................103 LThc thi phng thc bng tiu trnh mi ...........................................................105 LIiu khin qu trnh thc thi ca mt tiu trnh...................................................107 LIINhn bit khi no mt tiu trnh kt thc............................................................111 LIII Khi chy mt tin trnh mi ............................................................................113 LIVKt thc mt tin trnh .....................................................................................114

LVTHC THI PHNG THC BNG CCH RA HIU I TNG WAITHANDLE ...................116 LVICHNG VI: NG B HA......................................................................117 LVIIL DO NG B HA...........................................................................................117 LVIIICC PHNG PHP NG B HA.......................................................................117 LIXPHNG PHP SEMAPHORE...................................................................................117 LXPHNG PHP DNG LP MONITOR.........................................................................119 LXISYSTEM.THREADING.WAITHANDLE, BAO GM AUTORESETEVENT, MANUALRESETEVENT ................................................................................................121 LXIIPHNG PHP MUTEX........................................................................................124 LXIIICHNG VII: LP TRNH SOCKET BT NG B..........................126 LXIVLP TRNH S KIN TRONG WINDOWS.................................................................126LXVS dng Event v Delegate...............................................................................127 LXVILp AsyncCallback trong lp trnh Windows.....................................................129

Trang 4

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXVIIS DNG SOCKET BT NG B .......................................................................129LXVIIIThnh lp kt ni ..........................................................................................130LXVIII.1.1.1.Phng thc BeginAccept() v EndAccept()....................................................130 LXVIII.1.1.2. Phng thc BeginConnect() v EndConnect()...............................................132

LXIXGi d liu .......................................................................................................133LXIX.1.1.1.Phng thc BeginSend() v phng thc EndSend().......................................133 LXIX.1.1.2.Phng thc BeginSendTo() v EndSendTo()....................................................134

LXXNhn d liu ....................................................................................................135LXX.1.1.1.Phng thc BeginReceive(), EndReceive, BeginReceiveFrom(), EndReceiveFrom().............................................................................................................135

LXXIChng trnh WinForm gi v nhn d liu gia Client v Server ...................135LXXI.1.1.1.Chng trnh Server.........................................................................................135 LXXI.1.1.2.M hnh chng trnh Server.............................................................................135 LXXI.1.1.3.Lp ServerProgram...........................................................................................136 LXXI.1.1.4.Lp ServerForm................................................................................................139

LXXIIChng trnh Client.........................................................................................140LXXII.1.1.1.M hnh chng trnh Client.............................................................................141 LXXII.1.1.2.Lp ClientProgram...........................................................................................142 LXXII.1.1.3.Lp ClientForm................................................................................................145

LXXIIILP TRNH SOCKET BT NG B S DNG TIU TRNH.....................................146LXXIVLp trnh s dng hng i gi v hng i nhn thng ip........................146 LXXVLp trnh ng dng nhiu Client .....................................................................152

LXXVICHNG VIII: LP TRNH VI CC GIAO THC..........................155 LXXVIILP TRNH VI GIAO THC ICMP................................................155LXXVIIIGiao thc ICMP.............................................................................................155LXXVIII.1.1.1.nh dng ca gi tin ICMP...........................................................................155 LXXVIII.1.1.2.Cc tng Type ca gi tin ICMP...................................................................156 LXXVIII.1.1.3.Echo Request and Echo Reply Packets.........................................................156 LXXVIII.1.1.4.Gi tin Destination Unreachable ..................................................................157 LXXVIII.1.1.5.Gi tin Time Exceeded .................................................................................157

LXXIXS dng Raw Socket......................................................................................158LXXIX.1.1.1.nh dng ca Raw Socket.............................................................................158 LXXIX.1.1.2.Gi cc gi tin Raw.........................................................................................159 LXXIX.1.1.3.Nhn cc gi tin Raw .....................................................................................159

LXXXTo ra mt lp ICMP .......................................................................................159 LXXXITo gi tin ICMP ..........................................................................................161 LXXXIITo phng thc Checksum .........................................................................161 LXXXIIILp ICMP hon chnh....................................................................................162 LXXXIVChng trnh ping n gin.........................................................................163 LXXXVChng trnh TraceRoute n gin...............................................................166

LXXXVILP TRNH VI GIAO THC SMTP...............................................167LXXXVIIC bn v Email..........................................................................................167LXXXVII.1.1.1.Hot ng ca MTA.....................................................................................168 LXXXVII.1.1.2.Gi mail ra ngoi.........................................................................................168 LXXXVII.1.1.3.Nhn mail....................................................................................................169 LXXXVII.1.1.4.Hot ng ca MDA.....................................................................................170 LXXXVII.1.1.5.Hot ng ca MUA.....................................................................................171

LXXXVIIISMTP v Windows......................................................................................173LXXXVIII.1.1.1.Collaboration Data Objects (CDO)..............................................................173 LXXXVIII.1.1.2.Dch v mail SMTP......................................................................................173

Trang 5

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXXXIXLp SmtpMail...............................................................................................175 XCCc phng thc v thuc tnh ca lp SmtpMail...............................................175XC.1.1.1.S dng lp SmtpMail.........................................................................................176

Trang 6

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

ICHNG

I: NHNG KIN THC C BN V LP TRNH MNG

IITng quan Internet Protocol (IP) l nn tng ca lp trnh mng. IP l phng tin truyn ti d liu gia cc h thng bt k l h thng mng cc b (LAN) hay h thng mng din rng (WAN). Mc d lp trnh vin mng c th chn cc giao thc khc lp trnh nhng IP cung cp cc k thut mnh nht gi d liu gia cc thit b, c bit l thng qua mng Internet. hiu r cc khi nim bn di lp trnh mng, chng ta phi hiu r giao thc IP, hiu cch n chuyn d liu gia cc thit b mng. Lp trnh mng dng giao thc IP thng rt phc tp. C nhiu yu t cn quan tm lin quan n cch d liu c gi qua mng: s lng Client v Server, kiu mng, tc nghn mng, li mng, Bi v cc yu t ny nh hng n vic truyn d liu t thit b ny n thit b khc trn mng do vic hiu r chng l vn rt quan trng lp trnh mng c thnh cng. Mt gi d liu mng gm nhiu tng thng tin. Mi tng thng tin cha mt dy cc byte c sp t theo mt trt t c nh sn. Hu ht cc gi d liu dng trong lp trnh mng u cha ba tng thng tin cng vi d liu c dng truyn ti gia cc thit b mng. Hnh sau m t h thng th bc ca mt gi IP:

Hnh I.1:

Cc tng giao thc mng trong cc gi d liu

IIITng Ethernet Tng u tin ca gi d liu mng c gi l Ethernet Header, trong tng ny c ba gi giao thc Ethernet: Ethernet 802.2, Ethernet 802.3, v Ethernet phin bn 2. Cc giao thc Ethernet 802.2 v Ethernet 802.3 l cc giao thc chun ca IEEE. Ethernet phin bn 2 tuy khng phi l giao thc chun nhng n c s dng rng

Trang 7

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

ri trong mng Ethernet. Hu ht cc thit b mng k c h iu hnh Windows mc nh dng giao thc Ethernet phin bn 2 truyn ti cc gi IP.

Hnh I.2:

Ethernet Header

Phn u ca Ethernet phin bn 2 l a ch MAC (Media Access Card) dng xc nh cc thit b trn mng cng vi s giao thc Ethernet xc nh giao thc tng tip theo cha trong gi Ethernet. Mi gi Ethernet bao gm: 6 byte a ch MAC ch

Trang 8

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

6 byte a ch MAC ngun 2 byte xc nh giao thc tng k tip Data payload t 46 n 1500 byte

4-byte checksum IVa ch Ethernet a ch Ethernet (a ch MAC) l a ch ca cc thit b, a ch ny c gn bi cc nh sn xut thit b mng v n khng thay i c. Mi thit b trn mng Ethernet phi c 1 a ch MAC duy nht. a ch MAC gm 2 phn:

3 byte xc nh nh sn xut 3 byte xc nh s serial duy nht ca nh sn xut Gin a ch Ethernet cho php cc a ch broadcast v multicast. i vi

a ch broadcast th tt c cc bit ca a ch ch c gn bng 1 (FFFFFFFFFFFF). Mi thit b mng s chp nhn cc gi c a ch broadcast. a ch ny hu ch cho cc giao thc phi gi cc gi truy vn n tt c cc thit b mng. a ch multicast cng l mt loi a ch c bit ca a ch Ethernet, cc a ch multicast ch cho php mt s cc thit b chp nhn gi tin. Mt s a ch Ethernet multicast: a Ch 01-80-C2-00-00-00 09-00-09-00-00-01 09-00-09-00-00-01 09-00-09-00-00-04 09-00-2B-00-00-00 09-00-2B-00-00-01 09-00-2B-00-00-02 09-00-2B-00-00-03 09-00-2B-00-00-04 09-00-2B-00-00-05 09-00-2B-00-00-06 09-00-2B-00-00-07 09-00-2B-00-00-0F 09-00-2B-00-00-1x 09-00-2B-01-00-00 M T Spanning tree (for bridges) HP Probe HP Probe HP DTC DEC MUMPS DEC DSM/DTP DEC VAXELN DEC Lanbridge Traffic Monitor (LTM) DEC MAP End System Hello DEC MAP Intermediate System Hello DEC CSMA/CD Encryption DEC NetBios Emulator DEC Local Area Transport (LAT) DEC Experimental DEC LanBridge Copy packets (all bridges)

Trang 9

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

a Ch 09-00-2B-02-00-00 09-00-2B-02-01-00 09-00-2B-02-01-01 09-00-2B-02-01-02 09-00-2B-03-xx-xx 09-00-2B-04-00-00 09-00-2B-23-00-00 09-00-4E-00-00-02 09-00-77-00-00-01 09-00-7C-02-00-05 09-00-7C-05-00-01 0D-1E-15-BA-DD-06 CF-00-00-00-00-00 VEthernet Protocol Type

M T DEC DNA Lev. 2 Routing Layer Routers DEC DNA Naming Service Advertisement DEC DNA Naming Service Solicitation DEC DNA Time Service DEC default filtering by bridges DEC Local Area System Transport (LAST) DEC Argonaut Console Novell IPX Retix spanning tree bridges Vitalink diagnostics Vitalink gateway HP Ethernet Configuration Test protocol (Loopback)

Mt phn khc rt quan trng ca Ethernet Header l trng Protocol Type, trng ny c kch thc hai byte. S khc nhau gia gi tin Ethernet phin bn 2 v Ethernet 802.2 v 802.3 xy ra trng ny. Cc gi tin Ethernet 802.2 v 802.3 s dng trng ny cho bit kch thc ca mt gi tin Ethernet. Ethernet phin bn 2 dng trng ny nh ngha giao thc tng k tip trong gi tin Ethernet. Mt s gi tr ca trng ny: Gi Tr 0800 0806 0BAD 8005 8035 809B 80D5 8137 8138 814C 86DD Giao Thc IP ARP Banyan VINES HP Probe Reverse ARP AppleTalk IBM SNA Novell Novell Raw SNMP IPv6

Trang 10

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Gi Tr 876B VIData payload

Giao Thc TCP/IP compression

Data payload phi cha ti thiu 46 byte m bo gi Ethernet c chiu di ti thiu 64 byte. Nu phn data cha 46 byte th cc k t m c thm vo cho . Kch thc ca trng ny t 46 n 1500 byte. VIIChecksum Gi tr checksum cung cp c ch kim tra li cho d liu, kch thc ca trng ny l 4 byte . Nu gi tin b hng trong lc truyn, gi tr checksum s b tnh ton sai v gi tin c nh du l gi tin xu. VIIITng IP Tng IP nh ngha thm nhiu trng thng tin ca ca giao thc Ethernet

Hnh I.3:

Thng tin tng IP

Cc trng trong tng IP:Trang 11

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Trng Version Header Length Type of Service Total Length Identification Flags Fragment offset Time to Live (TTL) Protocol Header Checksum Source Address Destination Address Options IXTrng a ch

Bit 4 4 8 16 16 3 13 8 8 16 32 32

M T Phin bn IP header (phin bn hin ti l 4) Chiu di phn header ca gi IP Kiu cht lng dch v QoS (Quality of Service) Chiu di ca gi IP Gi tr ID duy nht xc nh cc gi IP Cho bit gi IP c b phn on hay khng hay cn cc phn on khc V tr ca phn on trong gi IP Thi gian ti a gi tin c php li trn mng (c tnh bng giy) Kiu giao thc ca tng d liu k tip Checksum ca d liu gi IP header a ch IP ca thit b gi a ch IP ca thit b nhn nh ngha cc c im ca gi IP trong tnglai

a ch Ethernet dng xc nh cc thit b trn mng LAN nhng n khng th dng xc nh a ch ca cc thit b trn mng xa. xc nh cc thit b trn cc mng khc nhau, a ch IP c dng. Mt a ch IP l mt s 32 bit v a ch IP c chia thnh 4 lp sau:Lp A Lp B Lp C Lp D 0.x.x.x127.x.x.x 128.x.x.x191.x.x.x 192.x.x.x223.x.x.x 224.x.x.x254.x.x.x

X Cc c phn on Mt trong nhng phc tp, rc ri ca gi IP l kch thc ca chng. Kch thc ti a ca gi IP c th ln n 65,536 byte. y l mt lng rt ln d liu cho mt gi tin. Thc t hu ht cc truyn ti d liu cp thp nh Ethernet khng th h tr mt gi IP ln (phn d liu ca Ethernet ch c th ti a 1500 byte). gii quyt vn ny, cc gi IP dng fragmentation (phn on) chia cc gi IP thnh cc phn nh hn truyn ti ti ch. Khi cc mnh c truyn ti ti ch,

Trang 12

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

phn mm ca thit b nhn phi c cch nhn ra cc phn on ca gi tin v rp chng li thnh thnh 1 gi IP. S phn on c thnh lp nh vo vic s dng 3 trng ca gi IP: fragmentation flags, fragment offset, v trng identification. C phn on bao gm ba c mt bit sau: C reserved: gi tr zero C Dont Fragment: cho bit gi IP khng b phn on

C More Fragment: cho bit gi tin b phn on v cn cc phn on khc na Trng IP Indentification xc nh duy nht nh danh mi gi IP. Tt c cc

phn on ca bt k gi IP no cng u c cng s indentification. S identification gip cho phn mm my nhn bit c cc phn on no thuc gi IP no v rp li cho ng. Trng fragment offset cho bit v tr ca phn on trong gi tin ban u. XITrng Type of Service Trng Type of Service xc nh kiu cht lng dch v QoS (Quality of Service) cho gi IP. Trng ny c dng nh du mt gi IP c mt u tin no chng hn nh c dng tng u tin ca cc d liu cn thi gian thc nh Video, Audio. Trong hu ht cc truyn ti mng, trng ny c c thit lp gi tr zero, cho bit y l d liu bnh thng, tuy nhin vi cc ng dng cn thi gian thc nh Video hay Audio th trng ny s c s dng tng u tin cho gi d liu. Trng ny gm tm bit v ngha cc bit nh sau: 3 bit c dng lm trng u tin 1 bit cho bit thi gian tr l bnh thng hay thp 1 bit cho bit thng lng bnh thng hay cao

1 bit cho bit tin cy bnh thng hay cao

2 bit c dng trong tng lai XIITrng Protocol

Trang 13

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

c dng xc nh giao thc tng tip theo trong gi IP, IANA nh ngha 135 gi tr cho trng ny c th dng trong gi IP nhng ch c mt s gi tr hay c dng trong bng sau: Gi Tr Giao Thc 1 Internet Control Message (ICMP) 2 Internet Group Message (IGP) 6 Transmission Control (TCP) 8 Exterior Gateway (EGP) 9 Interior Gateway (Cisco IGP) 17 User Datagram (UDP) 88 Cisco EIGRP Hai giao thc c dng nhiu nht trong lp trnh mng l TCP v UDP XIIITng TCP Giao thc TCP (Transmission Control Protocol) l giao thc hng kt ni, n cho php to ra kt ni im ti im gia hai thit b mng, thit lp mt ng nht qun truyn ti d liu. TCP m bo d liu s c chuyn ti thit b ch, nu d liu khng ti c thit b ch th thit b gi s nhn c thng bo li. Cc nh lp trnh mng phi hiu cch hot ng c bn ca TCP v c bit l phi hiu cch TCP truyn ti d liu gi cc thit b mng. Hnh sau cho thy nhng trng ca TCP Header. Nhng trng ny cha cc thng tin cn thit cho vic thc thi kt ni v truyn ti d liu mt cch tin tng.

Trang 14

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh I.4:

Cc trng ca TCP Header

Mi trng ca TCP Header kt hp vi mt chc nng c bit ca mt phin lm vic TCP. C mt s chc nng quan trng sau:

Source port v Destination port: theo di cc kt ni gia cc thit b ti li cc gi tin b mt

Sequence v Acknowledgement number: theo di th t cc gi tin v truyn Flag: m v ng kt ni gia cc thit b truyn ti d liu XIV TCP port TCP s dng cc port xc nh cc kt ni TCP trn mt thit b mng. lin lc vi mt ng dng chy trn mt thit b mng xa ta cn phi bit hai thng tin : a ch IP ca thit b xa TCP port c gn cho thit b xa

Trang 15

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

kt ni TCP c thnh lp, thit b xa phi chp nhn cc gi tin truyn n port c gn. Bi v c nhiu ng dng chy trn mt thit b s dng TCP do thit b phi cp pht cc cng khc nhau cho cc ng dng khc nhau.

Hnh I.5:

Kt ni TCP n gin

Trong hnh trn th thit b A ang chy hai ng dng Server, hai ng dng ny ang ch cc gi tin t Client. Mt ng dng c gn port 8000 v mt ng dng c gn port 9000. Thit b mng B mun kt ni n thit b mng A th n phi c gn mt TCP port cn trng t h iu hnh v port ny s c m trong sut phin lm vic. Cc port Client thng khng quan trng v c th gn bt k mt port no hp l trn thit b. T hp ca mt a ch IP v mt port l mt IP endpoint. Mt phin lm vic TCP c nh ngha l mt s kt hp ca mt IP endpoint cc b v mt IP endpoint xa. Mt ng dng mng c th s dng cng mt IP endpoint cc b nhng mi thit b xa phi s dng mt a ch IP hay port ring. IANA nh ngha mt danh sch cc port TCP tiu chun c gn cho cc ng dng c bit: Port 7 13 17 20 21 M T Echo Daytime Quote of the day FTP (data channel) FTP (control channel)Trang 16

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Port 22 23 25 37 80 110 119 123 137 138 143 389 443 993 995

M T SSH Telnet SMTP Time HTTP POP3 NNTP Network Time Protocol (NTP) NETBIOS name service NETBIOS datagram service Internet Message Access Protocol (IMAP) Lightweight Directory Access Protocol (LDAP) Secure HTTP (HTTPS) Secure IMAP Secure POP3 Cc port t 0->1023 c gn cho cc ng dng thng dng do vi cc ng

dng m cc lp trnh vin to ra th cc port c gn phi t 1024->65535. XVC ch m bo tin cy truyn ti cc gi tin Trng tip theo trong TCP Header sau port l s sequence v acknowledgement. Nhng gi tr ny cho php TCP theo di cc gi tin v m bo n c nhn theo ng th t. Nu bt k gi tin no b li, TCP s yu cu truyn ti li cc gi tin b li v rp chng li trc khi gi gi tin cho ng dng. Mi gi tin c mt s duy nht sequence cho mt phin lm vic TCP. Mt s ngu nhin c chn cho gi tin u tin c gi i trong phin lm vic. Mi gi tin tip theo c gi s tng s sequence bng s byte d liu TCP trong gi tin trc . iu ny m bo mi gi tin c xc nh duy nht trong lung d liu TCP. Thit b nhn s dng trng acknowledgement hi bo s sequence cui cng c nhn t thit b gi. Thit b nhn c th nhn nhiu gi tin trc khi gi li mt hi bo. S acknowledgement c tr v l s sequence cao nht lin sau ca d liu c nhn. K thut ny c gi l ca s trt. Cc gi tin c nhn ngoi thTrang 17

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

t c th c gi trong b m v c t vo ng th t khi cc gi tin khc c nhn thnh cng. Nu mt gi tin b mt, thit b nhn s thy c s sequence b li v gi mt s acknowledgement thp hn yu cu cc gi tin b li. Nu khng c ca s trt mi gi tin s phi hi bo li, lm tng bng thng v tr mng. XVIQu trnh thnh lp mt phin lm vic TCP Qu trnh lm thnh lp mt phin lm vic TCP c thc hin nh vo vic s dng cc c (Flag): Flag 6 bit dnh ring 1-bit URG flag 1-bit ACK flag 1-bit PUSH flag 1-bit RESET flag 1-bit SYN flag 1-bit FIN flag M T Dnh ring s dng trong tng lai, gi tr lun lun l zero nh du gi tin l d liu khn cp Hi bo nhn mt gi tin Cho bit d liu c y vo ng dng ngay lp tc Thit lp li tnh trng khi u kt ni TCP Bt u mt phin lm vic Kt thc mt phin lm vic

TCP s dng cc tnh trng kt ni quyt nh tnh trng kt ni gia cc thit b. Mt giao thc bt tay c bit c dng thnh lp nhng kt ni ny v theo di tnh trng kt ni trong sut phin lm vic. Mt phin lm vic TCP gm ba pha sau: M bt tay Duy tr phin lm vic ng bt tay Mi pha yu cu cc bit c c thit lp trong mt th t no . Qu trnh m bt tay thng c gi l ba ci bt tay v n yu cu ba bc thnh lp kt ni. Thit b gi gi c SYN cho bit bt u phin lm vic

Thit b nhn gi c c SYN v c ACK trong cng mt gi tin cho bit n chp nhn bt u phin lm vic

Trang 18

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Thit b gi gi c ACK cho bit phin lm vic m v sng sng cho vic gi v nhn cc gi tin. Sau khi phin lm vic c thnh lp, c ACK s c thit lp trong cc gi tin. ng phin lm vic, mt qu trnh bt tay khc c thc hin dng c FIN:

Thit b khi u ng kt ni gi c FIN nhn ng kt ni

Thit b bn kia gi c FIN v ACK trong cng mt gi tin cho bit n chp Thit b khi u ng kt ni gi c ACK ng kt ni

Hnh I.6:

Cc bc bt tay ca giao thc TCP

XVIITng UDP User Datagram Protocol (UDP) l mt giao thc ph bin khc c dng trong vic truyn ti d liu ca cc gi IP. Khng ging nh TCP, UDP l giao thc phi ni kt. Mi phin lm vic UDP khng g khc hn l truyn ti mt gi tin theo mt hng. Hnh sau s m t cu trc ca mt gi tin UDP

Trang 19

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh I.7:

UDP Header

UDP header gm nhng trng sau: Source Port Destination Port

Message Length

Checksum Next Level Protocol Cng ging nh TCP, UDP theo di cc kt ni bng cch s dng cc port t 1024->65536, cc port UDP t 0->1023 l cc port dnh ring cho cc ng dng ph bin, mt s dng ph bin nh: Port 53 69 111 137 138 M T Domain Name System Trivial File Transfer Protocol Remote Procedure Call NetBIOS name service NetBIOS datagramTrang 20

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Port 161

M T Simple Network Management Protocol

Trang 21

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XVIII

CHNG II: LP TRNH SOCKET HNG KT NI

XIXSocket Trong lp trnh mng dng Socket, chng ta khng trc tip truy cp vo cc thit b mng gi v nhn d liu. Thay v vy, mt file m t trung gian c to ra iu khin vic lp trnh. Cc file m t dng tham chiu n cc kt ni mng c gi l cc Socket. Socket nh ngha nhng c trng sau: Mt kt ni mng hay mt ng ng dn truyn ti d liu Mt kiu truyn thng nh stream hay datagram Mt giao thc nh TCP hay UDP Sau khi mt Socket c to ra n phi c gn vo mt a ch mng v mt port trn h thng cc b hay xa. Mt khi Socket c gn vo cc a ch mng v port, n c th c dng gi v nhn d liu trong mng. Trong .Net Framework lp Socket h tr cho vic lp trnh Socket. Phng thc to lp nh sau:Socket (AddressFamily, SocketType, ProtocolType)

Phng thc to lp ca lp Socket cn cc i s truyn vo sau: +AddressFamily: h a ch c dng, tham s ny c th c cc gi tr sau: AppleTalk Atm Banyan Ccitt Chaos Cluster DataKit DataLink DecNet Ecma a ch AppleTalk Native ATM services address. a ch Banyan a ch cho giao thc CCITT, nh l X25 a ch cho giao thc MIT CHAOS a ch cho cc sn phm cluster ca Microsoft a ch cho giao thc Datakit a ch ca giao thc tng data-link a ch DECnet a ch ECMA (European Computer ManufacturersTrang 22

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Association) FireFox HyperChannel Ieee12844 ImpLink InterNetwork InterNetworkV6 Ipx Irda Iso Lat Max NetBios a ch FireFox a ch NSC Hyperchannel a ch workgroup IEEE 1284.4 a ch ARPANET IMP a ch IP version 4 a ch IP version 6 a ch IPX hoc SPX a ch IrDA a ch cho giao thc ISO a ch LAT a ch MAX a ch NetBios

NetworkDesigners a ch Network Designers NS Osi Pup Sna Unix Unknown Unspecified VoiceView a ch Xerox NS a ch cho giao thc ISO a ch cho giao thc PUP a ch IBM SNA a ch Unix Cha bit h a ch Cha ch ra h a ch a ch VoiceView

+SocketType: kiu Socket, tham s ny c th c cc giao thc sau: Kiu Dgram M t c s dng trong cc giao thc phi kt ni, khng tin tng. Thng ip c th b mt, b trng lp hoc c th n sai th t. Dgram s dng giao thc UDP v h a ch InterNetwork. c s trong cc giao thc cp thp nh Internet Control Message Protocol (Icmp) v Internet Group Management Protocol (Igmp).Trang 23

Raw

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

ng dng phi cung cp IP header khi gi. Khi nhn s nhn c IP header v cc ty chn tng ng. Rdm c s dng trong cc giao thc phi kt ni, hng thng ip, truyn thng ip tin cy, v bin ca thng ip c bo v. Rdm (Reliably Delivered Messages) thng ip n khng b trng lp v ng th t. Hn na, thit b nhn c thit b nu thng ip b mt. Nu khi to Socket dng Rdm, ta khng cn yu cu kt ni ti host xa trc khi gi v nhn d liu.

Seqpacket Cung cp hng kt ni v truyn 2 chiu cc dng byte mt cch tin cy . Seqpacket khng trng lp d liu v bo v bin d liu. Socket kiu Seqpacket truyn thng vi 1 my n v yu cu kt ni trc khi truyn d liu. Stream c s dng trong cc giao thc hng kt ni, khng b trng lp d liu, khng bo v bin d liu. Socket kiu Stream ch truyn thng vi mt my n v yu cu kt ni trc khi truyn d liu. Stream dng giao thc Transmission Control Protocol (Tcp) v h a ch InterNetwork Cha bit kiu Socket

Unknown

+ProtocolType: kiu giao thc, tham s ny c th c cc gi tr sau: ProtocolType Ggp Icmp IcmpV6 Idp Igmp IP IPSecAuthenticationHeader M t Gateway To Gateway Protocol. Internet Control Message Protocol. Internet Control Message Protocol IPv6. Internet Datagram Protocol. Internet Group Management Protocol. Internet Protocol. IPv6 Authentication.

IPSecEncapsulatingSecurityPayload IPv6 Encapsulating Security Payload header. IPv4 IPv6 Ipx ND Internet Protocol version 4. Internet Protocol version 6 (IPv6). Internet Packet Exchange Protocol. Net Disk Protocol (unofficial).Trang 24

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Pup Raw Spx SpxII Tcp Udp Unknown Unspecified

PARC Universal Packet Protocol. Raw IP packet protocol. Sequenced Packet Exchange protocol. Sequenced Packet Exchange version 2 protocol. Transmission Control Protocol. User Datagram Protocol. Giao thc cha bit Giao thc cha c ch ra

V d phng thc to lp ca lp Socket:Socket sk = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

XXIPAddress IPAddress l mt i tng dng m t mt a ch IP, i tng ny c th c s dng trong nhiu phng thc ca Socket. Mt s phng thc ca lp IPAddress Phng Thc Equals GetHashCode GetType HostToNetworkOrder IsLoopBack NetworkToHostOrder Parse ToString M T So snh 2 a ch IP Ly gi tr has cho 1 i tng IPAddress Tr v kiu ca mt th hin a ch IP Chuyn 1 a ch IP t host byte order thnh network byte order Cho bit a ch IP c phi l a ch LoopBack hay khng Chuyn 1 a ch IP t network byte order thnh host byte order Chuyn 1 chui thnh 1 th hin IPAddress Chuyn 1 i tng IPAddress thnh mt chui

Phng thc Parse() thng c dng to ra 1 th hin ca IPAddress:IPAddress localIpAddress = IPAddress.Parse("127.0.0.1");

Trang 25

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Lp IPAddress cng cung cp 4 thuc tnh m t cc a ch IP c bit: Any: dng m t mt a ch IP bt k ca h thng. Broadcast: dng m t a ch IP Broadcast cho mng cc b Loopback: dng m t a ch loopback ca h thng None: khng dng a ch IP XXIIPEndPoint IPEndPoint l mt i tng m t s kt hp ca mt a ch IP v port. i tng IPEndPoint c dng gn kt cc Socket vi cc a ch cc b hoc cc a ch xa. Hai thuc tnh ca IPEndPoint c th c dng ly c vng cc port trn h thng l MinPort v MaxPort. XXIILp trnh Socket hng kt ni Trong lp trnh Socket hng kt ni, giao thc TCP c dng thnh lp phin lm vic gia hai endpoint. Khi s dng giao thc TCP thnh lp kt ni ta phi m phn kt ni trc nhng khi kt ni c thnh lp d liu c th truyn i gia cc thit b mt cch tin tng. lp trnh Socket hng kt ni ta phi thc hin mt lot cc thao tc gia clien v Server nh trong m hnh bn di

Trang 26

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh II.1: M hnh lp trnh Socket hng kt ni XXIIILp trnh pha Server u tin Server s to mt Socket, Socket ny s c gn vo mt a ch ip v mt port cc b, hm thc hin vic ny l hm Bind(). Hm ny cn mt danh i s l mt IPEndPoint cc b:IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind(ipep);

Bi v Server thng chp nhn kt ni trn chnh a ch IP v port ring ca n nn ta dng IPAddress.Any chp nhn kt ni trn bt k card mng no a ch IP ta dng y l a ch IP version 4 v kiu giao thc l TCP nn AddressFamily l InterNetwork v SocketType l Stream. Sau khi Socket c gn kt vo mt a ch v mt port, Server phi sn sng chp nhn kt ni t Client. Vic ny c thc hin nh vo hm Listen().Hm Listen() c mt i s, chnh l s Client ti a m n lng nghe.server.Listen(10);

Tip theo Server dng hm Accept() chp nhn kt ni t Client:Socket client = server.Accept();

Hm Accept() ny s dng Server li v ch cho n khi no c Client kt ni n n s tr v mt Socket khc, Socket ny c dng trao i d liu vi Client. Khi chp nhn kt ni vi Client th Server c th gi v nhn d liu vi Client thng qua phng thc Send() v Receive().string welcome = "Hello Client"; buff = Encoding.ASCII.GetBytes(welcome); client.Send(buff, buff.Length, SocketFlags.None);

Phng thc Send() ca Socket dng gi d liu, phng thc ny c mt s i s quan trng sau: Buff : mng cc byte cn gi Offset: v tr u tin trong mng cn gi Size: s byte cn gi SocketFlags: ch ra cch gi d liu trn Socket Trang 27

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Vic gi v nhn d liu c thc hin lin tc thng qua mt vng lp v hn:while (true) { buff = new byte[1024]; recv = client.Receive(buff); if (recv == 0) break; Console.WriteLine(Encoding.ASCII.GetString(buff, 0, recv)); client.Send(buff, recv, SocketFlags.None); }

Phng thc Receive() t d liu vo buffer, kch thc buffer c thit lp li, do nu buffer khng c thit lp li, ln gi phng thc Receive() k tip s ch c th nhn c d liu ti a bng ln nhn d liu trc. Phng thc ny c mt s i s quan trng sau: Buff : mng cc byte cn gi Offset: v tr u tin trong mng cn nhn Size: s byte cn gi SocketFlags: ch ra cch nhn d liu trn Socket

Phng thc Receive() tr v s byte d liu nhn c t Client. Nu khng c d liu c nhn, phng thc Receive() s b dng li v ch cho ti khi c d liu. Khi Client gi tn hiu kt thc phin lm vic (bng cch gi c FIN trong gi TCP), phng thc Receive() s tr v gi tr 0. Khi phng thc Receive() tr v gi tr 0, ta ng Socket ca Client li bng phng thc Close(). Socket chnh (Server Socket) vn cn hot ng chp nhn cc kt ni khc. Nu khng mun Client no kt ni n na th ta ng Server li lun:client.Close(); server.Close();

Chng trnh TCP Server n gin:using System; using System.Net; using System.Net.Sockets; using System.Text;

Trang 28

Khoa Cng Ngh Thng Tinclass TcpServerDonGian { public static void Main() { //S byte thc s nhn c dng hm Receive() int byteReceive; //buffer nhn v gi d liu byte[] buff = new byte[1024]; //EndPoint cc b

Gio trnh Lp Trnh Mng

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); //Server Socket Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Kt ni server vi 1 EndPoint server.Bind(ipep); //Server lng nghe ti a 10 kt ni server.Listen(10); Console.WriteLine("Dang cho Client ket noi den..."); //Hm Accept() s block server li cho n khi c Client kt ni n Socket client = server.Accept(); //Client EndPoint IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Da ket noi voi Client {0} tai port {1}", clientep.Address, clientep.Port); string welcome = "Hello Client"; //Chuyn chui thnh mng cc byte buff = Encoding.ASCII.GetBytes(welcome); //Gi cu cho cho Client client.Send(buff, buff.Length, SocketFlags.None); while (true) { //Reset li buffer buff = new byte[1024]; //Ly s byte thc s nhn c byteReceive = client.Receive(buff); //Nu Client ngt kt ni th thot khi vng lp if (byteReceive == 0) break; Console.WriteLine(Encoding.ASCII.GetString(buff, 0, byteReceive)); //Sau khi nhn d liu xong, gi li cho Client client.Send(buff, byteReceive, SocketFlags.None);

Trang 29

Khoa Cng Ngh Thng Tin}

Gio trnh Lp Trnh Mng

Console.WriteLine("Da dong ket noi voi Client: {0}", clientep.Address); //ng kt ni client.Close(); server.Close(); } }

kim tra th chng trnh ta c th dng chng trnh Telnet ca Windows kim tra. Dng lnh telnet 127.0.0.1 5000

Hnh II.2: Kt qu tr v sau khi telnet vo Server local ti port 5000 Sau khi dng lnh telnet, kt qu tr v nh trn hnh l kt ni thnh cng XXIVLp trnh pha Client Lp trnh Socket hng kt ni pha Client n gin hn pha Server. Client cng phi gn kt mt a ch ca mt Socket c to ra nhng s dng phng thc Connect() ch khng s dng phng thc Bind() ging nh pha Server. Phng thc Connect() yu cu mt IPEndPoint ca Server m Client cn kt ni n.IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try

Trang 30

Khoa Cng Ngh Thng Tin{ server.Connect(ipep); } catch (SocketException e) {

Gio trnh Lp Trnh Mng

Console.WriteLine("Khng th kt ni n Server"); Console.WriteLine(e.ToString()); return; }

Phng thc Connect() s dng li cho n khi Client kt ni c vi Server. Nu kt ni khng th c thc hin th n s pht sinh ra mt bit l, do hm Connect() tra phi trong khi try, catch khng b li chng trnh. Khi kt ni c thnh lp, Client c th dng phng thc Send() v Receive() ca lp Socket gi v nhn d liu tng t nh Server lm. Khi qu trnh trao i d liu hon tt, i tng Socket phi c ng li. Client Socket dng phng thc Shutdown() dng Socket v dng phng thc Close() thc s ng phin lm vic. Phng thc Shutdown() ca Socket dng mt tham s quyt nh cch Socket s dng li. Cc phng thc l:

Gi tr M t SocketShutdown.Both Ngn cn gi v nhn d liu trn Socket. SocketShutdown.Receive Ngn cn nhn d liu trn Socket. C RST s c gi nu c thm d liu c nhn. SocketShutdown.Send Ngn cn gi d liu trn Socket. C FIN s c gi sau khi tt c d liu cn li trong buffer c gi i. Chng trnh TCP Client n gin:using System; using System.Net; using System.Net.Sockets; using System.Text; class SimpleTcpClient { public static void Main() { //Buffer gi v nhn d liu

Trang 31

Khoa Cng Ngh Thng Tinbyte[] buff = new byte[1024]; //Chui nhp vo v chui nhn c string input, stringData; //IPEndPoint server

Gio trnh Lp Trnh Mng

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); //Server Socket Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Hm Connect() s b block li v ch khi kt ni c vi server th mi ht block try { server.Connect(ipep); } //Qu trnh kt ni c th xy ra li nn phi dng try, catch catch (SocketException e) { Console.WriteLine("Khng th kt ni n Server"); Console.WriteLine(e.ToString()); return; } //S byte thc s nhn c int byteReceive = server.Receive(buff); //Chui nhn c stringData = Encoding.ASCII.GetString(buff, 0, byteReceive); Console.WriteLine(stringData); while (true) { //Nhp d liu t bn phm input = Console.ReadLine(); //Nu nhp exit th thot v ng Socket if (input == "exit") break; //Gi d liu cho server server.Send(Encoding.ASCII.GetBytes(input)); //Reset li buffer buff = new byte[1024]; //S byte thc s nhn c byteReceive = server.Receive(buff); //Chui nhn c stringData = Encoding.ASCII.GetString(buff, 0, byteReceive); Console.WriteLine(stringData); }

Trang 32

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Console.WriteLine("Dong ket noi voi server..."); //Dng kt ni, khng cho php nhn v gi d liu server.Shutdown(SocketShutdown.Both); //ng Socket server.Close(); } }

XXVVn vi b m d liu Trong v d Client, Server n gin trn th mt mng cc byte c dng nh l b m gi v nhn d liu trn Socket. Bi v chng trnh c chy trong mi trng c iu khin, tt c cc thng ip u thuc dng text v kch thc nh nn loi buffer ny khng phi l mt vn . Trong th gii thc, chng ta khng bit kch thc v kiu d liu n trong khi truyn thng gia Client v Server. Vn xy ra khi khi d liu n ln hn kch thc b m d liu. Khi nhn d liu thng qua TCP, d liu c lu tr trong b m h thng. Mi khi gi phng thc Receive(), n s c d liu t b m TCP v ly d liu ra khi b m. S lng d liu c c bi phng thc Receive() c iu khin bi hai yu t sau: Kch thc b m d liu c ch ra trong phng thc Receive() Kch thc b m c ch ra trong tham s ca phng thc Receive() Trong v d n gin trn, buffer c nh ngha l mt mng byte kch thc 1024. Bi v kch thc d liu khng c ch ra trong phng thc Receive() nn kch thc b m t ng ly kch thc mc nh ca b m d liu l 1024 byte. Phng thc Receive() s c 1024 byte d liu mt ln v t d liu c c vo bin buffbyteReceive = client.Receive(buff);

Vo lc phng thc Receive() c gi, nu b m TCP cha t hn 1024 byte, phng thc ny s tr v s lng d liu m n thc s c c trong bin byte Receive. chuyn d liu thnh chui, ta dng phng thc GetString() nh sau:stringData = Encoding.ASCII.GetString(buff, 0, byteReceive);

Trang 33

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Trong i s ca hm GetString, ta phi truyn vo s byte thc s c c nu khng ta s nhn c mt chui vi cc byte tha ng sau. XXVIX l vi cc b m c kch thc nh H iu hnh Window dng b m TCP gi v nhn d liu. iu ny l cn thit TCP c th gi li d liu bt c lc no cn thit. Mt khi d liu c hi bo nhn thnh cng th n mi c xa khi b m.

Hnh II.3: TCP Buffer D liu n cng c hot ng theo cch tng t. N s li trong b m cho n khi phng thc Receive() c dng c n. Nu phng thc Receive() khng c ton b d liu trong b m, phn cn li vn c nm v ch phng thc Receive() tip theo c c. D liu s khng b mt nhng chng ta s khng ly c cc on d liu mnh mong mun. thy c vn , ta tin hnh thay i kch thc b m t 1024 byte xung cn 10 byte. V chy li chng trnh Client, Server n gin trn

Trang 34

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh II.4: Kt qu tr v khi chy chng trnh vi buffer nh Bi v b m d liu khng ln ly ht d liu b m TCP nn phng thc Receive() ch c th ly c mt lng d liu c ln ng bng ln ca b m d liu, phn cn li vn nm b m TCP v n c ly khi gi li phng thc Receive(). Do cu cho Client ca Server phi dng ti hai ln gi phng thc Receive() mi ly c ht. Trong ln gi v nhn d liu k tip, on d liu tip theo c c t b m TCP do nu ta gi d liu vi kch thc ln hn 10 byte th khi nhn ta ch nhn c 10 byte u tin. Bi v vy nn trong khi lp trnh mng chng ta phi quan tm n vic c d liu t b m TCP mt cch chnh xc. B m qu nh c th dn n tnh trng thng ip nhn s khng khp vi thng ip gi, ngc li b m qu ln s lm cho cc thng ip b trn li, kh x l. Vic kh nht l lm sao phn bit c cc thng ip c c t Socket. XXVIIVn vi cc thng ip TCP Mt trong nhng kh khn ca nhng nh lp trnh mng khi s dng giao thc TCP chuyn d liu l giao thc ny khng quan tm n bin d liu.

Trang 35

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh II.5: Client Send hai ln ri Server mi Receive Nh trn hnh vn xy ra khi truyn d liu l khng m bo c mi phng thc Send() s khng c c bi mt phng thc Receive(). Tt c d liu c c t phng thc Receive() khng thc s c c trc tip t mng m n c c t b m TCP. Khi cc gi tin TCP c nhn t mng s c t theo th t trong b m TCP. Mi khi phng thc Receive() c gi, n s c d liu trong b m TCP, khng quan tm n bin d liu. Chng ta hy xem xt v d sau, Chng Trnh BadTCPServer:using System; using System.Net; using System.Net.Sockets; using System.Text; class BadTcpServer { public static void Main() { //S byte thc s nhn c dng hm Receive() int byteReceive; //buffer nhn v gi d liu byte[] buff = new byte[1024]; //EndPoint cc b IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); //Server Socket Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Kt ni server vi 1 EndPoint server.Bind(ipep);

Trang 36

Khoa Cng Ngh Thng Tin//Server lng nghe ti a 10 kt ni server.Listen(10);

Gio trnh Lp Trnh Mng

Console.WriteLine("Dang cho Client ket noi den..."); //Hm Accept() s block server li cho n khi c Client kt ni n Socket client = server.Accept(); //Client EndPoint IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Da ket noi voi Client {0} tai port {1}", clientep.Address, clientep.Port); string welcome = "Hello Client"; //Chuyn chui thnh mng cc byte buff = Encoding.ASCII.GetBytes(welcome); //Gi cu cho cho Client client.Send(buff, buff.Length, SocketFlags.None); for (int i = 0; i < 5; i++) { byteReceive = client.Receive(buff); Console.WriteLine(Encoding.ASCII.GetString(buff, 0, byteReceive)); } Console.WriteLine("Da dong ket noi voi Client: {0}", clientep.Address); //ng kt ni client.Close(); server.Close(); Console.Read(); }

}

Chng trnh Server thnh lp Socket TCP bnh thng lng nghe kt ni, khi kt ni c thnh lp, Server gi cu cho cho Client v c gng nhn nm thng ip ring bit t Client:for (int i = 0; i < 5; i++) { byteReceive = client.Receive(data); Console.WriteLine(Encoding.ASCII.GetString(data, 0, byteReceive)); }

Mi khi c gi, phng thc Receive() c ton b d liu trong b m TCP, sau khi nhn nm thng ip, kt ni c ng li.Trang 37

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Chng trnh BadTCPClient:using System; using System.Net; using System.Net.Sockets; using System.Text; class BadTcpClient { public static void Main() { //Buffer gi v nhn d liu byte[] buff = new byte[10]; //Chui nhp vo v chui nhn c string input, stringData; //IPEndPoint server IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); //Server Socket Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Hm Connect() s b block li v ch khi kt ni c vi server th mi ht block try { server.Connect(ipep); } //Qu trnh kt ni c th xy ra li nn phi dng try, catch catch (SocketException e) { Console.WriteLine("Khon the ket noi den Server"); Console.WriteLine(e.ToString()); return; } //S byte thc s nhn c int byteReceive = server.Receive(buff); //Chui nhn c stringData = Encoding.ASCII.GetString(buff, 0, byteReceive); Console.WriteLine(stringData); server.Send(Encoding.ASCII.GetBytes("Thong diep 1")); server.Send(Encoding.ASCII.GetBytes("Thong diep 2")); server.Send(Encoding.ASCII.GetBytes("Thong diep 3")); server.Send(Encoding.ASCII.GetBytes("Thong diep 4")); server.Send(Encoding.ASCII.GetBytes("Thong diep 5"));

Trang 38

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Console.WriteLine("Dong ket noi voi server..."); //Dng kt ni, khng cho php nhn v gi d liu server.Shutdown(SocketShutdown.Both); //ng Socket server.Close(); Console.Read(); } }

Kt qu chng trnh nh hnh bn di

Hnh II.6: Kt qu trn Server Trong ln gi phng thc Receive() ln u tin, phng thc ny nhn ton b d liu t phng thc Send() ca Client gi ln, trong ln gi phng thc Receive() ln th hai, phng thc Receive() c d liu t hai phng thc Send() v mt phng thc Send() khc gi d liu cha xong. Trong ln gi th ba th phng thc Receive() s c ht d liu ang c gi d t phng thc Send() v c d liu c gi t phng thc Send() cui cng v sau khi Client thc hin xong nm phng thc Send() n s ng kt ni vi Server v Server cng s thot ra. XXVIIIGii quyt cc vn vi thng ip TCP

Trang 39

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

gii quyt vn vi bin d liu khng c bo v, chng ta phi tm hiu mt s k thut phn bit cc thng ip. Ba k thut thng thng dng phn bit cc thng ip c gi thng qua TCP: Lun lun s dng cc thng ip vi kch thc c nh Gi km kch thc thng ip cng vi mi thng ip S dng cc h thng nh du phn bit cc thng ip XXVIII.1.1.1. S dng cc thng ip vi kch thc c nh Cch d nht nhng cng l cch tn chi ph nht gii quyt vn vi cc thng ip TCP l to ra cc giao thc lun lun truyn cc thng ip vi kch thc c nh. Bng cch thit lp tt c cc thng ip c cng kch thc, chng trnh TCP nhn c th bit ton b thng ip c gi t Client. Khi gi d liu vi kch thc c nh, chng ta phi m bo ton b thng ip c gi t phng thc Send(). Ph thuc vo kch thc ca b m TCP v bao nhiu d liu c truyn, phng thc Send() s tr v s byte m n thc s gi n b m TCP. Nu phng thc Send() cha gi ht d liu th chng ta phi gi li phn d liu cn li. Vic ny thng c thc hin bng cch s dng vng lp while() v trong vng lp ta kim tra s byte thc s gi vi kch thc c nh.private static int SendData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; }

Trang 40

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Cng ging nh vic gi d liu, chng ta phi lun lun m bo nhn tt c d liu trong phng thc Receive(). Bng cch dng vng lp gi phng thc Receive() chng ta c th nhn c ton b d liu mong mun.private static byte[] ReceiveData(Socket s, int size) { int total = 0; int dataleft = size; byte[] data = new byte[size]; int recv; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) { data = Encoding.ASCII.GetBytes("exit"); break; } total += recv; dataleft -= recv; } return data;

Phng thc ReceiveData() s c d liu vi kch thc c c l i s c truyn vo, nu phng thc Receive() s tr v s byte thc s c c, nu s byte thc s c c m cn nh hn s byte truyn vo phng thc ReceiveData() th vng lp s tip tc cho n khi s byte c c ng bng kch thc yu cu. Chng trnh Server gi v nhn d liu vi kch thc c nhusing System; using System.Net; using System.Net.Sockets; using System.Text; class FixedTcpSrvr { private static int SendData(Socket s, byte[] data) { int total = 0; int size = data.Length;

Trang 41

Khoa Cng Ngh Thng Tinint dataleft = size; int sent; while (total < size) {

Gio trnh Lp Trnh Mng

sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } private static byte[] ReceiveData(Socket s, int size) { int total = 0; int dataleft = size; byte[] data = new byte[size]; int recv; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) { data = Encoding.ASCII.GetBytes("exit"); break; } total += recv; dataleft -= recv; } return data; } public static void Main() { byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Dang cho Client ket noi den..."); Socket client = newsock.Accept(); IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Da ket noi voi Client {0} tai port {1}", newclient.Address, newclient.Port); string welcome = "Hello Client";

Trang 42

Khoa Cng Ngh Thng Tindata = Encoding.ASCII.GetBytes(welcome); int sent = SendData(client, data); for (int i = 0; i < 5; i++) { data = ReceiveData(client, 12);

Gio trnh Lp Trnh Mng

Console.WriteLine(Encoding.ASCII.GetString(data)); } Console.WriteLine("Da ngat ket noi voi Client {0}", newclient.Address); client.Close(); newsock.Close(); } }

Chng trnh Client gi v nhn d liu vi kch thc c nhusing System; using System.Net; using System.Net.Sockets; using System.Text; class FixedTcpClient { private static int SendData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } private static byte[] ReceiveData(Socket s, int size) { int total = 0; int dataleft = size; byte[] data = new byte[size]; int recv; while (total < size) {

Trang 43

Khoa Cng Ngh Thng Tinrecv = s.Receive(data, total, dataleft, 0); if (recv == 0) {

Gio trnh Lp Trnh Mng

data = Encoding.ASCII.GetBytes("exit "); break; } total += recv; dataleft -= recv; } return data; } public static void Main() { byte[] data = new byte[1024]; int sent; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { server.Connect(ipep); } catch (SocketException e) { Console.WriteLine("Khong the ket noi den server"); Console.WriteLine(e.ToString()); return; } int recv = server.Receive(data); string stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 1")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 2")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 3")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 4")); sent = SendData(server, Encoding.ASCII.GetBytes("Thong diep 5")); Console.WriteLine("Dong ket noi voi server..."); server.Shutdown(SocketShutdown.Both); server.Close(); } }

Kt qu trn ServerTrang 44

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh II.7: Kt qu gi v nhn d liu vi kch thc c nh XXVIII.1.1.2. Gi km kch thc thng ip cng vi thng ip Cch gii quyt vn bin thng ip ca TCP bng cch s dng cc thng ip vi kch thc c nh l mt gii php lng ph bi v tt c cc thng ip u phi cng kch thc. Nu cc thng ip no cha kch thc th phi thm phn m vo, gy lng ph bng thng mng. Mt gii php cho vn cho php cc thng ip c gi vi cc kch thc khc nhau l gi kch thc thng ip km vi thng ip. Bng cch ny thit b nhn s bit c kch thc ca mi thng ip. thc hin vic ny ta sa i phng thc SendData() trong v d trcprivate static int SendVarData(Socket s, byte[] buff) { int total = 0; int size = buff.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(buff, total, dataleft, SocketFlags.None);

Trang 45

Khoa Cng Ngh Thng Tintotal += sent; dataleft -= sent; } return total; }

Gio trnh Lp Trnh Mng

Trong phng thc SendVarData(), ta s ly kch thc ca thng ip v gn n vo u ca thng ip, kch thc ny l mt s interger 4 byte. Kch thc ti a ca mi thng ip ny l 65KB. Gi tr interger 4 byte ny u tin c chuyn thnh mng cc byte, hm GetBytes() ca lp BitConverter c dng thc hin vic ny. Mng kch thc sau c gi n thit b xa, sau khi gi kch thc thng ip xong, phn chnh ca thng ip c gi i, k thut gi cng ging nh trong v d trc, chng ta s lp cho n khi tt c cc byte c gi. Bc tip theo l to ra mt phng thc c th nhn 4 byte kch thc thng ip v ton b thng ip. phng thc ReceiveData() trong v d trc c sa i thc hin vic ny.private static byte[] ReceiveVarData(Socket s) { int total = 0; int recv; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, 0); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) { data = Encoding.ASCII.GetBytes("exit "); break; } total += recv; dataleft -= recv; }

Trang 46

Khoa Cng Ngh Thng Tinreturn data; }

Gio trnh Lp Trnh Mng

Hm ReceiveVarData() nhn 4 byte u tin ca thng ip v chuyn n thnh gi tr interger bng phng thc GetInt32() ca lp BitConverter. Chng trnh Server gi v nhn thng ip cng vi kch thcusing System; using System.Net; using System.Net.Sockets; using System.Text; class VarTcpSrvr { private static int SendVarData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } private static byte[] ReceiveVarData(Socket s) { int total = 0; int recv; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, 0); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) {

Trang 47

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

data = Encoding.ASCII.GetBytes("exit "); break; } total += recv; dataleft -= recv; } return data; } public static void Main() { byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Dang cho Client ket noi den..."); Socket client = newsock.Accept(); IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Da ket noi voi client {0} tai port {1}", newclient.Address, newclient.Port); string welcome = "Hello client"; data = Encoding.ASCII.GetBytes(welcome); int sent = SendVarData(client, data); for (int i = 0; i < 5; i++) { data = ReceiveVarData(client); Console.WriteLine(Encoding.ASCII.GetString(data)); } Console.WriteLine("Dong ket noi voi Client {0}", newclient.Address); client.Close(); newsock.Close(); } }

Chng trnh Client gi v nhn thng ip cng vi kch thcusing System; using System.Net; using System.Net.Sockets; using System.Text; class VarTcpClient {

Trang 48

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

private static int SendVarData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } private static byte[] ReceiveVarData(Socket s) { int total = 0; int recv; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, 0); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, 0); if (recv == 0) { data = Encoding.ASCII.GetBytes("exit "); break; } total += recv; dataleft -= recv; } return data; } public static void Main() { byte[] data = new byte[1024]; int sent;

Trang 49

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { server.Connect(ipep); } catch (SocketException e) { Console.WriteLine("Khong the ket noi voi server"); Console.WriteLine(e.ToString()); return; } data = ReceiveVarData(server); string stringData = Encoding.ASCII.GetString(data); Console.WriteLine(stringData); string message1 = "Day la thong diep dau tien"; string message2 = "Thong diep ngan"; string message3 = "Thong diep nay dai hon cac thong diep khac"; string message4 = "a"; string message5 = "Thong diep cuoi cung"; sent = SendVarData(server, Encoding.ASCII.GetBytes(message1)); sent = SendVarData(server, Encoding.ASCII.GetBytes(message2)); sent = SendVarData(server, Encoding.ASCII.GetBytes(message3)); sent = SendVarData(server, Encoding.ASCII.GetBytes(message4)); sent = SendVarData(server, Encoding.ASCII.GetBytes(message5)); Console.WriteLine("Dang ngat ket noi voi server..."); server.Shutdown(SocketShutdown.Both); server.Close(); } }

Kt qu

Trang 50

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh II.8: Kt qu gi v thng ip cng vi kch thc XXVIII.1.1.3. S dng cc h thng nh du phn bit cc thng ip Mt cch khc gi cc thng ip vi kch thc khc nhau l s dng cc h thng nh du. H thng ny s chia cc thng ip bi cc k t phn cch bo hiu kt thc thng ip. Khi d liu c nhn t Socket, d liu c kim tra tng k t mt pht hin cc k t phn cch, khi cc k t phn cch c pht hin th d liu trc k t phn cch chnh l mt thng ip v d liu sau k t phn cch s bt u mt thng ip mi. Phng php ny c mt s hn ch, nu thng ip ln n s lm gim tc ca h thng v ton b cc k t ca thng ip u phi c kim tra. Cng c trng hp mt s k t trong thng ip trng vi cc k t phn cch v thng ip ny s b tch ra thnh cc thng ip con, iu ny lm cho chng trnh chy b sai lch. XXIXS dng C# Stream vi TCP iu khin thng ip dng giao thc TCP thng gy ra kh khn cho cc lp trnh vin nn .NET Framework cung cp mt s lp gim gnh nng lp trnh. Mt trong nhng lp l NetworkStream, v hai lp dng gi v nhn text s dng giao thc TCP l StreamWriter v StreamReader XXIX.1.1.1. Lp NetworkStreamTrang 51

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Lp NetworkStream nm trong namespace System.Net.Socket, lp ny c nhiu phng thc to lp to mt th hin ca lp NetworkStream nhng phng thc to lp sau hay c dng nht:Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); NetworkStream ns = new NetworkStream(server);

Mt s thuc tnh ca lp NetworkStream: Thuc Tnh CanRead CanSeek CanWrite DataAvailable M T true nu NetworkStream h tr c Lun lun false true nu NetworkStream h tr ghi true nu c d liu c

Mt s phng thc ca lp NetworkStream: Phng Thc BeginRead() BeginWrite() Close() CreateObjRef() M T Bt u c NetworkStream bt ng b Bt u ghi NetworkStream bt ng b ng i tng NetworkStream To ra mt i tng dng nh l proxy cho NetworkStream EndRead() Kt thc c NetworkStream bt ng b EndWrite() Kt thc ghi NetworkStream bt ng b Equals() So snh hai i tng NetworkStreams Flush() y tt c d liu t NetworkStream i GetHashCode() Ly hash code cho NetworkStream GetLifetimeService() Ly i tng lifetime service cho NetworkStream GetType() Ly kiu NetworkStream InitializeLifetimeService() Ly i tng lifetime service object iu khin chnh sch lifetime choNetworkStream Read() c d liu t NetworkStream ReadByte() c mt byte d liu t NetworkStream ToString() Tr v chui m t NetworkStream Write() Ghi d liu t NetworkStream

Trang 52

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng thc Read() c dng c cc khi d liu t NetworkStream. nh dng ca phng thc ny: int Read(byte[] buffer, int offset, int size) Trong : buffer: mng cc byte c c vo offset: v tr bt u c vo trong b m size: s byte ti a c c Phng thc ny tr v mt gi tr interger m t s byte thc s c c t NetworkStream v dt d liu c c vo buffer. Phng thc Write() dng gi cc khi d liu i cng c nh dng tng t: void Write(byte[] buffer, int offset, int size) Trong : buffer: mng cc byte ghi offset: v tr bt u ghi trong b m size: s byte ti a c ghi bt u ti v tr offset Chng trnh TCP Client NetworkStreamusing System; using System.Net; using System.Net.Sockets; using System.Text; class NetworkStreamTcpClient { public static void Main() { byte[] data = new byte[1024]; string input, stringData; int recv; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 500); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { server.Connect(ipep); } catch (SocketException e)

Trang 53

Khoa Cng Ngh Thng Tin{

Gio trnh Lp Trnh Mng

Console.WriteLine("Khong the ket noi den server"); Console.WriteLine(e.ToString()); return; } NetworkStream ns = new NetworkStream(server); if (ns.CanRead) { recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } else { Console.WriteLine("Error: Can't read from this Socket"); ns.Close(); server.Close(); return; } while (true) { input = Console.ReadLine(); if (input == "exit") break; if (ns.CanWrite) { ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); ns.Flush(); } recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Dang ngat ket noi voi server..."); ns.Close(); server.Shutdown(SocketShutdown.Both); server.Close(); } }

Chng trnh ny to ra mt i tng NetworkStream t i tng Socket:NetworkStream ns = new NetworkStream(server);

Trang 54

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Khi i tng NetworkStream c to ra, i tng Socket s khng c tham chiu n na cho n khi n b ng li vo cui chng trnh, tt c cc thng tin lin lc vi Server xa c thc hin thng i tng NetworkStream:recv = ns.Read(data, 0, data.Length); ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); ns.Flush();

Phng thc Flush() c dng sau mi phng thc Write() m bo d liu t vo NetworkStream s lp tc c gi n h thng xa. Mc d i tng NetworkStream c thm mt s chc nng ca Socket nhng vn cn tn ti vn vi bin thng ip. Vn ny c gii quyt thng qua hai lp h tr l StreamReader v StreamWriter. Ta c th kim tra chng trnh ny vi chng trnh TCP Server n gin trn. XXIX.1.1.2. Lp StreamReader v StreamWriter Namespcace System.IO cha hai lp StreamReader v StreamWriter iu khin vic c v ghi cc thng ip text t mng. C hai lp u c th c trin khai vi mt i tng NetworkStream xc nh cc h thng nh du cho cc thng ip TCP. Lp StreamReader c nhiu phng thc to lp, trong phng thc to lp n gin nht ca lp StreamReader:public StreamReader(Stream stream);

Bin stream c th c tham chiu n bt k kiu i tng Stream no k c i tng NetworkStream. C nhiu phng thc v thuc tnh c th c dng vi i tng StreamReader sau khi n c to ra nh trong bng sau: Phng Thc Close() CreateObjRef() DiscardBufferedData() Equals() GetHashCode() GetLifetimeService() GetType() M T ng i tng StreamReader To ra mt i tng c dng nh l mt proxy cho StreamReader B d liu hin ti StreamReader So snh hai i tng StreamReader Ly hash code cho i tng StreamReader Ly i tng lifetime service object cho StreamReader Ly kiu ca i tng StreamReaderTrang 55

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng Thc M T InitializeLifetimeService() To ra mt i tng lifetime service cho StreamReader Peek() Tr v byte d liu hp l tip theo t m khng g b n khi stream Read() c mt hoc nhiu byte d liu t StreamReader ReadBlock() c mt nhm cc byte t stream StreamReader v t n vo mt b m ReadLine() c d liu t bt u i tng StreamReader tr ln cho n khi gp k t xung dng u tin ReadToEnd() c d liu cho n khi ht stream ToString() To ra mt chui m t i tng StreamReader Tng t i tng StreamReader, i tng StreamWriter c th c to ra t mt i tng NetworkStream:public StreamWriter(Stream stream);

StreamWriter cng c nhiu phng thc v thuc tnh kt hp vi n, mt s phng thc v thuc tnh ca lp StreamReader cng c trong i tng StreamWriter, ngoi ra n cn c mt s phng thc v thuc tnh ring: Phng Thc Flush() Write() WriteLine() M T Gi tt c d liu trong b m StreamWriter ra stream Gi mt hoc nhiu byte d liu ra stream Gi d liu cng vi k t xung dng ra stream

Phng thc ReadLine() l phng thc hay nht ca lp StreamReader. N c cc k t t stream cho ti khi n gp k t xung dng. Tnh nng ny cho php s dng k t xung dng nh l mt k t phn tch cc thng ip. Phng thc WriteLine() ca lp StreamWriter s so khp vi phng thc ReadLine ca lp StreamReader do vic x l cc thng ip TCP tr nn d dng hn. Chng trnh Stream TCP Serverusing System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; class StreamTcpSrvr {

Trang 56

Khoa Cng Ngh Thng Tinpublic static void Main() { string data;

Gio trnh Lp Trnh Mng

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Dang cho Client ket noi toi..."); Socket client = newsock.Accept(); IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Da ket noi voi Client {0} tai port {1}", newclient.Address, newclient.Port); NetworkStream ns = new NetworkStream(client); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); string welcome = "Hello Client"; sw.WriteLine(welcome); sw.Flush(); while (true) { try { data = sr.ReadLine(); } catch (IOException) { break; } Console.WriteLine(data); sw.WriteLine(data); sw.Flush(); } Console.WriteLine("Da dong ket noi voi Client {0}", newclient.Address); sw.Close(); sr.Close(); ns.Close(); } }

Trang 57

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Chng trnh StreamTcpSrvr dng phng thc WriteLine() ca lp StreamWriter gi cc thng ip text v kt thc bng k t xung dng. i vi i tng NetworkStream, tt hn ht l ta phng thc Flush() sau khi gi phng thc WriteLine() m bo rng tt c d liu c gi t b m TCP. im khc bit ca chng trnh ny vi chng trnh TCP Server n gin trn l cch chng trnh StreamTcpSrvr bit khi no Client ngt kt ni. Bi v phng thc ReadLine() hot ng trn stream ch khng phi l Socket nn n khng th tr v gi tr 0 khi Client ngt kt ni. Thay v vy, phng thc ReadLine() s pht sinh ra mt bit l nu Client ngt kt ni v ta phi dng catch bt bit l ny v x l khi Client ngt kt ni:try { data = sr.ReadLine(); } catch (IOException) { break; }

Chng trnh Stream TCP Clientusing System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; class StreamTcpClient { public static void Main() { string data; string input; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { server.Connect(ipep); } catch (SocketException e)

Trang 58

Khoa Cng Ngh Thng Tin{

Gio trnh Lp Trnh Mng

Console.WriteLine("Khong the ket noi den server"); Console.WriteLine(e.ToString()); return; } NetworkStream ns = new NetworkStream(server); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); data = sr.ReadLine(); Console.WriteLine(data); while (true) { input = Console.ReadLine(); if (input == "exit") break; sw.WriteLine(input); sw.Flush(); data = sr.ReadLine(); Console.WriteLine(data); } Console.WriteLine("Dang dong ket noi voi server..."); sr.Close(); sw.Close(); ns.Close(); server.Shutdown(SocketShutdown.Both); server.Close(); } }

Trang 59

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XXXCHNG

III: LP TRNH SOCKET PHI KT NI

XXXITng quan Cc Socket phi kt ni cho php gi cc thng ip m khng cn phi thit lp kt ni trc. Mt phng thc c s c ton b thng ip c gi bi mt phng thc gi, iu ny lm trnh c cc rc ri, phc tp vi bin d liu. Tht khng may mn l giao thc phi kt ni UDP khng m bo d liu c truyn ti ch. Nhiu yu t nh mng bn, mng b t na chng c th ngn cn cc gi tin c truyn ti ch. Nu mt thit b ch d liu t mt thit b xa, n phi c gn mt a ch v port cc b, dng hm Bind() gn. Mt khi thc hin xong, thit b c th dng Socket gi d liu ra ngoi hay nhn d liu t Socket. Bi v thit b Client khng to ra kt ni n mt a ch Server c th do phng thc Connect() khng cn dng trong chng trnh UDP Client. M hnh bn di m t cc bc lp trnh Socket phi kt ni:

Hnh V.1:

M hnh lp trnh Socket phi kt ni

Trang 60

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Khi kt ni khng c thnh lp th phng thc Send() v Receive() khng c dng bi v trong hai phng thc trn u khng ch ra a ch ch ca d liu. Thay vo , Socket phi kt ni cung cp hai phng thc thc hin vic ny l SendTo() v ReceiveFrom() XXXIILp trnh pha Server UDP l mt giao thc phi kt ni do cc lp trnh vin ch phi lm hai vic to ra mt ng dng Server gi v nhn d liu: To ra Socket Kt ni Socket n mt IPEndPoint cc bIPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); newsock.Bind(ipep);

thc hin truyn thng phi kt ni, chng ta phi ch ra SocketType l Dgram v ProtocolType l Udp. Sau khi thc hin xong hai bc trn, Socket c th c dng hoc chp nhn cc gi tin UDP n trn IPEndPoint hoc gi cc gi tin udp n cc thit b nhn khc trn mng. Phng thc SendTo() dng gi d liu, phng thc ny ch ra d liu gi v IPEndPoint ca thit b nhn. C nhiu qu ti hm ca phng thc SendTo() c th c dng ty vo yu cu c th.SendTo(byte[] data, EndPoint Remote)

Phng thc trn gi mt mng d liu n mt EndPoint c ch ra bi Remote. Mt qu ti hm khc phc tp hn ca phng thc SendTo()SendTo(byte[] data, SocketFlags Flags, EndPoint Remote)

Phng thc ny cho php thm c SocketFlag, n ch ra cc ty chn UDP c s dng. ch ra s byte c gi t mng byte ta s dng qu ti hm sau ca phng thc SendTo():SendTo(byte[] data, int Offset, int Size, SocketFlags Flags, EndPoint Remote)

Trang 61

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng thc ReceiveFrom() c dng nh dng vi phng thc SendTo(), ch c mt im khc bit sau cch EndPoint c khai bo. Phng thc ReceiveFrom() n gin c nh ngha nh sau:ReceiveFrom(byte[] data, ref EndPoint Remote)

Cng nh thng thng, tham s th nht l mt mng byte c nh ngha nhn d liu, tham s th hai ra phi truyn tham chiu ca i tng EndPoint. Tham chiu ny tham chiu n v tr b nh ni bin c lu tr. Phng thc ReceiveFrom() s t thng tin EndPoint t thit b xa vo vng b nh ca i tng EndPoint tham chiu n. Bng vic s dng i s th hai l tham chiu ta s ly c a ch IP v port ca my xa. Chng trnh UDP n ginusing System; using System.Net; using System.Net.Sockets; using System.Text; class SimpleUdpSrvr { public static void Main() { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); newsock.Bind(ipep); Console.WriteLine("Dang cho Client ket noi den..."); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)(sender); recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine("Thong diep duoc nhan tu {0}:", Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); string welcome = "Hello Client"; data = Encoding.ASCII.GetBytes(welcome); newsock.SendTo(data, data.Length, SocketFlags.None, Remote); while (true) { data = new byte[1024]; recv = newsock.ReceiveFrom(data, ref Remote);

Trang 62

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); newsock.SendTo(data, recv, SocketFlags.None, Remote); } } }

chng trnh UDP chp nhn cc thng ip UDP n, n phi c gn vi mt port trn h thng. Vic ny c thc hin bng cch to ra mt i tng IPEndPoint s dng mt a ch IP cc b thch hp, trong trng hp ny ta ch ra IPAddresss.Any c th dng bt k a ch IP no trn my cc b lng nghe. Sau khi gn Socket vo mt IPEndPoint, Server s ch Client kt ni n, khi Client kt ni n, Client s gi thng ip n Server. Server sau khi nhn c thng ip t Client n s gi cu cho ngc li cho Client:recv = newsock.ReceiveFrom(data, ref Remote); Console.WriteLine("Thong diep duoc nhan tu {0}:",Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); string welcome = "Hello client";

Khi gi cu cho cho Client xong, Server s bt u nhn v gi thng ip XXXIIILp trnh pha Client Bi v Client khng cn ch trn mt port UDP nh sn nn n cng chng cn dng phng thc Bind(), thay v vy n s ly mt port ngu nhien trn h thng khi d liu c gi v n gia port ny nhn d liu tr v. Chng trnh UDP Client cng tng t chng trnh UDP Server: Chng trnh UDP Client n ginusing System; using System.Net; using System.Net.Sockets; 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"), 5000); Socket server = new Socket(AddressFamily.InterNetwork,

Trang 63

Khoa Cng Ngh Thng TinSocketType.Dgram, ProtocolType.Udp); string welcome = "Hello server"; data = Encoding.ASCII.GetBytes(welcome);

Gio trnh Lp Trnh Mng

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("Thong diep duoc nhan tu {0}:", Remote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); while (true) { input = Console.ReadLine(); 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("Dang dong client"); server.Close(); } }

Chng trnh UDP Client u tin nh ngha mt IPEndPoint m UDP Server s gi cc gi tin:IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);

Chng trnh Client gi thng ip n Server v ch cu cho tr v t Server. Bi v Client khng cn chp nhn cc thng ip UDP trn mt port nh trc nn Client khng dng phng thc Bind(). N s nhn cc thng ip UDP trn cng port m n gi. Chng trnh SimpleUdpClient c d liu nhp vo t bn phm ri gi n v ch d liu t Server gi tr v. Khi Server gi tr d liu v, Client s ly thng ip ra v hin th ln mn hnh. Nu ngi dng nhn vo exit th vng lp s thot v kt ni b ng li.

Trang 64

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Khng ging nh chng trnh TCP Server, chng trnh UDP Server s khng bit khi no Client ngt kt ni do khi Client ngt kt ni th n phi gi thng ip ngt kt ni cho Server bit. XXXIVS dng phng thc Connect() trong chng trnh UDP Client Cc phng thc UDP c thit k cho php cc lp trnh vin gi cc gi tin n bt k my no trn mng bt c lc no. Bi v giao thc UDP khng yu cu kt ni trc khi gi d liu nn phi ch ra a ch ca my nhn trong phng thc SendTo() v phng thc ReceiveFrom(). Nu chng trnh ca chng ta ch cn gi v nhn d liu t mt my, chng ta c th dng phng thc Connect(). Sau khi UDP socket c to ra, chng ta c th dng phng thc Connect() ging nh trong chng trnh TCP ch ra udp Server xa. Sau khi dng phng thc Connect() xong ta c th dng phng thc Send() v Receive() truyn ti d liu gia cc thit b vi nhau. K thut ny c minh ha trong chng trnh UDP Client sau: Chng trnh udp Client dng phng thc Connect()using System; using System.Net; using System.Net.Sockets; using System.Text; class OddUdpClient { public static void Main() { byte[] data = new byte[1024]; string input, stringData; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); server.Connect(ipep); string welcome = "Xin chao server"; data = Encoding.ASCII.GetBytes(welcome); server.Send(data); data = new byte[1024]; int recv = server.Receive(data); Console.WriteLine("Nhan thong diep tu {0}:", ipep.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); while (true)

Trang 65

Khoa Cng Ngh Thng Tin{ input = Console.ReadLine(); if (input == "exit") break;

Gio trnh Lp Trnh Mng

server.Send(Encoding.ASCII.GetBytes(input)); data = new byte[1024]; recv = server.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Dang dong client"); server.Close(); } }

XXXVPhn bit cc thng ip UDP Mt trong nhng tnh nng quan trng ca UDP m TCP khng c c l kh nng x l thng ip m khng cn quan tm n bin thng ip. UDP bo v bin thng ip ca tt c cc thng ip c gi. Mi ln gi phng thc ReceiveFrom() n ch c d liu c gi t mt phng thc SendTo(). Khi UDP Socket c to ra, n c th nhn thng ip t bt k Client no. udp Socket phn bit c Client no gi d liu n bt buc mi thng ip phi c cha trong mt gi tin ring v c nh du bi thng tin IP ca thit b gi. iu ny cho php thit b nhn phn bit c cc thng ip v thit b gi. Chng trnh Client v Server sau s minh ha iu ny. Chng trnh UDP Serverusing System; using System.Net; using System.Net.Sockets; using System.Text; class TestUdpSrvr { public static void Main() { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

Trang 66

Khoa Cng Ngh Thng Tinnewsock.Bind(ipep);

Gio trnh Lp Trnh Mng

Console.WriteLine("Dang cho client ket noi den..."); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint tmpRemote = (EndPoint)(sender); recv = newsock.ReceiveFrom(data, ref tmpRemote); Console.WriteLine("Thong diep duoc nhan tu {0}:", tmpRemote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); string welcome = "Xin chao client"; data = Encoding.ASCII.GetBytes(welcome); newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote); for (int i = 0; i < 5; i++) { data = new byte[1024]; recv = newsock.ReceiveFrom(data, ref tmpRemote); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); } newsock.Close(); } }

Chng trnh UDP Clientusing System; using System.Net; using System.Net.Sockets; using System.Text; class TestUdpClient { public static void Main() { byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); string welcome = "Xin chao Server"; data = Encoding.ASCII.GetBytes(welcome); server.SendTo(data, data.Length, SocketFlags.None, ipep); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint tmpRemote = (EndPoint)sender; data = new byte[1024]; int recv = server.ReceiveFrom(data, ref tmpRemote);

Trang 67

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Console.WriteLine("Thong diep duoc nhan tu {0}:", tmpRemote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); server.SendTo(Encoding.ASCII.GetBytes("Thong diep 1"), tmpRemote); server.SendTo(Encoding.ASCII.GetBytes("Thong diep 2"), tmpRemote); server.SendTo(Encoding.ASCII.GetBytes("Thong diep 3"), tmpRemote); server.SendTo(Encoding.ASCII.GetBytes("Thong diep 4"), tmpRemote); server.SendTo(Encoding.ASCII.GetBytes("Thong diep 5"), tmpRemote); Console.WriteLine("Dang dong client"); server.Close(); } }

Kt qu Server

Hnh V.2:

UDP Server nhn bit c cc thng ip ring r

XXXVINgn cn mt d liu Mt thun li ca vic truyn thng dng giao thc TCP l giao thc TCP s dng b m TCP. Tt c d liu c gi bi TCP Socket c t vo b m TCP trc khi c gi ra ngoi mng. Cng ging nh vy, tt c d liu nhn t Socket c t vo b m TCP trc khi c c bi phng thc Receive(). Khi phng thc Receive() c gng c d liu t b m, nu n khng c ht d liu th phn cn li vn nm trong b m v ch ln gi phng thc Receive() k tip. V UDP khng quan tm n vic gi li cc gi tin nn n khng dng b m. Tt c d liu c gi t Socket u c lp tc gi ra ngoi mng v tt c

Trang 68

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

d liu c nhn t mng lp tc c chuyn cho phng thc ReceiveFrom() trong ln gi tip theo. Khi phng thc ReceiveFrom() c dng trong chng trnh, cc lp trnh vin phi m bo rng b m phi ln chp nhn ht d liu t UDP Socket. Nu b m qu nh, d liu s b mt. thy c iu ny, ta tin hnh thay i kch thc b m trong chng trnh UDP n gin trn: Chng trnh BadUDPClientusing System; using System.Net; using System.Net.Sockets; using System.Text; class BadUdpClient { public static void Main() { byte[] data = new byte[30]; string input, stringData; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); string welcome = "Xin chao serveer"; data = Encoding.ASCII.GetBytes(welcome); server.SendTo(data, data.Length, SocketFlags.None, ipep); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint tmpRemote = (EndPoint)sender; data = new byte[30]; int recv = server.ReceiveFrom(data, ref tmpRemote); Console.WriteLine("Thong diep duoc nhan tu {0}:", tmpRemote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); while (true) { input = Console.ReadLine(); if (input == "exit") break; server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote); data = new byte[30]; recv = server.ReceiveFrom(data, ref tmpRemote); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Dang dong client");

Trang 69

Khoa Cng Ngh Thng Tinserver.Close(); } }

Gio trnh Lp Trnh Mng

Ta c th test chng trnh ny vi chng trnh UDP Server n gin trn. Khi ta nhn d liu t hn 10 byte th chng trnh vn chy bnh thng nhng khi ta nhp d liu ln hn 10 byte th chng trnh BadUdpClient s pht sinh ra mt bit l. Mc du ta khng th ly li d liu b mt nhng ta c th hn ch mt d liu bng cch t phng thc ReceiveFrom() trong khi try-catch, khi d liu b mt bi kch thc b m nh, ta c th tng kch thc b m vo ln k tip nhn d liu. Chng trnh BetterUdpClient sau minh ha vic ny: Chng trnh BetterUdpClientusing System; using System.Net; using System.Net.Sockets; using System.Text; class BetterdUdpClient { public static void Main() { byte[] data = new byte[30]; string input, stringData; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); string welcome = "Xin chao server"; data = Encoding.ASCII.GetBytes(welcome); server.SendTo(data, data.Length, SocketFlags.None, ipep); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint tmpRemote = (EndPoint)sender; data = new byte[30]; int recv = server.ReceiveFrom(data, ref tmpRemote); Console.WriteLine("Thong diep duoc nhan tu {0}:", tmpRemote.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); int i = 30; while (true) { input = Console.ReadLine(); if (input == "exit")

Trang 70

Khoa Cng Ngh Thng Tinbreak;

Gio trnh Lp Trnh Mng

server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote); data = new byte[i]; try { recv = server.ReceiveFrom(data, ref tmpRemote); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } catch (SocketException) { Console.WriteLine("Canh bao: du lieu bi mat, hay thu lai"); i += 10; } } Console.WriteLine("Dang dong client"); server.Close(); } }

Thay v s dng mng buffer vi chiu di c nh, chng trnh BetterUdpClient dng mt bit c th thit lp gi tr khc nhau mi ln phng thc ReceiveFrom() c dng.data = new byte[i]; try { recv = server.ReceiveFrom(data, ref tmpRemote); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } catch (SocketException) { Console.WriteLine("Canh bao: du lieu bi mat, hay thu lai"); i += 10; }

XXXVIINgn cn mt gi tin Mt kh khn khc khi lp trnh vi giao thc udp l kh nng b mt gi tin bi v udp l mt giao thc phi kt ni nn khng c cch no m thit b gi bitTrang 71

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

c gi tin gi c thc s n c ch hay khng. Cch n gin nht ngn chn vic mt cc gi tin l phi c c ch hi bo ging nh giao thc TCP. Cc gi tin c gi thnh cng n thit b nhn th thit b nhn phi sinh ra gi tin hi bo cho thit b gi bit nhn thnh cng. Nu gi tin hi bo khng c nhn trong mt khong thi gian no th thit b nhn s cho l gi tin b mt v gi li gi tin . C hai k thut dng truyn li cc gi tin UDP: S dng Socket bt ng b v mt i tng Timer. K thut ny yu cu s

dng mt Socket bt ng b m n c th lng nghe cc gi tin n khng b block. Sau khi Socket c thit lp c bt ng b, mt i tng Timer c th c thit lp, nu i tng Timer tt trc khi hnh ng c bt ng b kt thc th vic gi li d liu din ra. S dng Socket ng b v thit lp gi tr Socket time-out. lm c vic

ny, ta dng phng thc SetSocketOption(). XXXVII.1.1. S dng Soket Time-out Phng thc ReceiveFrom() l phng thc b block. N s block chng trnh li cho n khi chng trnh nhn d liu. Nu d liu khng bao gi nhn, chng trnh s block m mi. Mc n phng thc Receiv