You are on page 1of 34

Bi 4- Gii thut v cc k thut c

bn trong lp trnh Client

Ch
Nm c cc bc (gii thut) lp trnh chng

trnh Client
Bit cch s dng cc hm Socket API trong lp
trnh Client
Thc hnh lp trnh mt chng trnh Client n
gin

Ni dung
4.1) Cu trc tng qut chng trnh Client
4.2) Gii thut tng qut chng trnh Client
4.3) Cch gi hm Socket API trong tng bc

4.1 Cu trc chng trnh Client


V c bn, client khng yu cu mc u tin cao

trong h thng
Khng yu cu nhiu ti nguyn v khng cn

hot ng lin tc

Cu trc chng trnh gm 3


module
Module giao din tng tc vi user
Module kt ni vi server
Module thc thi giao thc trao i d liu vi

server
Gi bn tin yu cu n Server

Nhn bn tin phn hi t Server v x l

Cc chc nng h tr thc thi


giao thc
c v phn tch c php bn tin giao thc

Client/Server
X l d liu trc khi gi v sau khi nhn
Thao tc vi b m buffer cha d liu
Hin th trng thi phin lm vic
Thng bo v x l li gp phi
c/ghi d liu t tp tin

4.2) Gii thut chng trnh client c


5 bc
Mt Client ni chung cn thc hin 5 bc sau
Bc 1) Xc nh a ch remote socket pha
server
Bc 2) To local socket ti client
Bc 3) Kt ni local socket vi remote
socket
Bc 4) Gi/nhn/x l d liu qua kt ni
socket
Bc 5) ng kt ni

Phn r chc nng theo module


Bc 1 -> 3 c thc hin bi module kt ni

socket
Bc 4 ->5 c thc hin bi module thc thi
giao thc (module chnh)
Bc 1 3 l thao tc chung i vi mi Client
Bc 4 v 5 ty theo tng giao thc ng dng

nh HTTP, FTP, POP3 hay SMTP

V d minh ha: Chng trnh


EchoClient
Chc nng: kim tra phn hi ca server qua

TCP/IP
Cc cng on xy dng chng trnh gm:
Cc chc nng b tr: truy vn thng tin, thng bo

li
Lp trnh module kt ni
Lp trnh module tng tc vi Server theo giao
thc ng dng Echo
Lp chng trnh chnh

Giao thc ECHO


Echo dng kim tra hot ng ca mng v ca

server
Client gi n Server 1 bn tin l mt xu k t bt
k
Server gi tr li mt bn tin vi ni dung hon
ton trng vi bn tin m client gi n
V d:

Client gi bn tin HELLO


Server nhn c v gi li HELLO
Client gi How are you?
Server gi li How are you?

Cch thc hot ng


User chy chng trnh TCPEchoClient vi tham

s hm main l tn server
TCPEchoClient.exe <tn server>
Nu kt ni thnh cng, nhp bn tin l xu k t

t bn phm v gi bn tin n server


Nhn bn tin phn hi v in ra mn hnh
ng kt ni v kt thc nu bn tin nhp vo l
xu rng

Cc tp m ngun ca project
socketbasic.cpp: Module chc nng khi to v

gii phng WS, truy vn thng tin


errorhandler.cpp: Module chc nng bo li
connect.cpp : chc nng kt ni n server
echoclient.cpp: chc nng trao i cc bn tin
theo giao thc Echo

Bc 1: Xc nh a ch socket
pha Server

Client

Server

transport
network
interface

transport
network
interface

Internet

Xc nh a ch Socket ca
server ntn ?

UDP

TCP

POP3
a ch Socket ca tin trnh Server
- Kiu Socket (TCP hay UDP)
- Cng
- a ch IP

a ch ca remote socket pha


Server c 3 tham s
Loi socket: chn TCP hoc UDP ty vo ng

dng
FTP :

TCP socket
POP3: TCP socket
DNS: UDP socket
S cng: chn cng ca dch v tng ng
FTP: 21
POP3: 110

a ch IP: ly t hostname ca server hoc a

ch IP dng thp phn


hostname:
a ch IP:

ftp.nuce.edu.vn
220.231.122.114

C 2 cch ly a ch IP
Nu bit hostname, v d: ftp.nuce.edu.vn
S dng hm API gethostbyname ly thng tin

v trm server qua hostname


Thng tin hm tr v l cu trc hostent
Thng qua trng h_addr_list c th ly a ch IP
dng 4-byte
Nu bit a ch IP dng thp phn, v d :

220.231.122.114
S dng hm API inet_addr chuyn i thnh

a ch IP dng s 32 bit

Cch ly s cng
Nu bit s cng trc tip, v d 80, 7 hoc 21
S dng hm htons bin i s cng sang dng

NBO
Nu ch nh tn dch v, v d HTTP, ECHO, FTP
S dng hm API getservbyname truy vn

thng tin dch v t tn dch v

S dng cu trc a ch socket


a ch socket c lu trong cu trc d liu

struct sockaddr_in
Chng trnh cn khai bo mt bin kiu struct

sockaddr_in v gn gi tr cng, a ch IP va ly
c cho cc trng d liu tng ng
struct sockaddr_in sin; // bin cu trc a ch socket
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = server_addr.s_addr; //gn a ch IP
sin.sin_port = server_port; // gn s cng

Bc 2: To local socket ti
Client
Mi socket c tham chiu bi mt bin kiu

SOCKET
S dng hm API socket to 1 socket mi
SOCKET s = socket(PF_INET, sock_type, 0);

PF_INET: h giao thc TCP/IP


sock_type = SOCK_STREAM nu to TCP socket
sock_type = SOCK_DGRAM nu to UDP socket

Tip
Nu thnh cng, hm socket tr v mt gi tr

kiu SOCKET
Nu khng thnh cng, hm tr v gi tr hng
INVALID_SOCKET

Bc 3: Kt ni n remote
socket ti Server
Gi hm API connect v truyn tham s cn thit

kt ni vi socket ti server
int ret = connect(s, (struct sockaddr*) &sin, sizeof(sin));
if(ret==SOCKET_ERROR)
errexit(GetLastError(), "Khong ket noi duoc voi server: %s,
%s", host, service);

s: bin local socket va to


sin : bin cu trc a ch socket ca server

Nu gi tr tr v ret == SOCKET_ERROR

khng kt ni c, ngc li l kt ni thnh


cng

Ch
C nhiu kh nng xy ra li khi kt ni
Server khng tr li
Server t chi kt ni
Time out do tr truyn d liu

Khi lp trnh mng, cn ch kim tra kt qu gi

hm SOCKET API bit thao tc thc hin c


thnh cng hay khng
Nu khng kim tra m vn tip tc cc thao tc
tip theo s dn n li chng trnh

Bc 4: Client tng tc vi Server


Client gi bn tin yu cu bng cch
To ni dung bn tin v a bn tin vo vng m

buffer (b nh)
Gi hm API send gi bn tin qua socket

int byte_send = send(s, buffer, msg_length, 0);

Client nhn bn tin phn hi t server


Chun b vng m buffer s nhn ni dung bn tin
Gi hm API recv c d liu t socket vo

buffer
int byte_recv = recv(s, buffer, sizeof(buffer), 0);

Hm send v recv
Nu gi d liu thnh cng, hm tr v s byte

d liu gi
Ngc li, hm tr v gi tr SOCKET_ERROR
tm nguyn nhn gy li, gi hm
GetLastError()
Tng t, hm recv tr v s byte nhn c,
nu thnh cng, tr v SOCKET_ERROR nu
gp li

Chun b vng m buffer


Vng m c th khai bo di dng mng kiu

char
char buffer[512]; // vng m 512 bytes

Ch trnh trn vng m gy li chng trnh

khi gi hm recv nhiu ln

Bc 5: ng kt ni
Sau khi kt thc gi/nhn cc bn, client c th

ng kt ni
Gi hm API closesocket
closesocket(s)

Bi tp
Bi 1: Bit tn web server ca HXD l

www.nuce.edu.vn, hy vit mt chng trnh truy


vn a ch IP ca server trn
Bi 2: Vit 1 chng trnh Client kt ni n
cng 80 ca server www.nuce.edu.vn sau
Gi bn tin GET / HTTP/1.1\r\n\r\n, nhn phn

hi v in ra mn hnh
Gi bn tin GET /administrator HTTP/1.1\r\n,
nhn bn tin phn hi v in ra mn hnh

Tip
Bi 3: To giao din command line cho chng

trnh EchoTCPClient, s dng cc chc nng


qua lnh:
Kt ni n server: lnh connect, tham s l tn

hoc a ch IP ca server
Gi bn tin: lnh msg, tham s l ni dung bn tin
trn 1 dng
ng kt ni: lnh close
Thot khi chng trnh: lnh quit

c thm: Client s dng UDP


socket
Mt chng trnh client s dng UDP socket

cng bao gm cc bc tng t


im khc bit: khng c lin kt gia local
socket v remote socket pha server v UDP l
giao thc khng hng kt ni

Kt ni UDP socket
ngha ca vic gi hm connect vi UDP

socket

Xc nh a ch socket pha server mt ln duy

nht.
Sau c th dng hm send() v recv()
gi nhn d liu ging nh vi TCP socket
u im: thun tin khi client ch tng tc

vi mt server
Nu mun thay i a ch socket mi ln gi
hoc nhn d liu, s dng hm sendto v
recvfrom

Hm sendto v recvfrom
sendto l hm gi d liu dnh ring cho

UDP socket
int sendto( SOCKET s, const char *buf, int len, int flags,
const struct sockaddr *to, int tolen );

recvfrom l hm nhn d liu


int recvfrom( SOCKET s, char * buf, int len, int flags, struct
sockaddr *from, int *fromlen );

u im: gip chng trnh client linh hot

hn trong gi/ nhn d liu vi nhiu Server


Client c th dng mt local socket gi d liu

cho nhiu remote socket

Ch
Khi gi hm connect() vi UDP socket, hm

khng bo li nhng khng bo m chc chn


s lin lc c vi server.

Cch truyn v nhn


Khc vi TCP, UDP socket truyn trn vn

mt bn tin (datagram) trong mt ln gi hm


send hoc sendto
Nu vng m (buffer) ln th pha nhn
cng s nhn trn vn bn tin trong 1 ln
gi hm recv hoc recvfrom
Ch : nu kch thc vng m < kch
thc bn tin thi cc byte d liu cn li s b
b qua (cch lm vic ca UDP khng tin cy)

ng socket
ng socket UDP l gii phng ti nguyn

gn cho socket
Do tnh cht khng lin kt ca UDP, nu mt
pha (v d l Client) ng socket th pha bn
kia khng nhn bit c s kin
UDP thch hp cho cc ng dng cn tc
m khng cn tin cy v lin kt cht ch
gia Client v Server

Bi tp: Chng trnh Client vi


socket UDP
Vit chng trnh EchoUDPClient
S dng socket UDP
Tng tc vi server: gi bn tin qua socket v

nhn bn tin phn hi

You might also like