You are on page 1of 176

LP TRNH MNG

Network Programming

Lng nh Ho{ng
hoangla@soict.hut.edu.vn

Mc ch
Cung cp cc kin thc c bn v lp trnh ng dng mng Xy dng ng dng Server. Xy dng ng dng Client. Cc k thut vo ra. Cung cp cc k nng cn thit thit k v xy dng ng dng mng S dng th vin, mi trng, ti liu. Thit k, xy dng chng trnh.

Yu cu
Yu cu v kin thc:
Mng my tnh. Ngn ng lp trnh C/C++. Ngn ng lp trnh C#.

Ln lp y

Thi lng mn hc
Thi lng: 45 tit
L thuyt: 30 tit Bi tp:15 tit

T{i liu
Network Programming for Microsoft Windows Second Edition. Anthony Jone, Jim Ohlun. C# Network Programming. Sybex

|nh gi|
Thi cui k: 80% Qu trnh: 20%

Ni dung
Chng 1. Gii thiu cc m hnh lp trnh mng. Chng 2. B giao thc TCP/IP Chng 3. Windows Socket Chng 4. MFC Socket Chng 5. .NET Socket

Chng 1. Gii thiu c|c m hnh lp trnh mng

Lng nh Ho{ng
hoangla@soict.hut.edu.vn

Chng 1. Gii thiu c|c m hnh lp trnh mng


1.1. Tng quan v lp trnh mng 1.2. Giao thc Internet

1.1. Tng quan v lp trnh mng


Khi nim
Lp trnh mng l cc k thut lp trnh nhm xy dng ng dng, phn mm khai thc hiu qu ti nguyn mng my tnh.

10

1.1. Tng quan v lp trnh mng


Ngn ng lp trnh mng
C/C++: Mnh v ph bin, c hu ht cc lp trnh vin s dng vit cc ng dng mng hiu nng cao (Native code). Java: Kh thng dng, s dng nhiu trong cc in thoi di ng (J2ME,Android). C#: Mnh v d s dng, tuy nhin chy trn nn .Net Framework v ch h tr h h iu hnh Windows (Managed code chy trn Virtual Machine). Python, Perl, PHP...Ngn ng thng dch, s dng vit cc tin ch nh, nhanh chng (Interpreter) Gio trnh ny s ch cp n hai ngn ng C/C++ v C#.
11

1.1. Tng quan v lp trnh mng


Th vin
Windows Socket API ( WinSock) Th vin lin kt ng (WS2_32.DLL) i km trong h iu hnh Windows ca Microsoft. Thng s dng cng vi C/C++. Cho hiu nng cao nht. System.Net v System.Net.Sockets Hai namespace trong b th vin .NET ca Microsoft D s dng Thng s dng vi C#

12

1.1. Tng quan v lp trnh mng


Th vin
MFC Socket Nm trong b th vin MFC ca Microsoft ng gi cc hm ca WinSock di dng cc lp hng i tng. D s dng v hiu nng cao. Cc th vin ca cc ngn ng khc: Java, PHP, Python... Th vin s dng trong gio trnh: WinSock, MFC Socket, System.Net v System.Net.Sockets

13

1.1. Tng quan v lp trnh mng


Cng c lp trnh
Visual Studio (6.0, 2003 .NET, 2005, 2008,2010) Rt mnh H tr c WinSock, MFC Socket v .NET Socket (Phin bn 2003.NET tr ln). Ci thm Visual Assist X Dev C++ Min ph Ch h tr WinSock
14

1.1. Tng quan v lp trnh mng


Cng c g ri
TCPView: Hin th cc kt ni hin ti ca my tnh. Resource Monitor: ~ TCPView. Wireshark, Microsoft Network Monitor Netcat (Netcat Win32)

15

1.1. Tng quan v lp trnh mng


Ti liu tra cu
Microsoft Developer Network MSDN Cc k chi tit v chuyn nghip Cng c khng th thiu Google

16

1.2. Giao thc Internet


Giao thc Internet (Internet Protocol)
Giao thc mng thng dng nht trn th gii. Thnh cng ca Internet l nh IPv4. c h tr trn tt c cc h iu hnh. L cng c s dng lp trnh ng dng mng

17

Chng 2. B giao thc Internet TCP/IP

Lng nh Ho{ng
hoangla@soict.hut.edu.vn

Chng 2. B giao thc Internet (TCP/IP)


2.1. Gii thiu 2.2. Giao thc IPv4 2.3. Giao thc IPv6 2.4. Giao thc TCP 2.5. Giao thc UDP 2.6. H thng phn gii tn min

19

2.1. Gii thiu


B giao thc Internet
TCP/IP: Transmission Control Protocol/Internet Protocol. L b giao thc truyn thng c s dng trn Internet v hu ht cc mng thng mi. c chia thnh cc tng gm nhiu giao thc, thun tin cho vic qun l v pht trin. L th hin n gin ha ca m hnh l thuyt OSI.

20

2.1. Gii thiu


B giao thc Internet
Gm bn tng Tng ng dng Application Layer. Tng giao vn Transport Layer. Tng Internet Internet Layer. Tng truy nhp mng Network Access Layer.

21

2.1. Gii thiu


B giao thc Internet
Tng ng dng ng gi d liu ngi dng theo giao thc ring v chuyn xung tng di. Cc giao thc thng dng: HTTP, FTP, SMTP, POP3, DNS, SSH, IMAP... Vic lp trnh mng s xy dng ng dng tun theo mt trong cc giao thc tng ny hoc giao thc do ngi pht trin t nh ngha

22

2.1. Gii thiu


B giao thc Internet
Tng giao vn Cung cp dch v truyn d liu gia ng dng ng dng. n v d liu l cc on (segment,datagram) Cc giao thc tng ny: TCP, UDP, ICMP. Vic lp trnh mng s s dng dch v do cc giao thc tng ny cung cp truyn d liu

23

2.1. Gii thiu


B giao thc Internet
Tng Internet nh tuyn v truyn cc gi tin lin mng. Cung cp dch v truyn d liu gia my tnh my tnh trong cng nhnh mng hoc gia cc nhnh mng. n v d liu l cc gi tin (packet). Cc giao thc tng ny: IPv4, IPv6.... Vic lp trnh ng dng mng s rt t khi can thip vo tng ny, tr khi pht trin mt giao thc lin mng mi.
24

2.1. Gii thiu


B giao thc Internet
Tng truy nhp mng Cung cp dch v truyn d liu gia cc nt mng trn cng mt nhnh mng vt l. n v d liu l cc khung (frame). Ph thuc rt nhiu vo phng tin kt ni vt l. Cc giao thc tng ny a dng: MAC, LLC, ADSL, 802.11... Vic lp trnh mng tng ny l xy dng cc trnh iu khin phn cng tng ng, thng do nh sn xut thc hin.
25

2.1. Gii thiu


B giao thc Internet
D liu gi i qua mi tng s c thm phn thng tin iu khin (header). D liu nhn c qua mi tng s c bc tch thng tin iu khin.

26

2.2. Giao thc IPv4


Giao thc IPv4
c IETF cng b di dng RFC 791 vo 9/1981. Phin bn th 4 ca h giao thc IP v l phin bn u tin pht hnh rng ri. L giao thc hng d liu (phn bit vi hng thoi, video). S dng trong h thng chuyn mch gi. Truyn d liu theo kiu Best-Effort Khng m bo tnh trt t, trng lp, tin cy ca gi tin. Kim tra tnh ton vn ca d liu qua checksum
27

2.2. Giao thc IPv4


a ch IPv4
S dng 32 bit nh a ch cc my tnh trong mng. Bao gm: phn mng v phn host. S a ch ti a: 232 ~ 4,294,967,296. Dnh ring mt vi di c bit khng s dng. Chia thnh bn nhm 8 bt (octet).
Dng biu din Nh phn Thp phn Thp lc phn 28 Gi| tr 11000000.10101000.00000000.00000001 192.168.0.1 0xC0A80001

2.2. Giao thc IPv4


Cc lp a ch IPv4
C nm lp a ch: A,B,C,D,E. Lp A,B,C: trao i thng tin thng thng. Lp D: multicast Lp E: dnh
Lp A B C D E MSB 0xxx 10xx 110x 1110 1111
29

a ch u 0.0.0.0 128.0.0.0 192.0.0.0 224.0.0.0 240.0.0.0

a ch cui 127.255.255.255 191.255.255.255 223.255.255.255 239.255.255.255 255.255.255.255

2.2. Giao thc IPv4


Mt n mng (Network Mask)
Phn tch phn mng v phn host trong a ch IPv4. S dng trong b nh tuyn tm ng i cho gi tin. Vi mng c dng
Network 192.168.0. 11000000.10101000.00000000. Host 1 00000001

30

2.2. Giao thc IPv4


Mt n mng (Network Mask)
Biu din theo dng /n n l s bit dnh cho phn mng. Th d: 192.168.0.1/24 Biu din di dng nh phn Dng 32 bit nh du, bt dnh cho phn mng l 1, cho phn host l 0. Th d: 11111111.11111111.11111111.00000000 hay 255.255.255.0 Biu din di dng Hexa Dng s Hexa: 0xFFFFFF00 t dng
31

2.2. Giao thc IPv4


S lng a ch trong mi mng
Mi mng s c n bit dnh cho phn mng, 32-n bit dnh cho phn host. Phn phi a ch trong mi mng: 01 a ch mng (cc bit phn host bng 0). 01 a ch qung b (cc bit phn host bng 1). 2n-2 a ch gn cho cc my trm (host). Vi mng 192.168.0.1/24 a ch mng: 192.168.0.0 a ch qung b: 192.168.0.255 a ch host: 192.168.0.1- 192.168.0.254
32

2.2. Giao thc IPv4


Cc di a ch c bit
L nhng di c dng vi mc ch ring, khng s dng c trn Internet.
a ch 10.0.0.0/8 127.0.0.0/8 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4 Din gii Mng ring a ch loopback Mng ring Mng ring Multicast D tr

33

2.2. Giao thc IPv4


Di a ch cc b
Ch s dng trong mng ni b. Mun tham gia vo Internet phi c thit b NAT. Khc phc vn thiu a ch ca IPv4.
Tn Khi 24-bit Khi 20-bit Di a ch 10.0.0.0 10.255.255.255 172.16.0.0 172.31.255.255 192.168.0.0 192.168.255.25 5 S lng 16,777,216 1,048,576 M t mng Mt di trn vn thuc lp A Vit gn 10.0.0.0/8

T hp t mng 172.16.0.0/12 lp B T hp t mng 192.168.0.0/16 lp C

Khi 16-bit

65,536 34

2.3. Giao thc IPv6


Giao thc IPv6
IETF xut nm 1998. S dng 128 bit nh a ch cc thit b. Khc phc vn thiu a ch ca IPv4. Vn cha ph bin v cha th thay th hon ton IPv4.

35

2.4. Giao thc TCP


Giao thc TCP: Transmission Control Protocol
Giao thc li chy tng giao vn. Chy bn di tng ng dng v trn nn IP Cung cp dch v truyn d liu theo dng tin cy gia cc ng dng. c s dng bi hu ht cc ng dng mng. Chia d liu thnh cc gi nh, thm thng tin kim sot v gi i trn ng truyn. Lp trnh mng s s dng giao thc ny trao i thng tin.

36

2.4. Giao thc TCP


Cng (Port)
Mt s nguyn duy nht trong khong 0-65535 tng ng vi mt kt ni ca ng dng. TCP s dng cng chuyn d liu ti ng ng dng hoc dch v. Mt ng dng c th m nhiu kt ni => c th s dng nhiu cng. Mt s cng thng dng: HTTP(80), FTP(21), SMTP(25), POP3(110), HTTPS(443)...

37

2.4. Giao thc TCP


c tnh ca TCP
Hng kt ni: connection oriented Hai bn phi thit lp knh truyn trc khi truyn d liu. c thc hin bi qu trnh gi l bt tay ba bc (three ways handshake). Truyn d liu theo dng (stream oriented): t ng phn chia dng d liu thnh cc on nh truyn i, t ng ghp cc on nh thnh dng d liu v gi tr ng dng. ng trt t (ordering guarantee): d liu gi trc s c nhn trc
38

2.4. Giao thc TCP


c tnh ca TCP
Tin cy, chnh xc: thng tin gi i s c m bo n ch, khng d tha, sai st... tr ln, kh p ng c tnh thi gian thc. Cc c tnh khc: QoS...

39

2.4. Giao thc TCP


Header ca TCP
Cha thng tin v on d liu tng ng
TCP Header Bit offs 0 et 0 32 64 96 Data offset Reserved

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Source port Sequence number Acknowledgment number

Destination port

C E W C R E

U R G

A P R S F C S S Y I K H T N N

Window Size

128 160 ...

Checksum Options (if Data Offset > 5) ...

Urgent pointer

40

2.4. Giao thc TCP


Cc dch v trn nn TCP
Rt nhiu dch v chy trn nn TCP: FTP(21), HTTP(80), SMTP(25), SSH(22), POP3(110), VNC(4899)...

S dng netcat kt ni n mt dch v chy trn nn TCP:


nc.exe Th d nc.exe vv -vv [host] [port] 80 www.google.com

41

2.5. Giao thc UDP


Giao thc UDP: User Datagram Protocol
Cng l giao thc li trong TCP/IP. Cung cp dch v truyn d liu gia cc ng dng. UDP chia nh d liu ra thnh cc datagram S dng trong cc ng dng kht khe v mt thi gian, chp nhn sai st: thoi, video, game...

42

2.5. Giao thc UDP


c tnh ca UDP
Khng cn thit lp kt ni trc khi truyn (Connectionless). Nhanh, chim t ti nguyn d x l. Hn ch: Khng c c ch bo gi (report). Khng m bo trt t cc datagram (ordering). Khng pht hin c mt mt hoc trng lp thng tin (loss, duplication).

43

2.5. Giao thc UDP


Header ca UDP
+ 0 32 64 Bits 0 - 15 Source Port Length 16 - 31 Destination Port Checksum Data

44

2.5. Giao thc UDP


Cc dch v trn nn UDP
Phn gii tn min: DNS (53) Streamming: MMS, RTSP... Game

45

2.6. H thng ph}n gii tn min DNS


a ch IP kh nh vi con ngi. DNS Domain Name System
H thng phn cp lm nhim v nh x tn min sang a ch IP v ngc li.

46

2.6. H thng ph}n gii tn min DNS


DNS Domain Name System
Cc tn min c phn cp v qun l bi INTERNIC Cp cao nht l ROOT, sau l cp 1, cp 2,... Th d: www.hu(s)t.edu.vn
Cp Tn min Cp 4 www. Cp 3 hut. Cp 2 edu. Cp 1 vn

47

2.6. H thng ph}n gii tn min DNS


DNS Domain Name System
T chc c cp tn min cp 1 s duy tr c s d liu cc tn min cp 2 trc thuc, t chc c cp tn min cp 2 s duy tr c s d liu cc tn min cp 3 trc thuc... Mt my tnh mun bit a ch ca mt my ch c tn min no , n s hi my ch DNS m n nm trong, nu my ch DNS ny khng tr li c n s chuyn tip cu hi n my ch DNS cp cao hn, DNS cp cao hn nu khng tr li c li chuyn n DNS cp cao hn na...
48

2.6. H thng ph}n gii tn min DNS


DNS Domain Name System
Vic truy vn DNS s do h iu hnh thc hin. Dch v DNS chy cng 53 UDP. Cng c th nghim: nslookup Th d: nslookup www.google.com

49

Chng 3. Windows Socket

Lng nh Ho{ng
hoangla@soict.hut.edu.vn

Chng 3. Windows Socket


3.1. Kin trc 3.2. c tnh 3.3. Lp trnh WinSock 3.4. Cc phng php vo ra

51

3.1 Kin trc


Windows Socket (WinSock)
B th vin lin kt ng ca Microsoft. Cung cp cc API dng xy dng ng dng mng hiu nng cao.
Application Winsock 2 DLL ( WS2_32.DLL)

Layered/Base Provider RSVP Proxy


Default Provider MSAFD.DLL

Winsock Kernel Mode Driver (AFD.SYS)

Transport Protocols

52

3.1 Kin trc


Windows Socket (WinSock)
Phin bn hin ti l WinSock 2.2 Cc ng dng s giao tip vi th vin lin kt ng tng trn cng: WS2_32.DLL. Provider do nh sn xut ca cc giao thc cung cp. Tng ny b sung giao thc ca cc tng mng khc nhau cho WinSock nh TCP/IP, IPX/SPX, AppleTalk, NetBIOS...tng ny vn chy UserMode. WinSock Kernel Mode Driver (AFD.SYS) l driver chy KernelMode, nhn d liu t tng trn, qun l kt ni, b m, ti nguyn lin quan n socket v giao tip vi driver iu khin thit b.
53

3.1 Kin trc


Windows Socket (WinSock)
Transport Protocols l cc driver tng thp nht, iu khin trc tip thit b. Cc driver ny do nh sn xut phn cng xy dng, v giao tip vi AFD.SYS thng qua giao din TDI ( Transport Driver Interface) Vic lp trnh Socket s ch thao tc vi i tng SOCKET. Mi ng dng cn c mt SOCKET trc khi mun trao i d liu vi ng dng khc. ng dy o ni gia cc SOCKET s l knh truyn d liu ca hai ng dng.
54

3.2 c tnh
H tr cc giao thc hng thng ip (message oriented)
Thng ip truyn i c ti to nguyn vn c v kch thc v bin bn nhn

55

3.2 c tnh
H tr cc giao thc hng dng (stream oriented)
Bin ca thng ip khng c bo ton khi truyn i

56

3.2 c tnh
H tr cc giao thc hng kt ni v khng kt ni
Giao thc hng kt ni (connection oriented) thc hin thit lp knh truyn trc khi truyn thng tin. Th d: TCP Giao thc khng kt ni (connectionless) khng cn thit lp knh truyn trc khi truyn. Th d: UDP

57

3.2 c tnh
H tr cc giao thc hng kt ni v khng kt ni
Giao thc hng kt ni (connection oriented) thc hin thit lp knh truyn trc khi truyn thng tin. Th d: TCP Giao thc khng kt ni (connection less) khng cn thit lp knh truyn trc khi truyn. Th d: UDP

58

3.2 c tnh
H tr cc giao thc tin cy v trt t
Tin cy (reliability): m bo chnh xc tng byte c gi n ch. Trt t (ordering): m bo chnh xc trt t tng byte d liu. Byte no gi trc s c nhn trc, byte gi sau s c nhn sau.

59

3.2 c tnh
Multicast
WinSock h tr cc giao thc Multicast: gi d liu n mt hoc nhiu my trong mng.

Cht lng dch v - Quality of Service (QoS)


Cho php ng dng yu cu mt phn bng thng dnh ring cho mc ch no . Th d: truyn hnh thi gian thc.

60

3.3 Lp trnh WinSock


Chun b mi trng
H iu hnh Windows XP/2003/Vista/7. Visual Studio C++ Th vin trc tuyn MSDN Thm tiu WINSOCK2.H vo u mi tp m ngun. Thm th vin WS2_32.LIB vo mi Project bng cch Project => Property => Configuration Properties=> Linker=>Input=>Additional Dependencies

61

3.3 Lp trnh WinSock


Khi to WinSock
WinSock cn c khi to u mi ng dng trc khi c th s dng Hm WSAStartup s lm nhim khi to
int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );

wVersionRequested: [IN] phin bn WinSock cn dng. lpWSAData: [OUT] con tr cha thng tin v WinSock ci t trong h thng. Gi tr tr v:
Thnh cng: 0 Tht bi: SOCKET_ERROR
62

3.3 Lp trnh WinSock


Khi to WinSock
Th d
WSADATA wsaData; WORD wVersion = MAKEWORD(2,2); // Khi to phin bn 2.2 if (WSAStartup(wVersion,&wsaData)) { printf(Version not supported); }

63

3.3 Lp trnh WinSock


Gii phng WinSock
ng dng khi kt thc s dng WinSock c th gi hm sau gii phng ti nguyn v cho h thng int WSACleanup(void); Gi tr tr v: Thnh cng: 0 Tht bi: SOCKET_ERROR

64

3.3 Lp trnh WinSock


Xc nh li
Phn ln cc hm ca WinSock nu thnh cng u tr v 0. Nu tht bi, gi tr tr v ca hm l SOCKET_ERROR. ng dng c th ly m li gn nht bng hm int WSAGetLastError(void); Tra cu li vi cng c Error Lookup trong Visual Studio

65

3.3 Lp trnh WinSock


To SOCKET
SOCKET l mt s nguyn tru tng ha kt ni mng ca ng dng. ng dng phi to SOCKET trc khi c th gi nhn d liu. Hm socket c s dng to SOCKET
SOCKET socket ( int af, int type, int protocol );

Trong : af: [IN] Address Family, h giao thc s s dng, thng l AF_INET, AF_INET6. type: [IN] Kiu socket, SOCK_STREAM cho TCP/IP v SOCK_DGRAM cho UDP/IP. protocol: [IN] Giao thc tng giao vn, IPPROTO_TCP hoc IPPROTO_UDP
66

3.3 Lp trnh WinSock


To SOCKET
Th d
SOCKET s1,s2; // Khai bo socket s1,s2 // To socket TCP s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // To socket UDP s2 = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

67

3.3 Lp trnh WinSock


Xc nh a ch
WinSock s dng sockaddr_in lu a ch ca ng dng ch cn ni n. ng dng cn khi to thng tin trong cu trc ny
struct sockaddr_in{ short sin_family; // H giao thc, thng l{ AF_INET u_short sin_port; // Cng, dng big-endian struct in_addr sin_addr; // a ch IP char sin_zero[8]; // Khng s dng vi IPv4 };

68

3.3 Lp trnh WinSock


Xc nh a ch
S dng cc hm h tr : Chuyn i a ch IP dng xu sang s nguyn 32 bit
unsigned long inet_addr(const char FAR *cp);

Chuyn i a ch t dng in_addr sang dng xu


char FAR *inet_ntoa(struct in_addr in);

Chuyn i little-endian => big-endian (network order)


// Chuyn i 4 byte t little-endian=>big-endian u_long htonl(u_long hostlong) // Chuyn i 2 byte t little-endian=>big-endian u_short htons(u_short hostshort)

Chuyn i big-endian => little-endian (host order)


// Chuyn 4 byte t big-endian=>little-endian u_long ntohl(u_long netlong) // Chuyn 2 byte t big-endian=>little-endian u_short ntohs(u_short netshort)
69

3.3 Lp trnh WinSock


Xc nh a ch
Th d: in a ch 192.168.0.1:80 vo cu trc sockaddr_in
SOCKADDR_IN InternetAddr; // Khai bo bin lu a ch InternetAddr.sin_family = AF_INET;// H a ch Internet //Chuyn x}u a ch 192.168.0.1 sang s 4 byte dang network-byte // order v{ g|n cho trng sin_addr InternetAddr.sin_addr.s_addr = inet_addr(192.168.0.1"); //Chuyn i cng sang dng network-byte order v{ g|n cho trng // sin_port InternetAddr.sin_port = htons(80);

70

3.3 Lp trnh WinSock


Phn gii tn min
i khi a ch ca my ch c cho di dng tn min ng dng cn thc hin phn gii tn min c a ch thch hp Hm getnameinfo v getaddrinfo s dng phn gii tn min Cn thm tp tiu WS2TCPIP.H
int getaddrinfo( const char *nodename, // Tn min hoc a ch cn ph}n gii const char *servname, // Dch v hoc cng const struct addrinfo *hints, // Cu trc gi struct addrinfo **res // Kt qu ); Gi tr tr v Thnh cng: 0 Tht bi: m li Gii phng: freeaddrinfo()
71

3.3 Lp trnh WinSock


Phn gii tn min
Cu trc addrinfo: danh sch lin kt n cha thng tin v tn min tng ng
struct addrinfo { int ai_flags; // Thng l{ AI_CANONNAME int ai_family; // Thng l{ AF_INET int ai_socktype; // Loi socket int ai_protocol; // Giao th giao vn size_t ai_addrlen; // Chiu d{i ca ai_addr char *ai_canonname; // Tn min struct sockaddr *ai_addr; // a ch socket ~ ph}n gii struct addrinfo *ai_next; // Con tr ti cu trc tip theo };

72

3.3 Lp trnh WinSock


Phn gii tn min
on chng trnh sau s thc hin phn gii a ch cho tn min www.hut.edu.vn
addrinfo * result; // Lu kt qu ph}n gii int rc; // Lu m~ tr v sockaddr_in address; // Lu a ch ph}n gii c rc = getaddrinfo(www.hut.edu.vn, http, NULL, &result); // Mt tn min c th c nhiu a ch IP tng ng // Ly kt qu u tin if (rc==0) memcpy(&address,result->ai_addr,result->ai_addrlen); // X l vi address...

73

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
Vic truyn nhn d liu s dng giao thc TCP s bao gm hai phn: ng dng pha client v pha server. ng dng pha server: Khi to WinSock qua hm WSAStartup To SOCKET qua hm socket hoc WSASocket Gn SOCKET vo mt giao din mng thng qua hm bind Chuyn SOCKET sang trng thi i kt ni qua hm listen Chp nhn kt ni t client thng qua hm accept Gi d liu ti client thng qua hm send hoc WSASend Nhn d liu t client thng qua hm recv hoc WSARecv ng SOCKET khi vic truyn nhn kt thc bng hm closesocket Gii phng WinSock bng hm WSACleanup
74

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha server (tip)
WSAStartup

socket/ WSASocket

bind

send/ WSASend

accept

listen

recv/ WSARecv

closesocket

WSACleanu p

75

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha server (tip) Hm bind: gn SOCKET vo mt giao din mng ca my
int bind( SOCKET s, const struct sockaddr FAR* name, int namelen);
Trong s: [IN] SOCKET va c to bng hm socket name: [IN] a ch ca giao din mng cc b namelen: [IN] chiu di ca cu trc name Th d SOCKADDR_IN tcpaddr; short port = 8888; tcpaddr.sin_family = AF_INET;// Socket IPv4 tcpaddr.sin_port = htons(port); // host order => net order tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY); //Giao din bt k bind(s, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr)); // Bind socket
76

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha server (tip) Hm listen: chuyn SOCKET sang trng thi i kt ni
int listen(SOCKET s, int backlog);
Trong s: [IN] SOCKET c to trc bng socket/WSASocket backlog: [IN] chiu di hng i chp nhn kt ni

77

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha server (tip) Hm accept: chp nhn kt ni
SOCKET accept(SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen);
Trong s: [IN] SOCKET hp l, c bind v listen trc addr: [OUT] a ch ca client kt ni n addrlen: [IN/OUT] con tr ti chiu di ca cu trc addr. ng dng cn khi to addrlen tr ti mt s nguyn cha chiu di ca addr

Gi tr tr v l mt SOCKET mi, sn sng cho vic gi nhn d liu trn . ng vi mi kt ni ca client s c mt SOCKET ring.

78

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha server (tip) Hm send: gi d liu trn SOCKET
int send(SOCKET s, const char FAR * buf, int len, int flags); Trong s: [IN] SOCKET hp l, c accept trc buf: [IN] a ch ca b m cha d liu cn gi len: [IN] s byte cn gi flags:[IN] c quy nh cch thc gi, c th l 0,MSG_OOB,MSG_DONTROUTE Gi tr tr v Thnh cng: s byte gi c, c th nh hn len Tht bi: SOCKET_ERROR Th d char szHello[]=Hello Network Programming; send(s,szHello,strlen(szHello),0);
79

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha server (tip) Hm recv: nhn d liu trn SOCKET
int recv(SOCKET s, const char FAR * buf, int len, int flags); Trong s: [IN] SOCKET hp l, c accept trc buf: [OUT] a ch ca b m nhn d liu len: [IN] kch thc b m flags:[IN] c quy nh cch thc nhn, c th l 0, MSG_PEEK, MSG_OOB, MSG_WAITALL Gi tr tr v Thnh cng: s byte nhn c, c th nh hn len Tht bi: SOCKET_ERROR Th d char buf[100]; int len = 0; len = recv(s,buf,100,0); 80

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha server (tip) Hm closesocket: ng kt ni trn mt socket
int closesocket(SOCKET s )
Trong s: [IN] SOCKET hp l, kt ni Gi tr tr v Thnh cng: 0 Tht bi: SOCKET_ERROR

81

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
on chng trnh minh ha
#include <winsock2.h> //Thu vien Winsock void main(void) { WSADATA wsaData; SOCKET ListeningSocket; SOCKET NewConnection; SOCKADDR_IN ServerAddr; SOCKADDR_IN ClientAddr; int ClientAddrLen; int Port = 8888; // Khoi tao Winsock 2.2 WSAStartup(MAKEWORD(2,2), &wsaData); // Tao socket lang nghe ket noi tu client. ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Khoi tao cau truc SOCKADDR_IN cua server // doi ket noi o cong 8888 ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);

82

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
on chng trnh minh ha (tip)
// Bind socket cua server. bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)); // Chuyen sang trang thai doi ket noi listen(ListeningSocket, 5); // Chap nhan ket noi moi. ClientAddrLen = sizeof(ClientAddr); NewConnection = accept(ListeningSocket, (SOCKADDR *) &ClientAddr,&ClientAddrLen); // Sau khi chap nhan ket noi, server co the tiep tuc chap nhan them cac ket noi khac, // hoac gui nhan du lieu voi cac client thong qua cac socket duoc accept voi client // Dong socket closesocket(NewConnection); closesocket(ListeningSocket); // Giai phong Winsock WSACleanup(); }

83

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha client Khi to WinSock qua hm WSAStartup To SOCKET qua hm socket hoc WSASocket in thng tin v server vo cu trc sockaddr_in Kt ni ti server qua hm connect hoc WSAConnect Gi d liu ti server thng qua hm send hoc WSASend Nhn d liu t server thng qua hm recv hoc WSARecv ng SOCKET khi vic truyn nhn kt thc bng hm closesocket Gii phng WinSock bng hm WSACleanup

84

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha client (tip)
WSAStartup socket/ WSASocket x|c nh a ch/ph}n gii tn min

recv/ WSARecv

send/ WSASend

connect/WSA Connect

closesocket

WSACleanup

85

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
ng dng pha client (tip) a ch ca server xc nh trong cu trc sockaddr_in nh hm inet_addr hoc theo getaddrinfo Hm connect: kt ni n server
int connect(SOCKET s,const struct sockaddr FAR* name,int namelen); Trong s: [IN] SOCKET c to bng socket hoc WSASocket trc name:[IN] a ch ca server namelen:[IN] chiu di cu trc name Gi tr tr v Thnh cng: 0 Tht bi: SOCKET_ERROR

86

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
Chng trnh minh ha
#include <winsock2.h> void main(void) { WSADATA wsaData; SOCKET s; SOCKADDR_IN ServerAddr; int Port = 8888; // Khoi tao Winsock 2.2 WSAStartup(MAKEWORD(2,2), &wsaData); // Tao socket client s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Khoi tao cau truc SOCKADDR_IN co dia chi server la 202.191.56.69 va cong 8888 ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = inet_addr("202.191.56.69");

87

3.3 Lp trnh WinSock


Truyn d liu s dng TCP
Chng trnh minh ha (tip)
// Ket noi den server thong qua socket s. connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)); // Bat dau gui nhan du lieu

// Ket thuc gui nhan du lieu // Dong socket closesocket(s);


// Giai phong Winsock

WSACleanup();
}

88

3.3 Lp trnh WinSock


Bi tp
1. Vit chng trnh TCPClient, kt ni n mt my ch xc nh bi tn min hoc a ch IP. Sau nhn d liu t bn phm v gi n Server. Tham s c truyn vo t dng lnh c dng TCPClient.exe <a ch IP/Tn min> <Cng> 2. Vit chng trnh TCPServer, i kt ni cng xc nh bi tham s dng lnh. Mi khi c client kt ni n, th gi xu cho c ch ra trong mt tp tin xc nh, sau ghi ton b ni dung client gi n vo mt tp tin khc c ch ra trong tham s dng lnh
TCPServer.exe <Cng> <Tp tin cha c}u ch{o> <Tp tin lu ni dung client gi n> VD: TCPServer.exe 8888 chao.txt client.txt

89

3.3 Lp trnh WinSock


Truyn d liu s dng UDP
Giao thc UDP l giao thc khng kt ni (Connectionless) ng dng khng cn phi thit lp kt ni trc khi gi tin. ng dng c th nhn c tin t bt k my tnh no trong mng. Trnh t gi thng tin bn gi nh sau
socket/ WSASocket X|c nh a ch/Ph}n gii tn min

WSAStartup

WSACleanup

sendto

90

3.3 Lp trnh WinSock


Truyn d liu s dng UDP
ng dng bn gi Hm sendto: gi d liu n mt my tnh bt k
int sendto( SOCKET s, // [IN] socket to bng hm socket/WSASocket const char FAR * buf, // [IN] b m cha d liu cn gi int len, // [IN] s byte cn gi int flags, // [IN] c, tng t nh hm send const struct sockaddr FAR * to, // [IN] a ch ch int tolen // [IN] chiu di a ch ch ); Gi tr tr v Thnh cng: s byte gi c, c th nh hn len Tht bi: SOCKET_ERROR

91

3.3 Lp trnh WinSock


Truyn d liu s dng UDP
on chng trnh sau s gi mt xu ti a ch 202.191.56.69:8888
char buf[]=Hello Network Programming; // Xu cn gi SOCKET sender; // SOCKET gi SOCKADDR_IN receiverAddr; // a ch nhn // To socket gi tin sender = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // in a ch ch receiverAddr.sin_family = AF_INET; receiverAddr.sin_port = htons(8888); receiverAddr.sin_addr.s_addr = inet_addr("202.191.56.69"); // Thc hin gi tin sendto(sender, buf, strlen(buf), 0, (SOCKADDR *)&receiverAddr, sizeof(receiverAddr));
92

3.3 Lp trnh WinSock


Truyn d liu s dng UDP
Trnh t nhn thng tin bn nhn nh sau

WSAStartup

socket/ WSASocket

bind

WSACleanup

recvfrom

93

3.3 Lp trnh WinSock


Truyn d liu s dng UDP
ng dng bn nhn Hm recvfrom: nhn d liu t mt socket
int recvfrom( SOCKET s, // [IN] SOCKET s nhn d liu char FAR* buf, // [IN] a ch b m cha d liu s nhn c int len, // [IN] kch thc b m int flags, // [IN] c, tng t nh hm recv struct sockaddr FAR* from,// [OUT] a ch ca bn gi int FAR* fromlen // [IN/OUT] chiu di cu trc a ch ca bn // gi, khi to l chiu di ca from ); Gi tr tr v Thnh cng: s byte nhn c Tht bi: SOCKET_ERROR
94

3.3 Lp trnh WinSock


Truyn d liu s dng UDP
on chng trnh sau s nhn liu datagram t cng 8888 v hin th ra mn hnh
SOCKET receiver; SOCKADDR_IN addr, source; int len = sizeof(source); // To socket UDP receiver = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Khi to a ch v cng 8888 addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(8888); // i UDP datagram cng 8888 // Bind socket vo tt c cc giao din v cng 8888 bind(receiver,(sockaddr*)&addr,sizeof(SOCKADDR_IN));

95

3.3 Lp trnh WinSock


Truyn d liu s dng UDP
on chng trnh (tip)
// Lp i gi tin while (1) { // Nhn d liu t mng datalen = recvfrom(receiver,buf,100,0,(sockaddr*)&source, &len); // Kim tra chiu di if (datalen>0) { buf[datalen]=0; printf("Data:%s",buf); // Hin th ra mn hnh } }

96

3.3 Lp trnh WinSock


S dng Netcat gi nhn d liu n gin
Netcat l mt tin ch mng rt a nng. C th s dng nh TCP server: nc.exe -v -l -p <cng i kt ni> Th d: nc.exe -l -p 8888 C th s dng nh TCP client: nc -v <ip/tn min> <cng> Th d: nc.exe 127.0.0.1 80 S dng nh UDP receiver: nc -v -l -u -p <cng i kt ni> Th d: nc.exe -v -l -u -p 8888 S dng nh UDP sender: nc -v -u <ip/tn min> <cng> Th d: nc.exe -v -u 192.168.0.1 80

97

3.3 Lp trnh WinSock


Mt s hm khc
getpeername: ly a ch u kia m SOCKET kt ni n
int getpeername( SOCKET s, // [IN] SOCKET cn ly a ch struct sockaddr FAR* name, // [OUT] a ch ly c int FAR* namelen // [OUT] chiu d{i a ch ); int getsockname( SOCKET s, // [IN] SOCKET cn ly a ch struct sockaddr FAR* name, // [OUT] a ch ly c int FAR* namelen // [OUT] chiu d{i a ch );

getsockname: ly a ch cc b ca SOCKET

98

3.3 Lp trnh WinSock


Bi tp
1. Vit chng trnh clientinfo thc hin kt ni n mt my ch xc nh v gi thng tin v tn my, danh sch cc a c trong my, kch thc cc a. a ch (tn min) v cng nhn vo t tham s dng lnh. VD: clientinfo abc.com 1234 2. Vit chng trnh serverinfo i kt ni t cc clientinfo v thu nhn thng tin t client, hin ra mn hnh. Tham s dng lnh truyn vo l cng m serverinfo s i kt ni VD: serverinfo 1234

99

3.4 C|c phng ph|p v{o ra


Cc ch hot ng ca WinSock
Thread( Lung): L n v thc thi c lp v tun t ca chng trnh. Mi chng trnh c t nht mt thread chnh l thread bt u thc hin ti hm main Blocking (ng b): L ch m cc hm vo ra s chn thread n khi thao tc vo ra hon tt (cc hm vo ra s khng tr v cho n khi thao tc hon tt). L ch mc nh ca SOCKET Cc hm nh hng:
accept connect send recv ...

100

3.4 C|c phng ph|p v{o ra


Cc ch hot ng ca WinSock
Blocking (ng b):
Application OS

I/O Request Blocking state I/O Complete Perform I/O

101

3.4 C|c phng ph|p v{o ra


Cc ch hot ng ca WinSock
Blocking (ng b): Thch hp vi cc ng dng x l tun t. Khng nn gi cc hm blocking khi thread x l giao din (GUI Thread). Th d:
Thread b chn bi hm recv th khng th gi d liu
... do { // Thread s b chn li khi gi h{m recvfrom // Trong lc i d liu th khng th gi d liu rc = recvfrom(receiver,szXau,128,0, (sockaddr*)&senderAddress,&senderLen); // .. }while ...

102

3.4 C|c phng ph|p v{o ra


Cc ch hot ng ca WinSock
Non-Blocking (Bt ng b): L ch m cc thao tc vo ra s tr v ni gi ngay lp tc v tip tc thc thi thread. Kt qu ca thao tc vo ra s c thng bo cho chng trnh di mt c ch ng b no . Cc hm vo ra bt ng b s tr v m li WSAWOULDBLOCK nu thao tc khng th hon tt ngay v mt thi gian ng k(chp nhn kt ni, nhn d liu, gi d liu...). y l iu hon ton bnh thng. C th s dng trong thread x l giao din ca ng dng. Thch hp vi cc ng dng hng s kin.

103

3.4 C|c phng ph|p v{o ra


Cc ch hot ng ca WinSock
Non-Blocking (Bt ng b):
Application OS

I/O Request Non-Blocking state Other Computations I/O Complete Perform I/O

104

3.4 C|c phng ph|p v{o ra


Cc ch hot ng ca WinSock
Non-Blocking (Bt ng b): Socket cn chuyn sang ch ny bng hm ioctlsocket
SOCKET s; unsigned long ul = 1; int nRet; s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Chuyn sang ch non-blocking nRet = ioctlsocket(s, FIONBIO, (unsigned long *) &ul); if (nRet == SOCKET_ERROR) { // Tht bi }

105

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Blocking
M hnh mc nh, n gin nht. Khng th gi nhn d liu ng thi trong cng mt lung. Ch nn p dng trong cc ng dng n gin, x l tun t, t kt ni. Gii quyt vn x l song song bng vic to thm cc thread chuyn bit: thread gi d liu, thread nhn d liu Hm API CreateThread c s dng to mt lung mi HANDLE WINAPI CreateThread( __in LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in LPVOID lpParameter, __in DWORD dwCreationFlags, __out LPDWORD lpThreadId ); - TerminateThread - BOOL WINAPI TerminateThread( __in_out HANDLE hThread, __in DWORD dwExitCode );

- Trn unix/linux/posix: pthread_create v pthread_kill


106

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Blocking
Main Thread socket bind listen accept CreateThread send other tasks
107

Receiver Thread recv other tasks

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Blocking
on chng trnh sau s minh ha vic gi v nhn d liu ng thi trong TCP Client
// Khai b|o lung x l vic nhn d liu DWORD WINAPI ReceiverThread(LPVOID lpParameter); ... // Khai b|o c|c bin to{n cc SOCKADDR_IN address; SOCKET client; char szXau[128]; ... rc = connect(client,(sockaddr*)&address,sizeof(address)); // To lung x l vic nhn d liu CreateThread(0,0,ReceiverThread,0,0,0); while (strlen(gets(szXau))>=2) { rc = send(client,szXau,strlen(szXau),0); } ...

108

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Blocking
on chng trnh (tip)
DWORD WINAPI ReceiverThread(LPVOID lpParameter) { char szBuf[128]; int len = 0; do { len = recv(client,szBuf,128,0); if (len>=2) { szBuf[len] = 0; printf("%s\n",szBuf); } else break; }while (len>=2); }

109

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Select
L m hnh c s dng ph bin. S dng hm select thm d cc s kin trn socket (gi d liu, nhn d liu, kt ni thnh cng, yu cu kt ni...). H tr nhiu kt ni cng mt lc. C th x l tp trung tt c cc socket trong cng mt thread (ti a 1024). Nguyn mu hm nh sau int select( int nfds, // Khng s dng fd_set FAR * readfds, // Tp c|c socket h{m s thm d cho s kin read fd_set FAR * writefds, // Tp c|c socket h{m s thm d cho s kin write fd_set FAR * exceptfds, // Tp c|c socket h{m s thm d cho s kin except const struct timeval FAR * timeout // Thi gian thm d ti a ); Gi tr tr v: Thnh cng: s lng socket c s kin xy ra Ht gi: 0 Tht bi: SOCKET_ERROR 110

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Select
Main Thread socket bind listen
Khi to tp select

select
X l s kin

Kt thc ?

Y
111

closesocket

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Select
iu kin thnh cng ca select Mt trong cc socket ca tp readfds nhn c d liu hoc kt ni b ng, reset, hy, hoc hm accept thnh cng. Mt trong cc socket ca tp writefds c th gi d liu, hoc hm connect thnh cng trn socket non-blocking. Mt trong cc socket ca tp exceptfds nhn c d liu OOB, hoc connect tht bi. Cc tp readfds, writefds, exceptfds c th NULL, nhng khng th c ba cng NULL. Cc MACRO FD_CLR, FD_ZERO, FD_ISSET, FD_SET s dng thao tc vi cc cu trc fdset.

112

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Select
on chng trnh sau s thm d trng thi ca socket s khi no c d liu
SOCKET s; fd_set fdread; int ret; // Khi to socket s v{ to kt ni ... // Thao tc vo ra trn socket s while(TRUE) { // Xa tp fdread FD_ZERO(&fdread); // Thm s v{o tp fdread FD_SET(s, &fdread); ret = select(0, &fdread, NULL, NULL, NULL); // i s kin trn socket if (ret == SOCKET_ERROR) { // X l li }

113

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Select
on chng trnh (tip)
if (ret > 0) { // Kim tra xem s c c thit lp hay khng if (FD_ISSET(s, &fdread)) { // c d liu t s } } }

114

3.4 C|c phng ph|p v{o ra


Bi tp: Simple Telnet Server S dng m hnh select vit hai chng trnh server/client thc hin yu cu sau:
Vit chng trnh server i kt ni cng 12345. Vi mi client kt ni n, yu cu nhp tn v mt khu. So snh tn v mt khu trong tp tin passwd gm nhiu dng c dng: user1:pass1 user2:pass2 Nu ng nhp thnh cng th i lnh t client v chuyn tip lnh cho h thng x l, sau gi tr kt qu cho client. V d: Hello guest, please authenticate yourself Username: noname Password: nopass Welcome to noname server C:\Program files>dir /ah <Kt qu> C:\Program files>cd \ C:\
115

Vit chng trnh SelectTCPServer c th thc hin nhng cng vic sau: p ng c ti a 255 kt ni. S dng m hnh Select. nh danh cc client bng nickname Chuyn tip thng ip t mt nickname n tt c cc nickname khc ang ng nhp vo h thng. C php ng nhp ca mt client: Hello <nickname>\r\n C php gi thng ip ca mt nickname n h thng Chat <ni dung>\r\n C php gi thng ip ca h thng n mt client Chat <nickname> <ni dung>\r\n
116

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAAsyncSelect
C ch x l s kin da trn thng ip ca Windows ng dng GUI c th nhn c cc thng ip t WinSock qua ca s ca ng dng. Hm WSAAsyncSelect c s dng chuyn socket sang ch bt ng b v thit lp tham s cho vic x l s kin int WSAAsyncSelect( SOCKET s, // [IN] Socket s x l s kin HWND hWnd, // [IN] Handle ca s nhn s kin unsigned int wMsg, // [IN] M~ thng ip, ty chn, thng>=WM_USER long lEvent // [IN] Mt n cha c|c s kin ng dng mun nhn // bao gm FD_READ, //FD_WRITE,FD_ACCEPT,FD_CONNECT,FD_CLOSE );

117

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAAsyncSelect
Th d: WSAAsyncSelect(s, hwnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE); Tt c cc ca s u c hm callback nhn s kin t Windows. Khi ng dng ng k socket vi ca s no, th ca s s nhn c cc s kin ca socket. Nguyn mu ca hm callback ca ca s: LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); Khi ca s nhn c cc s kin lin quan n WinSock: uMsg s cha m thng ip m ng dng ng k bng WSAAsyncSelect wParam cha bn thn socket xy ra s kin Na cao ca lParam cha m li nu c, na thp cha m s kin c th l FD_READ, FD_WRITE, FD_CONNECT, FD_ACCEPT, FD_CLOSE 118

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAAsyncSelect
ng dng s dng hai MACRO: WSAGETSELECTERROR v WSAGETSELECTEVENT kim tra li v s kin xy ra trn socket. Th d:
BOOL CALLBACK WinProc(HWND hDlg,UINT wMsg, WPARAM wParam, LPARAM lParam) { SOCKET Accept; switch(wMsg) { case WM_PAINT: // X l s kin kh|c break; case WM_SOCKET: // S kin WinSock if (WSAGETSELECTERROR(lParam)) // Kim tra c li hay khng { closesocket( (SOCKET) wParam); // ng socket break; }

119

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAAsyncSelect
Th d (tip):
switch(WSAGETSELECTEVENT(lParam)) // X|c nh s kin { case FD_ACCEPT: // Chp nhn kt ni Accept = accept(wParam, NULL, NULL); . break; case FD_READ: // C d liu t socket wParam break; case FD_WRITE: // C th gi d liu n socket wParam break; case FD_CLOSE: // ng kt ni closesocket( (SOCKET)wParam); break; } break; } return TRUE; 120 }

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAAsyncSelect
u im: x l hiu qu nhiu s kin trong cng mt lung. Nhc im: ng dng phi c t nht mt ca s, khng nn dn qu nhiu socket vo cng mt ca s v s dn ti nh tr trong vic x l giao din.

121

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
X l da trn c ch ng b i tng s kin ca Windows: WSAEVENT Mi i tng c hai trng thi: Bo hiu (signaled) v cha bo hiu (nonsignaled). Hm WSACreateEvent s to mt i tng s kin trng thi cha bo hiu v c ch hot ng l thit lp th cng (manual reset). WSAEVENT WSACreateEvent(void); Hm WSAResetEvent s chuyn i tng s kin v trng thi cha bo hiu BOOL WSAResetEvent(WSAEVENT hEvent); Hm WSACloseEvent s gii phng mt i tng s kin BOOL WSACloseEvent(WSAEVENT hEvent);

122

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Hm WSAEventSelect s t ng chuyn socket sang ch non-blocking v gn cc s kin ca socket vi i tng s kin truyn vo theo tham s int WSAEventSelect( SOCKET s, // [IN] Socket cn x l s kin WSAEVENT hEventObject,// [IN] i tng s kin ~ to trc long lNetworkEvents // [IN] C|c s kin ng dng mun nhn // t WinSock ); Th d: rc = WSAEventSelect(s, hEventObject, FD_READ|FD_WRITE);

123

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Hm WaitForMultipleEvent s i s kin trn mt mng cc i tng s kin cho n khi mt trong cc i tng chuyn sang trng thi bo hiu. DWORD WSAWaitForMultipleEvents( DWORD cEvents, // [IN] S lng s kin cn i const WSAEVENT FAR * lphEvents,// [IN] Mng c|c s kin, max 64 BOOL fWaitAll, //[IN] C i tt c c|c s kin khng ? DWORD dwTimeout, //[IN] Thi gian i ti a BOOL fAlertable //[IN] Thit lp l{ FALSE ); Gi tr tr v Thnh cng: S th t ca s kin xy ra + WSA_WAIT_EVENT_0. Ht gi: WSA_WAIT_TIMEOUT. Tht bi: WSA_WAIT_FAILED.

124

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Xc nh m ca s kin gn vi mt i tng s kin c th bng hm WSAEnumNetworkEvents. int WSAEnumNetworkEvents( SOCKET s, // [IN] Socket mun thm d WSAEVENT hEventObject, // [IN] i tng s kin tng ng LPWSANETWORKEVENTS lpNetworkEvents// [OUT] Cu trc cha m~ s kin ); M s kin li nm trong cu trc WSANETWORKEVENTS c khai bo nh sau typedef struct _WSANETWORKEVENTS { long lNetworkEvents; // Mt n cha s kin c kch ho int iErrorCode[FD_MAX_EVENTS]; // Mng c|c m~ s kin } WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;

125

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Th d
#include <winsock2.h> #define MAX_EVENTS 64 int _tmain(int argc, _TCHAR* argv[]) { SOCKET SocketArray [MAX_EVENTS]; WSAEVENT EventArray [MAX_EVENTS],NewEvent; SOCKADDR_IN InternetAddr; SOCKET Accept, Listen; DWORD EventTotal = 0; DWORD Index, i; WSADATA wsaData; WORD wVersion = MAKEWORD(2,2); int rc = WSAStartup(wVersion,&wsaData); // Thit lp TCP socket i kt ni 8888 Listen = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); InternetAddr.sin_family = AF_INET; InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY); InternetAddr.sin_port = htons(8888); 126 rc = bind(Listen, (PSOCKADDR) &InternetAddr,sizeof(InternetAddr));

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Th d (tip)
NewEvent = WSACreateEvent(); WSAEventSelect(Listen, NewEvent,FD_ACCEPT | FD_CLOSE); rc = listen(Listen, 5); WSANETWORKEVENTS NetworkEvents; SocketArray[EventTotal] = Listen; EventArray[EventTotal] = NewEvent; EventTotal++; char buffer[1024]; int len; while(TRUE) { // i tt c c|c s kin Index = WSAWaitForMultipleEvents(EventTotal,EventArray, FALSE, WSA_INFINITE, FALSE); Index = Index - WSA_WAIT_EVENT_0;

127

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Th d (tip)
// Duyt tm ra s kin n{o c b|o hiu for(i=Index; i < EventTotal ;i++) { Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 1000, FALSE); if ((Index == WSA_WAIT_FAILED) || (Index == WSA_WAIT_TIMEOUT)) continue; else { Index = i; WSAResetEvent(EventArray[Index]); WSAEnumNetworkEvents( SocketArray[Index], EventArray[Index], &NetworkEvents);

128

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Th d (tip)
// Kim tra s kin FD_ACCEPT if (NetworkEvents.lNetworkEvents & FD_ACCEPT) { if (NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0) { printf("FD_ACCEPT failed with error %d\n", NetworkEvents.iErrorCode[FD_ACCEPT_BIT]); break; } // Chp nhn kt ni mi // cho v{o danh s|ch socket v{ s kin Accept = accept( SocketArray[Index], NULL, NULL);

129

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh WSAEventSelect
Th d (tip)
if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS) { printf("Too many connections"); closesocket(Accept); break; }

NewEvent = WSACreateEvent();
WSAEventSelect(Accept, NewEvent, FD_READ | FD_WRITE | FD_CLOSE); EventArray[EventTotal] = NewEvent; SocketArray[EventTotal] = Accept; EventTotal++; printf("Socket %d connected\n", Accept); } ...

130

Bi tp
Vit chng trnh chat+gi file n gin (client +server) s dng m hnh WSAEventSelect. C th nhp v hin th ting Vit. C qun l username, password. Ni dung lu trong xu c kiu wchar_t. S lng byte gi i = chiu di xu * 2.

131

Bi tp
Thit k v ci t mt giao thc cho php gi file v vn bn ng thi trn mt kt ni TCP. Thit k v ci t mt giao thc cho php gi file v vn bn ng thi trn mt socket UDP.

132

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped
S dng cu trc OVERLAPPED cha thng tin v thao tc vo ra. Cc thao tc vo ra s tr v ngay lp tc v thng bo li cho ng dng theo mt trong hai cch sau: Event c ch ra trong cu trc OVERLAPPED. Completion routine c ch ra trong tham s ca li gi vo ra. Cc hm vo ra s dng m hnh ny: WSASend WSASendTo WSARecv WSARecvFrom WSAIoctl WSARecvMsg AcceptEx ConnectEx TransmitFile TransmitPackets DisconnectEx 133 WSANSPIoctl

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped X l qua event
Cu trc OVERLAPPED typedef struct WSAOVERLAPPED { DWORD Internal; DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; WSAEVENT hEvent; } WSAOVERLAPPED, FAR * LPWSAOVERLAPPED Internal, InternalHigh,Offset,OffsetHigh c s dng ni b trong WinSock hEvent l i tng event s c bo hiu khi thao tc vo ra hon tt, chng trnh cn khi to cu trc vi mt i tng s kin hp l. Khi thao tc vo ra hon tt, chng trnh cn ly kt qu vo ra thng qua hm WSAGetOverlappedResult

134

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped X l qua event
Hm WSAGetOverlappedResult BOOL WSAGetOverlappedResult( SOCKET s, LPWSAOVERLAPPED lpOverlapped, LPDWORD lpcbTransfer, BOOL fWait, LPDWORD lpdwFlags ); s l socket mun kim tra kt qu lpOverlapped l con tr n cu trc OVERLAPPED lpcbTransfer l con tr n bin s lu s byte trao i c fWait l bin bo cho hm i cho n khi thao tc vo ra hon tt lpdwFlags : c kt qu ca thao tc Hm tr v TRUE nu thao tc hon tt hoc FALSE nu thao tc cha hon tt, c li hoc khng th xc nh. 135

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped X l qua event
To i tng event vi WSACreateEvent. Khi to cu trc OVERLAPPED vi event va to. Gi yu cu vo ra vi tham s l cu trc OVERLAPPED va to, tham s lin quan n CompletionRoutine phi lun bng NULL. i thao tc kt thc qua hm WSAWaitForMultipleEvents. Nhn kt qu vo ra qua hm WSAGetOverlappedResult

136

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped Th d x l qua event
// Khi to WinSock v{ kt ni n 127.0.0.1:8888 OVERLAPPED overlapped; // Khai b|o cu trc OVERLAPPED WSAEVENT receiveEvent = WSACreateEvent(); // To event memset(&overlapped,0,sizeof(overlapped)); overlapped.hEvent = receiveEvent; char buff[1024]; WSABUF databuff; databuff.buf = buff; databuff.len = 1024; DWORD bytesReceived = 0; DWORD flags = 0; while (1) { DWORD flags = 0; // Gi yu cu nhn d liu rc = WSARecv(s,&databuff,1,&bytesReceived,&flags,&overlapped,0); // B m nhn d liu // Cu trc m t b m // S byte nhn c / C quy nh c|ch nhn, bt buc phi c

137

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped Th d x l qua event
if (rc == SOCKET_ERROR) { rc = WSAGetLastError(); if (rc != WSA_IO_PENDING) { printf("Loi %d !\n",rc); continue; } }; rc = WSAWaitForMultipleEvents(1,&receiveEvent,TRUE,WSA_INFINITE,FALSE); if ((rc == WSA_WAIT_FAILED)||(rc==WSA_WAIT_TIMEOUT)) continue; WSAResetEvent(receiveEvent); rc = WSAGetOverlappedResult(s,&overlapped,&bytesReceived,FALSE,&flags); // Kim tra li // Hin th buff[bytesReceived] = 0; printf(buff); }

138

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped X l Completion Routine
H thng s thng bo cho ng dng bit thao tc vo ra kt thc thng qua mt hm callback gi l Completion Routine Nguyn mu ca hm nh sau void CALLBACK CompletionROUTINE( IN DWORD dwError, // M~ li IN DWORD cbTransferred, // S byte trao i IN LPWSAOVERLAPPED lpOverlapped, // Cu trc lpOverlapped // tng ng IN DWORD dwFlags ); // C kt qu thao t|c v{o ra WinSock s b qua trng event trong cu trc OVERLAPPED, vic to i tng event v thm d l khng cn thit na.

139

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped X l Completion Routine
ng dng cn chuyn lung sang trng thi alertable ngay sau khi gi yu cu vo ra. Cc hm c th chuyn lung sang trng thi alertable: WSAWaitForMultipleEvents, SleepEx Nu ng dng khng c i tng event no th c th s dng SleepEx DWORD SleepEx(DWORD dwMilliseconds, // Thi gian i BOOL bAlertable // Trng th|i alertable );

140

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped Th d Completion Routine
// Khai b|o c|c cu trc cn thit SOCKET s; OVERLAPPED overlapped; char buff[1024]; WSABUF databuff; DWORD flags; DWORD bytesReceived = 0; Int rc = 0;

void CALLBACK CompletionRoutine( IN DWORD dwError, IN DWORD cbTransferred, IN LPWSAOVERLAPPED lpOverlapped, IN DWORD dwFlags) { if (dwError != 0||cbTransferred==0) // X l li { closesocket(s); return; };

141

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped Th d Completion Routine
// Hin th x}u ra m{n hnh buff[cbTransferred]=0; printf(buff); // Khi to li cu trc overlapped v{ li gi tip yu cu nhn d liu memset(&overlapped,0,sizeof(overlapped)); flags = 0; rc = WSARecv(s, &databuff, 1, &bytesReceived, &flags, &overlapped, CompletionRoutine); if (rc == SOCKET_ERROR) { rc = WSAGetLastError(); if (rc != WSA_IO_PENDING) printf("Loi %d !\n",rc); }; return;

142

3.4 C|c phng ph|p v{o ra


Cc m hnh vo ra ca WinSock
M hnh Overlapped Th d Completion Routine
int _tmain(int argc, _TCHAR* argv[]) { // Khi to v{ kt ni n 127.0.0.1:8888 // Khi to cu trc overlapped memset(&overlapped,0,sizeof(overlapped)); // Khi to b m d liu databuff.buf = buff; databuff.len = 1024; // Gi yu cu v{o ra rc = WSARecv(s, &databuff,1,&bytesReceived,&flags,&overlapped, CompletionRoutine); // X l li // Chuyn lung sang trng th|i alertable while (1) SleepEx(1000,TRUE); getch(); closesocket(s); WSACleanup(); return 0; 143 }

3.4 C|c phng ph|p v{o ra


Bi tp
Vit chng trnh Server s dng m hnh Overlapped Completion Routine c th nhn nhiu kt ni t client v chuyn tip d liu t mt client n cc client cn li.

144

Chng 4. MFC Socket

Lng nh Ho{ng
hoangla@soict.hut.edu.vn

Chng 4. MFC Soket


4.1. Gii thiu 4.2. CSocket 4.3. CAsyncSocket

146

Chng 4.1 Gii thiu


MFC: Microsoft Foundation Classes B th vin hng i tng C++ lp trnh ng dng trn Window. Cung cp hai lp h tr lp trnh mng
CAsyncSocket: ng gi li th vin WinSock di dng hng i tng. Hot ng ch bt ng b. CSocket: K tha t CAsyncSocket v cung cp giao din mc cao hn na. Hot ng ch ng b.

Hai lp ny khng thread-safe: i tng to ra lung no th ch c th c s dng lung . Tp tiu : afxsock.h

147

Chng 4.2 CSocket


Khi to th vin: t ng bi framework qua hm AfxSocketInit Khi to i tng CSocket: Phng thc Create
BOOL Create( UINT nSocketPort = 0, // Cng, mc nh l 0 int nSocketType = SOCK_STREAM, // Kiu socket LPCTSTR lpszSocketAddress = NULL) // a ch giao din mng, th d // 192.168.1.1 Gi tr tr v: - Khc NULL nu thnh cng - NULL nu tht bi. M li c th truy nhp qua hm GetLastError() Th d: CSocket Server, Client Server.Create(8888); Client.Create();

148

Chng 4.2 CSocket


Kt ni n my khc: Phng thc Connect
BOOL Connect( LPCTSTR lpszHostAddress, // a ch/tn min my ch UINT nHostPort // Cng ); BOOL Connect( const SOCKADDR* lpSockAddr, // a ch my ch di dng SOCKADDR int nSockAddrLen // Chiu di cu trc a ch ); Gi tr tr v: - Khc NULL nu thnh cng - NULL nu tht bi. M li c th truy nhp qua hm GetLastError() Th d: CSocket s; s.Create(); s.Connect(www.google.com.vn, 80);

149

Chng 4.2 CSocket


i kt ni t my khc: Phng thc Listen
BOOL Listen( int nConnectionBacklog = 5 )

Gi tr tr v: - Khc NULL nu thnh cng - NULL nu tht bi. M li c th truy nhp qua hm GetLastError()

ng kt ni: Phng thc Close


virtual void Close( )

150

Chng 4.2 CSocket


Chp nhn kt ni t my khc: Phng thc Accept
virtual BOOL Accept( CSocket& rConnectedSocket, // Socket tng ng vi kt ni mi SOCKADDR* lpSockAddr = NULL,// a ch socket mi di dng SOCKADDR int* lpSockAddrLen = NULL // Chiu di a ch ); Gi tr tr v: - Khc NULL nu thnh cng - NULL nu tht bi. M li c th truy nhp qua hm GetLastError() Th d: CSocket Server, Client; // Khi to socket Server // Chp nhn kt ni Server.Accept(Client); // Gi nhn d liu trn Client

151

Chng 4.2 CSocket


Gi d liu n my khc: Phng thc Send
virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );

// B m cha d liu cn gi // S byte cn gi // C, ch c th l MSG_OOB nu c

Gi tr tr v: - S byte gi c nu thnh cng - SOCKET_ERROR nu tht bi Th d: char buff[]=Hello MFC Socket; Client.Send(buff,strlen(buff));

152

Chng 4.2 CSocket


Nhn d liu t my khc: Phng thc Receive
virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );

// B m s nhn d liu // Kch thc b m // C, c th l MSG_PEEK hoc MSG_OOB

Gi tr tr v: - S byte nhn c nu thnh cng - NULL nu kt ni b ng - SOCKET_ERROR nu tht bi Th d:

char buff[1024]; int buflen = 1024, nBytesReceived; nBytesReceived = connectedSocket. Receive(buff,1024);

153

Chng 4.2 CSocket


Xy dng Client bng CSocket
CSocket s; unsigned char buff[1024]; char * request = GET / HTTP/1.0\r\nHost:www.google.com\r\n\r\n; int len = 0; s.Create(); s.Connect(www.google.com,80); s.Send(request,strlen(request)); len = s.Receive(buff,1024); buff[len] = 0; printf(%s,buff);

154

Chng 4.2 CSocket


Xy dng Server bng CSocket
CSocket listen,connect; Char * buff = Hello Network Programming; listen.Create(80,SOCK_STREAM,0.0.0.0); listen.Listen(); listen.Accept(connect); connect.Send(buff,strlen(buff)); connect.Close();

155

Chng 4.3 CAsyncSocket


ng gi hot ng ca socket bt ng b Nguyn mu cc hm vo ra tng t CSocket nhng tr v ngay lp tc t li gi. ng dng khng s dng trc tip lp ny m k tha v chng ln cc phng thc o ca lp x l cc s kin. Cc phng thc hay c chng
OnAccept: Phng thc ny s c gi mi khi c yu cu kt ni. OnClose: Phng thc ny s c gi mi khi socket u kia b ng. OnSend: Phng thc ny c gi khi socket c th gi d liu. OnReceive: Phng thc ny c gi khi socket nhn c d liu v ch ng dng x l OnConnect: Phng thc ny c gi khi yu cu kt ni c chp nhn v socket sn sng gi nhn d liu.

156

Chng 4.3 CAsyncSocket


Khi to i tng: Phng thc Create
BOOL Create( UINT nSocketPort = 0, // Cng int nSocketType = SOCK_STREAM, // Kiu socket long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, // Mt n s kin LPCTSTR lpszSocketAddress = NULL // a ch socket ); Gi tr tr v : - Khc NULL nu thnh cng - NULL nu tht bi S khc bit duy nht vi CSocket phng thc ny l tham s lEvent cha mt n cc s kin ng dng mong mun nhn c

157

Chng 4.3 CAsyncSocket


X l cc s kin: chng ln phng thc tng ng vi s kin mong mun
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket k tha t // AsyncSocket { static int i = 0; i++; TCHAR buff[4096]; int nRead; nRead = Receive(buff, 4096); switch (nRead) { case 0: Close(); break; case SOCKET_ERROR: if (GetLastError() != WSAEWOULDBLOCK) { AfxMessageBox (_T("Error occurred")); Close(); } break; 158

Chng 4.3 CAsyncSocket


X l cc s kin (tip)
default: buff[nRead] = _T('\0'); // Kt thc x}u CString szTemp(buff); m_strRecv += szTemp; // Chn x}u nhn c v{o cui m_strRecv if (szTemp.CompareNoCase(_T("bye")) == 0) { ShutDown(); s_eventDone.SetEvent(); } } CAsyncSocket::OnReceive(nErrorCode); }

159

Chng 4.3 CAsyncSocket


3.Vit chng trnh HTTP Streaming server thc hin thao tc sau:
i kt ni cng 80 Cho php gii hn tc upload X l cc request t client gi n c dng GET /<TenFile> HTTP/1.1 Host: . \n\n Phn hi cc request nh sau: Nu tn <TenFile> tn ti trong th mc hin ti th gi tr phn hi c dng Status:OK-200\n Content-Length:<KichThuocFile>\n Content-Type:video/mp4\n \n \n <NoiDungFile>
160

Chng 4.3 CAsyncSocket


3.Vit chng trnh HTTP Streaming server thc hin thao tc sau:
Phn hi cc request nh sau: Nu file khng tn ti th phn hi li nh sau Status: Not Found 404\n Content-Length:<Chieu dai xau phan hoi>\n Content-Type:text/html\n \n \n Khng tm thy tp tin

161

Chng 4.3 CAsyncSocket


1.Vit chng trnh gi file bng CAsyncSocket 2. Vit chng trnh gi tin nhn m ha qua mng bng blocking. Cch thc m ha nh sau: Server chn mt s nguyn x (0-255) lm mt khu. v gi cho mi client khi kt ni n. M ASCII ca k t c gi s c cng thm x trc khi truyn, bn nhn tr i x hin th. Nu gi tr cng thm >255 th truyn i phn d ca gi tr khi chia cho 256.

162

Chng 5. NET Socket

Lng nh Ho{ng
hoangla@soict.hut.edu.vn

Chng 5. NET Soket


5.1. Gii thiu 5.2. TCP Server 5.3. TCP Client 5.4. UDP Server/Client

164

Chng 5.1 Gii thiu


.NET Framework l b th vin chy trn a kin trc ca Microsoft Hai namespace h tr lp trnh mng: System.Net v System.Net.Sockets Mt vi lp chnh
IPAddress: Lu tr v qun l a ch IP. IPEndPoint: Lu tr thng tin v mt a ch socket, tng t nh SOCKADDR_IN. Bao gm IPAddress v cng. DNS: H tr cc thao tc phn gii tn min Socket: X l cc thao tc trn socket

165

Chng 5.1 Gii thiu


IPAddress: ng gi mt a ch IP
Khi to: IPAddress.Parse(192.168.1.1); Ly dng chui: IPAddress.ToString(); Cc a ch c bit: IPAddress.Any, IPAddress.Broadcast, IPAddress.Loopback

IPEndPoint: ng gi mt a ch socket
Khi to: IPEndPoint(IPAddress, Int32) Ly dng chui: IPEndPoint.ToString();

DNS: thc hin phn gii tn min


Ly a ch IP: IPAddress[] DNS.GetHostAddress(www.google.com); Ly thng tin v host: IPHostEntry DNS.GetHostEntry(www.google.com);
166

Chng 5.2 TCP Server


Trnh t to TCP Server
1.To mt Socket 2.Lin kt vi mt IPEndPoint cc b 3.Lng nghe kt ni 4.Chp nhn kt ni 5.Gi nhn d liu theo giao thc thit k 6.ng kt ni sau khi hon thnh v tr li trng thi lng nghe ch kt ni mi.

167

Chng 5.2 TCP Server


Th d
// Thit lp a ch ca server IPEndPoint ie = new IPEndPoint(IPAddress.Any, 8888); // To socket server Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); int ret; // Bind v Listen server.Bind(ie); server.Listen(10); Console.WriteLine(Doi ket noi tu client..."); // Chp nhn kt ni mi Socket client = server.Accept(); Console.WriteLine("Chap nhan ket noi tu:{0}", client.RemoteEndPoint.ToString()); string s = Hello Net Socket"; byte[] data = new byte[1024]; data = Encoding.ASCII.GetBytes(s); client.Send(data, data.Length, SocketFlags.None); 168

Chng 5.2 TCP Server


Th d (tip)
while (true) { data = new byte[1024]; ret = client.Receive(data); if (ret == 0) break; Console.WriteLine("Du lieu tu client:{0}", Encoding.ASCII.GetString(data,0,ret)); } client.Shutdown(SocketShutdown.Both); client.Close();

169

Chng 5.3 TCP Client


Trnh t
Xc nh a ch ca Server To Socket Kt ni n Server Gi nhn d liu theo giao thc thit k ng Socket

170

Chng 5.3 TCP Client


Th d
// Thit lp a ch IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888); // To socket client Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Kt ni n server client.Connect(iep); byte[] data = new byte[1024]; int recv = client.Receive(data); // Nhn c}u ch{o t server string s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Server gui:{0}", s); string input; while (true) { input = Console.ReadLine(); //Chuyen input thanh mang byte gui len cho server data = Encoding.ASCII.GetBytes(input); client.Send(data, data.Length, SocketFlags.None); 171

Chng 5.3 TCP Client


Th d (tip)
if (input.ToUpper().Equals("QUIT")) break; } client.Disconnect(true); client.Close(); }

172

Chng 5.4 UDP Server/Client


Trnh t UDP Server
To mt Socket Lin kt vi mt IPEndPoint cc b qua hm Bind (UDP Server) hoc xc nh a ch Server gi d liu (UDP Client) Gi nhn d liu theo giao thc thit k bng hm ReceiveFrom/SendTo ng Socket

173

Phn phi im
Thi cui k: 70% Chuyn cn: 15% Gia k: 15%

174

Ni dung
Tt c cc chng

175

Hnh thc thi


Trc nghim Thi gian: 60p S cu hi: 40 C l thuyt + bi tp Khng s dng ti liu hoangla@soict.hut.edu.vn

176

You might also like