Chng 3: H qun tr c s d liu MySQL
36
3.3. S dng MySQL
3.3.1. Lnh mysql
ây là lnh thâm nhp trình qun lý c s d liu và a ra các
nh qun tr khác .
Cú pháp
mysql u username p password databasename
Ví d
Truy xut c s d liu packet voi username la “pac” va
password la “ket”.
$ mysql –I pac –p ket packet
3.3.2. Lnh mysqladmin
Là công c chính ca ngi qun tr c s d liu vi 2 tham s -u,-
p . Vi mysqladmin có mt s lnh qun tr sau
• create databasename : to csdl
• drop database name :xóa c s d liu
• password newpassword : i mt khu
• status: thông tin v trng thái hin hành ca trình ch
• version cho bit thông tin v phiên bn ca trình ch my sql
3.3.3. Lnh mysqlshow
Lnh này cho bit thông tin v database. Nu không có tham s s
hin th toàn b database, ngc i nu có tham s là tên database thì
hin th tt c các bng trong database.
u tham s là tên database và tên bng thì toàn b tên các ct
trong bng sc hin th
u tham s là tên database,tên bng,tên ct thì thông tin ca ct s
c lit kê.
Chng 3: H qun tr c s d liu MySQL
37
3.3.4. Lnh grant
p quyn cho ngi dùng database
Cú pháp :
grant privilege on object to user[user-password] [opt]
• privilege là quyn cp cho tài khon ngi dùng bao gm:
§ Alter : quyn thay i bng và file ch mc
§ Creat : quyn to bng vàdatabase
§ Delete : quyn xoá d liu trong database
§ Drop : quyn xoá database
§ Index : quyn qun lý ch mc index
§ Insert : quyn chèn d liu mi vào
§ Select : quyn xem d liu
§ Update : quyn cp nht d liu
§ All : tt c các quyn
• Object : databasename.table
Có th dùng databasename.* s tác ng n mi bng
trên databasename.
u ý: mysql cho phép cp quyn trên database cha có
cho mt ngi dùng sau này s to
• User : username.host
Ví d rick@”%”
• Password : nu grant ta mi user ta t password bng
cách thêm identyfied by password
• Ví d : to mi user khtn vi password cntt toàn quyn trên
database tên packet(packet có th cha có)
mysql>grant all on packet.* to khtn@”%” indentified by cntt
Chng 3: H qun tr c s d liu MySQL
38
3.3.5. Lnh Revoke
Lnh này dùng c quyn ngi dùng
Cú pháp:
revoke privilege on object from user
3.3.6. Ví d v to mt c s d liu
o c s d liu packet vi username là khtn và password la cntt :
$mysql>grant all on packet.* to khtn@ identified by cntt;
nh trên c thc hin vi t cách qun tr root ca MySQL.
(Thoát v du nhc lnh $mysql>quit )
Ri gõ tip các lnh sau:
$mysql u khtn p cntt
$ mysql>create database packet;
$mysql>use packet (s dng database tên packet)
Bây gi mi truy vn sql u lác ng lên database packet.
3.4. Lp trình MySQL trên ngôn ng C
Mt s hàm thng dùng khi lp trình vi MySQL
4.4.1 mysql_init
Khi to cu trúc x lý kt ni
Cú pháp :
MYSQL *mysql_init (MYSQL *old_connect)
Tham s:
• old_connect =NULL :to kt ni mi
• old_connect khác NULL :tái kt ni vi con tr old_connect
Chng 3: H qun tr c s d liu MySQL
39
3.4.2 mysql_real_connection
Thc hin kt ni vt lý n máy ch ni Mysql sever ang chy
Cú pháp :
MYSQL *mysql_real_connect(MYSQL *connection ,
const char* server_host, const char * sql_username,
const char *sql_pass, const char* db_name,
unsigned port_num ,const char * unit_socket_name ,
unsigned int flag )
Tham s :
• Connection : trn cu trúc MYSQL c khi to bi hàm
mysqlconnect.
• Server_host : a ch IP ca máy ch ni dch vu mysql
server ang chy.
• sql_username,sql_pass : là i s chng thc quyn ng
nhp h thng
• db_name : tên ca database
• port_num : s hiu cng mysql dùng (mc nh bng 0)
• unit_socket_name kiu socket (mc nh NULL)
• flag: kiu giao thc s kt ni
Chng 3: H qun tr c s d liu MySQL
40
3.4.3 mysql_query
Thc thi câu lnh sql query.
Cú pháp:
int mysql_query(MYSQL *connect,const char* query)
Tham s:
• query : câu lnh sql cn thc hin
Kt qu tr v
• Bng 0 nu thc thi thành công
• Bng 1 nu tht bi
3.4.4. mysql_affected_rows
Cho bit s dòng bnh hng sau lnh query
Cú pháp :
my_ulonglong mysql_affected_rows(MYSQL *connection)
Khi s dng hàm này phi ép kiu giá tr tr v là unsigned long
3.4.5. mysql_store_result
y giá tr tr v sau khi gi hàm mysql_query a vào cu trúc
MYSQL_RES
Cú pháp :
MYSQL_RES *mysql_store_result(MYSQL -*connection)
3.4.6. mysql_fetch_row
y ra mt dònh d liu t MYSQL_RES . Bn cng có th di
chuyn n 1 dòng d liu bt kì nh hai hàm mysql_row_seek và
mysql_row_tell.
Cú pháp :
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
Chng 3: H qun tr c s d liu MySQL
41
3.4.7. mysql_row_seek
Di chuyn n v trí offset và tr v v trí con tr trc ó
Cú pháp :
MYSQL_ROW_OFFSET myql_row_seek(
MYSQL_RES *result MYSQL_ROW_OFFSET offset)
3.4.8. mysql_free_result
Gii phóng tài nguyên.
Cú pháp:
void mysql_free_result (MYSQL_RES *result)
Chng 4: Lp trình socket
42
Chng 4: Lp trình socket
4.1. Gii thiu v lp trình socket
Khi vit ng ng và có nhu cu tng tác vi mt ng ng khác,
chúng ta thng da vào mô hình khách/ ch (client/server). Theo mô hình
này, ng ng có kh ng phc hoc cung cp nhng thông tin gì ó gi
là ng ng ch (trình ch hay server). ng ng gi yêu cu n trình ch
c i là ng ng khách (trình khách hay client). M rng hn na, server
có th là mt máy tính vi cu hình nh còn client là rt nhiu máy con khác
ni vào máy ch.
Nh vy, trc khi yêu cu mt ch ca trình ch thc hin iu gì
ó, trình khách (client) phi có kh ng kt ni c vi trình ch. Quá trình
kt ni này c thc hin thông qua mt c ch tru tng hóa i là socket
(m ch là “c ch cm”). Kt ni gia trình khách và trình ch ng t
nh vic cm phích in vào cm in. Trình khách thng c coi nh
phích cm in, còn trình ch c coi nh cm in, mt cm có th cm
vào ó nhiu phích in khác nhau ng nh mt máy ch có th kt ni và
phc cho rt nhiu máy khách.
Nu kt ni thành công thì trình khách và trình ch có th trao i d
liu vi nhau, thc hin các yêu cu v trao i d liu.
4.2. Nguyên lý hot ng a socket
u tiên server m mt cm socket. ây ch là quá trình h iu hành
phân b tài nguyên chun kt ni. Dùng hàm socket() to “ cm”
cho trình ch server.
Tip n, ng ng khách bit n cm socket a trình ch, n
phi t cho server ch mt cái tên. Nu trên máy c b và da vào h thng
file a UNIX hay Linux, n có th t tên cho socket nh là mt tên file
Chng 4: Lp trình socket
43
(vi y ng dn). n ch cn t tên còn ng dn thng t trong
th c /tmp hay /usr/tmp. i vi giao tip ng thông qua giao thc
TCP/IP tên a socket c thay th bng khái nim cng (port). Cng là mt
s nguyên 2 bytes (khong 65000 cng n có th chn t cho socket) thay
th cho tên tp tin. Nu trình khách và trình ch nm trên hai máy khách
nhau, giao thc TCP/IP còn yêu cu xác nh thêm a ch IP kt ni n
máy ch xa.
Sau khi ã ch nh tên hoc s hiu port cho socket, n i hàm bind()
ràng buc hay t tên chính thc cho socket a trình ch. Tip n là ch
kt ni t phía trình khách, trình ch s gi hàm listen() to hàng i nhn
các kt ni do trình khách a n. Nu có yêu cu kt ni t phía trình
khách, trình ch gi hàm accept() tip nhn yêu cu a trình khách.
accept() to mt socket vô danh khác (unnamed socket), cm kt ni a
trình khách vào socket vô danh này và thc hin quá trình chuyn d liu trao
i gia khách ch. Socket c t tên trc ó vn tip c hot ng
ch nhn yêu cu t trình khách khác.
i giao tip c ghi thông qua socket ng n gin nh vic dùng
lnh read/write c ghi trên file. Nu file da vào s mô (file descriptor)
xác nh socket cn c ghi cho hàm read/write.
Phía trình khách ch cm o mt socket vô danh, ch nh tên và v trí
socket a trình ch. Yêu cu kt ni bng hàm connect() và c ghi, truy
xut d liu a socket bng lnh read/ write hoc lnh send/ recv.
Chng 4: Lp trình socket
44
4.3. Lp trình vi socket
4.3.1. Các thuc tính a socket
Socket c nh ngha da trên 3 thành phn thuc tính( attribute)
ó là: vùng( domain), kiu( type) và giao thc( protocol). Socket còn cn
c vào mt a ch kt hp vi nó. a ch này ph thuc vào vùng a
socket và thng c i là dòng giao thc (protocol family). Ví d
nh dòng giao thc theo h thng file a Sun thng ly tên file làm
ng dn a ch, trong khi giao thc TCP/IP i ly a ch IP (32 bits)
tham chiu và thc hin kt ni vt lý.
4.3.1.1. Vùng( domain)
Vùng dùng xác nh tng ng ni giao tip a Socket
din ra. Vùng giao tip Socket thông ng nht hin nay là
AF_INET hay gia tip socket theo chun ng Internet. Chun này
s dng a ch IP xác nh nút kt ni vt lý trên ng. Ngoài
ra, nu n ch cn giao tip c b, n có th dùng vùng giao tip
theo chun a Sun AF_UNIX, ó là dùng ng dn và h thng
file t tên và xác nh kt ni gia hai hay nhiu ng ng.
Chng n nh ví d trên, chúng ta ã thc hin bng cách t tên
cho socket là server_socket, và Linux ã to ra file server_socket
ngay trên th c hin hành (hay trong th c m /tmp tùy theo
phiên n a Linux và UNIX). Tuy nhiên vùng giao tip
AF_UNIX li ít c s dng trong thc t. Ngày nay hu ht các
ng ng ng s dng socket u theo vùng AF_INET là ch yu.
Chúng ta bàn sâu v phân vùng này ngay sau ây.
Vùng AF_INET nh ã nêu s dng c ch IP (Internet
Protocol) là mt ch ngha s 32 bits xác nh kt ni vt lý. S
này thng c vit dng nhòm nh 192.168.1.1, 203.162.42.1
Chng 4: Lp trình socket
45
hay 127.0.0.1 là các a ch IP hp l. a ch IP có th c ánh
thành mt tên d nh n nh www.yahoo.com
hay
www.microsoft.com
, chúng c i là tên vùng (domain name).
Vic ánh a ch IP thành tên vùng thng do máy ch DNS
(Domain Name Server) thc hin. Tuy nhiên, n ng có th t
ánh tên vùng ngay trên mày c b bng cách s dng tp tin d
liu /etc/hosts.
Socket theo dòng giao thc IP s dng port (s hiu cng)
t tên cho mt socket. Cng dùng phân bit d liu gi n
chuyn cho ng ng nào. n hình dung nu a ch IP dùng
xác nh c máy hay ni kt ni vt lý a d liu n thì
cng là a ch ph dùng gi chính xác d liu n ni ng ng
cn. iu này do trên mt máy có th có nhiu ng ng cùng chy
và cùng s dng trùng s cng. Do cng là mt giá tr nguyên 2
bytes nân n có th s dng khong 65000 cng t do t cho
socket. Tr các s hiu cng n ting nh FTP, Web ã nêu phn
trên n không nên s dng, còn thì bn có th chn s cng ln
n 1024 m cho socket a ung ng.
M socket theo AF_INET không khác my so vi AF_UNIX
ngoài vic t tên và ch nh s hiu cng. Ví d:
/* M socket theo kt ni IP */
server_sockfd = socket (AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(“127.0.0.1”);
server_address.sin_port = 1234;
Chng 4: Lp trình socket
46
Ngoài vùng giao tip AF_UNIX và AF_INET, n còn có th
gp AF_ISO dành cho chun giao thc ng theo ISO hay AF_NS
dành cho h thng ng Xerox, tuy nhiên chúng không c s
ng thng xuyên, cho nên ta không cp n chi tit.
5.3.1.2. Kiu socket(type)
Vi mi vùng domain a socket, n có th có nhiu cách
giao tip. Có hai kiu giao tip kiu giao tip in hình s là giao
tip mt chiu (SOCK_DGRAM) và giao tip o m hai chiu
(SOCK_STREAM). D liu khi chuyn i c óng thành tng
gói (data package hay datagram). SOCK_STREAM và
SOCK_DGRAM qui nh cách chuyn gói d liu theo hai cách
nh sau:
SOCK_STREAM luôn gi kt ni và bo m gói thông tin
gi i c chuyn n ích và nhn y . Sau khi nhn xong d
liu, ni nhn gi thông tin phn hi cho ni gi và quá trình gi
ch c xác nhn hoàn tt khi nhn c y thng tin gi nhn
c hai phía khách ch. Kiu truyn d li socket này trong vùng
giao thc ng Internet AF_INET c là giao thc truyn
TCP. Khi kt hp vi c ch nh tuyn theo a ch IP chúng c
i tt là TCP/IP. Kt ni và truyn d liu theo cách này tuy o
m nhng tn nhiu tài nguyên a h thng do kt ni phi duy
trì và theo dõi thng xuyên.
SOCK_DGRAM cách gi nhn d liu này ch din ra mt
chiu. Trình khách, ni gi d liu i không cn bit trình ch (ni
nhn) có nhn c gói d liu y hay không. Trình ch khi
nhn c d liu ng không cn thông báo hay xác nhn vi trình
khách là d liu ã nhn xong. Cách gi này có v không an toàn
Chng 4: Lp trình socket
47
nhng bù li thc hin nhanh và không tiêu tn nhiu tài nguyên
duy trì kt ni và kim tra d liu nhn gi. Kiu truyn d liu
socket này trong vùng giao thc ng Internet AF_INET c i
là giao thc truyn UDP (User Datagram Protocol). Khi kt hp vi
ch nh tuyn theo c ch IP chúng c i tt là UDP/IP. Do
tính cht không m o nên UDP c dùng nhiu trong ng vi
c ích thông báo hay gi tin tin n mt nhóm máy tính nào ó
trong ng. Nó ít khi c dùng trong các ch cn s chính xác
cao nh gi nhn file hay kt nói c s d liu.
4.3.1.3. Giao thc a socket( protocol)
Giao thc là cách qui c gi nhn d liu giia hai hay nhiu
máy tính trong mng. Tùy theo mi kiu gi nhn d liu mà ta có
các giao thc khác nhau. Hin nay kiu gi nhn theo giao thc
TCP và UDP là s dng nhiu nht. Tuy nhiên iu này không bt
buc, TCP và UDP ch là cách cài t cho vùng socket AF_INET
theo giao tip Internet mà thôi. Ví d, ban có th cài t mt giao
thc khác thay cho UDP áp ng cho cách chuyn d liu không
o m. Mõi kiu socket u có giao thc mc nh áp ng cho
nó. Trong tt các hàm socket sau này, tùy chn protocol nu có
yêu cu n có th t giá tr 0 yêu cu s dng giao thc mc
nh.
Trong các ví d phn sau ta ch tp trung nghiên cu v vùng
socket AF_INET và a ch IP thay cho vùng AF_UNIX. Vi
AF_INET i ng ng ng a n u có th giao tip c
vi nhau bt k chúng ang chy trên Windows, Linux hay UNIX.
Chng 4: Lp trình socket
48
4.3.2. To socket
H thng cung cp cho n hàm socket() to mi mt socket.
Hàm socket() tr v s nguyên int cho bit s mô hay nh danh dùng
truy cp socket sau này.
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
Tham s domain ch nh vùng hay a ch áp t cho socket.
domain có th nhn mt trong các giá tr sau:
AF_UNIX M socket kt ni theo giao thc file (xut nhp socket da
trên xut nhp (file) a UNIX/Linux
AF_INET M socket theo giao thc Internet (s dng a ch IP kt
ni)
AF_IPX Vùng giao thc IPX (ng Novell)
AF_IS Chun giao thc ISO
AF_NS Giao thc Xerox Network System
ng 4-1 Các giá tr ca domain
Hu nh n ch s dng AF_UNIX và AF_INET là chính. Các
vùng giao thc khác ã li thi và hin nay ít còn c s dng.
Tham s type trong hàm socket() dùng ch nh kiu giao tiép hay
truyn d liu a socket. n có th ch nh bng SOCK_STREAM
dùng cho truyn d liu o m hoc SOCK_GRAM dùng cho truyn
không o m.
Chng 4: Lp trình socket
49
Tham s protocol dùng chn giao thc áp ng cho kiu socket(
trong trng hp có nhiu giao thc áp ng cho mt kiu truyn). Tuy
nhiên n ch cn t giá tr 0 (ly giao thc mc nh). AF_INET ch cài
t mt giao thcduy nht cho các kiu truyn SOCK_STREAM và
SOCK_DGRAM ó là TCP và UDP.
Nu o socket thành công, hàm tr v s nh danh socket(
descriptor). n s dng s nh danh này trong tt các li i truy
xut socket khác nh read/write. S này tng t nh s nh danh file
mà bn thng dùng c và ghi file. c/ ghi vào socket ng ng
ngha vi gi và nhn d liu gia trình khách và trình ch.
4.3.3. nh a ch cho socket
Khi socket ã c o ra, n ch cn ch nh a ch và tên cho
socket. Mt socket cn phi có a ch và tên các trình khách có th
tham chiu n. Tùy mi vùng giao thc mà cách ánh a ch có th
khác nhau.
Ví d khi n dùng vùng giao thc AF_UNIX da trên h thng tp
tin, a ch socket c nh ngha trong cu trúc sockaddr_un a file
include sys/un.h nh sau:
struct sockaddr_un{
sa_family_t sun_family; /* AF_UNIX */
char sun_path []; /* ng dn */
};
Chng 4: Lp trình socket
50
Trong Linux sa_family_t c nh ngha là kiu short. sun_path là
ng dn to tp tin socket.
Vùng AF_UNIX c s dng nhiu trong các ng ng c b
trên t máy vì nó ph thuc vào ng dn tp tin tuyt i a h
iu hành.
Thc t bn dùng AF_INET vi cu trúc a ch c nh ngha
trong sockadd_in a file include netinet/in.h nh sau:
struct sockadd_in{
short in sin_family; /* AF_INET */
unsigned short int sin_port; /* s cng */
struct in_addr sin_addr; /* a ch IP */
};
Cu trúc in_addr mô a ch IP c nh ngha nh sau:
struct in_addr{
unsigned long int s_addr;
};
Nh n thy a ch IP là mt s long (4 bytes hay 32 bits). ây
ng chính là cu trúc a ch cho mt chng trình giao tip vi nhau
qua ng Internet.
Trên quan im a lp trình ng ng, cho dù socket có nh a
ch theo vùng nào i chng na mt khi ã m c socket, n ch cn
xem socket nh mt tp tin và thc hin thao tác read/write trên ó(
ng ng vi send và receive trên Winsock a Microsoft).
Chng 4: Lp trình socket
51
4.3.4. t tên cho socket
Sau khi ã nh a ch, n ch cn t tên cho socket. i vi
AF_UNIX c ch chính là ng dn, còn tên chính là tên tp tin to
socket. i vi vùng giao thc AF_INET a ch chính là s IP còn tên
chính là s hiu cng (sin_port) trong cu trúc sockaddr_in. Khi ã gán
thông tin y cho socket n cn i hàm bind() rabgd buc nhng
thông tin này cho socket ã m ra trc ó.
#include <sys/socket.h>
int byte (int socket, const struct sockaddr *address, size_t address_len);
Hàm h thng bind() s dng các thông tin trong cu trúc address
gán cho socket s nh danh socketd tr v bi hàm socket() trc ó.
Tham s address_len cho bit chièu dài a cu trúc (struct sockaddr*)
truyn vào hàm. n lu ý sockaddr là cu trúc tng quát cho
sockaddr_un và sockaddr_in
Khi ràng buc thành công bind() tr v tr 0. Nu không hàm tr v
-1 và errno cha mt trong các li sau:
Mã li Mô
EBADF S mô file không hp l
ENOTSOCK S mô file không dành cho socket
EINVAL S mô file tham chiu n mt socket ã có.
EADDRNOTAVAIL a ch không xác nh
EADDRINUSE a ch và cng ràng buc ã b mt socket khác
chim ng
ng 4-2 Các mã li a hàm bind()
Chng 4: Lp trình socket
52
Nu n m socket thuc vùng AF_UNIX errno có th nhn thêm
các li sau:
Mã li Mô
EACCESS Không th to file cho socket do không có
quyn o file
ENOTDIR,
ENAMETOOLONG
Tên file không hp l
ng 4-3 Các mã li a domain AF_UNIX
Ràng buc tên socket là bc quan trng nht socket a n có
kh ng nhìn thy và truy xut c t các ng ng bên ngoài.
Mt socket nu cha c t tên i là socket vô danh ( unnamed
socket).
4.3.5. o hàng i cho socket
ón nhn các kt ni chuyn n, socket trình ch phi o ra
mt hàng i (queue). c ích a hành i là u i các kt ni cha
c trình ch x lý kp. Hàm h thng listen() thc hin công vic
này.
#include <sys/socket.h>
int listen(int socketd, int backlog);
Tham s socketd cho bit s mô socket cn o hàng i. backlog
là s kt ni ti a c phép a vào hàng i. Nu mt kt ni n
trình ch trong khi ã có backlog kt ni trc ó cha x lý thì kt ni
này b tht i. Lý do hàng i ã y, trình ch server không mun
nhn thêm kt ni na. Thông thng backlog mang giá tr 5 là s trung
bình kh thi nht.
Chng 4: Lp trình socket
53
Hàm listen() tr v 0 nu o hàng i thành công, nu tht i tr
tr v s là -1 và bin errno cha tr EBADF, EINVAL, hoc
ENOTSOCK.
4.3.6. Ch và chp nhn kt ni
Mt khi ã to c socket, t tên cho nó và chun xong hàng
i tip nhn kt ni, công vic sau cùng là ch kt ni a trình
khách gi n. n i hàm accept() thc hin công vic này.
#include <sys/socket.h>
int accept(int socketd, struct sockaddr *address, size_t
*address_len);
Hàm h thng accept() tr v khi có mt trình khách mun kt
ni vi cm socket ch nh s mô socketd. Kt ni a trình khách
trc ht c t vào hàng i. Khi accept() phát hin ra có socket
trong hàng i, nó s t ng ly a ch ca máy khách t vào cu trúc
address, chiu dài tht s ca cu trúc a ch tr v trong bin
address_len. Tip n accept() o ra mt socket vô danh. Kt qu tr v
a accept() là s mô cho socket vô danh, n có th s dng s này
liên c vi trình khách. Socket vô danh mi này có cùng kiu vi
socket t tên ang lng nghe trên hàng i.
Do cu trúc struct sockaddr không có nh cho nên n cn thit lp
kích thc va tip nhn a ch trình khách. Nu a ch trình
khách dài hn không gian n dành cho cu trúc sockaddr, phn d ra
ct .
Chng 4: Lp trình socket
54
Nu cha có kt ni nào trong hàng i, accept() dng i ch –
block( trình ch s không thc thi các lnh k tip) cho n khi có kt
ni a client gi n. Bàn có th thay i c ch ch này bng cách i
hàm fcntl() iu chnh và thêm vào c O_NONBLOCK cho socket nh
sau:
int flags=fcntl(socketd, F_GETFL, 0);
fcntl(socketd, F_SETFL, O_NONBLOCK | flags);
Sau khi t c này cho socket, hàm accept() không dng i ch
khi n i nó. accept() tr v ngay s mô cho socket nu có kt ni
trong hàng i, nu không nó s tr v -1 và thc thi dòng lnh k tip.
4.3.7. Yêu cu kt ni
Trình ch ca n thng thc hin chac nng o, t tên, ch kt
ni bnh các hàm socket(), bind(), và accept(). Tuy nhiên phía trình
khách n gin hn, n ch cn i hàm connect() yêu cu kt ni
vi trình ch. connect() c khai báo nh sau:
#include <sys/socket.h>
int connnect(int socketd, const struct sockaddr *address,
size_t address_len);
Tham s socketd là s mô tr v bi hàm socket(). address là cu
trúc a ch tr n socket a trình ch. address_len là chiu dài a
bin cu trúc address. Kt qu tr v ca hàm là 0 nu thành công và
ngc i là -1. Trong trng hp -1, bin errno cha mt trong nhng
tr sau:
Chng 4: Lp trình socket
55
Mã li Mô
EBADF S mô socket truyn cho hàm không hp l
EALREADY Kêt ni ã c thit lp trc ó
ETIMEOUT Quá thi gian ch kt ni
ECONNREFUSED Trình ch server t chi kt ni
ng 4-4 Mã li a hàm connect()
Nu kt ni không thành công hàm connect() có gng ch kt ni
i. Nu sau mt s ln kt ni không thành công connect() tr v li
ETIMEOUT.
ng t accept() n có th i ch ch ca hàm connect()
bng cách i fcntl() t i c ENONBLOCK. Bng cách này, khi kt
ni không thành công ln u tiên, hàm connect() không ch lp
i kt ni. Hàm kt thúc và tr v mã li ngay lp tc.
4.3.8. óng kt ni
ng t nh x lý trên file. n có trách nhim óng các kt ni
ã to ra bng cách g hàm close(). óng kt nói gii phóng tài
nguyên và bo m d liu ã chuyn i hoàn tt c hai u gi và
nhn.
#include <sys/socket.h>
int close(int sockd);
i vi hai phía trình khách và trình ch, n nên i close()
óng socket khi lnh read tr v tr 0 (không còn d liu c).
Chng 4: Lp trình socket
56
Thng thì close() tr v ngay tc khc, tuy nhiên có th close() i
vào trng thái ch (block) nu scoket a n thit lp kiu kt ni hai
chiu (SOCK_STREAM) cùng vi tùy chn SOCK_LINGER và d liu
ang trnh thái cha chuyn ht. Tùy chn SOCK_LINER c
cp sau.
4.3.9. Giao tip bng socket
Chúng ta va xem qua các hàm h thng dùng o và x lý socket,
gi ây ta có th tr li nhng ví d v s dng socket th n.
Nhã nêu, n nên s dng socket theo vùng AF_INET thay cho
AF_UNIX. Socket da trên h thng file thng gp phi mt s vn
nh chúng ch c truy xut trên h thng file ch nh a
UNIX/Linux. Vic phân quyn cho phép c ghi file ng là mt vn .
Thng file socket o ra trong th c hin hành hoc th c m
/tmp và bn phi cho phép hu nh toàn quyn truy cp các th c này
socket hot ng. Vi AF_INET thì vn này không phát sinh,
AF_INET da vào cng và a ch IP kt ni. ng ng a n trên
Linux s dng AF_INET d chuyn i sang Windows hn là
AF_UNIX.
Trong AF_INET, khi o mi mt socket trên trình ch, n phi
chn mt s hiu cng t cho socket. Vic chn s hiu cng phi loi
tr nhng cng ã c các ng ng khác s dng. n có th tham
kho tp tin /etc/services, ây là tp tin vn n lit kê danh sách các
ch và cng ã c dành s dng, s cng a n không nên
trùng vi nhng s ã có trong danh sách này. Ban ng không th s
ng các cng nh n 1024, chúng dành cho các ch ca h thng.
Giao tip ng không òi i phi kt ni vi mt h thng ng
tht s. Ngay trên mt máy, n có th s dng giao tip ng liên
Chng 4: Lp trình socket
57
c gia các tin trình ang chy. Nu cn s a ch IP, n có th s
ng s 127.0.0.1, ây là a ch IP “hi qui” (loop back) thng dùng
cho các ng ng c b. Vi a ch này, d liu gi i quay v úng
a ch ban u, có ngha là máy gi và máy nhn c xem là mt. Do
tính cht c bit này, nu trình khách trên máy c b gi d liu n
trình ch theo IP 127.0.0.1 thì trình ch cng trên máy này nhn c
d liu và hi âm i. Nu máy n hòa ng, n nên i ngi qun tr
ng xin mt a ch IP thích hp.
a ch mng IP thng khó nh, n có th yêu cu socket tip
nhn mt tên gi nh khách thay cho s IP. Chng n localhost hay
my.computer.home thay cho 127.0.0.1. Tp tin vn n /etc/hosts cha
các danh sách chuyn i này. Ví d, n có th dùng trình son tho vi
hay gnotepad sa ni dung tp tin này nh sau:
127.0.0.1 localhost
127.0.0.1 my.computer.home
207.46.131.91 www.microsoft.com
Nh n thy, mt a ch IP có th ánh bng nhiu tên khác
nhau (a ch IP và tên thng cách nhau bng khong trng hay tab).
Thng a ch IP 127.0.0.1 c i là localhost và không có gì tr
ngi nu n d nh t cho nó mt cái tên khác chng n nh
my.computer.home. Các a ch Web mà bn thng thy nh
www.yahoo.com
hay www.microsoft.com là các a ch toàn cu c
qun lý bi t chc quc t InterNIC. bit mt tên i ng vi mt
a ch IP có tn i hay không, n có th gi lnh ping nh sau:
Chng 4: Lp trình socket
58
$ ping localhost
PING (127.0.0.1) from 127.0.0.1 : 56 (84) bytes of data.
64 bytes from (127.0.0.1) : icmp_seq=0 ttl=255 time=67 usec
64 bytes from (127.0.0.1) : icmp_seq=0 ttl=255 time=48 usec
64 bytes from (127.0.0.1) : icmp_seq=0 ttl=255 time=51 usec
4.4. S dng socket trong ng ng minh a
Phn lp trình socket này c s dng thc hin vic trao i
thông tin gia thành phn client và server trong phn ng ng minh
a.
th thành phn client dùng socket kt ni n thành phn
server. Sau khi kt ni thành công client gi các lnh nh Start
Capture, Stop Capture, Get Filter n server, server nhn các lnh này,
thc hin xong nó s tr li kt qu thc hin là thành công hay tht i
cho client.
Phn 3: Xây dng ng dng th nghim PacketCap
59
PHN 3: XÂY DNG NG NG TH NGHIM PACKETCAP
Chng 5. Phân tích và thit k PacketCap
Chng 6. Cài t và th nghim
Chng 7. Tng kt
Chng 5: Phân tích và thit k PacketCap
60
Chng 5: Phân tích và thit k PacketCap
5.1. Kho sát hin tng
Hin nay có rt nhiu phm mm bt gói tin nh Tcpdump, Microsoft
Network Monitor, Ethereal Trong ó phn mm ngun m Ethereal ni bt
vi nhiu u im nh chy trên nhiu h iu hành, h tr bt gói tin theo
nhiu giao thc khác nhau
Các phn mm này có hn ch chung là khi chúng ang bt các gói tin
thì chúng ta không th c, phân tích các thông tin bt c, hay nói cách
khác khi kt thúc quá trình bt các gói tin ri thì mi phân tích các thông tin
này c.
Nhng phn mm này không h tr vic ghi kt qu vào c s d liu,
mà ch u vào các file có cu trúc theo nh ng riêng a chúng. Nu file
này có kích thc ln thì vic tìm kim, x lý các thông tin phân tích rt
chm.
Nhng phn mm này ch chy trên môi trng desktop là ch yu do ó
không cho phép cu hình t xa (ví d: u chnh b lc , thit lp ng dn
u tr trên mng ….t xa. Hin nay các phn mm này ang c phát trin
sang mô hình client/server).
Trong khi ó thì nhu cu ngi qun tr mng rt a dng:
• n có thông tin v lu lng mng u chnh bng
thông theo yêu cu ca khách hàng cng nh phát hin
trc các s c nu c.
• Theo dõi hành ng truy cp và xâm nhp mng bt hp
pháp.
• t c hành ng trên nên là online (phân tích và u
khin) nu c.