You are on page 1of 178

TRNG I HC LT KHOA CNG NGH THNG TIN

BI GING TM TT

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

Lt 2009

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

MC LC
ICHNG I: NHNG KIN THC C BN V LP TRNH MNG.............6 IITNG QUAN..............................................................................................................6
IIITng Ethernet.......................................................................................................... 6 IVa ch Ethernet....................................................................................................... 8 VEthernet Protocol Type........................................................................................... 10 VIData payload ........................................................................................................ 11 VIIChecksum ............................................................................................................ 11

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

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

XVIITNG UDP.......................................................................................................20 XVIIICHNG II: LP TRNH SOCKET HNG KT NI.........................23 XIXSOCKET..............................................................................................................23 XXIPADDRESS .........................................................................................................26 XXIIPENDPOINT ....................................................................................................27 XXIILP TRNH SOCKET HNG KT NI.............................................................27
XXIIILp trnh pha Server ........................................................................................28 XXIVLp trnh pha Client..........................................................................................32 XXVVn vi b m d liu .................................................................................34 XXVIX l vi cc b m c kch thc nh.............................................................35 XXVIIVn vi cc thng ip TCP.........................................................................37 XXVIIIGii quyt cc vn vi thng ip TCP........................................................41
XXVIII.1.1.1.S dng cc thng ip vi kch thc c nh.................................................41 XXVIII.1.1.2.Gi km kch thc thng ip cng vi thng ip ........................................46 XXVIII.1.1.3.S dng cc h thng nh du phn bit cc thng ip .........................52

XXIXS dng C# Stream vi TCP .............................................................................52


XXIX.1.1.1.Lp NetworkStream............................................................................................ 52 XXIX.1.1.2.Lp StreamReader v StreamWriter...................................................................56

XXXCHNG III: LP TRNH SOCKET PHI KT NI..................................61 XXXITNG QUAN.....................................................................................................61 XXXIILP TRNH PHA SERVER .............................................................................62
Trang 2

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XXXIIILP TRNH PHA CLIENT.............................................................................64


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

XXXVINGN CN MT D LIU ............................................................................69 XXXVIINGN CN MT GI TIN............................................................................72


XXXVII.1.1.S dng Soket Time-out..........................................................................73

XXXVIIIIU KHIN VIC TRUYN LI CC GI TIN .........................................75 XXXIXCHNG IV: S DNG CC LP HELPER CA C# SOCKET........81 XLLP TCP CLIENT................................................................................................81 XLILP TCPLISTENER...........................................................................................84 XLIILP UDPCLIENT...............................................................................................87 XLIIICHNG V: A NHIM TIU TRNH......................................................91 XLIVKHI NIM TIN TRNH V TIU TRNH CA WINDOWS..............................91 XLVM HNH...........................................................................................................91 XLVICC K THUT TRONG .NET TO TIU TRNH ............................................92
XLVIITo tiu trnh trong Thread-pool.......................................................................92 XLVIIITo tiu trnh bt ng b ...............................................................................95
XLVIII.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.......................................................................... 98 PollingExample............................................................................. 99 WaitingExample.........................................................................100 WaitAllExample .........................................................................101 CallbackExample........................................................................ 102

XLIXThc thi phng thc bng Timer....................................................................104 LThc thi phng thc bng tiu trnh mi ...........................................................106 LIiu khin qu trnh thc thi ca mt tiu trnh...................................................108 LIINhn bit khi no mt tiu trnh kt thc............................................................112 LIII Khi chy mt tin trnh mi ............................................................................114 LIVKt thc mt tin trnh .....................................................................................115

LVTHC THI PHNG THC BNG CCH RA HIU I TNG WAITHANDLE 117 LVICHNG VI: NG B HA......................................................................118 LVIIL DO NG B HA......................................................................................118 LVIIICC PHNG PHP NG B HA...............................................................118 LIXPHNG PHP SEMAPHORE............................................................................118 LXPHNG PHP DNG LP MONITOR................................................................120 LXISYSTEM.THREADING.WAITHANDLE, BAO GM AUTORESETEVENT, MANUALRESETEVENT ...........................................................................................122 LXIIPHNG PHP MUTEX...................................................................................125 LXIIICHNG VII: LP TRNH SOCKET BT NG B..........................127 LXIVLP TRNH S KIN TRONG WINDOWS.......................................................127
LXVS dng Event v Delegate...............................................................................128

Trang 3

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXVILp AsyncCallback trong lp trnh Windows.....................................................130

LXVIIS DNG SOCKET BT NG B ...............................................................130


LXVIIIThnh lp kt ni .......................................................................................... 131
LXVIII.1.1.1.Phng thc BeginAccept() v EndAccept()....................................................131 LXVIII.1.1.2. Phng thc BeginConnect() v EndConnect()...............................................133

LXIXGi d liu ....................................................................................................... 134


LXIX.1.1.1.Phng thc BeginSend() v phng thc EndSend().......................................134 LXIX.1.1.2.Phng thc BeginSendTo() v EndSendTo()....................................................135

LXXNhn d liu .................................................................................................... 136


LXX.1.1.1.Phng thc BeginReceive(), EndReceive, BeginReceiveFrom(), EndReceiveFrom()............................................................................................................. 136

LXXIChng trnh WinForm gi v nhn d liu gia Client v Server ...................136


LXXI.1.1.1.Chng trnh Server......................................................................................... 136 LXXI.1.1.2.M hnh chng trnh Server.............................................................................136 LXXI.1.1.3.Lp ServerProgram........................................................................................... 137 LXXI.1.1.4.Lp ServerForm................................................................................................ 140

LXXIIChng trnh Client......................................................................................... 141


LXXII.1.1.1.M hnh chng trnh Client.............................................................................142 LXXII.1.1.2.Lp ClientProgram........................................................................................... 143 LXXII.1.1.3.Lp ClientForm................................................................................................ 146

LXXIIILP TRNH SOCKET BT NG B S DNG TIU TRNH.......................147


LXXIVLp trnh s dng hng i gi v hng i nhn thng ip........................147 LXXVLp trnh ng dng nhiu Client .....................................................................153

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

LXXIXS dng Raw Socket......................................................................................159


LXXIX.1.1.1.nh dng ca Raw Socket.............................................................................160 LXXIX.1.1.2.Gi cc gi tin Raw......................................................................................... 161 LXXIX.1.1.3.Nhn cc gi tin Raw ..................................................................................... 161

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

LXXXVILP TRNH VI GIAO THC SMTP...............................................169


LXXXVIIC bn v Email..........................................................................................169
LXXXVII.1.1.1.Hot ng ca MTA..................................................................................... 170 LXXXVII.1.1.2.Gi mail ra ngoi......................................................................................... 170 LXXXVII.1.1.3.Nhn mail.................................................................................................... 171 LXXXVII.1.1.4.Hot ng ca MDA..................................................................................... 172 LXXXVII.1.1.5.Hot ng ca MUA..................................................................................... 172

LXXXVIIISMTP v Windows......................................................................................174
LXXXVIII.1.1.1.Collaboration Data Objects (CDO)...............................................................174

Trang 4

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXXXVIII.1.1.2.Dch v mail SMTP...................................................................................... 175

LXXXIXLp SmtpMail...............................................................................................177 XCCc phng thc v thuc tnh ca lp SmtpMail...............................................177


XC.1.1.1.S dng lp SmtpMail......................................................................................... 178

Trang 5

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 6

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 7

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 M T Spanning tree (for bridges) HP Probe HP Probe HP DTC DEC MUMPS DEC DSM/DTP DEC VAXELN DEC Lanbridge Traffic Monitor (LTM)
Trang 8

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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

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

Trang 9

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

a Ch CF-00-00-00-00-00 VEthernet Protocol Type

M T 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 876B Giao Thc IP ARP Banyan VINES HP Probe Reverse ARP AppleTalk IBM SNA Novell Novell Raw SNMP IPv6 TCP/IP compression
Trang 10

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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

Bit 4 4 8 16 16 3

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

Fragment offset Time to Live (TTL) Protocol

13 8

Header Checksum 16 Source Address Destination Address Options IXTrng a ch 32 32

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 0.x.x.x127.x.x.x

Trang 12

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Lp B Lp C Lp D

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

Trang 13

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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 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 1 2 6 8 9 17 88 Giao Thc Internet Control Message (ICMP) Internet Group Message (IGP) Transmission Control (TCP) Exterior Gateway (EGP) Interior Gateway (Cisco IGP) User Datagram (UDP) Cisco EIGRP Hai giao thc c dng nhiu nht trong lp trnh mng l TCP v UDP

XIIITng TCP
Trang 14

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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.

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 Sequence v Acknowledgement number: theo di th t cc gi tin v truyn ti li cc gi tin b mt Flag: m v ng kt ni gia cc thit b truyn ti d liu

Trang 15

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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

Trang 16

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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 22 23 25 37 80 110 119 123 137 138 143 389 M T Echo Daytime Quote of the day FTP (data channel) FTP (control channel) 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)

Trang 17

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Port 443 993 995

M T 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 th 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):
Trang 18

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Flag 6 bit dnh ring

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

1-bit URG flag 1-bit ACK flag 1-bit PUSH flag 1-bit RESET flag 1-bit SYN flag 1-bit FIN flag

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 Thit b gi gi c ACK cho bit phin lm vic m v sng sng cho vic gi v nhn cc gi tin.

Trang 19

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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 Thit b bn kia gi c FIN v ACK trong cng mt gi tin cho bit n chp nhn ng kt ni 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 20

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 M T Domain Name System Trivial File Transfer Protocol
Trang 21

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Port 111 137 138 161

M T Remote Procedure Call NetBIOS name service NetBIOS datagram Simple Network Management Protocol

Trang 22

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 Manufacturers
Trang 23

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

Raw

Trang 24

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Protocol (Icmp) v Internet Group Management Protocol (Igmp). 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 Internet Protocol version 4. Internet Protocol version 6 (IPv6). Internet Packet Exchange Protocol.
Trang 25

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

ND Pup Raw Spx SpxII Tcp Udp Unknown Unspecified

Net Disk Protocol (unofficial). 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:


Trang 26

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

IPAddress localIpAddress = IPAddress.Parse("127.0.0.1");

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 27

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

Trang 28

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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; class 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 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";

Trang 30

Khoa Cng Ngh Thng Tin


//Chuyn chui thnh mng cc byte buff = Encoding.ASCII.GetBytes(welcome); //Gi cu cho cho Client

Gio trnh Lp Trnh Mng

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


Trang 31

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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 { server.Connect(ipep); } catch (SocketException e) { 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:

Trang 32

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Gi tr SocketShutdown.Both

M t 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 byte[] buff = new byte[1024]; //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("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);

Trang 33

Khoa Cng Ngh Thng Tin


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

Gio trnh Lp Trnh Mng

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

Trang 34

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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 buff
byteReceive = 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);

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


Trang 35

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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

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.
Trang 36

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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.

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

Trang 37

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

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

Trang 38

Khoa Cng Ngh Thng Tin


}

Gio trnh Lp Trnh Mng

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

Trang 39

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

server.Send(Encoding.ASCII.GetBytes("Thong diep 3")); server.Send(Encoding.ASCII.GetBytes("Thong diep 4")); server.Send(Encoding.ASCII.GetBytes("Thong diep 5")); 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.

Trang 40

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XXVIIIGii quyt cc vn vi thng ip TCP 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 41

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 nh
using 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 42

Khoa Cng Ngh Thng Tin


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

Khoa Cng Ngh Thng Tin


data = 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 nh


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

Khoa Cng Ngh Thng Tin


recv = 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 Server
Trang 45

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 trc
private 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 46

Khoa Cng Ngh Thng Tin


total += 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 47

Khoa Cng Ngh Thng Tin


return 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 thc
using 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 48

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 thc


using System; using System.Net; using System.Net.Sockets; using System.Text; class VarTcpClient {

Trang 49

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 50

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 51

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 NetworkStream
Trang 52

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 M T true nu NetworkStream h tr c Lun lun false true nu NetworkStream h tr ghi

DataAvailable true nu c d liu c Mt s phng thc ca lp NetworkStream: Phng Thc BeginRead() BeginWrite() Close() CreateObjRef() EndRead() EndWrite() Equals() Flush() GetHashCode() GetLifetimeService() GetType() 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 Kt thc c NetworkStream bt ng b Kt thc ghi NetworkStream bt ng b So snh hai i tng NetworkStreams y tt c d liu t NetworkStream i Ly hash code cho NetworkStream Ly i tng lifetime service cho NetworkStream Ly kiu NetworkStream

InitializeLifetimeService() Ly i tng lifetime service object iu khin chnh sch lifetime choNetworkStream Read() ReadByte() ToString() Write() c d liu t NetworkStream c mt byte d liu t NetworkStream Tr v chui m t NetworkStream Ghi d liu t NetworkStream

Trang 53

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 NetworkStream
using 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 54

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 55

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

Trang 56

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng Thc GetType() Peek() Read() ReadBlock() ReadLine() ReadToEnd() ToString()

M T Ly kiu ca i tng StreamReader Tr v byte d liu hp l tip theo t m khng g b n khi stream c mt hoc nhiu byte d liu t StreamReader c mt nhm cc byte t stream StreamReader v t n vo mt b m c d liu t bt u i tng StreamReader tr ln cho n khi gp k t xung dng u tin c d liu cho n khi ht stream To ra mt chui m t i tng StreamReader

InitializeLifetimeService() To ra mt i tng lifetime service cho 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 Server
using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text;

Trang 57

Khoa Cng Ngh Thng Tin


class StreamTcpSrvr { public 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 58

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 Client


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

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 60

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 61

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 b
IPEndPoint 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 62

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 gin
using System; using System.Net; using System.Net.Sockets; using System.Text; class SimpleUdpSrvr { public static void Main() { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 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 63

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 gin
using 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 64

Khoa Cng Ngh Thng Tin


SocketType.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 65

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 66

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 Server
using 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 67

Khoa Cng Ngh Thng Tin


newsock.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 Client


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

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 69

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 BadUDPClient
using 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 70

Khoa Cng Ngh Thng Tin


server.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 BetterUdpClient
using 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 71

Khoa Cng Ngh Thng Tin


break;

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 bit
Trang 72

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 ReceiveFrom() s b block mi mi nu khng c d liu c c. phng thc SetSocketOption() cung cp nhiu ty chn cho cc Socket c to, mt trong nhng ty chn l ReceiveTimeout. N s thit lp khong thi gian Socket s ch d liu n trc khi pht ra tn hiu time-out. nh dng ca phng thc SetSocketOption() nh sau:
SetSocketOption(SocketOptionLevel so, SocketOptionName sn, int value)

SocketOptionLevel ch ra kiu ty chn Socket thc thi. SocketOptionName nh ngha ty chn c thit lp, v tham s cui cng thit lp gi tr cho ty chn. ch ra gi tr TimeOut ta dng nh sau:
server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);

Trang 73

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Trong gi tr ca tham s cui cng ch ra s miligiy ti a hm ReceiveFrom() s ch cho n khi c d liu c. Chng trnh sau s minh ha cch dng TimeOut: Chng trnh TimeOutUdpClient
using System; using System.Net; using System.Net.Sockets; using System.Text; class TimeoutUdpClient { public static void Main() { byte[] data = new byte[1024]; string input, stringData; int recv; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); int sockopt = (int)server.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout); Console.WriteLine("Gia tri timeout mac dinh: {0}", sockopt); server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); sockopt = (int)server.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout); Console.WriteLine("Gia tri timeout moi: {0}", sockopt); 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]; recv = server.ReceiveFrom(data, ref tmpRemote); Console.WriteLine("Thong diep duoc nhan tu {0}:", mpRemote.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[1024];

Trang 74

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

recv = server.ReceiveFrom(data, ref tmpRemote); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Dang dong client"); server.Close(); } }

Chng trnh TimeoutUdpClient u tin ly gi tr ReceiveTimeout ban u t Socket v hin th n, sau thit lp gi tr ny thnh 3 giy:
int sockopt = (int)server.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout); Console.WriteLine("Gia tri timeout mac dinh: {0}", sockopt); server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);

Phng thc GetSocketOption() tr v mt i tng Object, v th n phi c p kiu thnh kiu interger. Sau khi bin dch v chy chng trnh vi chng trnh SimpleUdpServer trn, kt qu xut ra nh sau:
C:\>TimeoutUdpClient
Gia tri timeout mac dinh: 0

Gia tri timeout moi: 3000 Unhandled Exception: System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP) at System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, EndPoint& remoteEP) at TimeoutUdpClient.Main() C:\>

Gi tr ban u ca ReceiveTimeout c thit lp l 0 cho bit n s ch d liu mi mi. Sau khi thm phng thc SetSocketOpition() v c thit lp gi tr 3000 mili giy th hm ReceiveFrom() s i d liu trong 3 giy, sau 3 giy nu khng c d liu c th n s pht sinh ra bit l do ta phi t hm ny trong khi try catch x l bit l. XXXVIIIiu khin vic truyn li cc gi tin C nhiu l do cc gi tin UDP khng th n c ch, c th ln u tin gi khng ti c ch nhng khi gi li ln th hai, ba th ti c ch. Hu ht cc ng dng udp u cho php gi li cc gi tin mt s ln trc khi loi b n. Khi gi
Trang 75

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

mt gi tin m khng c thng ip tr v, chng ta c th gi li thng ip ban u nhiu ln, nu sau khi gi li mt s ln thng ip n c ch th ta tip tc vi phn cn li ca chng trnh ngc li ta s pht sinh ra mt thng bo li. Cch n gin nht thc hin vic truyn li l to ra mt phng thc ring trong lp iu khin tt c vic gi v nhn cc thng ip. Cc bc thc hin nh sau: 1) Gi mt thng ip n my xa 2) Ch cu tr li t my xa 3) Nu cu tr li c nhn, chp nhn n v thot khi phng thc vi d liu nhn v kch thc ca d liu. 4) Nu khng nhn c cu tr li no trong khong thi gian time-out, tng bin m th ln 5) Kim tra bin m th, nu n nh hn s ln nh ngha trc th quay li bc 1, nu n bng s ln nh ngha trc, khng truyn li na v thng bo li. Mt khi phng thc gi v nhn cc gi tin udp c to ra, n c th c dng bt c u trong chng trnh ni c d liu c gi ti thit b xa v ch cu tr li. Phng thc ny c ci t nh sau:
private int SndRcvData(Socket s, byte[] message, EndPoint rmtdevice) { int recv; int retry = 0; while (true) { Console.WriteLine("Truyen lai lan thu: #{0}", retry); try { s.SendTo(message, message.Length, SocketFlags.None, rmtdevice); data = new byte[1024]; recv = s.ReceiveFrom(data, ref Remote); } catch (SocketException) { recv = 0;

Trang 76

Khoa Cng Ngh Thng Tin


} if (recv > 0) { return recv; } else { retry++; if (retry > 4) { return 0; } }

Gio trnh Lp Trnh Mng

Phng thc ny yu cu ba tham s: Mt i tng socket c thnh lp Mng d liu cha thng ip gi ti thit b xa Mt i tng EndPoint cha a ch IP v port ca thit b xa i tng Socket c truyn vo phng thc trn phi c khi to trc v gi tr ReceiveTimeout c thit lp mt khong thi gian ch cu tr li t thit b xa. Phng thc SndRcvData() u tin gi d liu n thit b xa dng phng thc SendTo() truyn thng. Sau khi gi thng ip, phng thc SndRcvData() s block phng thc ReceiveFrom() v ch thng ip tr v. Nu thng ip c nhn t thit b xa trong khong gi tr ReceiveTimeout th phng thc SndRcvData() s t d liu vo mng byte c nh ngha trong lp v tr v s byte c c. Nu khng c thng ip tr v vo lc kt thc gi tr ReceiveTimeout, mt bit l s c pht ra v khi catch c x l. Trong khi catch, gi tr recv c thit lp v 0. Sau khi try-catch, gi tr recv s c kim tra. Nu gi tr l s dng th thng ip c nhn thnh cng, nu l s 0 th khng c thng ip no c nhn v gi tr ny c tng ln, sau kim tra n t ti gi tr ti a hay cha, nu cha t ti gi tr ti a ton b qu trnh s c lp li v bt u gi li thng ip, nu ti gi tr ti a ri th phng thc SndRcvData() s tr v 0.
Trang 77

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Chng trnh RetryUdpClient


using System; using System.Net; using System.Net.Sockets; using System.Text; class RetryUdpClient { private byte[] data = new byte[1024]; private static IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); private static EndPoint Remote = (EndPoint)sender; private int SndRcvData(Socket s, byte[] message, EndPoint rmtdevice) { int recv; int retry = 0; while (true) { Console.WriteLine("Truyen lai lan thu: #{0}", retry); try { s.SendTo(message, message.Length, SocketFlags.None, rmtdevice); data = new byte[1024]; recv = s.ReceiveFrom(data, ref Remote); } catch (SocketException) { recv = 0; } if (recv > 0) { return recv; } else { retry++; if (retry > 4) { return 0; } } } } public RetryUdpClient() {

Trang 78

Khoa Cng Ngh Thng Tin


string input, stringData; int recv;

Gio trnh Lp Trnh Mng

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); int sockopt = (int)server.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout); Console.WriteLine("Gia tri timeout mac dinh: {0}", sockopt); server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); sockopt = (int)server.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout); Console.WriteLine("Gia tri timeout moi: {0}", sockopt); string welcome = "Xin chao Server"; data = Encoding.ASCII.GetBytes(welcome); recv = SndRcvData(server, data, ipep); if (recv > 0) { stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } else { Console.WriteLine("Khong the lien lac voi thiet bi o xa"); return; } while (true) { input = Console.ReadLine(); if (input == "exit") break; recv = SndRcvData(server, Encoding.ASCII.GetBytes(input), ipep); if (recv > 0) { stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } else Console.WriteLine("Khong nhan duoc cau tra loi"); } Console.WriteLine("Dang dong client"); server.Close(); }

Trang 79

Khoa Cng Ngh Thng Tin


public static void Main() { RetryUdpClient ruc = new RetryUdpClient(); } }

Gio trnh Lp Trnh Mng

Trang 80

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XXXIXCHNG

IV: S DNG CC LP HELPER CA C# SOCKET

XLLp TCP Client Lp TcpClient nm namespace System.Net.Sockets c thit k h tr cho vic vit cc ng dng TCP Client c d dng. Lp TcpClient cho php to ra mt i tng Tcp Client s dng mt trong ba phng thc to lp sau: TcpClient(): l phng thc to lp u tin, i tng c to ra bi phng thc to lp ny s gn kt vi mt a ch cc b v mt port TCP ngu nhin. Sau khi i tng TcpClient c to ra, n phi c kt ni n thit b xa thng qua phng thc Connect() nh v d di y:
TcpClient newcon = new TcpClient(); newcon.Connect("192.168.6.1", 8000);

TcpClient(IPEndPoint localEP): phng thc to lp ny cho php chng ta ch ra a ch IP cc b cng vi port c dng. y l phng thc to lp thng c s dng khi thit b c nhiu hn mt card mng v chng ta mun d liu c gi trn card mng no. Phng thc Connect() cng c dng kt ni vi thit b xa:
IPEndPoint iep = new IPEndPoint(IPAddress,Parse("192.168.6.1"), 8000); TcpClient newcon = new TcpClient(iep); newcon.Connect("192.168.6.2", 8000);

TcpClient(String host, int port): phng thc to lp th ba ny thng c s dng nht, n cho php ch ra thit b nhn trong phng thc to lp v khng cn phi dng phng thc Connect(). a ch ca thit b xa c th l mt chui hostname hoc mt chui a ch IP. Phng thc to lp ca TcpClient s t ng phn gii hostname thnh a ch IP. V d:
TcpClient newcon = new TcpClient("www.isp.net", 8000);

Mi khi i tng TcpClient c to ra, nhiu thuc tnh v phng thc c th c dng x l vic truyn d liu qua li gia cc thit b.

Trang 81

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng Thc Close() Connect() Equals() GetHashCode() GetStream() GetType() ToString()

M T ng kt ni TCP Thnh lp kt ni TCP vi thit b xa So snh hai i tng TcpClient Ly m hash code Ly i tng Stream n c th dng gi v nhn d liu Ly kiu ca th hin hin ti Chuyn th hin hin ti sang kiu chui

Phng thc Connect() dng kt ni i tng TcpClient n thit b xa. Mi khi kt ni c thnh lp, phng thc GetStream() gn mt i tng NetworkStream gi v nhn d liu nh vo phng thc Read() v Write(). Lp TcpClient cn c nhiu thuc tnh c m t trong bng sau: Thuc Tnh LingerState NoDelay ReceiveBufferSize ReceiveTimeout SendBufferSize SendTimeout M T Ly hoc thit lp thi gian kt ni TCP vn cn sau khi gi phng thc Close() Ly hoc thit lp thi gian tr c dng gi hoc nhn b m TCP Ly hoc thit lp kch thc b m TCP nhn Ly hoc thit lp thi gian timeout ca Socket Ly hoc thit lp kch thc b m TCP gi Ly hoc thit lp gi tr timeout ca Socket

Chng trnh TCPClient n gin


using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpClientSample { public static void Main() { byte[] data = new byte[1024]; string input, stringData; TcpClient server;

Trang 82

Khoa Cng Ngh Thng Tin


try {

Gio trnh Lp Trnh Mng

server = new TcpClient("127.0.0.1", 5000); } catch (SocketException) { Console.WriteLine("Khong the ket noi den server"); return; } NetworkStream ns = server.GetStream(); int recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); while (true) { input = Console.ReadLine(); if (input == "exit") break; ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); ns.Flush(); data = new byte[1024]; 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.Close(); } }

Trong chng trnh trn phng thc to lp s t ng kt ni n Server c ch ra xa, n nn c t trong khi try-catch phng trng hp Server khng hp l. Sau khi i tng NetworkStream c to ra, ta c th dng phng thc Read() v Write() nhn v gi d liu:
Trang 83

Khoa Cng Ngh Thng Tin


while (true) { input = Console.ReadLine(); if (input == "exit") break;

Gio trnh Lp Trnh Mng

ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); ns.Flush(); data = new byte[1024]; recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData); }

Phng thc Read() yu cu 3 tham s: Mng cc byte t d liu nhn vo V tr offset trong b m m ti ta mun t d liu Chiu di ca b m d liu Cng ging nh phng thc Receive() ca Socket, phng thc Read() s c mt lng d liu c ln ti a ng bng ln b m. Nu b m qu nh, phn d liu cn li s nm trong stream v i ln gi phng thc Read() tip theo. Phng thc Write() cng yu cu ba tham s: Mng cc byte gi d liu V tr offset trong b m m ti ta mun gi d liu Chiu di ca d liu c gi Cn ch rng TCP khng bo v cc bin thng ip. iu ny cng p dng cho lp TcpClient, do ta cn phi x l vn bin thng ip ging nh phng thc Receive() ca lp Socket bng cch to ra vng lp m bo tt c d liu u c c t stream. Ta c th test chng trnh ny vi chng trnh TCP Server n gin phn trn. XLILp TCPListener

Trang 84

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Cng ging nh lp TcpClient, lp TcpListener cng cho php chng ta to ra cc chng trnh TCP Server mt cch n gin Lp TcpListener c ba phng thc to lp: TcpListener(int port): gn mt i tng TcpListener vo mt port c ch ra trn my cc b. TcpListener(IPEndPoint ie): gn mt i tng TcpListener vo mt i tng EndPoint cc b TcpListener(IPAddress addr, int port): gn mt i tng TcpListener vo mt i tng IPAddress v mt port Khng ging nh lp TcpClient, cc phng thc to lp ca lp TcpListener yu cu t nht mt tham s: s port m Server lng nghe kt ni. Nu Server c nhiu card mng v ta mun lng nghe trn mt card mng no th ta c th dng mt i tng IPEndPoint ch ra a ch IP ca card cng vi s port dng lng nghe. Lp TcpListener c mt s phng thc sau: Phng Thc AcceptSocket() AcceptTcpClient() Equals() GetHashCode() GetType() Pending() Start() Stop() ToString() M T Chp nhn kt ni trn port v gn kt ni cho mt i tng Socket Chp nhn kt ni trn port v gn kt ni cho mt i tng TCPClient So snh hai i tng TcpListener Ly hash code Ly kiu ca th hin hin ti Kim tra xem c yu cu ang ch kt ni hay khng Bt u lng nghe kt ni Ngng lng nghe kt ni Chuyn i tng TcpListener thnh chui

Phng thc Start() tng t nh phng thcBind() v Listen() c dng lp socket. Phng thc Start() kt ni Socket n EndPoint c nh ngha phng thc to lp ca lp TcpListener v t TCP port vo ch lng nghe, sng sng chp nhn kt ni. Phng thc AcceptTcpClient() c th so snh vi phng thc Accept() ca Socket, chp nhn kt ni v gn n cho mt i tng TcpClient.

Trang 85

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Sau khi i tng TcpClient c to ra, tt c cc truyn thng vi thit b xa c thc hin vi i tng TcpClient mi ch khng phi vi i tng TcpListener ban u, do i tng TcpListener c th c dng chp nhn kt ni khc. ng i tng TcpListener ta dng phng thc Stop(). Chng trnh TCPListener
using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpListenerSample { public static void Main() { int recv; byte[] data = new byte[1024]; TcpListener newsock = new TcpListener(5000); newsock.Start(); Console.WriteLine("Dan cho client ket noi den..."); TcpClient client = newsock.AcceptTcpClient(); NetworkStream ns = client.GetStream(); string welcome = "Hello Client"; 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; Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); ns.Write(data, 0, recv); } ns.Close(); client.Close(); newsock.Stop(); } }

Trang 86

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Chng trnh TcpListenerSample u tin to ra mt i tng TcpListener, s dng port 5000 v dng phng thc Start() t i tng mi to ra vo ch lng nghe. Sau phng thc AcceptTcpClient() ch kt ni TCP n v gn kt ni n ny vo mt i tng TcpClient:
TcpListener newsock = new TcpListener(5000); newsock.Start(); Console.WriteLine("Dan cho client ket noi den..."); TcpClient client = newsock.AcceptTcpClient(); NetworkStream ns = client.GetStream();

Khi i tng TcpClient c thnh lp, mt i tng NetworkStream c gn vo truyn thng vi my xa. Tt c cc thng tin lin lc u c thc hin bng cch s dng phng thc Read() v Write() XLIILp UdpClient Lp UdpClient c to ra gip cho vic lp trnh mng vi giao thc UDP c n gin hn. Lp UdpClient c bn phng thc to lp: UdpClient(): to ra mt i tng UdpClient nhng khng gn vo bt k a ch hay port no. UdpClient(int port): gn i tng UdpClient mi to vo mt port/ UdpClient(IPEndPoint iep): gn i tng UdpClient mi to vo mt a ch Ip cc b v mt port. UdpClient(string host, int port): gn i tng UdpClient mi to vo mt a ch IP v mt port bt k v kt hp n vi mt a ch IP v port xa. Cc phng thc to lp ca lp UdpClient tng t nh cc phng thc to lp ca lp TcpClient, chng ta c th cho h thng chn port thch hp cho ng dng hoc ta c th ch ra port c dng trong ng dng. Nu ng dng UDP phi chp nhn d liu trn mt port no , ta phi nh ngha port trong phng thc to lp ca lp UdpClient. Mt s phng thc ca lp UdpClient: Phng Thc Close() M T ng Socket bn di
Trang 87

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng Thc Connect() DropMulticastGroup() Equals() GetHashCode() GetType() JoinMulticastGroup() Receive() Send() ToString()

M T Cho php ch ra IP endpoint xa gi v nhn d liu G b Socket t 1 nhm UDP multicast So snh hai i tng UdpClient Ly hash code Ly kiu ca i tng hin ti Thm Socket vo mt nhm UDP multicast Nhn d liu t Socket Gi d liu n thit b xa t Socket Chuyn i tng UdpClient thnh chui

C nhiu ch khc nhau gia phng thc Send(), Receive() ca lp UdpClient v phng thc SendTo(), ReceiveFrom() ca Socket. Phng thc Receive() Lp UdpClient s dng phng thc Receive() chp nhn cc gi tin trn mt card mng v mt port. Ch c mt cch s dng ca phng thc Receive():
byte[] Receive(ref IPEndPoint iep)

Khi d liu c nhn t Socket, n khng t vo mng byte trong phng thc nh trong phng thc ReceiveFrom() m n s tr v mt mng byte. S khc nhau th hai l phng thc ReceiveFrom() t thng tin ca my xa vo mt i tng EndPoint cn phng thc Receive() t thng tin ca my xa vo mt i tng IPEndPoint, vic ny c th lm cho lp trnh vin cm thy d lp trnh hn. Khi nhiu d liu c nhn hn kch thc b m, thay v pht sinh ra mt bit l nh trong phng thc ReceiveFrom() ca Socket, UdpClient t v mt b m d liu ln cha d liu nhn y l mt tnh nng rt hay ca phng thc Receive(). Phng thc Send() Phng thc Send() c ba qu ti hm gi d liu ti thit b xa: Send(byte[] data, int sz): gi mt mng d liu vi kch thc l sz n thit b xa mc nh. dng qu ti hm ny, ta phi ch ra thit b xa mc nh bng cch hoc s dng phng thc to lp ca lp UdpClient hoc dng phng thc Connect().
Trang 88

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Send(byte[] data, int sz, IPEndPoint iep): cho php gi mng d liu c kch thc sz n thit b xa c ch ra bi iep. Send(byte[] data, int sz, string host, int port): gi mng d liu kch thc sz n my xa v port c ch ra. Chng trnh UdpClient Server
using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpSrvrSample { public static void Main() { byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000); UdpClient newsock = new UdpClient(ipep); Console.WriteLine("Dang cho client ket noi den..."); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); data = newsock.Receive(ref sender); Console.WriteLine("Thong diep duoc nhan tu {0}:", sender.ToString()); Console.WriteLine(Encoding.ASCII.GetString(data, 0, data.Length)); string welcome = "Xin chao client"; data = Encoding.ASCII.GetBytes(welcome); newsock.Send(data, data.Length, sender); while (true) { data = newsock.Receive(ref sender); Console.WriteLine(Encoding.ASCII.GetString(data, 0, data.Length)); newsock.Send(data, data.Length, sender); } } }

Chng trnh UdpClient Client


using System; using System.Net; using System.Net.Sockets; using System.Text; class UdpClientSample {

Trang 89

Khoa Cng Ngh Thng Tin


public static void Main() { byte[] data = new byte[1024]; string input, stringData;

Gio trnh Lp Trnh Mng

UdpClient server = new UdpClient("127.0.0.1", 5000); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); string welcome = "Xin chao server"; data = Encoding.ASCII.GetBytes(welcome); server.Send(data, data.Length); data = server.Receive(ref sender); Console.WriteLine("Thong diep duoc nhan tu {0}:", sender.ToString()); stringData = Encoding.ASCII.GetString(data, 0, data.Length); Console.WriteLine(stringData); while (true) { input = Console.ReadLine(); if (input == "exit") break; server.Send(Encoding.ASCII.GetBytes(input), input.Length); data = server.Receive(ref sender); stringData = Encoding.ASCII.GetString(data, 0, data.Length); Console.WriteLine(stringData); } Console.WriteLine("Dang dong client"); server.Close(); } }

Trang 90

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XLIIICHNG

V: A NHIM TIU TRNH

XLIVKhi nim tin trnh v tiu trnh ca Windows Tin trnh l mt th hin ca chng trnh ang hat ng. Mt tin trnh lun s hu mt khng gian a ch c kch thc 4GB cha m chng trnh, cc d liu, s hu ti nguyn ca h thng nh tp tin, i tng ng b ha.... Mi tin trnh khi mi to lp u ch c mt tiu trnh chnh nhng sau c th to lp nhiu tin trnh khc. Tiu trnh l mt thnh phn n v ca tin trnh c th thc hin cc ch th ng vi mt an m no ca chng trnh. H iu hnh Windows cho php cc tiu trnh hat ng c lp v t chc iu phi (lp lch tin trnh) CPU cc tiu trnh hat ng ng thi. H iu hnh phn chia thi gian s dng CPU cho mi tin trnh rt mn theo kiu xoay vng. Mi tiu trnh c th c 1 trong 3 trng thi : Running, Ready, Blocked. Cc tiu trnh trong mt tin trnh c th cng truy xut n cc bin ton cc ca tin trnh. XLVM hnh

Bien toan cuc tien trnh Heap cua tien trnh Bien moi trng tien trnh Stack tieu trnh 1 Tieu trnh 1 Stack tieu trnh 2 Tieu trnh 2 T4 T5

T2 T3

T1

T14 T13 T12

CPU T11 T10 T6 T7 T8 T9

Cc ng dng ci t theo m hnh a tin trnh hay a tiu trnh u phi i din vi cc vn sau : - H thng tiu th thm b nh lu tr cc cu trc m t tin trnh hay tiu trnh.
Trang 91

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

- H thng tn thm thi gian theo vt chng trnh, qun l cc tiu trnh. - Nhiu tin trnh tranh chp ti nguyn dng chung i hi thc hin ng b ha. XLVICc k thut trong .NET to tiu trnh Th vin lp .NET Framework cung cp mt s phng php to tiu trnh mi: Thc thi mt phng phc bng tiu trnh trong Thread-pool Thc thi phng thc mt cch bt ng b Thc thi mt phng thc bng tiu trnh theo chu k hay mt thi im xc nh Thc thi phng thc bng cch ra hiu i tng WaitHandle XLVIITo tiu trnh trong Thread-pool Cch to: Khai bo mt phng thc cha m lnh cn thc thi Phng thc ny phi tr v void v ch nhn mt i s. To mt th hin ca y nhim System.Threading.WaitCallback tham chiu n phng thc ny. Gi phng thc tnh QueueUserWorkItem ca lp System.Threading.ThreadPool, Truyn th hin y nhim to lm i s. B thc thi s xp th hin y nhim ny vo hng i v thc thi n khi mt tiu trnh trong thread-pool sn sng. V d thc thi mt phng thc c tn l DisplayMessage: Truyn DisplayMessage n thread-pool hai ln Ln u khng c i s Ln sau c i s l i tng MessageInfo Chng trnh ThreadPoolExample
using System; using System.Threading; // Lp dng truyn d liu cho phng thc DisplayMessage

Trang 92

Khoa Cng Ngh Thng Tin


// khi n c thc thi bng thread-pool. public class MessageInfo { private int iterations; private string message;

Gio trnh Lp Trnh Mng

// Phng thc khi dng nhn cc thit lp cu hnh cho tiu trnh. public MessageInfo(int iterations, string message) { this.iterations = iterations; this.message = message; } // Cc thuc tnh dng ly cc thit lp cu hnh. public int Iterations { get { return iterations; } } public string Message { get { return message; } } } public class ThreadPoolExample { // Hin th thng tin ra ca s Console. public static void DisplayMessage(object state) { // p i s state sang MessageInfo. MessageInfo config = state as MessageInfo; // Nu i s config l null, khng c i s no truyn cho phng thc // ThreadPool.QueueUserWorkItem; // s dng cc gi tr mc nh. if (config == null) { // Hin th mt thng bo ra ca s Console ba ln. for (int count = 0; count < 3; count++) { Console.WriteLine("A thread-pool example."); // Vo trng thi ch, dng cho mc ch minh ha. // Trnh a cc tiu trnh ca thread-pool // vo trng thi ch trong cc ng dng thc t. Thread.Sleep(1000); } } else { // Hin th mt thng bo c ch nh trc // vi s ln cng c ch nh trc. for (int count = 0; count < config.Iterations; count++)

Trang 93

Khoa Cng Ngh Thng Tin


{ Console.WriteLine(config.Message);

Gio trnh Lp Trnh Mng

// Vo trng thi ch, dng cho mc ch minh ha. // Trnh a cc tiu trnh ca thread-pool // vo trng thi ch trong cc ng dng thc t. Thread.Sleep(1000); } } } public static void Main() { // To mt i tng y nhim, cho php chng ta // truyn phng thc DisplayMessage cho thread-pool. WaitCallback workMethod = new WaitCallback(ThreadPoolExample.DisplayMessage); // Thc thi DisplayMessage bng thread-pool (khng c i s). ThreadPool.QueueUserWorkItem(workMethod); // Thc thi DisplayMessage bng thread-pool (truyn mt // i tng MessageInfo cho phng thc DisplayMessage). MessageInfo info = new MessageInfo(5, "A thread-pool example with arguments."); ThreadPool.QueueUserWorkItem(workMethod, info); // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

Tnh hung s dng: Khi mt tiu trnh trong thread-pool sn sng, n nhn cng vic k tip t hng i v thc thi cng vic ny. Khi hon tt cng vic, thay v kt thc, tiu trnh ny quay v thread-pool v nhn cng vic k tip t hng i. Vic s dng thread-pool gip n gin ha vic lp trnh h-tr-a-tiu-trnh. Tuy nhin, cn lu khi quyt nh s dng thread-pool, cn xem xt cc im sau: - Khng nn s dng thread-pool thc thi cc tin trnh chy trong mt thi gian di. V s tiu trnh trong thread-pool l c gii hn. c bit, trnh t cc tiu trnh trong thread-pool vo trng thi i trong mt thi gian qu di.

Trang 94

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

- Khng th iu khin lch trnh ca cc tiu trnh trong thread-pool, cng nh khng th thay i u tin ca cc cng vic. Thread-pool x l cc cng vic theo th t thm chng vo hng i. XLVIIITo tiu trnh bt ng b Khi cho gi mt phng thc,thng thc hin mt cch ng b; ngha l m lnh thc hin li gi phi i vo trng thi dng (block) cho n khi phng thc c thc hin xong. Trong mt s trng hp, cn thc thi phng thc mt cch bt ng b; ngha l cho thc thi phng thc ny trong mt tiu trnh ring trong khi vn tip tc thc hin cc cng vic khc. Sau khi phng thc hon tt, cn ly tr tr v ca n . Nguyn tc hot ng: NET Framework h tr ch thc thi bt ng b, cho php thc thi bt k phng thc no mt cch bt ng b bng mt y nhim. Khi khai bo v bin dch mt y nhim, trnh bin dch s t ng sinh ra hai phng thc h tr ch thc thi bt ng b: BeginInvoke v EndInvoke. Khi gi phng thc BeginInvoke ca mt th hin y nhim, phng thc c tham chiu bi y nhim ny c xp vo hng i thc thi bt ng b. Quyn kim sot qu trnh thc thi c tr v cho m gi BeginInvoke ngay sau , v phng thc c tham chiu s thc thi trong ng cnh ca tiu trnh sn sng trc tin trong thread-pool. Cc bc thc hin: Khai bo mt y nhim c ch k ging nh phng thc cn thc thi. To mt th hin ca y nhim tham chiu n phng thc ny. Gi phng thc BeginInvoke ca th hin y nhim thc thi phng thc S dng phng thc EndInvoke kim tra trng thi ca phng thc cng nh thu ly tr tr v ca n nu hon tt . Cc i s ca phng thc BeginInvoke gm cc i s c ch nh bi y nhim, cng vi hai i s dng khi phng thc thc thi bt ng b kt thc: Mt th hin ca y nhim System.AsyncCallback tham chiu n phng thc m b thc thi s gi khi phng thc thc thi bt ng b
Trang 95

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

kt thc. Phng thc ny s c thc thi trong ng cnh ca mt tiu trnh trong thread-pool. Truyn gi tr null cho i s ny ngha l khng c phng thc no c gi v phi s dng mt c ch khc xc nh khi no phng thc thc thi bt b kt thc. Mt tham chiu i tng m b thc thi s lin kt vi qu trnh thc thi bt ng b. Phng thc thc thi bt ng b khng th s dng hay truy xut n i tng ny, nhng m lnh c th s dng n khi phng thc ny kt thc, cho php lin kt thng tin trng thi vi qu trnh thc thi bt ng b. V d, i tng ny cho php nh x cc kt qu vi cc thao tc bt ng b c khi to trong trng hp khi to nhiu thao tc bt ng b nhng s dng chung mt phng thc callback x l vic kt thc. Phng thc EndInvoke cho php ly tr tr v ca phng thc thc thi bt ng b, nhng trc ht phi xc nh khi no n kt thc. C bn k thut dng xc nh mt phng thc thc thi bt ng b kt thc hay cha: Blocking: dng qu trnh thc thi ca tiu trnh hin hnh cho n khi phng thc thc thi bt ng b kt thc. iu ny rt ging vi s thc thi ng b. Tuy nhin, nu linh hot chn thi im chnh xc a m lnh vo trng thi dng (block) th vn cn c hi thc hin thm mt s vic trc khi m lnh i vo trng thi ny. Polling: lp i lp li vic kim tra trng thi ca phng thc thc thi bt ng b xc nh n kt thc hay cha. y l mt k thut rt n gin, nhng nu xet v mt x ly thi khng c hiu qua. Nn trnh cc vng lp cht lm lng ph thi gian ca b x l; tt nht l nn t tiu trnh thc hin polling vo trng thi ngh (sleep) trong mt khong thi gian bng cch s dng Thread.Sleep gia cc ln kim tra trng thi. Bi ky thut polling oi hoi phai duy tri mt vong lp nn hoat ng cua tiu trnh ch se bi gii han, tuy nhin co th d dang cp nht tin cng vic Waiting: s dng mt i tng dn xut t lp System.Threading.WaitHandle bo hiu khi phng thc thc thi bt ng b kt thc. Waiting l mt ci tin ca k thut polling, n cho phpch nhiu phng thc thc thi bt ng b kt thc.
Trang 96

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

C th ch nh cc gi tr time-out cho php tiu trnh thc hin waiting dng li nu phng thc thc thi bt ng b din ra qu lu, hoc mun cp nht nh k b ch trng thi. Callback: Callback l mt phng thc m b thc thi s gi khi phng thc thc thi bt ng b kt thc. M lnh thc hin li gi khng cn thc hin bt k thao tc kim tra no, nhng vn c th tip tc thc hin cc cng vic khc. Callback rt linh hot nhng cng rt phc tp, c bit khi c nhiu phng thc thc thi bt ng b chy ng thi nhng s dng cng mt callback. Trong nhng trng hp nh th, phi s dng cc i tng trng thi thch hp so trng cc phng thc hon tt vi cc phng thc khi to. V d: Lp AsyncExecutionExample trong m t c ch thc thi bt ng b. N s dng mt y nhim c tn l AsyncExampleDelegate thc thi bt ng b mt phng thc c tn l LongRunningMethod. Phng thc LongRunningMethod s dng Thread.Sleep m phng mt phng thc c thi gian thc thi di:
// y nhim cho php bn thc hin vic thc thi bt ng b //ca AsyncExecutionExample.LongRunningMethod. public delegate DateTime AsyncExampleDelegate(int delay, string name); // Phng thc c thi gian thc thi di. public static DateTime LongRunningMethod(int delay, string name) { Console.WriteLine("{0} : {1} example - thread starting.", DateTime.Now.ToString("HH:mm:ss.ffff"), name); // M phng vic x l tn nhiu thi gian. Thread.Sleep(delay); Console.WriteLine("{0}:{1}examplethread finishing.", DateTime.Now.ToString("HH:mm:ss.ffff"), name); // Tr v thi gian hon tt phng thc. return DateTime.Now; }

Trang 97

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

AsyncExecutionExample cha 5 phng thc din t cc cch tip cn khc nhau v vic kt thc phng thc thc thi bt ng b. XLVIII.1.1.1. Phng thc BlockingExample Phng thc BlockingExample thc thi bt ng b phng thc LongRunningMethod v tip tc thc hin cng vic ca n trong mt khong thi gian. Khi x l xong cng vic ny, BlockingExample chuyn sang trang thi dng (block) cho n khi phng thc LongRunningMethod kt thc. vo trng thi dng, BlockingExample thc thi phng thc EndInvoke ca th hin y nhim AnsyncExampleDelegate. Nu phng thc LongRunningMethod kt thc, EndInvoke tr v ngay lp tc, nu khng, BlockingExample chuyn sang trng thi dng cho n khi phng thc LongRunningMethod kt thc.
public static void BlockingExample() { Console.WriteLine(Environment.NewLine + "*** Running Blocking Example ***"); // Gi LongRunningMethod mt cch bt ng b. Truyn null cho // c y nhim callback v i tng trng thi bt ng b. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Blocking", null, null); // Thc hin cng vic khc cho n khi // sn sng i vo trng thi dng. for (int count = 0; count < 3; count++) { Console.WriteLine("{0} : Continue processing until " + "ready to block...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } // i vo trng thi dng cho n khi phng thc // thc thi bt ng b kt thc v thu ly kt qu. Console.WriteLine("{0} : Blocking until method is complete...", DateTime.Now.ToString("HH:mm:ss.ffff"));

Trang 98

Khoa Cng Ngh Thng Tin


DateTime completion =

Gio trnh Lp Trnh Mng

longRunningMethod.EndInvoke(asyncResult); // Hin th thng tin kt thc. Console.WriteLine("{0} : Blocking example complete.", completion.ToString("HH:mm:ss.ffff")); }

XLVIII.1.1.2. Phng thc PollingExample Phng thc PollingExample thc thi bt ng b phng thc LongRunningMethod v sau thc hin vng lp polling cho n khi LongRunningMethod kt thc. PollingExample kim tra thuc tnh IsComplete ca th hin IAsyncResult (c tr v bi BeginInvoke) xc nh phng thc LongRunningMethod kt thc hay cha, nu cha, PollingExample s gi Thread.Sleep.
public static void PollingExample() { Console.WriteLine(Environment.NewLine + " Running Polling Example"); // Gi LongRunningMethod mt cch bt ng b. Truyn null cho // c y nhim callback v i tng trng thi bt ng b. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Polling", null, null); // Thc hin polling kim tra phng thc thc thi // bt ng b kt thc hay cha. Nu cha kt thc th i vo // trng thi ch trong 300 mini-giy trc khi thc hin polling ln na. Console.WriteLine("{0} : Poll repeatedly until method is complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while (! asyncResult.IsCompleted) { Console.WriteLine("{0} : Polling...",

Trang 99

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(300); } // Thu ly kt qu ca phng thc thc thi bt ng b. DateTime completion = longRunningMethod.EndInvoke(asyncResult); // Hin th thng tin kt thc. Console.WriteLine("{0} : Polling example complete.", completion.ToString("HH:mm:ss.ffff")); }

XLVIII.1.1.3. Phng thc WaitingExample Phng thc WaitingExample thc thi bt ng b phng thc LongRunningExample v sau ch cho n khi LongRunningMethod kt thc. WaitingExample s dng thuc tnh AsyncWaitHandle ca th hin IAsyncResult (c tr v bi BeginInvoke) c c mt WaitHandle. Gi phng thc WaitOne ca WaitHandle. Vic s dng gi tr time-out cho php WaitingExample dng qu trnh i thc hin cng vic khc hoc dng hon ton nu phng thc thc thi bt ng b din ra qu lu.
public static void WaitingExample() { Console.WriteLine(Environment.NewLine + "*** Running Waiting Example ***"); // Gi LongRunningMethod mt cch bt ng b. Truyn null cho // c y nhim callback v i tng trng thi bt ng b. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Waiting", null, null); // i phng thc thc thi bt ng b kt thc. // Time-out sau 300 mili-giy v hin th trng thi ra // ca s Console trc khi tip tc i. Console.WriteLine("{0} : Waiting until method is complete...", DateTime.Now.ToString("HH:mm:ss.ffff"));

Trang 100

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

while (!asyncResult.AsyncWaitHandle.WaitOne(300, false)) { Console.WriteLine("{0} : Wait timeout...", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Thu ly kt qu ca phng thc thc thi bt ng b. DateTime completion = longRunningMethod.EndInvoke(asyncResult); // Hin th thng tin kt thc. Console.WriteLine("{0} : Waiting example complete.", completion.ToString("HH:mm:ss.ffff")); }

XLVIII.1.1.4. Phng thc WaitAllExample Phng thc WaitAllExample thc thi bt ng b phng thc LongRunningMethod nhiu ln v sau s dng mng cc i tng WaitHandle i cho n khi tt c cc phng thc kt thc.
public static void WaitAllExample() { Console.WriteLine(Environment.NewLine + "*** Running WaitAll Example ***"); // Mt ArrayList cha cc th hin IAsyncResult // cho cc phng thc thc thi bt ng b. ArrayList asyncResults = new ArrayList(3); // Gi ba ln LongRunningMethod mt cch bt ng b. // Truyn null cho c y nhim callback v i tng // trng thi bt ng b. Thm th hin IAsyncResult // cho mi phng thc vo ArrayList. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); asyncResults.Add(longRunningMethod.BeginInvoke(3000, "WaitAll 1", null, null)); asyncResults.Add(longRunningMethod.BeginInvoke(2500, "WaitAll 2", null, null)); asyncResults.Add(longRunningMethod.BeginInvoke(1500, "WaitAll 3", null, null)); // To mt mng cc i tng WaitHandle, // s c s dng i tt c cc phng thc

Trang 101

Khoa Cng Ngh Thng Tin


// thc thi bt ng b kt thc.

Gio trnh Lp Trnh Mng

WaitHandle[] waitHandles = new WaitHandle[3]; for (int count = 0; count < 3; count++) { waitHandles[count] = ((IAsyncResult)asyncResults[count]).AsyncWaitHandle; } // i c ba phng thc thc thi bt ng b kt thc. // Time-out sau 300 mili-giy v hin th trng thi ra // ca s Console trc khi tip tc i. Console.WriteLine("{0} : Waiting until all 3 methods are complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while (! WaitHandle.WaitAll(waitHandles, 300, false)) { Console.WriteLine("{0} : WaitAll timeout...", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Kim tra kt qu ca mi phng thc v xc nh // thi gian phng thc cui cng kt thc. DateTime completion = DateTime.MinValue; foreach (IAsyncResult result in asyncResults) { DateTime time = longRunningMethod.EndInvoke(result); if (time > completion) completion = time; } // Hin th thng tin kt thc. Console.WriteLine("{0} : WaitAll example complete.", completion.ToString("HH:mm:ss.ffff")); }

XLVIII.1.1.5. Phng thc CallbackExample Phng thc CallbackExample thc thi bt ng b phng thc LongRunningMethod v truyn mt th hin y nhim AsyncCallback (tham chiu n phng thc CallbackHandler) cho phng thc BeginInvoke. Phng thc CallbackHandler s c gi mt cch t ng khi phng thc LongRunningMethod kt thc. Kt qu l phng thc CallbackExample vn tip tc thc hin cng vic.
public static void CallbackExample() {

Trang 102

Khoa Cng Ngh Thng Tin


Console.WriteLine(Environment.NewLine +

Gio trnh Lp Trnh Mng

"*** Running Callback Example ***"); // Gi LongRunningMethod mt cch bt ng b. Truyn mt // th hin y nhim AsyncCallback tham chiu n // phng thc CallbackHandler. CallbackHandler s // t ng c gi khi phng thc thc thi bt ng b // kt thc. Truyn mt tham chiu n th hin y nhim // AsyncExampleDelegate nh mt trng thi bt ng b; // nu khng, phng thc callback khng th truy xut // th hin y nhim gi EndInvoke. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Callback", new AsyncCallback(CallbackHandler), longRunningMethod); // Tip tc vi cng vic khc. for (int count = 0; count < 15; count++) { Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } } // Phng thc x l vic kt thc bt ng b bng callbacks.public static void CallbackHandler(IAsyncResult result) { // Trch tham chiu n th hin AsyncExampleDelegate // t th hin IAsyncResult. AsyncExampleDelegate longRunningMethod = (AsyncExampleDelegate)result.AsyncState; // Thu ly kt qu ca phng thc thc thi bt ng b. DateTime completion = longRunningMethod.EndInvoke(result); // Hin th thng tin kt thc. Console.WriteLine("{0} : Callback example complete.", completion.ToString("HH:mm:ss.ffff"));
}

Trang 103

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

XLIXThc thi phng thc bng Timer K thut ny gip thc thi mt phng thc trong mt tiu trnh ring theo chu k hay mt thi im xc nh. Thng thng, rt hu ch khi thc thi mt phng thc mt thi im xc nh hay nhng thi khong xc nh. V d, cn sao lu d liu lc 1:00 AM mi ngy hay xa vng m d liu mi 20 pht. Lp Timer gip vic nh thi thc thi mt phng thc tr nn d dng, cho php thc thi mt phng thc c tham chiu bi y nhim TimerCallback nhng thi khong nht nh. Phng thc c tham chiu s thc thi trong ng cnh ca mt tiu trnh trong thread-pool. Cch thc hin Khai bo mt phng thc tr v void v ch nhn mt i tng lm i s. Sau , to mt th hin y nhim System.Threading.TimerCallback tham chiu n phng thc ny. Tip theo, to mt i tng System.Threading.Timer v truyn n cho th hin y nhim TimerCallback cng vi mt i tng trng thi m Timer s truyn cho phng thc khi Timer ht hiu lc. B thc thi s ch cho n khi Timer ht hiu lc v sau gi phng thc bng mt tiu trnh trong thread-pool. Khi to mt i tng Timer, cn ch nh hai thi khong (thi khong c th c ch nh l cc gi tr kiu int, long, uint, hay System.TimeSpan): Gi tr u tin l thi gian tr (tnh bng mili-giy) phng thc c thc thi ln u tin. Ch nh gi tr 0 thc thi phng thc ngay lp tc, v ch nh System.Threading.Timeout.Infinite to Timer trng thi cha bt u (unstarted). Gi tr th hai l khong thi gian m Timer s lp li vic gi phng thc sau ln thc thi u tin. Nu ch nh gi tr 0 hay Timeout.Infinite th Timer ch thc thi phng thc mt ln duy nht (vi iu kin thi gian tr ban u khng phi l Timeout.Infinite). i s th hai c th cung cp bng cc tr kiu int, long, uint, hay System.TimeSpan.

Trang 104

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Sau khi to i tng Timer, cng c th thay i cc thi khong c s dng bi Timer bng phng thc Change, nhng khng th thay i phng thc s c gi. Khi dng xong Timer, nn gi phng thc Timer.Depose gii phng ti nguyn h thng b chim gi bi Timer. Vic hy Timer cng hy lun phng thc c nh thi thc thi. V d Lp TimerExample di y trnh by cch s dng Timer gi mt phng thc c tn l TimerHandler. Ban u, Timer c cu hnh gi TimerHandler sau hai giy v lp li sau mt giy. V d ny cng trnh by cch s dng phng thc Timer.Change thay i cc thi khong. Chng trnh TimerExample
using System; using System.Threading; public class TimerExample { // Phng thc s c thc khi Timer ht hiu lc. // Hin th mt thng bo ra ca s Console. private static void TimerHandler(object state) { Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), state); } public static void Main() { // To mt th hin y nhim TimerCallback mi // tham chiu n phng thc tnh TimerHandler. // TimerHandler s c gi khi Timer ht hiu lc. TimerCallback handler = new TimerCallback(TimerHandler); // To mt i tng trng thi, i tng ny s c // truyn cho phng thc TimerHandler. // Trong trng hp ny, mt thng bo s c hin th. string state = "Timer expired."; Console.WriteLine("{0} : Creating Timer.", DateTime.Now.ToString("HH:mm:ss.ffff")); // To mt Timer, pht sinh ln u tin sau hai giy // v sau l mi giy. using (Timer timer = new Timer(handler, state, 2000, 1000)) {

Trang 105

Khoa Cng Ngh Thng Tin


int period;

Gio trnh Lp Trnh Mng

// c thi khong mi t Console cho n khi // ngi dng nhp 0. Cc gi tr khng hp l // s s dng gi tr mc nh l 0 (dng v d). do { try { period = Int32.Parse(Console.ReadLine()); } catch { period = 0; } // Thay i Timer vi thi khong mi. if (period > 0) timer.Change(0, period); } while (period > 0); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

LThc thi phng thc bng tiu trnh mi Thc thi m lnh trong mt tiu trnh ring, v mun kim sot hon ton qu trnh thc thi v trng thi ca tiu trnh . tng linh hot v mc kim sot khi hin thc cc ng dng h-tra-tiu-trnh, bn phi trc tip to v qun l cc tiu trnh. Lp Thread cung cp mt c ch m qua bn c th to v kim sot cc tiu trnh. Cc bc thc hin: To mt i tng y nhim ThreadStart tham chiu n phng thc cha m lnh m mun dng mt tiu trnh mi chy n. Ging nh cc y nhim khc, ThreadStart c th tham chiu n mt phng thc tnh hay phng thc ca mt i tng. Phng thc c tham chiu phi tr v void v khng c i s. To mt i tng Thread, v truyn th hin y nhim ThreadStart cho phng thc khi dng ca n. Tiu trnh mi c trng thi ban u l Unstarted (mt thnh vin thuc kiu lit k System.Threading.ThreadState). Gi thc thi phng thc Start ca i tng Thread chuyn trng thi ca n sang ThreadState.Running v bt u thc thi phng thc c tham chiu bi th hin y nhim ThreadStart.
Trang 106

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

V y nhim ThreadStart khai bo khng c i s, nn khng th truyn d liu trc tip cho phng thc c tham chiu. truyn d liu cho tiu trnh mi, cn phi cu hnh d liu l kh truy xut i vi m lnh ang chy trong tiu trnh mi. Cch tip cn thng thng l to mt lp ng gi c d liu cn cho tiu trnh v phng thc c thc thi bi tiu trnh. Khi mun chy mt tiu trnh mi, th to mt i tng ca lp ny, cu hnh trng thi cho n, v ri chy tiu trnh. V d
using System; using System.Threading; public class ThreadExample { // Cc bin gi thng tin trng thi. private int iterations; private string message; private int delay; public ThreadExample(int iterations, string message, int delay) { this.iterations = iterations; this.message = message; this.delay = delay; } public void Start() { // To mt th hin y nhim ThreadStart // tham chiu n DisplayMessage. ThreadStart method = new ThreadStart(this.DisplayMessage); // To mt i tng Thread v truyn th hin y nhim // ThreadStart cho phng thc khi dng ca n. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting new thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Khi chy tiu trnh mi. thread.Start(); } private void DisplayMessage() { // Hin th thng bo ra ca s Console vi s ln // c ch nh (iterations), ngh gia mi thng bo // mt khong thi gian c ch nh (delay).

Trang 107

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

for (int count = 0; count < iterations; count++) { Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), message); Thread.Sleep(delay); } } public static void Main() { // To mt i tng ThreadExample. ThreadExample example = new ThreadExample(5, "A thread example.", 500); // Khi chy i tng ThreadExample. example.Start(); // Tip tc thc hin cng vic khc. for (int count = 0; count < 13; count++) { Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

LIiu khin qu trnh thc thi ca mt tiu trnh Cn nm quyn iu khin khi mt tiu trnh chy v dng, c th tm dng qu trnh thc thi ca mt tiu trnh Cc phng thc ca lp Thread: Abort, Interrupt, Resume, Start, v Suspend cung cp mt c ch iu khin mc cao ln qu trnh thc thi ca mt tiu trnh. Mi phng thc ny tr v tiu trnh ang gi ngay lp tc. Kt qu l phi vit m bt v th l cc ngoi l c th b nm khi ta c iu khin qu trnh thc thi ca mt Thread.

Phng Thc Abort()

M T - Kt thc mt tiu trnh bng cch nm ngoi l

Trang 108

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng Thc

M T System.Threading. ThreadAbortException trong m lnh ang c chy. - M lnh ca tiu trnh b hy c th bt ngoi l ThreadAbortException thc hin vic dn dp, nhng b thc thi s t ng nm ngoi l ny ln na bo m tiu trnh kt thc, tr khi ResetAbort c gi.

Interrupt()

- Nm ngoi l - System.Threading.ThreadInterruptedException (trong m lnh ang c chy) lc tiu trnh ang trng thi WaitSleepJoin. iu ny ngha l tiu trnh ny gi Sleep, Join hoc ang i WaitHandle - Nu tiu trnh ny khng trng thi WaitSleepJoin, ThreadInterruptedException s b nm sau khi tiu trnh i vo trng thi WaitSleepJoin. - Phc hi qu trnh thc thi ca mt tiu trnh b tm ngng . - Vic gi Resume trn mt tiu trnh cha b tm hon s sinh ra ngoi l System.Threading.ThreadStateException trong tiu trnh ang gi. Khi chy tiu trnh mi; - Tm hon qu trnh thc thi ca mt tiu trnh cho n khi phng thc Resume c gi. - Vic tm hon mt tiu trnh b tm hon s khng c hiu

Resume

Start

Suspend

lc - Vic gi Suspend trn mt tiu trnh cha khi chy hoc kt thc s sinh ra ngoi l ThreadStateException trong tiu trnh ang gi.

V d: Lp ThreadControlExample: V d ny khi chy mt tiu trnh th hai, hin th nh k mt thng bo ra ca s Console v ri i vo trng thi ngh (sleep).
Trang 109

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Bng cch nhp cc lnh ti du nhc lnh, ta c th gin on, tm hon, phc hi, v hy b tiu trnh th hai.
Chng trnh ThreadControlExample
using System; using System.Threading; public class ThreadControlExample { private static void DisplayMessage() { // Lp i lp li vic hin th mt thng bo ra ca s Console. while (true) { try { Console.WriteLine("{0} : Second thread running. Enter (S)uspend, (R)esume, (I)nterrupt, or (E)xit.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Ngh 2 giy. Thread.Sleep(2000); } catch (ThreadInterruptedException) { // Tiu trnh b gin on. Vic bt ngoi l // ThreadInterruptedException cho php v d ny // thc hin hnh ng ph hp v tip tc thc thi. Console.WriteLine("{0} : Second thread interrupted.", DateTime.Now.ToString("HH:mm:ss.ffff")); } catch (ThreadAbortException abortEx) { // i tng trong thuc tnh // ThreadAbortException.ExceptionState c cung cp // bi tiu trnh gi Thread.Abort. // Trong trng hp ny, n cha mt chui // m t l do ca vic hy b. Console.WriteLine("{0} : Second thread aborted ({1})", DateTime.Now.ToString("HH:mm:ss.ffff"), abortEx.ExceptionState); // Mc d ThreadAbortException c th l, // b thc thi s nm n ln na bo mtiu trnh kt thc } }

Trang 110

Khoa Cng Ngh Thng Tin


} public static void Main() {

Gio trnh Lp Trnh Mng

// To mt i tng Thread v truyn cho n mt th hin // y nhim ThreadStart tham chiu n DisplayMessage. Thread thread = new Thread(new ThreadStart(DisplayMessage)); Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Khi chy tiu trnh th hai. thread.Start(); // Lp v x l lnh do ngi dng nhp. char command = ' '; do { string input = Console.ReadLine(); if (input.Length > 0) command = input.ToUpper()[0]; else command = ' '; switch (command) { case 'S': // Tm hon tiu trnh th hai. Console.WriteLine("{0} : Suspending second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Suspend(); break; case 'R': // Phc hi tiu trnh th hai. try { Console.WriteLine("{0} : Resuming second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Resume(); } catch (ThreadStateException) { Console.WriteLine("{0} : Thread wasn't suspended.", DateTime.Now.ToString("HH:mm:ss.ffff")); } break; case 'I': // Gin on tiu trnh th hai. Console.WriteLine("{0} : Interrupting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff"));

Trang 111

Khoa Cng Ngh Thng Tin


thread.Interrupt(); break; case 'E':

Gio trnh Lp Trnh Mng

// Hy b tiu trnh th hai v truyn mt i tng // trng thi cho tiu trnh ang b hy, // trong trng hp ny l mt thng bo. Console.WriteLine("{0} : Aborting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Abort("Terminating example."); // i tiu trnh th hai kt thc. thread.Join(); break; } } while (command != 'E'); // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

LIINhn bit khi no mt tiu trnh kt thc kim tra mt tiu trnh kt thc hay cha l kim tra thuc tnh Thread.IsAlive. Thuc tnh ny tr v true nu tiu trnh c khi chy nhng cha kt thc hay b hy. Thng thng,cn mt tiu trnh i mt tiu trnh khc hon tt vic x l ca n. Thay v kim tra thuc tnh IsAlive trong mt vng lp, c th s dng phng thc Thread.Join. Phng thc ny khin tiu trnh ang gi dng li (block) cho n khi tiu trnh c tham chiu kt thc. C th ty chn ch nh mt khong thi gian (gi tr int hay TimeSpan) m sau khong thi gian ny, Join s ht hiu lc v qu trnh thc thi ca tiu trnh ang gi s phc hi li. Nu ch nh mt gi tr time-out, Join tr v true nu tiu trnh kt thc, v false nu Join ht hiu lc. V d V d thc thi mt tiu trnh th hai v ri gi Join i tiu trnh th hai kt thc. V tiu trnh th hai mt 5 giy thc thi, nhng phng thc Join ch nh gi
Trang 112

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

tr time-out l 3 giy, nn Join s lun ht hiu lc v v d ny s hin th mt thng bo ra ca s Console. Chng trnh ThreadFinishExample
using System; using System.Threading; public class ThreadFinishExample { private static void DisplayMessage() { // Hin th mt thng bo ra ca s Console 5 ln. for (int count = 0; count < 5; count++) { Console.WriteLine("{0} : Second thread", DateTime.Now.ToString("HH:mm:ss.ffff")); // Ngh 1 giy. Thread.Sleep(1000); } } public static void Main() { // To mt th hin y nhim ThreadStart // tham chiu n DisplayMessage. ThreadStart method = new ThreadStart(DisplayMessage); // To mt i tng Thread v truyn th hin y nhim // ThreadStart cho phng thc khi dng ca n. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Khi chy tiu trnh th hai. thread.Start(); // Dng cho n khi tiu trnh th hai kt thc, // hoc Join ht hiu lc sau 3 giy. if (!thread.Join(3000)) { Console.WriteLine("{0} : Join timed out !!", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

Trang 113

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LIII Khi chy mt tin trnh mi Lp Process cung cp mt dng biu din c qun l cho mt tin trnh ca h iu hnh. Lp Process hin thc bn qu ti hm phng thc Start. Hai trong s ny l cc phng thc tnh, cho php ch nh tn v cc i s cho tin trnh mi. V d, hai lnh di y u thc thi Notepad trong mt tin trnh mi: // Thc thi notepad.exe, khng c i s. Process.Start("notepad.exe"); // Thc thi notepad.exe, tn file cn m l i s. Process.Start("notepad.exe", "SomeFile.txt"); Hai dng khc ca phng thc Start yu cu to i tng ProcessStartInfo c cu hnh vi cc chi tit ca tin trnh cn chy.Vic s dng i tng ProcessStartInfo cung cp mt c ch iu khin tt hn trn cc hnh vi v cu hnh ca tin trnh mi. Tm tt mt vi thuc tnh thng dng ca lp ProcessStartInfo: Arguments: Cc i s dng truyn cho tin trnh mi ErrorDialog :Nu Process.Start khng th khi chy tin trnh c ch nh, n s nm ngoi l System.ComponentModel.Win32Exception. Nu ErrorDialog l true, Start s hin th mt thng bo li trc khi nm ngoi l FileName : Tn ca ng dng. WindowStyle :iu khin cch thc hin th ca ca s. Cc gi tr hp l bao gm: Hidden, Maximized, Minimized, v Normal WorkingDirectory : Tn y ca th mc lm vic Khi hon tt vi mt i tng Process, bn nn hy n gii phng cc ti nguyn h thng, gi phng thc Close(), Dispose(). V d sau s dng Process thc thi Notepad trong mt ca s trng thi phng to v m mt file c tn l C:\Temp\file.txt. Sau khi to, v d ny s gi phng thc Process.WaitForExit dng tiu trnh ang chy cho n khi tin trnh kt thc hoc gi tr time-out ht hiu lc. Chng trnh StartProcessExample
using System; using System.Diagnostics;

Trang 114

Khoa Cng Ngh Thng Tin


public class StartProcessExample { public static void Main() {

Gio trnh Lp Trnh Mng

// To mt i tng ProcessStartInfo v cu hnh cho n // vi cc thng tin cn thit chy tin trnh mi. ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "notepad.exe"; startInfo.Arguments = "file.txt"; startInfo.WorkingDirectory = "C:\\Temp"; startInfo.WindowStyle = ProcessWindowStyle.Maximized; startInfo.ErrorDialog = true; // To mt i tng Process mi. using (Process process = new Process()) { // Gn ProcessStartInfo vo Process. process.StartInfo = startInfo; try { // Khi chy tin trnh mi. process.Start(); // i tin trnh mi kt thc trc khi thot. Console.WriteLine("Waiting 30 seconds for process to finish."); process.WaitForExit(30000); } catch (Exception ex) { Console.WriteLine("Could not start process."); Console.WriteLine(ex); } } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

LIVKt thc mt tin trnh Nu khi chy mt tin trnh mi t m lnh c qun l bng lp Process , c th kt thc tin trnh mi bng i tng Process m t tin trnh ny. Mt khi

Trang 115

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

c i tng Process m t tin trnh cn kt thc, cn gi phng thc CloseMainWindow hay phng thc Kill(). Phng thc CloseMainWindow gi mt thng ip n ca s chnh ca ng dng. CloseMainWindow s khng kt thc cc ng dng khng c ca s chnh hoc cc ng dng c ca s chnh b v hiu. Vi nhng tnh hung nh th, CloseMainWindow s tr v false. CloseMainWindow tr v true nu thng ip c gi thnh cng, nhng khng bo m tin trnh tht s kt thc. Phng thc Kill() kt thc mt tin trnh ngay lp tc; ngi dng khng c c hi dng vic kt thc, v tt c cc d liu cha c lu s b mt. V d sau khi chy mt th hin mi ca Notepad, i 5 giy, sau kt thc tin trnh Notepad. Trc tin, v d ny kt thc tin trnh bng CloseMainWindow. Nu CloseMainWindow tr v false, hoc tin trnh Notepad vn c chy sau khi CloseMainWindow c gi, v d ny s gi Kill() v buc tin trnh Notepad kt thc. C th buc CloseMainWindow tr v false bng cch b mc hp thoi File Open m. Chng trnh TerminateProcessExample
using System; using System.Threading; using System.Diagnostics; public class TerminateProcessExample { public static void Main() { // To mt Process mi v chy notepad.exe. using (Process process = Process.Start("notepad.exe")) { // i 5 giy v kt thc tin trnh Notepad. Thread.Sleep(5000); // Kt thc tin trnh Notepad. // Gi mt thng ip n ca s chnh. if (!process.CloseMainWindow()) { // Khng gi c thng ip. Kt thc Notepad bng Kill. process.Kill(); }

Trang 116

Khoa Cng Ngh Thng Tin


else {

Gio trnh Lp Trnh Mng

// Thng ip c gi thnh cng; i 2 giy // chng thc vic kt thc trc khi vin n Kill. if (!process.WaitForExit(2000)) { process.Kill(); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); }

} } }

LVThc thi phng thc bng cch ra hiu i tng WaitHandle S dng cc lp dn xut t WaitHandle gi thc thi mt phng thc. Bng phng thc RegisterWaitForSingleObject ca lp ThreadPool, c th ng k th hin y nhim WaitOrTimerCallback vi thread-pool khi mt i tng dn xut t WaitHandle i vo trng thi signaled. C th cu hnh thread-pool thc thi phng thc ch mt ln hay t ng ng k li phng thc mi khi WaitHandle i vo trng thi signaled. Nu WaitHandle trng thi signaled khi gi RegisterWaitForSingleObject, phng thc s thc thi ngay lp tc. Phng thc Unregister ca i tng System.Threading.RegisteredWaitHandle (c tr v bi phng thc RegisterWaitForSingleObject) c s dng hy b vic ng k. Lp thng c dng lm b kch hot l AutoResetEvent, n s t ng chuyn sang trng thi unsignaled sau khi trng thi signaled. Tuy nhin, cng c th thay i trng thi signaled theo mun bng lp ManualResetEvent hay Mutex.

Trang 117

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LVICHNG LVIIL do ng b ha

VI: NG B HA

Trong cc h iu hnh a nhim cho php nhiu cng vic c thc hin ng thi. Vic tn ti cng lc nhiu tiu trnh trong mi trng c th dn n s tranh chp, ngn cn hat ng ln nhau gia cc tiu trnh. V d : Vi mt tin trnh mi u to lp 4 tiu trnh cng c ni dung x l ng nht.: Mi tiu trnh s tng gi tr ca bin toncc Count ln 250.000 ln . Do vy Count s tng ln 1.000.000 ln trong tan b tin trnh. hn ch cc trnh trng tranh chp ti nguyn cn c c ch iu khin cc tiu trnh truy xut ti nguyn mt cch tun t . chnh l thc hin ng b ha cc tiu trnh. Cc trng hp cn thc hin ng b ha. Khi mt tiu trnh truy xut n mt ti nguyn dng chung , cn ch thc hin ng b ha vic truy xut ti nguyn trnh xy ra tranh chp. Cc c ch ng b ha u da trn tng ch cho php mt tiu trnh c truy xut ti nguyn khi tha iu kin khng c tranh chp trn . Nhng tiu trnh khng hi iu kin s dng ti nguyn th c h iu hnh t vo trng thi ch (Khng chim CPU), v h iu hnh s lun kim sat tnh trng truy xut ti nguyn ca tiu trnh khc c th gii phng kp thi cc tiu trnh ang ch vo thi im thch hp. LVIIICc phng php ng b ha thc hin c c ch ng b ha , h iu hnh s dng cc i tng ng b ha gn lin vi cc ti nguyn phn nh tnh trng truy xut trn cc ti nguyn. Cc i tng ng b ha c th nhn trng thi TRUE hoc FALSE. Khi i tng ng b ha trng thi TRUE tiu trnh c php truy cp ti nguyn, ngc li th khng. LIXPhng php Semaphore

Trang 118

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Khi nim: Semaphore l mt i tng ng b ha lu tr mt bin m c gi tr t 0 n Max, semaphore nhn trng thi TRUE khi gi tr ca bin m > 0 v nhn trng thi FALSE nu c gi tr bin m =0 Tnh hung s dng: S dng semaphore kim sot vic cho php mt s hu hn tiu trnh cng lc truy xut mt ti nguyn dng chung. Bin m ca i tng semaphore s cho bit s tiu trnh ang truy xut ti nguyn m semaphore bo v, bin m s gim 1 nu c thm mt tiu trnh truy xut ti nguyn, ngc li s tng gi tr ln 1 nu c mt tiu trnh chm dt truy xut ti nguyn. Khi bin m t gi tr 0 ti nguyn c bo v, khng tiu trnh no ngai Max tiu trnh ng k c truy xut. C th dng semaphore ng b ha cc tiu trnh trong cng hoc khc tin trnh. Cch to i tng Semaphore Class Semaphore Semaphore(int InitCount, int MaxCount) ng k truy cp ti nguyn chung Phng thc WaitOne( ) Kt thc truy cp ti nguyn chung Phng thc Release( ) V d: To ra 10 tiu trnh nhng ti mt thi im ch c 3 tiu trnh truy cp ti nguyn chung:
class SemaphoreTest { static Semaphore s = new Semaphore(3, 3); // Available=3; Capacity=3 static void Main() { for (int i = 0; i < 10; i++) { Thead thread = new Thread(new ThreadStart(Go)); thread.Start(); } }

Trang 119

Khoa Cng Ngh Thng Tin


static void Go() { while (true) { s.WaitOne(); Thread.Sleep(100);

Gio trnh Lp Trnh Mng

// Only 3 threads can get here at once s.Release(); } } }

LXPhng php dng lp Monitor Mt c ch ng b ha khc l lp Monitor. Lp ny cho php mt tiu trnh n thu ly kha (lock) trn mt i tng bng cch gi phng thc tnh Monitor.Enter. Bng cch thu ly kha trc khi truy xut mt ti nguyn hay d liu dng chung, ta chc chn rng ch c mt tiu trnh c th truy xut ti nguyn cng lc. Mt khi hon tt vi ti nguyn, tiu trnh ny s gii phng kha tiu trnh khc c th truy xut n bng phng thc tnh Monitor.Exit. Khi m c gi trong lnh lock tng ng vi gi Monitor.Enter khi i vo khi m ny, v gi Monitor.Exit khi i ra khi m ny. Tiu trnh ch c th gi Monitor.Wait gii phng lock v t tiu trnh ny vo hng ch (wait queue). Cc tiu trnh trong hng ch cng c trng thi l WaitSleepJoin v s tip tc block cho n khi tiu trnh ch gi phng thc Pulse hay PulseAll ca lp Monitor. Phng thc Pulse di chuyn mt trong cc tiu trnh t hng ch vo hng sn sng, cn phng thc PulseAll th di chuyn tt c cc tiu trnh. Khi mt tiu trnh c di chuyn t hng ch vo hng sn sng, n c th thu ly lock trong ln gii phng k tip. Lp ThreadSyncExample trnh by cch s dng lp Monitor v lnh lock. V d ny khi chy ba tiu trnh, mi tiu trnh (ln lt) thu ly lock ca mt i tng c tn l consoleGate. K , mi tiu trnh gi phng thc Monitor.Wait. Khi ngi dng nhn Enter ln u tin, Monitor.Pulse s c gi gii phng mt tiu trnh ang ch. Ln th hai ngi dng nhn Enter, Monitor.PulseAll s c gi gii phng tt c cc tiu trnh ang ch cn li.
Trang 120

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Chng trnh ThreadSyncExample


using System; using System.Threading; public class ThreadSyncExample { private static object consoleGate = new Object(); private static void DisplayMessage() { Console.WriteLine("{0} : Thread started, acquiring lock...", DateTime.Now.ToString("HH:mm:ss.ffff")); // Thu ly cht trn i tng consoleGate. try { Monitor.Enter(consoleGate); Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Acquired consoleGate lock, waiting..."); // i cho n khi Pulse c gi trn i tng consoleGate. Monitor.Wait(consoleGate); Console.WriteLine("{0} : Thread pulsed, terminating.", DateTime.Now.ToString("HH:mm:ss.ffff")); } finally { Monitor.Exit(consoleGate); } } public static void Main() { // Thu ly cht trn i tng consoleGate. lock (consoleGate) { // To v khi chy ba tiu trnh mi // (chy phng thc DisplayMesssage). for (int count = 0; count < 3; count++) { (new Thread(new ThreadStart(DisplayMessage))).Start(); } } Thread.Sleep(1000); // nh thc mt tiu trnh ang ch. Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse one waiting thread.");

Trang 121

Khoa Cng Ngh Thng Tin


Console.ReadLine(); // Thu ly cht trn i tng consoleGate. lock (consoleGate) { // Pulse mt tiu trnh ang ch. Monitor.Pulse(consoleGate); } // nh thc tt c cc tiu trnh ang ch.

Gio trnh Lp Trnh Mng

Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse all waiting threads."); Console.ReadLine(); // Thu ly cht trn i tng consoleGate. lock (consoleGate) { // Pulse tt c cc tiu trnh ang ch. Monitor.PulseAll(consoleGate); } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

LXISystem.Threading.WaitHandle, bao gm AutoResetEvent, ManualResetEvent Cc lp thng dng khc dng ng b ha tiu trnh l cc lp con ca lp System.Threading.WaitHandle, bao gm AutoResetEvent, ManualResetEvent. Th hin ca cc lp ny c th trng thi signaled hay unsignaled. Cc tiu trnh c th s dng cc phng thc ca cc lp c lit k i vo trng thi WaitSleepJoin v i trng thi ca mt hay nhiu i tng dn xut t WaitHandle bin thnh signaled. Phng Thc M T Tiu trnh gi phng thc tnh ny s i vo trng thi WaitAny() WaitSleepJoin v i bt k mt trong cc i tng WaitHandle thuc mt mng WaitHandle bin thnh signaled. Cng c th ch nh gi tr time-out. WaitAll() Tiu trnh gi phng thc tnh ny s i vo trng thi WaitSleepJoin v i tt c cc i tng WaitHandle trong mt
Trang 122

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng Thc

M T mng WaitHandle bin thnh signaled. Bn cng c th ch nh gi tr time-out. Tiu trnh gi phng thc ny s i vo trng thi

WaitOne()

WaitSleepJoin v i mt i tng WaitHandle c th bin

thnh signaled. im khc bit chnh gia cc lp AutoResetEvent, ManualResetEvent, l cch thc chng chuyn trng thi t signaled thnh unsignaled. Lp AutoResetEvent v ManualResetEvent l cc b i vi mt tin trnh. ra hiu mt AutoResetEvent, bn hy gi phng thc Set ca n, phng thc ny ch gii phng mt tiu trnh ang i s kin. AutoResetEvent s t ng tr v trng thi unsignaled. Lp ManualResetEvent phi c chuyn i qua li gia signaled v unsignaled bng phng thc Set v Reset ca n. Gi Set trn mt ManualResetEvent s t trng thi ca n l signaled, gii phng tt c cc tiu trnh ang i s kin. Ch khi gi Reset mi lm cho ManualResetEvent tr thnh unsignaled. S dng cc lp dn xut t WaitHandle gi thc thi mt phng thc. Bng phng thc RegisterWaitForSingleObject ca lp ThreadPool, c th ng k th hin y nhim WaitOrTimerCallback vi thread-pool khi mt i tng dn xut t WaitHandle i vo trng thi signaled. C th cu hnh thread-pool thc thi phng thc ch mt ln hay t ng ng k li phng thc mi khi WaitHandle i vo trng thi signaled. Nu WaitHandle trng thi signaled khi gi RegisterWaitForSingleObject, phng thc s thc thi ngay lp tc. Phng thc Unregister ca i tng System.Threading.RegisteredWaitHandle (c tr v bi phng thc RegisterWaitForSingleObject) c s dng hy b vic ng k. Lp thng c dng lm b kch hot l AutoResetEvent, n s t ng chuyn sang trng thi unsignaled sau khi trng thi signaled. Tuy nhin, chng ta

Trang 123

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

cng c th thay i trng thi signaled theo mun bng lp ManualResetEvent hay Mutex. V d di y trnh by cch s dng mt AutoResetEvent kch hot thc thi mt phng thc c tn l EventHandler: Chng trnh EventExecutionExample
using System.Threading; public class EventExecutionExample { // Phng thc s c thc thi khi AutoResetEvent i vo trng // thi signaled hoc qu trnh i ht thi gian (time-out). private static void EventHandler(object state, bool timedout) { // Hin th thng bo thch hp ra ca s Console // ty vo qu trnh i ht thi gian hay // AutoResetEvent trng thi signaled. if (timedout) { Console.WriteLine("{0} : Wait timed out.", DateTime.Now.ToString("HH:mm:ss.ffff")); } else { Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), state); } } public static void Main() { // To mt AutoResetEvent trng thi unsignaled. AutoResetEvent[] autoEvent; autoEvent[0] = new AutoResetEvent(false); // To mt th hin y nhim WaitOrTimerCallback // tham chiu n phng thc tnh EventHandler. // EventHandler s c gi khi AutoResetEvent i vo // trng thi signaled hay qu trnh i ht thi gian. WaitOrTimerCallback handler = new WaitOrTimerCallback(EventHandler); // To i tng trng thi (c truyn cho phng thc // th l s kin khi n c kch hot). Trong trng hp // ny, mt thng bo s c hin th. string state = "AutoResetEvent signaled.";

Trang 124

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

// ng k th hin y nhim i AutoResetEvent i vo // trng thi signaled. Thit lp gi tr time-out l 3 giy. RegisteredWaitHandle handle = ThreadPool.RegisterWaitForSingleObject(autoEvent, handler, state, 3000, false); Console.WriteLine("Press ENTER to signal the AutoResetEvent or enter \"Cancel\" to unregister the wait operation."); while (Console.ReadLine().ToUpper() != "CANCEL") { // Nu "Cancel" khng c nhp vo Console, // AutoResetEvent s i vo trng thi signal, // v phng thc EventHandler c thc thi. // AutoResetEvent s t ng tr v trng thi unsignaled. autoEvent.Set(); } // Hy b vic ng k qu trnh i. Console.WriteLine("Unregistering wait operation."); handle.Unregister(null); // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

LXIIPhng php Mutex Mutex cung cp mt c ch ng b ha qu trnh thc thi ca cc tiu trnh vt qua bin tin trnh. Mt Mutex l signaled khi n khng thuc s hu ca bt k tiu trnh no. Mt tiu trnh ginh quyn s hu Mutex lc khi dng hoc s dng mt trong cc phng thc c lit k trn. Quyn s hu Mutex c gii phng bng cch gi phng thc Mutex.ReleaseMutex (ra hiu Mutex v cho php mt tiu trnh khc thu ly quyn s hu ny). V d di y s dng mt Mutex c tn l MutexExample bo m ch mt th hin ca v d c th thc thi. Chng trnh MutexExample
using System; using System.Threading; public class MutexExample { public static void Main() {

Trang 125

Khoa Cng Ngh Thng Tin


// Gi tr lun l cho bit ng dng ny // c quyn s hu Mutex hay khng. bool ownsMutex;

Gio trnh Lp Trnh Mng

// To v ly quyn s hu mt Mutex c tn l MutexExample. using (Mutex mutex = new Mutex(true, "MutexExample", out ownsMutex)) { // Nu ng dng s hu Mutex, n c th tip tc thc thi; // nu khng, ng dng s thot. if (ownsMutex) { Console.WriteLine("This application currently owns the mutex named MutexExample. Additional instances of this application will not run until you release the mutex by pressing Enter."); Console.ReadLine(); // Gii phng Mutex.mutex.ReleaseMutex(); } else { Console.WriteLine("Another instance of this" + " application already owns the mutex named" + " MutexExample. This instance of the" + " application will terminate."); } } // Nhn Enter kt thc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }

Trang 126

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXIII

CHNG VII: LP TRNH SOCKET BT NG B

LXIVLp trnh s kin trong Windows Trong lp trnh s kin trong Windows, mi khi mt s kin xy ra, mt phng thc c gi thc thi da trn s kin nh trong hnh di y:

Hnh VI.1:

Lp trnh s kin trn Windows

Trong cc chng trc, chng ta lp trnh Socket trong ch blocking. Socket ch blocking s ch mi mi cho n khi hon thnh nhim v ca n. Trong khi n b blocking th cc chc nng khc ca chng trnh khng thc hin c. Khi lp trnh Windows th lc gi mt phng thc b blocking th ton b chng trnh s ng li v khng thc hin cc chc nng khc c. Do vic lp trnh bt ng b l cn thit cho chng trnh khi b nng.

Trang 127

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXVS dng Event v Delegate Event l mt thng ip c gi bi mt i tng m t mt hot ng m n din ra. Thng ip ny xc nh hot ng v truyn cc d liu cn thit cho hot ng. Event c th l m t hot ng no , chng hn nh hot ng click mt Button, hot ng nhn v gi d liu trn Socket. Event sender khng cn thit phi bit i tng no s iu khin thng ip s kin mi khi n c gi thng qua h thng Windows. N cho b nhn s kin ng k vi h thng Windows v thng bo kiu s kin m b nhn s kin mun nhn nh hnh minh ha sau:

Hnh VI.2:

Gi v nhn s kin trong Windows

B nhn s kin c xc nh trong h thng Windows bi mt con tr lp c gi l delegate. Mt delegate l mt lp n gi tham chiu n mt phng thc m phng thc ny iu khin s kin c nhn. Khi h thng Windows nhn s kin. n kim tra coi th c delegate no ng k x l n khng. Nu c delegate ng k x l s kin, thng ip s kin c truyn vo phng thc c nh

Trang 128

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

ngha bi delegate. Sau khi phng thc hon tt, h thng Windows s x l s kin tip theo xy ra cho ti khi s kin kt thc chng trnh c pht ra. V d n gin sau m t cch lp trnh s kin trn Windows Forrm Chng trnh WindowSample
using System; using System.Drawing; using System.Windows.Forms; class WindowSample : Form { private TextBox data; private ListBox results; public WindowSample() { Text = "Sample Window Program"; Size = new Size(400, 380); Label label1 = new Label(); label1.Parent = this; label1.Text = "Enter text string:"; label1.AutoSize = true; label1.Location = new Point(10, 10); data = new TextBox(); data.Parent = this; data.Size = new Size(200, 2 * Font.Height); data.Location = new Point(10, 35); results = new ListBox(); results.Parent = this; results.Location = new Point(10, 65); results.Size = new Size(350, 20 * Font.Height); Button checkit = new Button(); checkit.Parent = this; checkit.Text = "test"; checkit.Location = new Point(235, 32); checkit.Size = new Size(7 * Font.Height, 2 * Font.Height); checkit.Click += new EventHandler(checkit_OnClick); } void checkit_OnClick(object obj, EventArgs ea) { results.Items.Add(data.Text); data.Clear(); } public static void Main() {

Trang 129

Khoa Cng Ngh Thng Tin


Application.Run(new WindowSample()); } }

Gio trnh Lp Trnh Mng

im chnh trong chng trnh ny l EvenHandler ng k phng thc ButtonOnClick() cho i tng Button vi s kin click:
checkit.Click += new EventHandler(checkit_OnClick);

Khi ngi dng click button, iu khin chng trnh s c chyn n phng thc ButtonOnClick()
void checkit_OnClick(object obj, EventArgs ea) { results.Items.Add(data.Text); data.Clear(); }

LXVILp AsyncCallback trong lp trnh Windows Khi s kin kch hot delegate, .NET cung cp mt c ch kch hot delegate. Lp AsyncCallback cung cp cc phng thc bt u mt chc nng bt ng b v cung cp mt phng thc delegate gi khi chc nng bt ng b kt thc. Tin trnh ny khc vi cch lp trnh s kin c bn, s kin ny khng pht sinh ra t i tng Windows m n xut pht t mt phng thc khc trong chng trnh. Phng thc ny chnh n ng k mt delegate AsyncCallback gi khi phng thc hon tt chc nng ca n. Socket s dng phng thc c nh ngha trong lp AsyncCallback cho php cc chc nng mng hot ng mt cch bt ng b. N pht tn hiu cho h iu hnh khi chc nng mng hon tt. Trong mi trng lp trnh Windows, nhng phng thc ny gip cho ng dng khi b treo trong khi ch cc chc nng mng hon tt. LXVIIS dng Socket bt ng b i tng Socket c nhiu phng thc s dng lp AsyncCallback gi cc phng thc khc khi cc chc nng mng hon tt. N cho php dng tip tc x l cc s kin khc trong khi ch cho cc chc nng mng ha thnh cng vic ca n. Cc phng thc bt ng b ca Socket chia cc chc nng mng lm hai phn:

Trang 130

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Mt phng thc Begin bt u cc chc nng mng v ng k phng thc AsyncCallback. Mt phng thc End hon thnh chc nng mng khi phng thc AsyncCallback c gi. Bng sau cho bit cc phng thc bt ng b c th c gia vi Socket. Mi phng thc Begin c kt hp vi mt phng thc End hon tt chc nng ca chng:
Phng thc bt u M t BeginAccept() BeginConnect() BeginReceive() BeginReceiveFrom() BeginSend() BeginSendTo() Chp nhn kt ni Kt ni n thit b xa Nhn d liu t Socket Nhn d liu t thit b xa Gi d liu t Socket Gi d liu n thit b xa Phng thc kt thc EndAccept() EndConnect() EndReceive() EndReceiveFrom() EndSend() EndSendTo

LXVIIIThnh lp kt ni Phng thc c dng thnh lp kt ni vi thit b xa ph thuc vo chng trnh ng vai tr l Server hay Client. Nu l Server th phng thc BeginAccept() c dng, nu l Client th phng thc BeginConnect() c dng. LXVIII.1.1.1. Phng thc BeginAccept() v EndAccept() chp nhn kt ni t thit b xa, phng thc BeginAccetp() c dng. nh dng ca n nh sau:
IAsyncResult BeginAccept(AsyncCallback callback, object state)

Phng thc BeginAccept() nhn hai i s: tn ca phng thc AsyncCallback dng kt thc phng thc v mt i tng state c th c dng truyn thng tin gia cc phng thc bt ng b. Phng thc ny c dng nh sau:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); sock.Bind(iep); sock.Listen(5); sock.BeginAccept(new AsyncCallback(CallAccept), sock);

Trang 131

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

on code trn to ra mt i tng Socket v gn n n mt a ch IP cc b v mt port TCP cc b chp nhn kt ni. Phng thc BeginAccept() nh ngha delegate c dng khi c kt ni trn Socket. Tham s cui cng c truyn vo phng thc BeginAccept() l Socket ban u c to ra. Sau khi phng thc BeginAccept() kt thc, phng thc AsyncCallback nh ngha s c gi khi kt ni xy ra. Phng thc AsyncCallback phi bao gm phng thc EndAccept() kt thc vic chp nhn Socket. Sau y l nh dng ca phng thc EndAccept():
Socket EndAccept(IAsyncResult iar);

i tng IasyncResult truyn gi tr bt ng b t phng thc BeginAccept() n phng thc EndAccept(). Cng ging nh phng thc ng b Accept(), phng thc EndAccept() tr v mt i tng Socket c dng kt ni vi Client. Tt c cc thng tin lin lc vi thit b xa u c thc hin thng qua i tng Socket ny.
private static void CallAccept(IAsyncResult iar) { Socket server = (Socket)iar.AsyncState; Socket client = server.EndAccept(iar); . . . }

Tn ca phng thc AsyncCallback phi ging vi tn ca phng thc c dng lm tham s ca phng thc BeginAccept(). Bc u tin trong phng thc l nhn Socket ban u ca Server. Vic ny c thc hin bng cch dng property AsyncState ca lp IasyncResult. Property ny c kiu l object do n phi c p kiu sang mt i tng Socket. Sau khi Socket ban u c ly v, phng thc EndAccept() c th ly c i tng Socket mi truyn thng vi thit b xa. i s truyn vo ca ca phng thc EndAccept() phi ging vi i s truyn vo phng thc AsyncCallback.

Trang 132

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

i tng Client Socket sau khi c to ra, n c th c dng ging nh bt k i tng Socket no khc, n c th c s dng cc phng thc ng b hoc bt ng b gi v nhn d liu. LXVIII.1.1.2. Phng thc BeginConnect() v EndConnect() ng dng Client kt ni n Server xa bng phng thc bt ng b ta phi dng phng thc BeginConnect(). nh dng ca phng thc ny nhu sau:
IAsyncResult BeginConnect(EndPoint ep, AsyncCallback callback, Object state)

Tham s truyn vo phng thc BeginConnect() l mt EndPoint ca thit b xa cn kt ni n. Ging nh phng thc BeginAccept(), phng thc BeginConnect() cng ch ra tn phng thc do delegate AsyncCallback tham chiu n v phng thc ny c gi khi kt ni hon tt. Tham s cui cng l mt i tng state, n c th c truyn vo phng thc EndConnect() truyn ti cc d liu cn thit. y l on code v d ca phng thc BeginConnect():
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);

on code ny to ra mt i tng Socket newsock v mt i tng IPEndPoint iep cho thit b xa. Phng thc BeginConnect() tham chiu n phng thc AsyncCallback (Connect) v truyn i tng Socket ban u newsock n phng thc AsyncCallback. Khi kt ni c thnh lp phng thc do delegate AsyncCallback tham chiu ti c gi. Phng thc ny dng phng thc EndConnect() hon thnh vic kt ni. nh dng ca phng thc EndConnect() nh sau:
EndConnect(IAsyncResult iar)

i tng IasyncResult truyn gi tr t phng thc BeginConnect(). Sau y l v d cch dng phng thc ny:
public static void Connected(IAsyncResult iar) {

Trang 133

Khoa Cng Ngh Thng Tin


Socket sock = (Socket)iar.AsyncState; try { sock.EndConnect(iar); } catch (SocketException) {

Gio trnh Lp Trnh Mng

Console.WriteLine("Unable to connect to host"); } }

u tin ta ly Socket ban u c s dng bi phng thc BeginConnect(), Socket ny ly c l nh vo thuc tnh object ca i tng IAsyncResult c truyn vo trong phng thc tham chiu bi delegate AsyncCallback. Sau khi Socket ban u c to ra, phng thc EndConnect() c gi, i s truyn vo phng thc EndConnect() l mt i tng IAsyncResult ch ngc tr li phng thc BeginConnect() ban u. Bi v thit b xa c th kt ni c v cng c th khng nn tt nht l t n vo trong khi try catch. LXIXGi d liu LXIX.1.1.1. Phng thc BeginSend() v phng thc EndSend() Phng thc BeginSend() cho php gi d liu n mt Socket c kt ni. nh dng ca phng thc ny nh sau:
IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags sockflag, AsyncCallback callback, object state)

Hu ht cc i s ca phng thc ny ging nh cc i s ca phng thc ng b Send() ch c thm hai i s l AsyncCallback v object. i s AsyncCallback: xc nh phng thc c gi khi phng thc BeginSend() thc hin thnh cng. i s object: gi thng tin tnh trng n phng thc EndSend() Sau y l mt v d ca phng thc BeginSend():
sock.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendData), sock);

Trong v d ny ton b d liu trong b m data c gi i v phng thc SendData c gi khi Socket sng sng gi d liu. i tng Socket sock s c truyn n phng thc do delegate AsyncCallback tham chiu ti.
Trang 134

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Phng thc EndSend() s hon tt vic gi d liu. nh dng ca phng thc ny nh sau:
int EndSend(IAsyncResult iar)

Phng thc EndSend() tr v s byte c gi thnh cng th Socket. Sau y l mt v d ca phng thc EndSend():
private static void SendData(IAsyncResult iar) { Socket server = (Socket)iar.AsyncState; int sent = server.EndSend(iar); }

Socket ban u c to li bng cch dng thuc tnh AsyncState ca i tng IAsyncResult LXIX.1.1.2. Phng thc BeginSendTo() v EndSendTo() Phng thc BeginSendTo() c dng vi Socket phi kt ni bt u truyn ti d liu bt ng b ti thit b xa. nh dng ca phng thc BeginSendTo() nh sau:
IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, SocketFlags sockflag, EndPoint ep, AsyncCallback callback, object state)

Cc i s ca phng thc BeginSendTo() cng ging nh cc i s ca phng thc SendTo(). Sau y l mt v d ca phng thc BeginSendTo():
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.6"), 9050); sock.BeginSendTo(data, 0, data.Length, SocketFlags.None, iep, new AsynCallback(SendDataTo), sock);

Phng thc SendDataTo() do delegate AsyncCallback tham chiu n c truyn vo lm i s ca phng thc BeginSendTo(). Phng thc ny s c thc thi khi d liu bt u c gi i t Socket. Phng thc EndSendTo() s c thc thi khi qu trnh gi d liu kt thc. nh dng ca phng thc ny nh sau:
int EndSendTo(IAsyncResult iar)

Trang 135

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

i s truyn vo ca phng thc EndSendTo() l mt i tng IAsyncResult, i tng ny mang gi tr c truyn t phng thc BeginSendTo(). Khi qu trnh gi d liu bt ng b kt thc th phng thc EndSendTo() s tr v s byte m n thc s gi c. LXXNhn d liu LXX.1.1.1. Phng thc BeginReceive(), EndReceive, BeginReceiveFrom(), EndReceiveFrom() Cch s dng ca cc phng thc ny cng tng t nh cch s dng ca cc phng thc: BeginSend(), EndSend(), BeginSendTo() v EndSendTo() LXXIChng trnh WinForm gi v nhn d liu gia Client v Server LXXI.1.1.1. Chng trnh Server

Hnh VI.3:

Giao din Server

LXXI.1.1.2. M hnh chng trnh Server

Trang 136

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh VI.4:

M hnh chng trnh Server

LXXI.1.1.3. Lp ServerProgram
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace Server { class ServerProgram { private IPAddress serverIP; public IPAddress ServerIP { get { return serverIP; } set { this.serverIP = value; } } private int port; public int Port { get

Trang 137

Khoa Cng Ngh Thng Tin


{ return this.port; } set { this.port = value; } } //delegate set d liu cho cc Control

Gio trnh Lp Trnh Mng

//Ti thi im ny ta cha bit d liu s c hin th vo u nn ta phi dng delegate public delegate void SetDataControl(string Data); public SetDataControl SetDataFunction = null; Socket serverSocket = null ; IPEndPoint serverEP = null; Socket clientSocket = null; //buffer nhn v gi d liu byte[] buff = new byte[1024]; //S byte thc s nhn c int byteReceive = 0; string stringReceive = ""; public ServerProgram(IPAddress ServerIP, int Port) { this.ServerIP = ServerIP; this.Port = Port; } //Lng nghe kt ni public void Listen() { serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverEP = new IPEndPoint(ServerIP, Port); //Kt hp Server Socket vi Local Endpoint serverSocket.Bind(serverEP); //Lng nghe kt ni trn Server Socket //-1: khng gii hn s lng client kt ni n serverSocket.Listen(-1); SetDataFunction("Dang cho ket noi"); //Bt u chp nhn Client kt ni n serverSocket.BeginAccept(new AsyncCallback(AcceptScoket), serverSocket); }

Trang 138

Khoa Cng Ngh Thng Tin


//Hm callback chp nhn Client kt ni private void AcceptScoket(IAsyncResult ia) { Socket s = (Socket)ia.AsyncState;

Gio trnh Lp Trnh Mng

//Hm Accept s block server li v ch Client kt ni n //Sau khi Client kt ni n s tr v socket cha thng tin ca Client clientSocket = s.EndAccept(ia); string hello = "Hello Client"; buff = Encoding.ASCII.GetBytes(hello); SetDataFunction("Client " + clientSocket.RemoteEndPoint.ToString() + "da ket noi den"); clientSocket.BeginSend(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(SendData), clientSocket); } private void SendData(IAsyncResult ia) { Socket s = (Socket)ia.AsyncState; s.EndSend(ia); //khi to li buffer nhn d liu buff = new byte[1024]; //Bt u nhn d liu s.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(ReceiveData), s); } public void Close() { clientSocket.Close(); serverSocket.Close(); } private void ReceiveData(IAsyncResult ia) { Socket s = (Socket)ia.AsyncState; try { //Hm EmdReceive s b block cho n khi c d liu trong TCP buffer byteReceive = s.EndReceive(ia); } catch { //Trng hp li xy ra khi Client ngt kt ni

Trang 139

Khoa Cng Ngh Thng Tin


this.Close(); SetDataFunction("Client ngat ket noi"); this.Listen(); return; }

Gio trnh Lp Trnh Mng

//Nu Client shutdown th hm EndReceive s tr v 0 if (byteReceive == 0) { Close(); SetDataFunction("Clien dong ket noi"); } else { stringReceive = Encoding.ASCII.GetString(buff, 0, byteReceive); SetDataFunction(stringReceive); //Sau khi Server nhn d liu xong th bt u gi d liu xung cho Client s.BeginSend(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(SendData), s); } } } }

LXXI.1.1.4. Lp ServerForm
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; namespace Server { public partial class ServerForm : Form { ServerProgram server = new ServerProgram(IPAddress.Any, 6000);

Trang 140

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

public ServerForm() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; server.SetDataFunction = new ServerProgram.SetDataControl(SetData); } private void SetData(string Data) { this.listBox1.Items.Add(Data); } private void cmdStart_Click(object sender, EventArgs e) { server.Listen(); } private void cmdStop_Click(object sender, EventArgs e) { this.server.Close(); SetData("Server dong ket noi"); } private void ServerForm_Load(object sender, EventArgs e) { } } }

LXXIIChng trnh Client

Trang 141

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh VI.5:

Giao din Client

LXXII.1.1.1. M hnh chng trnh Client

Trang 142

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Hnh VI.6: LXXII.1.1.2. Lp ClientProgram


using System;

M hnh chng trnh Client

using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace Client { class ClientProgram { //delegate set d liu cho cc Control //Ti thi im ny ta cha bit d liu s c hin th vo u nn ta phi dng delegate public delegate void SetDataControl(string Data); public SetDataControl SetDataFunction = null; //buffer nhn v gi d liu byte[] buff = new byte[1024]; //S byte thc s nhn c int byteReceive = 0; //Chui nhn c string stringReceive = "";

Trang 143

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint serverEP = null; //Lng nghe kt ni public void Connect(IPAddress serverIP, int Port) { serverEP = new IPEndPoint(serverIP, Port); //Vic kt ni c th mt nhiu thi gian nn phi thc hin bt ng b serverSocket.BeginConnect( serverEP, new AsyncCallback(ConnectCallback), serverSocket); } //Hm callback chp nhn Client kt ni private void ConnectCallback(IAsyncResult ia) { //Ly Socket ang thc hin vic kt ni bt ng b Socket s = (Socket)ia.AsyncState; try { //Set d liu cho Control SetDataFunction("ang ch kt ni"); //Hm EndConnect s b block cho n khi kt ni thnh cng s.EndConnect(ia); SetDataFunction("Kt ni thnh cng"); } catch { SetDataFunction("Kt ni tht bi"); return; } //Ngay sau khi kt ni xong bt u nhn cu cho t Server gi xung s.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(ReceiveData), s); } private void ReceiveData(IAsyncResult ia) { Socket s = (Socket)ia.AsyncState; byteReceive = s.EndReceive(ia); stringReceive = Encoding.ASCII.GetString(buff, 0, byteReceive); SetDataFunction(stringReceive); }

Trang 144

Khoa Cng Ngh Thng Tin


private void SendData(IAsyncResult ia) { Socket s = (Socket)ia.AsyncState; s.EndSend(ia); //khi to li buffer nhn d liu buff = new byte[1024]; //Bt u nhn d liu

Gio trnh Lp Trnh Mng

s.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(ReceiveData), s); } //Hm ngt kt ni public bool Disconnect() { try { //Shutdown Soket ang kt ni n Server serverSocket.Shutdown(SocketShutdown.Both); serverSocket.Close(); return true; } catch { return false; } } //Hm gi d liu public void SendData(string Data) { buff = Encoding.ASCII.GetBytes(Data); serverSocket.BeginSend(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(SendToServer), serverSocket); } //Hm CallBack gi d liu private void SendToServer(IAsyncResult ia) { Socket s = (Socket)ia.AsyncState; s.EndSend(ia); buff = new byte[1024]; s.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(ReceiveData), s); } }

Trang 145

Khoa Cng Ngh Thng Tin


}

Gio trnh Lp Trnh Mng

LXXII.1.1.3. Lp ClientForm
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; namespace Client { public partial class ClientForm : Form { ClientProgram client = new ClientProgram(); public ClientForm() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; client.SetDataFunction = new ClientProgram.SetDataControl(SetData); } private void SetData(string Data) { this.listBox1.Items.Add(Data); } private void cmdConnect_Click(object sender, EventArgs e) { client.Connect(IPAddress.Parse(this.txtServerIP.Text), int.Parse(this.txtPort.Text)); } private void cmdDisconnect_Click(object sender, EventArgs e) { client.Disconnect(); } private void cmdSend_Click_1(object sender, EventArgs e) { client.SendData(this.txtInput.Text); this.txtInput.Text = ""; } }

Trang 146

Khoa Cng Ngh Thng Tin


}

Gio trnh Lp Trnh Mng

LXXIIILp trnh Socket bt ng b s dng tiu trnh LXXIVLp trnh s dng hng i gi v hng i nhn thng ip Trong cch lp trnh ny, chng ta s dng hai hng i, mt hng i gi v mt hng i nhn thc hin vic gi v nhn d liu. Lp Queue nm trong namespace System.Collections gip ta thc hin vic ny.
Queue inQueue = new Queue(); Queue outQueue = new Queue();

Hai phng thc quan trng ca lp Queue c dng trong lp trnh mng l EnQueue() v DeQueue(). Phng thc EnQueue() s a mt i tng vo hng i v phng thc DeQueue() s ly i tng u tin t hng i ra. tng ca phng php lp trnh ny l ta s dng hai vng lp v hn kim tra hng i gi v hng i nhn, khi hng i gi c d liu th d liu c gi ra ngoi mng thng qua Socket, tng t khi hng i nhn c d liu th n s ngay lp tc ly d liu ra v x l.
private void Send() { while (true) { if (OutQ.Count > 0) { streamWriter.WriteLine(OutQ.Dequeue().ToString()); streamWriter.Flush(); } } } private void Receive() { string s; while (true) { s = streamReader.ReadLine(); InQ.Enqueue(s); } }

chy song song hai vng lp v hn ny ta phi to ra hai tiu trnh ring, mi vng lp v hn s chy trong mt tiu trnh ring bit do trong khi hai vng lp v hn ny chy th tin trnh chnh vn c th lm c cc cng vic khc.

Trang 147

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Thread tSend = new Thread(new ThreadStart(Send)); tSend.Start(); Thread tReceive = new Thread(new ThreadStart(Receive)); tReceive.Start();

Ngoi ra, ta cn s dng mt tiu trnh khc thc hin vic kt ni nhm trnh gy treo tin trnh chnh.
Thread tConnect = new Thread(new ThreadStart(WaitingConnect)); tConnect.Start();

Vic iu khin kt ni c thc hin trong mt tiu trnh khc v c x l bng phng thc WaitingConnect():
private void WaitingConnect() { tcpListener = new TcpListener(1001); tcpListener.Start(); socketForClient = tcpListener.AcceptSocket(); if (socketForClient.Connected) { MessageBox.Show("Client Connected"); netWorkStream = new NetworkStream(socketForClient); streamReader = new StreamReader(netWorkStream); streamWriter = new StreamWriter(netWorkStream); tSend = new Thread(new ThreadStart(Send)); tSend.Start(); tReceive = new Thread(new ThreadStart(Receive)); tReceive.Start(); } else { MessageBox.Show("Ket noi khong thanh cong"); } }

Trang 148

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Vic nhp d liu c thc hin bng phng thc InputData()


public void InputData(string s) { InQ.Enqueue(s); OutQ.Enqueue(s); }

Phng thc ny n gin ch a d liu nhp vo hng i nhn hin th d liu ln mn hnh v a d liu nhp ny vo hng i gi gi ra ngoi mng. Lp ServerObject
using System; using System.IO; using System.Windows.Forms; using System.Threading; using System.Collections; using System.Net.Sockets; using System.Collections.Generic; using System.Text; namespace Server { class ServerObject { Thread tSend, tReceive, tConnect; public Queue InQ = new Queue(); public Queue OutQ = new Queue(); private TcpListener tcpListener; Socket socketForClient; private NetworkStream netWorkStream; private StreamWriter streamWriter; private StreamReader streamReader; public void CreateConnection() { tConnect = new Thread(new ThreadStart(WaitingConnect)); tConnect.Start(); } private void WaitingConnect() { tcpListener = new TcpListener(1001);

Trang 149

Khoa Cng Ngh Thng Tin


tcpListener.Start();

Gio trnh Lp Trnh Mng

socketForClient = tcpListener.AcceptSocket(); if (socketForClient.Connected) { MessageBox.Show("Client Connected"); netWorkStream = new NetworkStream(socketForClient); streamReader = new StreamReader(netWorkStream); streamWriter = new StreamWriter(netWorkStream); tSend = new Thread(new ThreadStart(Send)); tSend.Start(); tReceive = new Thread(new ThreadStart(Receive)); tReceive.Start(); } else { MessageBox.Show("Ket noi khong thanh cong"); } //socketForClient.Close(); } private void Send() { while (true) { if (OutQ.Count > 0) { streamWriter.WriteLine(OutQ.Dequeue().ToString()); streamWriter.Flush(); } } } private void Receive() { string s; while (true) { s = streamReader.ReadLine(); InQ.Enqueue(s); } }

Trang 150

Khoa Cng Ngh Thng Tin


public void InputData(string s) { InQ.Enqueue(s); OutQ.Enqueue(s); } } }

Gio trnh Lp Trnh Mng

Lp ClientObject
using System; using System.Windows.Forms; using System.Collections; using System.Net.Sockets; using System.Threading; using System.IO; using System.Collections.Generic; using System.Text; namespace Client { class ClientObject { Thread tSend, tReceive, tConnect; public Queue InQ = new Queue(); public Queue OutQ = new Queue(); private TcpClient socketForServer; private NetworkStream networkStream; private StreamWriter streamWriter; private StreamReader streamReader; public void Connect() { tConnect = new Thread(new ThreadStart(WaitConnect)); tConnect.Start(); } public void WaitConnect() { try {

Trang 151

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

socketForServer = new TcpClient("localhost", 1001); } catch { MessageBox.Show("Ket noi that bai"); } networkStream = socketForServer.GetStream(); streamReader = new StreamReader(networkStream); streamWriter = new StreamWriter(networkStream); tSend = new Thread(new ThreadStart(Send)); tSend.Start(); tReceive = new Thread(new ThreadStart(Receive)); tReceive.Start(); } private void Send() { while (true) { if (OutQ.Count > 0) { streamWriter.WriteLine(OutQ.Dequeue().ToString()); streamWriter.Flush(); } } } private void Receive() { string s; while (true) { s = streamReader.ReadLine(); InQ.Enqueue(s); } } public void InputData(string s) { InQ.Enqueue(s); OutQ.Enqueue(s); } } }

Trang 152

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXXVLp trnh ng dng nhiu Client Mt trong nhng kh khn ln nht ca cc nh lp trnh mng l kh nng x l nhiu Client kt ni n cng mt lc. ng dng server x l c vi nhiu Client ng thi th mi Client kt ni ti phi c x l trong mt tiu trnh ring bit. M hnh x l nh sau:

Hnh VI.7:

M hnh x l mt Server nhiu Client

Chng trnh Server s to ra i tng Socket chnh trong chng trnh chnh, mi khi Client kt ni n, chng trnh chnh s to ra mt tiu trnh ring bit iu khin kt ni. Bi v phng thc Accept() to ra mt i tng Socket mi cho mi kt ni nn i tng mi ny c s dng thng tin lin lc vi Client trong tiu trnh mi. Socket ban u c t do v c th chp nhn kt ni khc. Chng trnh ThreadedTcpSrvr
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets;

Trang 153

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

class ThreadedTcpSrvr { private TcpListener client; public ThreadedTcpSrvr() { client = new TcpListener(5000); client.Start(); Console.WriteLine("Dang cho client..."); while (true) { while (!client.Pending()) { Thread.Sleep(1000); } ConnectionThread newconnection = new ConnectionThread(); newconnection.threadListener = this.client; Thread newthread = new Thread(new ThreadStart(newconnection.HandleConnection)); newthread.Start(); } } public static void Main() { ThreadedTcpSrvr server = new ThreadedTcpSrvr(); } } class ConnectionThread { public TcpListener threadListener; private static int connections = 0; public void HandleConnection() { int recv; byte[] data = new byte[1024]; TcpClient client = threadListener.AcceptTcpClient(); NetworkStream ns = client.GetStream(); connections++; Console.WriteLine("Client moi duoc chap nhan, Hien tai co {0} ket noi", connections); string welcome = "Xin chao client"; data = Encoding.ASCII.GetBytes(welcome); ns.Write(data, 0, data.Length);

Trang 154

Khoa Cng Ngh Thng Tin


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

Gio trnh Lp Trnh Mng

Console.WriteLine("Client disconnected: {0} active connections", connections); } }

Trang 155

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXXVICHNG

VIII: LP TRNH VI CC GIAO THC

LXXVIILP TRNH VI GIAO THC ICMP LXXVIIIGiao thc ICMP ICMP c nh ngha trong RFC 792, giao thc ny gip xc nh li ca cac thit b mng. ICMP s dng IP truyn thng trn mng. Mc d n dng IP nhng ICMP hon ton l mt giao thc c lp vi TCP, UDP. Giao thc tng k tip ca cc gi tin IP c xc nh trong phn d liu s dng trng Type. Cc gi tin ICMP c xc nh bi trng Type bng 1 ca gi tin IP, ton b gi tin ICMP c kt hp vi phn d liu ca gi tin IP.

nh dng ca gi tin ICMP v IP LXXVIII.1.1.1. nh dng ca gi tin ICMP Tng t nh TCP v UDP, ICMP dng mt c t nh dng gi tin c bit xc nh thng tin. Cc gi tin ICMP gm nhng trng sau: Trng Type: kch thc 1 byte, xc nh loi thng ip ICMP trong gi tin. Nhiu loi gi tin ICMP c dng gi thng ip iu khin n cc thit b xa. Mi loi thng ip c nh dng ring v cc d liu cn thit. Trng Code: kch thc 1 byte, cc kiu thng ip ICMP khc nhau yu cu cc ty chn d liu v iu khin ring, nhng ty chn ny c nh ngha trng Code.
Trang 156

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Trng Checksum: kch thc 2 byte, trng ny m bo gi tin ICMP n ch m khng b h hi. Trng Message: c nhiu byte, nhng byte ny cha cc thnh phn d liu cn thit cho mi kiu thng ip ICMP. Trng Message thng cha ng nhng thng tin c gi v nhn t thit b xa. Nhiu kiu thng ip ICMP nh ngha 2 trng u tin trong Message l Identifier v s Sequense. Cc trng ny dng nh danh duy nht gi tin ICMP n cc thit b. LXXVIII.1.1.2. Cc tng Type ca gi tin ICMP C nhiu kiu gi tin ICMP, mi kiu ca gi tin ICMP c nh ngha bi 1 byte trong trng Type. Bng sau lit k danh sch cc kiu ICMP ban u c nh ngha trong RFC 792.
Type Code 0 3 4 5 8 11 12 13 14 15 16 M T Echo reply Destination unreachable Source quench Redirect Echo request Time exceeded Parameter problem Timestamp request Timestamp reply Information request Information reply

Cc trng Type ca gi tin ICMP


Trang 157

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

T khi pht hnh RFC 792 vo thng 9 nm 1981, nhiu trng ICMP c to ra. Cc gi tin ICMP c dng cho vic thng bo li mng. Nhng m t sau hay dng cc gi tin ICMP: LXXVIII.1.1.3. Echo Request and Echo Reply Packets Hai gi tin ICMP thng c s dng nht l Echo Request v Echo Reply. Nhng gi tin ny cho php mt thit b yu cu mt tr li ICMP t mt thit b xa trn mng. y chnh l nhn ca lnh ping hay dng kim tra tnh trng ca cc thit b mng. Gi tin Echo Request dng Type 8 ca ICMP vi gi tr code bng 0. Phn d liu ca Message gm cc thnh phn sau: 1 byte Indentifier: xc nh duy nht gi tin Echo Request 1 byte s Sequence: cung cp thm nh danh cho gi tin gi tin ICMP trong mt dng cc byte cha d liu c tr v gi thit b nhn. Khi mt thit b nhn nhn mt gi tin Echo Request, n phi tr li vi mt gi tin Echo Reply, trng Type ICMP bng 0. Gi tin Echo Reply phi cha cng Identifier v s Sequence nh gi tin Echo Request tng ng. Phn gi tr d liu cng phi ging nh ca gi tin Echo Request. LXXVIII.1.1.4. Gi tin Destination Unreachable Gi tin Destination Unreachable vi trng Type bng 3 thng tr v bi thit b Router sau khi n nhn c mt gi tin IP m n khng th chuyn ti ch. Phn d liu ca gi tin Destination Unreachable cha IP Header cng vi 64 bit gin . Trong gi tin, trng Code xc nh l do gi tin khng th c chuyn i bi router. Bng sau cho bit mt s gi tr Code c th gp phi: Code 0 1 M T Network unreachable Host unreachable

Trang 158

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Code 2 3 4 5 6 7 8 9 10 11 12

M T Protocol unreachable Port unreachable Fragmentation needed and DF flag set Source route failed Destination network unknown Destination host unknown Source host isolated Communication with destination network prohibited Communication with destination host prohibited Network unreachable for type of service Host unreachable for type of service Cc gi tr Code Destination Unreachable

LXXVIII.1.1.5. Gi tin Time Exceeded Gi tin Time Exceeded vi trng Type ca ICMP bng 11 l mt cng c quan trng khc phc cc vn mng. N cho bit mt gi tin IP vt qu gi tr thi gian sng (TTL) c nh ngha trong IP Header. Mi khi mt gi tin IP n 1 router, gi tr TTL gim i mt. Nu gi tr TTL v 0 trc khi gi tin IP n ch, router cui cng nhn c gi tin vi gi tr TTL bng 0 s phi gi mt gi tin Time Exceeded cho thit b gi. Lnh tracert hay dng gi tin ny. LXXIXS dng Raw Socket

Trang 159

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Bi v cc gi tin ICMP khng dng c TCP v UDP, nn ta khng dng c cc lp hellper nh TcpClient, UdpClient. Thay v vy, ta phi s dng Raw Socket, y l mt tnh nng ca lp Socket. Raw Socket cho php nh ngha ring cc gi tin mng pha trn tng IP. Tt nhin l t phi lm tt c mi vic bng tay nh l to tt c cc trng ca gi tin ICMP ch khng dng cc th vin c sn ca .NET nh lm vi TCP v UDP. LXXIX.1.1.1. nh dng ca Raw Socket to ra mt Raw Socket, ta phi dng SocketType.Raw khi Socket c to ra. C nhiu gi tr ProtocolType ta c th dng vi Raw Socket c lit k trong bng sau:
Gi Tr Ggp Icmp Idp Igmp IP Ipx ND Pup Raw Spx SpxII Unknown Unspecified M T Gateway-to-Gateway Protocol Internet Control Message Protocol IDP Protocol Internet Group Management Protocol A raw IP packet Novell IPX Protocol Net Disk Protocol Xerox PARC Universal Protocol (PUP) A raw IP packet Novell SPX Protocol Novell SPX Version 2 Protocol An unknown protocol An unspecified protocol

Cc gi tr ca Raw Socket ProtocolType Nhng giao thc c lit k cho Raw Socket trn cho php th vin .NET to ra cc gi tin IP bn di. Bng cch s dng gi tr ProtocolType.Icmp, gi tin IP c to ra bi Socket xc nh giao thc tng tip theo l ICMP (Trng Type bng 1). iu ny cho php thit b xa nhn ra ngay gi tin l 1 gi tin ICMP v x l n mt cch tng ng. Sau y l lnh to ra mt Socket cho cc gi tin ICMP:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);

Trang 160

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXXIX.1.1.2. Gi cc gi tin Raw Bi v ICMP l mt giao thc phi kt ni, nn ta khng th kt ni socket n mt port cc b gi mt gi tin hoc s dng phng thc Connect() kt ni n n mt thit b xa. Ta phi dng phng thc SendTo() ch ra i tng IPEndPoint ca a ch ch. ICMP khng dng cc port v th gi tr port ca i tng IPEndPoint khng quan trng. V d sau to mt i tng IPEndPoint ch khng c port v gi mt gi tin n n:
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 0); sock.SendTo(packet, iep);

LXXIX.1.1.3. Nhn cc gi tin Raw Nhn d liu t mt Raw Socket kh hn gi d liu t mt Raw Socket. nhn d liu t Raw Socket, ta phi dng phng thc ReceiveFrom(). Bi v Raw Socket khng nh ngha giao thc tng cao hn, d liu tr v t mt ln gi phng thc ReceiveFrom() cha ton b ni dung ca gi tin IP. D liu ca gi tin IP bt u t byte th 20 do ly ra c d liu v header ca gi tin ICMP, ta phi bt u c t byte th 20 ca d liu nhn c. LXXXTo ra mt lp ICMP Nh cp trc, Raw Socket khng t ng nh dng gi tin ICMP v vy ta phi t nh dng. Lp ICMP phi nh ngha mi bin cho mi thnh phn trong gi tin ICMP. Cc bin c nh ngha m t mt gi tin ICMP. Cc thnh phn ca mt lp ICMP in hnh Bin D Liu Type Code Checksum Message Kch Thc 1 byte 1 byte 2 bytes multibyte Kiu Byte Byte Unsigned 16-bit integer Byte array

Trang 161

Khoa Cng Ngh Thng Tin


class ICMP { public byte Type; public byte Code; public UInt16 Checksum; public int MessageSize; public byte[] Message = new byte[1024]; public ICMP() { } }

Gio trnh Lp Trnh Mng

Sau khi gi mt gi tin ICMP th hu nh s nhn c mt gi tin ICMP tr v t thit b xa. d dng gii m ni dung ca gi tin, chng ta nn to mt phng thc to lp khc ca lp ICMP n c th nhn mt mng byte Raw ICMP v t cc gi tr vo phn d liu thch hp trong lp:
public ICMP(byte[] data, int size) { Type = data[20]; Code = data[21]; Checksum = BitConverter.ToUInt16(data, 22); MessageSize = size - 24; Buffer.BlockCopy(data, 24, Message, 0, MessageSize); }

Raw Socket tr v ton b gi tin IP do ta phi b qua thng tin IP header trc khi ly thng tin ca gi tin ICMP v th phn Type ti v tr 20 ca mng byte. Phn d liu trong gi tin ICMP c ly ra tng byte mt v c t vo thnh phn thch hp ca ICMP Sua khi to ra mt i tng ICMP mi vi d liu nhn c, ta c th ly cc thnh phn d liu ra:
int recv = ReceiveFrom(data, ref ep); ICMP response = new ICMP(data, recv); Console.WriteLine("Received ICMP packet:"); Console.WriteLine(" Type {0}", response.Type); Console.WriteLine(" Code: {0}", response.Code); Int16 Identifier = BitConverter.ToInt16(response.Message, 0); Int16 Sequence = BitConverter.ToInt16(response.Message, 2); Console.WriteLine(" Identifier: {0}", Identifier); Console.WriteLine(" Sequence: {0}", Sequence);

Trang 162

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4); Console.WriteLine(" data: {0}", stringData);

LXXXITo gi tin ICMP Sau khi mt i tng ICMP c to ra v phn d liu ca gi tin c nh ngha, th ta vn cha th gi trc tip i tng ICMP bng phng thc SendTo() c, n phi chuyn thnh 1 mng byte, vic ny c thc hin nh vo phng thc Buffer.BlockCopy():
public byte[] getBytes() { byte[] data = new byte[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); return data; }

LXXXIITo phng thc Checksum C l phn kh khn nht ca vic to mt gi tin ICMP l tnh ton gi tr checksum ca gi tin. Cch d nht thc hin iu ny l to ra mt phng thc tnh checksum ri t t n vo trong lp ICMP n c s dng bi chng trnh ng dng ICMP.
public UInt16 getChecksum() { UInt32 chcksm = 0; byte[] data = getBytes(); int packetsize = MessageSize + 8; int index = 0; while (index < packetsize) { chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index)); index += 2; } chcksm = (chcksm >> 16) + (chcksm & 0xffff); chcksm += (chcksm >> 16); return (UInt16)(~chcksm); }

Trang 163

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Bi v gi tr checksum s dng m s 16 bit, thut ton ny c tng khc 2 byte ca gi tin ICMP mt lc (s dng phng thc ToUInt16() ca lp BitConverter) v thc hin cc php ton s hc cn thit trn cc byte. Gi tr tr v l mt s nguyn dng 16 bit. s dng gi tr checksum trong mt chng trnh ng dng ICMP, u tin in tt c cc thnh phn d liu, thit lp thnh phn Checksum thnh 0, tip theo gi phng thc getChecksum() tnh ton checksum ca gi tin ICMP v sau t kt qu vo thnh phn Checksum ca gi tin:
packet.Checksum = 0; packet.Checksum = packet.getChecksum();

Sau khi thnh phn Checksum c tnh ton, gi tin sn sng c gi ra ngoi thit b ch dng phng thc SendTo(). Khi mt gi tin ICMP nhn c t mt thit b xa, chng ta phi ly phn Checksum ra v so snh vi gi tr checksum tnh c, nu 2 gi tr khng khp nhau th c li xy ra trong qu trnh truyn v gi tin phi c truyn li. LXXXIIILp ICMP hon chnh
using System; using System.Net; using System.Text; class ICMP { public byte Type; public byte Code; public UInt16 Checksum; public int MessageSize; public byte[] Message = new byte[1024]; public ICMP() { } public ICMP(byte[] data, int size) { Type = data[20]; Code = data[21]; Checksum = BitConverter.ToUInt16(data, 22); MessageSize = size - 24;

Trang 164

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Buffer.BlockCopy(data, 24, Message, 0, MessageSize); } public byte[] getBytes() { byte[] data = new byte[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); return data; } public UInt16 getChecksum() { UInt32 chcksm = 0; byte[] data = getBytes(); int packetsize = MessageSize + 8; int index = 0; while (index < packetsize) { chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index)); index += 2; } chcksm = (chcksm >> 16) + (chcksm & 0xffff); chcksm += (chcksm >> 16); return (UInt16)(~chcksm); } }

LXXXIVChng trnh ping n gin Chng trnh ping l mt chng trnh quan tronjng, n l cng c ban u chun on kh nng kt ni ca mt thit b mng. Chng trnh ping dng cc gi tin ICMP Echo Request (Type 8) gi mt thng ip n gin n thit b xa. Khi thit b xa nhn thng ip, n tr li li vi mt gi tin ICMP Echo Reply (Type 0) cha thng ip ban u

Trang 165

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Thng ip ICMP c dng trong lnh ping Chng trnh ping n gin:
using System; using System.Net; using System.Net.Sockets; using System.Text; class SimplePing { public static void Main(string[] argv) { byte[] data = new byte[1024]; int recv; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(argv[0]), 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("goi tin test"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);

Trang 166

Khoa Cng Ngh Thng Tin


packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getChecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);

Gio trnh Lp Trnh Mng

host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); } catch (SocketException) { Console.WriteLine("Khong co tra loi tu thiet bi o xa"); return; } ICMP response = new ICMP(data, recv); Console.WriteLine("tra loi tu: {0}", ep.ToString()); Console.WriteLine(" Type {0}", response.Type); Console.WriteLine(" Code: {0}", response.Code); int Identifier = BitConverter.ToInt16(response.Message, 0); int Sequence = BitConverter.ToInt16(response.Message, 2); Console.WriteLine(" Identifier: {0}", Identifier); Console.WriteLine(" Sequence: {0}", Sequence); string stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4); Console.WriteLine(" data: {0}", stringData); host.Close(); } }

Chng trnh ping n gin ny ch yu cu mt a ch IP c dng command line. Trong phn u tin ca chng trnh ny, mt gi tin ICMP c to ra, trng Type c gi tr l 8 v Code c gi tr 0. N to ra mt gi tin Echo Request s dng trng Identifier v Sequence theo di cc gi tin ring bit v cho php nhp text vo phn d liu. Cng ging nh cc chng trnh hng phi kt ni nh UDP, mt gi tr timeout c thit lp cho Socket dng phng thc SetSocketOption(). Nu khng c gi tin ICMP tr v trong 3 giy, mt bit l s c nm ra v chng trnh s thot.
Trang 167

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Gi tin ICMP tr v to ra mt i tng ICMP mi, i tng ny c th dng quyt nh nu gi tin nhn c khp vi gi tin ICMP gi. Trng Identifier, Sequence v phn d liu ca gi tin nhn phi khp gi tr ca gi tin gi. LXXXVChng trnh TraceRoute n gin Chng trnh traceroute gi cc ICMP Echo Request n my xa bit c cc router m n s i qua cho n ch. Bng cch thit lp trng TTL (time to live) ca gi tin IP tng ln 1 gi tr khi i qua mi router, chng trnh traceroute c th bt buc gi tin ICMP b loi b ti cc router khc nhau trn ng n ti ch. Mi ln trng TTL ht hn, router cui cng s gi tr v mt gi tin (Type 11) cho thit b gi. Bng cch t gi tr khi u cho trng TTL bng 1, khi gi tin IP i qua mi router th gi tr TTL s gim i mt. Sau mi ln thit b gi nhn c gi tin ICMP Time Exceeded trng TTL s c tng ln 1. Bng cch hin th cc a ch gi cc gi tin ICMP Time Exceeded, ta c th xc nh c chi tit ng i ca mt gi tin ti ch. Chng trnh traceroute s dng phng thc SetSocketOption() v ty chn IPTimeToLive ca Socket thay i gi tr TTL ca gi tin IP. Bi v ch c mi trng TTL ca gi tin IP b thay i, gi tin ICMP c th c to ra mt ln v c s dng trong cc ln tip theo mi khi s dng gi tin IP ny. Chng trnh traceroute n gin:
using System; using System.Net; using System.Net.Sockets; using System.Text; class TraceRoute { public static void Main(string[] argv) { byte[] data = new byte[1024]; int recv, timestart, timestop; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPHostEntry iphe = Dns.Resolve(argv[0]); IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2);

Trang 168

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("goi tin test"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length); packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getCchecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); int badcount = 0; for (int i = 1; i < 50; i++) { host.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, i); timestart = Environment.TickCount; host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); timestop = Environment.TickCount; ICMP response = new ICMP(data, recv); if (response.Type == 11) Console.WriteLine("Chang {0}: tra loi tu {1}, {2}ms", i, ep.ToString(), timestop - timestart); if (response.Type == 0) { Console.WriteLine("{0} den {1} chang, {2}ms.", ep.ToString(), i, timestop - timestart); break; } badcount = 0; } catch (SocketException) { Console.WriteLine("chang {0}: khong co tra loi tu thiet bi o xa", i); badcount++; if (badcount == 5) { Console.WriteLine("Khong the lien lac voi thiet bi o xa"); break; } } } host.Close(); } }

LXXXVILP TRNH VI GIAO THC SMTP LXXXVIIC bn v Email Hu ht mi gi tin email trn Internet u dng m hnh email ca Unix. M hnh ny tr nn ph bin v c s dng rng ri phn ph th n c ngi dng cc b v ngi dng xa. M hnh email Unix chia cc chc nng email ra lm 3 phn:
Trang 169

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

The Message Transfer Agent (MTA) The Message Delivery Agent (MDA) The Message User Agent (MUA) Mi mt phn thc hin mt chc nng ring bit trong qu trnh gi, nhn v hin th th LXXXVII.1.1.1. Hot ng ca MTA MTA iu khin c cc mail gi n v mail gi i, trc y n c chia ra lm 2 chc nng ring bit: Quyt nh ni v cch gi mail ra ngoi Quyt nh noi chuyn mail n Mi mt chc nng trn yu cu mt chc nng x l khc nhau trong MTA

M hnh email Unix LXXXVII.1.1.2. Gi mail ra ngoi Vi mi mail c gi ra ngoi, MTA phi quyt nh ch ca a ch nhn. Nu ch l h thng cc b, MTA c th hoc l chuyn mail trc tip h thng mailbox cc b hoc chuyn mail n MDA pht mail. Tuy nhin, nu ch l mt domain xa, MTA phi thc hin 2 chc nng sau:
Trang 170

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Quyt nh mail server ca domain c s dng mc MX DNS hay khng Thnh lp mt lin kt thng tin vi mail server xa v chuyn mail. Lin kt thng tin vi mail server xa lun lun dng SMTP (Simple Mail Transfer Protocol). Giao thc chun ny cung cp mt k thut giao tip chung chuyn mail gia 2 h thng mail khc nhau trn Internet LXXXVII.1.1.3. Nhn mail MTA chu trch nhim nhn cc th gi n c t h thng cc b v t ngi dng xa. a ch ch ca th phi c xem xt k lng v mt quyt nh phi c thc hin cho bit th c th thc s c gi t h thng cc b hay khng. C 3 danh mc a ch ch c th c dng trong th: cc ti khon cc b ca h thng, cc ti khon b danh cc b, cc ti khon ngi dng xa. Cc ti khon cc b ca h thng: mi h thng mail, d l Window hay Unix hay ngay c Macintosh cng u c mt tp hp cc ti khon cc b c th truy cp vo h thng. MTA phi nhn ra cc th cc mail c ch l ti kha ngi dng v chuyn n hoc trc tip n hp th ca ngi dng hoc n mt MDA ring bit chuyn i. Cc ti khon b danh cc b: Nhiu MTA cho php cc tn b danh c to ra. Tn b danh chnh n khng th lu gi th, thay v vy n s dng con tr n mt hoc nhiu ngi dng ca h thng thc s ni m th c lu tr. Mi khi MTA quyt nh tn b danh hp l, n chuyn i a ch ch thnh h thng tn ti khon ngi dng thc s, Cc ti khon ngi dng xa: nhiu MTA cng chp nhn cc th gi n m ch l cc ti khon ngi dng khng nm trn h thng cc b. y l cng vic i hi phi c nhiu k thut, nhiu kh khn MTA iu khin vic gi mail n mt h thng cc ti khon xa. K thut ny c gi l relying. Mt mail server chp nhn mt th gi n m ch l mt ti khon ca my xa v t ng chuyn th n my xa. Nhiu ISP, tnh nng ny l cn thit bi khc hng khng c kh nng gi th trc tip n

Trang 171

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

cc my xa. Thay v vy, h s gi th n mail server ca ISP, v mail server ca ISP s t ng chuyn th ny n h thng ch. Tht khng may mn, vic chuyn tip mail c th b khai thc, ngi dng c th s dng cc mail server chuyn tip n a ch ngun khi chuyn hng lot th rc n cc ngi dng trn h thng email xa, nhng email ny phi c chn li bi ngi qun tr mail. LXXXVII.1.1.4. Hot ng ca MDA Chc nng chnh ca MDA l chuyn cc th c ch l cc ti khon ngi dng trn h thng cc b. lm c iu ny, MDA phi bit kiu v v tr ca cc mailbox ca cc c nhn. Hu ht cc h thng email s dng mt s kiu h thng c s d liu theo di cc th c lu gi bi ngi dng cc b. MDA phi truy cp n mi mailbox ca ngi dng chn cc th c gi n. Nhiu MDA cng thc hin cc k thut nng cao ch chuyn tip th: T ng lc th: y l chc nng ph bin nht ca cc MDA lc cc thu n. i vi cc ngi dng phi nhn hng ng email mi ngy th y l mt tnh nng tuyt vi. Cc th c th c t ng sp xp theo cc th mc ring bit da vo cc gi tr header, hay ngay c mt vi t trong header. Hu ht cc MDA cng cho php nh qun tr mail cu hnh lc trn ton b h thng c th chn cc th rc hoc cc th c virus. T ng tr li th: nhiu chng trnh MDA cho php ngi dng cu hnh t chuyn th, mt s th t ng tr li c th c cu hnh tr li tt c cc th c nhn bi mt ngi dng, mt s khc c cu hnh t ng tr li da vo mt s t c bit trong header. T ng chy chng trnh: y l kh nng khi ng chng trnh h thng da vo mt s mail n, y l mt cng c qun tr ca nh qun tr. Nh qun tr h thng mail c th khi ng h thng mail t xa hay c th cu hnh mail server t mt my khc mail server. LXXXVII.1.1.5. Hot ng ca MUA

Trang 172

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

MUA cho php ngi dng khng ngi trc mail server vn c th truy cp hp th ca h. MUA ch chu trch nhim chnh c cc th trong hp th, n khng th nhn hoc gi th. C 2 vn phc tp vi MUA l vic c v lu tr cc th n: Lu gi cc th Client Nhiu ISP thch ngi dng ti cc th ca h v. Mi khi th c ti v, n s b g b khi mail server. iu ny gip cho ngi qun tr mail bo ton c khng gian lu tr trn server. Giao thc c dng cho loi truy cp ny l POP (Post Office Protocol, thng c gi l POP3 cho version 3). Chng trnh MUA POP3 cho php ngi dng kt ni n server v ti tt c cc th hp th v. Qu trnh ny c m t trong hnh sau:

Qu trnh ti th s dng phn mm POP3 iu tr ngi khi s dng POP3 l cc th c lu gi trm lm vic ni m ngi dng kt ni ti mail server. Nu ngi dng kt ni s dng nhiu trm lm vic th cc th s b chia ra gia cc trm lm vic lm cho ngi dng kh truy cp cc th sau khi ti cc th xong. Hin nay mt s ISP cho php ti th s dng POP3 m khng xa khi hp th.

Trang 173

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Lu gi th Server Mt phng thc truy cp th thay cho POP3 l IMAP (Interactive Mail Access Protocol hay IMAPPrev4 cho version 4). IMAP cho php ngi dng xy dng cc th mc mail server v lu gi cc th trong cc th mc thay v phi ti xung trm lm vic. Bi v cc th c lu gi server, ngi dng c th kt ni t bt k trm lm vic no c th. Qu trnh ny c m t nh trong hnh sau:

Lu gi th trn server cc th mc s dng IMAP iu tr ngi i vi h thng ny l vic tiu tn dung lng a trn server.
The .NET mail library uses the Microsoft CDOSYS message component to send messages to remote hosts using SMTP. One significant area of confusion is when and how Windows OSes provide support for CDOSYS and how the CDOSYS relates to .NET. This section will shed some light on this topic, in addition to answering questions about CDOSYS.

LXXXVIIISMTP v Windows Th vin mail ca .NET s dng Microsoft CDOSYS gi th n my xa dng SMTP. LXXXVIII.1.1.1. Collaboration Data Objects (CDO)

Trang 174

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

H thng mail Microsoft Exchange 5 s dng th vin Active Message (OLEMSG32.DLL) cho php cc lp trnh vin vit code dng h thng Exchange chuyn th n cc hp th ca ngi dng cng nh n h thng Exchange khc trn mng Exchange. Vi s pht hnh ca Exchange 5.5, mt h thng th mi c gii thiu CDO (Collaboration Data Object). Khng ging nh Active Messaging, CDO s dng MAPI (Message Application Program Interface) cung cp cho cc lp trnh vin mt cch d hn gi th. CDO cng tn ti qua vi nm vi nhiu ci tin bao gm phin bn 1.1, 1.2 v 1.2.1. Nn tng Microsoft NT Server sau ny s dng th vin CDO NT Server (CDONTS). Th vin ny khng dng chun MAPI c s dng trong CDO m bt u s dng cc chun ca Internet nh SMTP chuyn th n cc my xa. Phin bn hin ti ca CDO (CDO 2) c pht hnh chung vi Windows 2000 v n cng c dng trn Windows XP. N s dng CDONTS cung cp cc th vin mail v news cho lp trnh vin. Cc thnh phn mi ca CDO 2 bao gm kh nng x l nhiu file nh km th v nhiu s kin giao thc mail khc nhau. Nhng tnh nng ny gip cho cc lp trnh vin d dng hn trong vic lp trnh. Trong Windows 2000, XP, th vin CDO 2 l CDOSYS.DLL, tt c cc chc nng trong th vin mail .NET phi cn tp tin ny. Bi v CDO 2 hon ton khc vi cc phin bn CDO 1.x nn h thng cn c 2 th vin ny. CDO 2 khng tng thch li vi cc nn tng Windows c hn. LXXXVIII.1.1.2. Dch v mail SMTP C Windows 2000 v Windows XP u cung cp mt server SMTP c bn h tr c gi v nhn th s dng giao thc SMTP. Chc nng ny l mt phn ca IIS (Internet Information Services). Cc lp mail ca .NET c th s dng IIS SMTP Server gi th trc tip ra ngoi n cc mail server xa. Trc khi s dng SMTP, chng ta phi cu hnh cho n, vic cu hnh c thc hin t ca s Computer Management. Cc bc cu hnh nh sau:
Trang 175

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

1. Nhn chut phi vo My Computer, chn Manage 2. Khi ca s Computer Management xut hin, m Services and Applications v sau m Internet Information Services 3. Nhn chut phi vo Default SMTP Virtual Server v chn Properties Ca s Properties l ni chng ta cu hnh cc thit lp cho dch v SMTP Trong th General, chn card mng cho php cc kt ni SMTP ti v s lng cc kt ni SMTP ng thi c php. Chng ta cng c th bt/tt vic ghi log cho dch v SMTP. Trong th Delivery, cu hnh s ln c gng gi th. Nt Advanced l cc thit lp thng minh cho mail server. Cu hnh ny quan trng nu mail server ca ISP l mt server chuyn tp n mail server xa. lm iu ny, chng ta phi, nhp a ch mail server ca ISP v dch v SMTP s chuyn tip tt c cc th ra ngoi thng qua server ny.

Default SMTP Virtual Properties


Trang 176

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

LXXXIXLp SmtpMail Lp SmtpMail nm trong namespace System.Web.Mail cho php gi th theo giao thc SMTP trong chng trnh C#. XCCc phng thc v thuc tnh ca lp SmtpMail Lp SmtpMail cung cp giao tip .NET cho th vin mail CDOSYS trn h thng Windows 200 v Windows XP. N khng dng phng thc to lp to 1 th hin ca lp. Thay v vy, ta phi dng cc phng thc v thuc tnh static truyn thng tin cho th vin CDOSYS. Phng thc Send() ca lp SmtpMail l hay c dng nht, phng thc Send() c qu ti hm v n c 2 nh dng nh sau:
Send(MailMessage message) Send(string from, string to, string subject, string body)

nh dng u tin cho php gi mt i tng MailMessage. Lp MailMessage cha mt thng ip email, thng ip ny c to ra bng cch gn gi tr cho cc thuc tnh ca lp vi thng tin lin quan n thng ip v cc a ch ch. nh dng th 2 s cho php chng ta gi mt thng ip dng raw, chng ta phi ch ra cc trng header ca thng ip email: From: ngi gi thng ip To: cc a ch nhn thng ip, ngn cch bi du phy Subject: tiu th i s cui cng ca phng thc Send() l phn thn ca th. Phn ny c th l text hoc HTML. Thuc tnh duy nht ca lp SmtpMail l SmtpServer. N l mt thuc tnh static v n ch ra a ch ca server chuyn tip th c dng chuyn tip cc thng ip mail ra ngoi. Mc nh, thuc tnh SmtpSerrver c thit lp cho dch v SMTP ca IIS nu IIS c ci. Nu IIS khng c ci, thuc tnh SmtpServer c thit lp gi tr null v s pht sinh ra li khi gi thng ip i.

Trang 177

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

Nu chng ta s dng mt mail server chuyn tip, chng ta phi thit lp gi tr cho thuc tnh SmtpServer trc khi gi thng ip.
SmtpMail.SmtpServer = "mailsrvr.myisp.net";

Khi tt c cc gi tr c thit lp, tt c cc th gi i s c chuyn tip qua mail server ny. Tt nhin, chng ta phi m bo rng server ny cho php chng ta chuyn tip mail qua n. XC.1.1.1. S dng lp SmtpMail Chng trnh MailTest sau y s minh ha cch to mt email n gin v gi n thng qua mt mail rely n ngi nhn:

TI LIU THAM KHO [1] C Sharp Network Programming, Sybex [2] Microsoft Network Programming For The Microsoft Dot Net Framework, Microsoft Press [3] Network programming in dot NET C Sharp and Visual Basic dot NET, Digital Press

Trang 178

You might also like