Upload
ai-quyet-nguyen
View
42
Download
2
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