BAI HOC THAY HAY IN

Embed Size (px)

Citation preview

CHNG 1: TNG QUAN V CNG NGH PHN MM

Khoa Cng Ngh Thng Tin

Gio trnh Lp Trnh Mng

MC LC6 CHNG I: NHNG KIN THC C BN V LP TRNH MNG

6I.1. Tng quan

6I.1.1. Tng Ethernet

7I.1.2. a ch Ethernet

9I.1.3. Ethernet Protocol Type

9I.1.4. Data payload

10I.1.5. Checksum

10I.2. Tng IP

11I.2.1. Trng a ch

11I.2.2. Cc c phn on

12I.2.3. Trng Type of Service

12I.2.4. Trng Protocol

13I.3. Tng TCP

14I.3.1. TCP port

16I.3.2. C ch m bo tin cy truyn ti cc gi tin

17I.3.3. Qu trnh thnh lp mt phin lm vic TCP

18I.4. Tng UDP

21 CHNG II: LP TRNH SOCKET HNG KT NI

21II.1. Socket

24II.2. IPAddress

25II.3. IPEndPoint

25II.4. Lp trnh Socket hng kt ni

26II.4.1. Lp trnh pha Server

30II.4.2. Lp trnh pha Client

32II.4.3. Vn vi b m d liu

33II.4.4. X l vi cc b m c kch thc nh

35II.4.5. Vn vi cc thng ip TCP

39II.4.6. Gii quyt cc vn vi thng ip TCP

39II.4.6.1. S dng cc thng ip vi kch thc c nh

44II.4.6.2. Gi km kch thc thng ip cng vi thng ip

50II.4.6.3. S dng cc h thng nh du phn bit cc thng ip

50II.4.7. S dng C# Stream vi TCP

50II.4.7.1. Lp NetworkStream

54II.4.7.2. Lp StreamReader v StreamWriter

59 CHNG III: LP TRNH SOCKET PHI KT NI

59III.1. Tng quan

60III.2. Lp trnh pha Server

62III.3. Lp trnh pha Client

64III.3.1. S dng phng thc Connect() trong chng trnh UDP Client

65III.3.2. Phn bit cc thng ip UDP

67III.4. Ngn cn mt d liu

70III.5. Ngn cn mt gi tin

71III.5.1. S dng Soket Time-out

73III.6. iu khin vic truyn li cc gi tin

79 CHNG V: S DNG CC LP HELPER CA C# SOCKET

79IV.1. Lp TCP Client

82IV.2. Lp TCPListener

85IV.3. Lp UdpClient

89 CHNG V: A NHIM TIU TRNH

89V.1. Khi nim tin trnh v tiu trnh ca Windows

89V.2. M hnh

90V.3. Cc k thut trong .NET to tiu trnh

90V.3.1. To tiu trnh trong Thread-pool

93V.3.2. To tiu trnh bt ng b

96V.3.2.1. Phng thc BlockingExample

97V.3.2.2. Phng thc PollingExample

98V.3.2.3. Phng thc WaitingExample

99V.3.2.4. Phng thc WaitAllExample

100V.3.2.5. Phng thc CallbackExample

102V.3.3. Thc thi phng thc bng Timer

104V.3.4. Thc thi phng thc bng tiu trnh mi

106V.3.5. iu khin qu trnh thc thi ca mt tiu trnh

110V.3.6. Nhn bit khi no mt tiu trnh kt thc

112V.3.7. Khi chy mt tin trnh mi

114V.3.8. Kt thc mt tin trnh

115V.4. Thc thi phng thc bng cch ra hiu i tng WaitHandle

117 CHNG V: NG B HA

117VI.1. L do ng b ha

117VI.2. Cc phng php ng b ha

117VI.3. Phng php Semaphore

119VI.4. Phng php dng lp Monitor

121VI.5. System.Threading.WaitHandle, bao gm AutoResetEvent, ManualResetEvent

124VI.6. Phng php Mutex

126 CHNG V: LP TRNH SOCKET BT NG B

126VII.1. Lp trnh s kin trong Windows

127VII.1.1. S dng Event v Delegate

129VII.1.2. Lp AsyncCallback trong lp trnh Windows

129VII.2. S dng Socket bt ng b

130VII.2.1. Thnh lp kt ni

130VII.2.1.1. Phng thc BeginAccept() v EndAccept()

132VII.2.1.2. Phng thc BeginConnect() v EndConnect()

133VII.2.2. Gi d liu

133VII.2.2.1. Phng thc BeginSend() v phng thc EndSend()

134VII.2.2.2. Phng thc BeginSendTo() v EndSendTo()

135VII.2.3. Nhn d liu

135VII.2.3.1. Phng thc BeginReceive(), EndReceive, BeginReceiveFrom(), EndReceiveFrom()

135VII.2.4. Chng trnh WinForm gi v nhn d liu gia Client v Server

135VII.2.4.1. Chng trnh Server

135VII.2.4.2. M hnh chng trnh Server

136VII.2.4.3. Lp ServerProgram

139VII.2.4.4. Lp ServerForm

140VII.2.5. Chng trnh Client

141VII.2.5.1. M hnh chng trnh Client

142VII.2.5.2. Lp ClientProgram

145VII.2.5.3. Lp ClientForm

146VII.3. Lp trnh Socket bt ng b s dng tiu trnh

146VII.3.1. Lp trnh s dng hng i gi v hng i nhn thng ip

152VII.3.2. Lp trnh ng dng nhiu Client

155 TI LIU THAM KHO

I CHNG I: NHNG KIN THC C BN V LP TRNH MNGI.1. Tng 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 liuI.1.1. Tng 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 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.

INCLUDEPICTURE "mk:@MSITStore:E:\\CNTT\\Lap%20trinh%20mang\\Ebook\\Sybex%20-%20C%20Sharp%20Network%20Programming.chm::/images/f0205%5F0%2Ejpg" \* MERGEFORMATINET 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 6 byte a ch MAC ngun 2 byte xc nh giao thc tng k tip Data payload t 46 n 1500 byte 4-byte checksumI.1.2. a 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 ChM T

01-80-C2-00-00-00Spanning tree (for bridges)

09-00-09-00-00-01HP Probe

09-00-09-00-00-01HP Probe

09-00-09-00-00-04HP DTC

09-00-2B-00-00-00DEC MUMPS

09-00-2B-00-00-01DEC DSM/DTP

09-00-2B-00-00-02DEC VAXELN

09-00-2B-00-00-03DEC Lanbridge Traffic Monitor (LTM)

09-00-2B-00-00-04DEC MAP End System Hello

09-00-2B-00-00-05DEC MAP Intermediate System Hello

09-00-2B-00-00-06DEC CSMA/CD Encryption

09-00-2B-00-00-07DEC NetBios Emulator

09-00-2B-00-00-0FDEC Local Area Transport (LAT)

09-00-2B-00-00-1xDEC Experimental

09-00-2B-01-00-00DEC LanBridge Copy packets (all bridges)

09-00-2B-02-00-00DEC DNA Lev. 2 Routing Layer Routers

09-00-2B-02-01-00DEC DNA Naming Service Advertisement

09-00-2B-02-01-01DEC DNA Naming Service Solicitation

09-00-2B-02-01-02DEC DNA Time Service

09-00-2B-03-xx-xxDEC default filtering by bridges

09-00-2B-04-00-00DEC Local Area System Transport (LAST)

09-00-2B-23-00-00DEC Argonaut Console

09-00-4E-00-00-02Novell IPX

09-00-77-00-00-01Retix spanning tree bridges

09-00-7C-02-00-05Vitalink diagnostics

09-00-7C-05-00-01Vitalink gateway

0D-1E-15-BA-DD-06HP

CF-00-00-00-00-00Ethernet Configuration Test protocol (Loopback)

I.1.3. Ethernet Protocol Type

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

0800IP

0806ARP

0BADBanyan VINES

8005HP Probe

8035Reverse ARP

809BAppleTalk

80D5IBM SNA

8137Novell

8138Novell

814CRaw SNMP

86DDIPv6

876BTCP/IP compression

I.1.4. Data 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.I.1.5. Checksum

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.

I.2. Tng IP

Tng IP nh ngha thm nhiu trng thng tin ca ca giao thc Ethernet

Hnh I.3: Thng tin tng IPCc trng trong tng IP:TrngBitM T

Version4Phin bn IP header (phin bn hin ti l 4)

Header Length4Chiu di phn header ca gi IP

Type of Service8Kiu cht lng dch v QoS (Quality of Service)

Total Length16Chiu di ca gi IP

Identification16Gi tr ID duy nht xc nh cc gi IP

Flags3Cho bit gi IP c b phn on hay khng hay cn cc phn on khc

Fragment offset13V tr ca phn on trong gi IP

Time to Live (TTL)8Thi gian ti a gi tin c php li trn mng (c tnh bng giy)

Protocol8Kiu giao thc ca tng d liu k tip

Header Checksum16Checksum ca d liu gi IP header

Source Address32a ch IP ca thit b gi

Destination Address32a ch IP ca thit b nhn

Optionsnh ngha cc c im ca gi IP trong tnglai

I.2.1. Trng a ch

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

Lp B128.x.x.x191.x.x.x

Lp C192.x.x.x223.x.x.x

Lp D224.x.x.x254.x.x.x

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

I.2.3. Trng Type of Service

Trng Type of Service xc nh kiu cht lng dch v QoS (Quality of Service) cho gi IP. Trng ny c dng nh du mt gi IP c mt u tin no chng hn nh c dng tng u tin ca cc d liu cn thi gian thc nh Video, Audio.

Trong hu ht cc truyn ti mng, trng ny c c thit lp gi tr zero, cho bit y l d liu bnh thng, tuy nhin vi cc ng dng cn thi gian thc nh Video hay Audio th trng ny s c s dng tng u tin cho gi d liu. Trng ny gm tm bit v ngha cc bit nh sau:

3 bit c dng lm trng u tin

1 bit cho bit thi gian tr l bnh thng hay thp

1 bit cho bit thng lng bnh thng hay cao

1 bit cho bit tin cy bnh thng hay cao

2 bit c dng trong tng lai

I.2.4. Trng 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 TrGiao Thc

1Internet Control Message (ICMP)

2Internet Group Message (IGP)

6Transmission Control (TCP)

8Exterior Gateway (EGP)

9Interior Gateway (Cisco IGP)

17User Datagram (UDP)

88Cisco EIGRP

Hai giao thc c dng nhiu nht trong lp trnh mng l TCP v UDP

I.3. Tng TCP

Giao thc TCP (Transmission Control Protocol) l giao thc hng kt ni, n cho php to ra kt ni im ti im gia hai thit b mng, thit lp mt ng nht qun truyn ti d liu. TCP m bo d liu s c chuyn ti thit b ch, nu d liu khng ti c thit b ch th thit b gi s nhn c thng bo li.

Cc nh lp trnh mng phi hiu cch hot ng c bn ca TCP v c bit l phi hiu cch TCP truyn ti d liu gi cc thit b mng. Hnh sau cho thy nhng trng ca TCP Header. Nhng trng ny cha cc thng tin cn thit cho vic thc thi kt ni v truyn ti d liu mt cch tin tng.

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

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

IANA nh ngha mt danh sch cc port TCP tiu chun c gn cho cc ng dng c bit:

PortM T

7Echo

13Daytime

17Quote of the day

20FTP (data channel)

21FTP (control channel)

22SSH

23Telnet

25SMTP

37Time

80HTTP

110POP3

119NNTP

123Network Time Protocol (NTP)

137NETBIOS name service

138NETBIOS datagram service

143Internet Message Access Protocol (IMAP)

389Lightweight Directory Access Protocol (LDAP)

443Secure HTTP (HTTPS)

993Secure IMAP

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

I.3.2. C 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.

I.3.3. Qu 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):FlagM T

6 bit dnh ringDnh ring s dng trong tng lai, gi tr lun lun l zero

1-bit URG flagnh du gi tin l d liu khn cp

1-bit ACK flagHi bo nhn mt gi tin

1-bit PUSH flagCho bit d liu c y vo ng dng ngay lp tc

1-bit RESET flagThit lp li tnh trng khi u kt ni TCP

1-bit SYN flagBt u mt phin lm vic

1-bit FIN flagKt thc mt phin lm vic

TCP s dng cc tnh trng kt ni quyt nh tnh trng kt ni gia cc thit b. Mt giao thc bt tay c bit c dng thnh lp nhng kt ni ny v theo di tnh trng kt ni trong sut phin lm vic. Mt phin lm vic TCP gm ba pha sau:

M bt tay

Duy tr phin lm vic

ng bt tay

Mi pha yu cu cc bit c c thit lp trong mt th t no . Qu trnh m bt tay thng c gi l ba ci bt tay v n yu cu ba bc thnh lp kt ni.

Thit b gi gi c SYN cho bit bt u phin lm vic

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

Sau khi phin lm vic c thnh lp, c ACK s c thit lp trong cc gi tin. ng phin lm vic, mt qu trnh bt tay khc c thc hin dng c FIN:

Thit b khi u ng kt ni gi c FIN

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

I.4. Tng 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

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:PortM T

53Domain Name System

69Trivial File Transfer Protocol

111Remote Procedure Call

137NetBIOS name service

138NetBIOS datagram

161Simple Network Management Protocol

II CHNG II: LP TRNH SOCKET HNG KT NIII.1. Socket

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:AppleTalka ch AppleTalk

AtmNative ATM services address.

Banyana ch Banyan

Ccitta ch cho giao thc CCITT, nh l X25

Chaosa ch cho giao thc MIT CHAOS

Clustera ch cho cc sn phm cluster ca Microsoft

DataKita ch cho giao thc Datakit

DataLinka ch ca giao thc tng data-link

DecNeta ch DECnet

Ecmaa ch ECMA (European Computer Manufacturers Association)

FireFoxa ch FireFox

HyperChannela ch NSC Hyperchannel

Ieee12844a ch workgroup IEEE 1284.4

ImpLinka ch ARPANET IMP

InterNetworka ch IP version 4

InterNetworkV6a ch IP version 6

Ipxa ch IPX hoc SPX

Irdaa ch IrDA

Isoa ch cho giao thc ISO

Lata ch LAT

Maxa ch MAX

NetBiosa ch NetBios

NetworkDesignersa ch Network Designers

NSa ch Xerox NS

Osia ch cho giao thc ISO

Pupa ch cho giao thc PUP

Snaa ch IBM SNA

Unixa ch Unix

UnknownCha bit h a ch

UnspecifiedCha ch ra h a ch

VoiceViewa ch VoiceView

+SocketType: kiu Socket, tham s ny c th c cc giao thc sau:KiuM t

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

Rawc s trong cc giao thc cp thp nh Internet Control Message 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.

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

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

Streamc 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

UnknownCha bit kiu Socket

+ProtocolType: kiu giao thc, tham s ny c th c cc gi tr sau:

ProtocolTypeM t

GgpGateway To Gateway Protocol.

IcmpInternet Control Message Protocol.

IcmpV6Internet Control Message Protocol IPv6.

IdpInternet Datagram Protocol.

IgmpInternet Group Management Protocol.

IPInternet Protocol.

IPSecAuthenticationHeaderIPv6 Authentication.

IPSecEncapsulatingSecurityPayloadIPv6 Encapsulating Security Payload header.

IPv4Internet Protocol version 4.

IPv6Internet Protocol version 6 (IPv6).

IpxInternet Packet Exchange Protocol.

NDNet Disk Protocol (unofficial).

PupPARC Universal Packet Protocol.

RawRaw IP packet protocol.

SpxSequenced Packet Exchange protocol.

SpxIISequenced Packet Exchange version 2 protocol.

TcpTransmission Control Protocol.

UdpUser Datagram Protocol.

UnknownGiao thc cha bit

UnspecifiedGiao thc cha c ch ra

V d phng thc to lp ca lp Socket:

Socket sk = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

II.2. IPAddress

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 IPAddressPhng Thc M T

Equals So snh 2 a ch IP

GetHashCode Ly gi tr has cho 1 i tng IPAddress

GetType Tr v kiu ca mt th hin a ch IP

HostToNetworkOrder Chuyn 1 a ch IP t host byte order thnh network byte order

IsLoopBack Cho bit a ch IP c phi l a ch LoopBack hay khng

NetworkToHostOrder Chuyn 1 a ch IP t network byte order thnh host byte order

Parse Chuyn 1 chui thnh 1 th hin IPAddress

ToString Chuyn 1 i tng IPAddress thnh mt chui

Phng thc Parse() thng c dng to ra 1 th hin ca IPAddress:IPAddress localIpAddress = IPAddress.Parse("127.0.0.1");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

II.3. IPEndPoint

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.

II.4. Lp trnh Socket hng kt niTrong 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

Hnh II.1: M hnh lp trnh Socket hng kt ni II.4.1. Lp trnh pha Server u tin Server s to mt Socket, Socket ny s c gn vo mt a ch ip v mt port cc b, hm thc hin vic ny l hm Bind(). Hm ny cn mt danh i s l mt IPEndPoint cc b:

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

server.Bind(ipep);

Bi v Server thng chp nhn kt ni trn chnh a ch IP v port ring ca n nn ta dng IPAddress.Any chp nhn kt ni trn bt k card mng no

a ch IP ta dng y l a ch IP version 4 v kiu giao thc l TCP nn AddressFamily l InterNetwork v SocketType l Stream.

Sau khi Socket c gn kt vo mt a ch v mt port, Server phi sn sng chp nhn kt ni t Client. Vic ny c thc hin nh vo hm Listen().Hm Listen() c mt i s, chnh l s Client ti a m n lng nghe.

server.Listen(10);

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

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

buff = Encoding.ASCII.GetBytes(welcome);

client.Send(buff, buff.Length, SocketFlags.None);

Phng thc Send() ca Socket dng gi d liu, phng thc ny c mt s i s quan trng sau:

Buff : mng cc byte cn gi

Offset: v tr u tin trong mng cn gi

Size: s byte cn gi

SocketFlags: ch ra cch gi d liu trn SocketVic gi v nhn d liu c thc hin lin tc thng qua mt vng lp v hn:

while (true)

{

buff = new byte[1024];

recv = client.Receive(buff);

if (recv == 0)

break;

Console.WriteLine(Encoding.ASCII.GetString(buff, 0, recv));

client.Send(buff, recv, SocketFlags.None);

}

Phng thc Receive() t d liu vo buffer, kch thc buffer c thit lp li, do nu buffer khng c thit lp li, ln gi phng thc Receive() k tip s ch c th nhn c d liu ti a bng ln nhn d liu trc.Phng thc ny c mt s i s quan trng sau:

Buff : mng cc byte cn gi

Offset: v tr u tin trong mng cn nhn

Size: s byte cn gi

SocketFlags: ch ra cch nhn d liu trn Socket

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

client.Close();

server.Close(); Chng trnh TCP Server n gin:using System;

using System.Net;

using System.Net.Sockets;

using System.Text;

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

//Chuyn chui thnh mng cc byte

buff = Encoding.ASCII.GetBytes(welcome);

//Gi cu cho cho Client

client.Send(buff, buff.Length, SocketFlags.None);

while (true)

{

//Reset li buffer

buff = new byte[1024];

//Ly s byte thc s nhn c

byteReceive = client.Receive(buff);

//Nu Client ngt kt ni th thot khi vng lp

if (byteReceive == 0)

break;

Console.WriteLine(Encoding.ASCII.GetString(buff, 0, byteReceive));

//Sau khi nhn d liu xong, gi li cho Client

client.Send(buff, byteReceive, SocketFlags.None);

}

Console.WriteLine("Da dong ket noi voi Client: {0}", clientep.Address);

//ng kt ni

client.Close();

server.Close();

}

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

Hnh II.2: Kt qu tr v sau khi telnet vo Server local ti port 5000

Sau khi dng lnh telnet, kt qu tr v nh trn hnh l kt ni thnh cng

II.4.2. Lp trnh pha ClientLp 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:

Gi tr M t

SocketShutdown.Both Ngn cn gi v nhn d liu trn Socket.

SocketShutdown.Receive Ngn cn nhn d liu trn Socket. C RST s c gi nu c thm d liu c nhn.

SocketShutdown.Send Ngn cn gi d liu trn Socket. C FIN s c gi sau khi tt c d liu cn li trong buffer c gi i.

Chng trnh TCP Client n gin:

using System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class SimpleTcpClient

{

public static void Main()

{

//Buffer gi v nhn d liu

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

Console.WriteLine(stringData);

while (true)

{

//Nhp d liu t bn phm

input = Console.ReadLine();

//Nu nhp exit th thot v ng Socket if (input == "exit")

break;

//Gi d liu cho server

server.Send(Encoding.ASCII.GetBytes(input));

//Reset li buffer

buff = new byte[1024];

//S byte thc s nhn c

byteReceive = server.Receive(buff);

//Chui nhn c

stringData = Encoding.ASCII.GetString(buff, 0, byteReceive);

Console.WriteLine(stringData);

}

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

}

}

II.4.3. Vn vi b m d liu Trong v d Client, Server n gin trn th mt mng cc byte c dng nh l b m gi v nhn d liu trn Socket. Bi v chng trnh c chy trong mi trng c iu khin, tt c cc thng ip u thuc dng text v kch thc nh nn loi buffer ny khng phi l mt vn .

Trong th gii thc, chng ta khng bit kch thc v kiu d liu n trong khi truyn thng gia Client v Server. Vn xy ra khi khi d liu n ln hn kch thc b m d liu.

Khi nhn d liu thng qua TCP, d liu c lu tr trong b m h thng. Mi khi gi phng thc Receive(), n s c d liu t b m TCP v ly d liu ra khi b m. S lng d liu c c bi phng thc Receive() c iu khin bi hai yu t sau: Kch thc b m d liu c ch ra trong phng thc Receive() Kch thc b m c ch ra trong tham s ca phng thc Receive()

Trong v d n gin trn, buffer c nh ngha l mt mng byte kch thc 1024. Bi v kch thc d liu khng c ch ra trong phng thc Receive() nn kch thc b m t ng ly kch thc mc nh ca b m d liu l 1024 byte. Phng thc Receive() s c 1024 byte d liu mt ln v t d liu c c vo bin 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.

II.4.4. X l vi cc b m c kch thc nhH 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

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

II.4.5. Vn 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 ReceiveNh trn hnh vn xy ra khi truyn d liu l khng m bo c mi phng thc Send() s khng c c bi mt phng thc Receive(). Tt c d liu c c t phng thc Receive() khng thc s c c trc tip t mng m n c c t b m TCP. Khi cc gi tin TCP c nhn t mng s c t theo th t trong b m TCP. Mi khi phng thc Receive() c gi, n s c d liu trong b m TCP, khng quan tm n bin d liu.

Chng ta hy xem xt v d sau, Chng Trnh BadTCPServer:using System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class BadTcpServer

{

public static void Main()

{

//S byte thc s nhn c dng hm Receive()

int byteReceive;

//buffer nhn v gi d liu

byte[] buff = new byte[1024];

//EndPoint cc b

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);

//Server Socket

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//Kt ni server vi 1 EndPoint

server.Bind(ipep);

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

}

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

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.II.4.6. Gii 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

II.4.6.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;

}

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;

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)

{

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

data = Encoding.ASCII.GetBytes(welcome);

int sent = SendData(client, data);

for (int i = 0; i < 5; i++)

{

data = ReceiveData(client, 12);

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)

{

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;

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

Hnh II.7: Kt qu gi v nhn d liu vi kch thc c nh II.4.6.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);

total += sent;

dataleft -= sent;

}

return total;

}

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;

}

return data;

}

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)

{

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

{

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;

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

Hnh II.8: Kt qu gi v thng ip cng vi kch thc II.4.6.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. II.4.7. S 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 StreamReaderII.4.7.1. Lp NetworkStreamLp 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 TnhM T

CanRead true nu NetworkStream h tr c

CanSeek Lun lun false

CanWrite true nu NetworkStream h tr ghi

DataAvailable true nu c d liu c

Mt s phng thc ca lp NetworkStream:Phng Thc M T

BeginRead() Bt u c NetworkStream bt ng b

BeginWrite() Bt u ghi NetworkStream bt ng b

Close() ng i tng NetworkStream

CreateObjRef() To ra mt i tng dng nh l proxy cho NetworkStream

EndRead() Kt thc c NetworkStream bt ng b

EndWrite() Kt thc ghi NetworkStream bt ng b

Equals() So snh hai i tng NetworkStreams

Flush() y tt c d liu t NetworkStream i

GetHashCode() Ly hash code cho NetworkStream

GetLifetimeService() Ly i tng lifetime service cho NetworkStream

GetType() Ly kiu NetworkStream

InitializeLifetimeService() Ly i tng lifetime service object iu khin chnh sch lifetime choNetworkStream

Read() c d liu t NetworkStream

ReadByte() c mt byte d liu t NetworkStream

ToString() Tr v chui m t NetworkStream

Write() Ghi d liu t NetworkStream

Phng thc Read() c dng c cc khi d liu t NetworkStream. nh dng ca phng thc ny: int Read(byte[] buffer, int offset, int size)

Trong :

buffer: mng cc byte c c vo

offset: v tr bt u c vo trong b m

size: s byte ti a c c

Phng thc ny tr v mt gi tr interger m t s byte thc s c c t NetworkStream v dt d liu c c vo buffer.

Phng thc Write() dng gi cc khi d liu i cng c nh dng tng t:

void Write(byte[] buffer, int offset, int size)

Trong :

buffer: mng cc byte ghi

offset: v tr bt u ghi trong b m

size: s byte ti a c ghi bt u ti v tr offset

Chng trnh TCP Client NetworkStreamusing System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class NetworkStreamTcpClient

{

public static void Main()

{

byte[] data = new byte[1024];

string input, stringData;

int recv;

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 500);

Socket server = new Socket(AddressFamily.InterNetwork,

SocketType.Stream, ProtocolType.Tcp);

try

{

server.Connect(ipep);

}

catch (SocketException e)

{

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

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. II.4.7.2. Lp StreamReader v StreamWriterNamespcace 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 M T

Close() ng i tng StreamReader

CreateObjRef() To ra mt i tng c dng nh l mt proxy cho StreamReader

DiscardBufferedData() B d liu hin ti StreamReader

Equals() So snh hai i tng StreamReader

GetHashCode() Ly hash code cho i tng StreamReader

GetLifetimeService() Ly i tng lifetime service object cho StreamReader

GetType() Ly kiu ca i tng StreamReader

InitializeLifetimeService() To ra mt i tng lifetime service cho StreamReader

Peek() Tr v byte d liu hp l tip theo t m khng g b n khi stream

Read() c mt hoc nhiu byte d liu t StreamReader

ReadBlock() c mt nhm cc byte t stream StreamReader v t n vo mt b m

ReadLine() c d liu t bt u i tng StreamReader tr ln cho n khi gp k t xung dng u tin

ReadToEnd() c d liu cho n khi ht stream

ToString() To ra mt chui m t i tng StreamReader

Tng t i tng StreamReader, i tng StreamWriter c th c to ra t mt i tng NetworkStream:public StreamWriter(Stream stream);

StreamWriter cng c nhiu phng thc v thuc tnh kt hp vi n, mt s phng thc v thuc tnh ca lp StreamReader cng c trong i tng StreamWriter, ngoi ra n cn c mt s phng thc v thuc tnh ring:Phng Thc M T

Flush() Gi tt c d liu trong b m StreamWriter ra stream

Write() Gi mt hoc nhiu byte d liu ra stream

WriteLine() Gi d liu cng vi k t xung dng ra stream

Phng thc ReadLine() l phng thc hay nht ca lp StreamReader. N c cc k t t stream cho ti khi n gp k t xung dng. Tnh nng ny cho php s dng k t xung dng nh l mt k t phn tch cc thng ip. Phng thc WriteLine() ca lp StreamWriter s so khp vi phng thc ReadLine ca lp StreamReader do vic x l cc thng ip TCP tr nn d dng hn.

Chng trnh Stream TCP Serverusing System;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Text;

class StreamTcpSrvr

{

public static void Main()

{

string data;

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

}

}

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)

{

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

}

}III CHNG III: LP TRNH SOCKET PHI KT NIIII.1. Tng 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

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() III.2. Lp 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)

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

ReceiveFrom(byte[] data, ref EndPoint Remote)

Cng nh thng thng, tham s th nht l mt mng byte c nh ngha nhn d liu, tham s th hai ra phi truyn tham chiu ca i tng EndPoint. Tham chiu ny tham chiu n v tr b nh ni bin c lu tr. Phng thc ReceiveFrom() s t thng tin EndPoint t thit b xa vo vng b nh ca i tng EndPoint tham chiu n. Bng vic s dng i s th hai l tham chiu ta s ly c a ch IP v port ca my xa. Chng trnh UDP n ginusing System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class SimpleUdpSrvr

{

public static void Main()

{

int recv;

byte[] data = new byte[1024];

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);

Socket newsock = new Socket(AddressFamily.InterNetwork,

SocketType.Dgram, ProtocolType.Udp);

newsock.Bind(ipep);

Console.WriteLine("Dang cho Client ket noi den...");

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);

EndPoint Remote = (EndPoint)(sender);

recv = newsock.ReceiveFrom(data, ref Remote);

Console.WriteLine("Thong diep duoc nhan tu {0}:", Remote.ToString());

Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

string welcome = "Hello Client";

data = Encoding.ASCII.GetBytes(welcome);

newsock.SendTo(data, data.Length, SocketFlags.None, Remote);

while (true)

{

data = new byte[1024];

recv = newsock.ReceiveFrom(data, ref Remote);

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 III.3. Lp trnh pha ClientBi v Client khng cn ch trn mt port UDP nh sn nn n cng chng cn dng phng thc Bind(), thay v vy n s ly mt port ngu nhien trn h thng khi d liu c gi v n gia port ny nhn d liu tr v. Chng trnh UDP Client cng tng t chng trnh UDP Server: Chng trnh UDP Client n ginusing System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class SimpleUdpClient

{

public static void Main()

{

byte[] data = new byte[1024];

string input, stringData;

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);

Socket server = new Socket(AddressFamily.InterNetwork,

SocketType.Dgram, ProtocolType.Udp);

string welcome = "Hello server";

data = Encoding.ASCII.GetBytes(welcome);

server.SendTo(data, data.Length, SocketFlags.None, ipep);

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);

EndPoint Remote = (EndPoint)sender;

data = new byte[1024];

int recv = server.ReceiveFrom(data, ref Remote);

Console.WriteLine("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.

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.III.3.1. S dng phng thc Connect() trong chng trnh UDP ClientCc 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)

{

input = Console.ReadLine();

if (input == "exit")

break;

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

}

}III.3.2. Phn bit cc thng ip UDP

Mt trong nhng tnh nng quan trng ca UDP m TCP khng c c l kh nng x l thng ip m khng cn quan tm n bin thng ip. UDP bo v bin thng ip ca tt c cc thng ip c gi. Mi ln gi phng thc ReceiveFrom() n ch c d liu c gi t mt phng thc SendTo().

Khi UDP Socket c to ra, n c th nhn thng ip t bt k Client no. udp Socket phn bit c Client no gi d liu n bt buc mi thng ip phi c cha trong mt gi tin ring v c nh du bi thng tin IP ca thit b gi. iu ny cho php thit b nhn phn bit c cc thng ip v thit b gi.

Chng trnh Client v Server sau s minh ha iu ny.Chng trnh UDP Serverusing System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class TestUdpSrvr

{

public static void Main()

{

int recv;

byte[] data = new byte[1024];

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);

Socket newsock = new Socket(AddressFamily.InterNetwork,

SocketType.Dgram, ProtocolType.Udp);

newsock.Bind(ipep);

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

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 rIII.4. Ngn 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 d liu c nhn t mng lp tc c chuyn cho phng thc ReceiveFrom() trong ln gi tip theo. Khi phng thc ReceiveFrom() c dng trong chng trnh, cc lp trnh vin phi m bo rng b m phi ln chp nhn ht d liu t UDP Socket. Nu b m qu nh, d liu s b mt. thy c iu ny, ta tin hnh thay i kch thc b m trong chng trnh UDP n gin trn: Chng trnh BadUDPClientusing System;

using System.Net;

using System.Net.Sockets;

using System.Text;

class BadUdpClient

{

public static void Main()

{

byte[] data = new byte[30];

string input, stringData;

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);

Socket server = new Socket(AddressFamily.InterNetwork,

SocketType.Dgram, ProtocolType.Udp);

string welcome = "Xin chao serveer";

data = Encoding.ASCII.GetBytes(welcome);

server.SendTo(data, data.Length, SocketFlags.None, ipep);

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);

EndPoint tmpRemote = (EndPoint)sender;

data = new byte[30];

int recv = server.ReceiveFrom(data, ref tmpRemote);

Console.WriteLine("Thong diep duoc nhan tu {0}:", tmpRemote.ToString());

Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

while (true)

{

input = Console.ReadLine();

if (input == "exit")

break;

server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote);

data = new byte[30];

recv = server.ReceiveFrom(data, ref tmpRemote);

stringData = Encoding.ASCII.GetString(data, 0, recv);

Console.WriteLine(stringData);

}

Console.WriteLine("Dang dong client");

server.Close();

}

}

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

break;

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;

}III.5. Ngn cn mt gi tinMt 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 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().III.5.1. S dng Soket Time-outPhng 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 SetSocke