Mạng máy tính hay hệ thống mạng (tiếng Anh: computer network hay network system), Được thiết lập khi có từ 2 máy vi tính trở lên kết nối với nhau để chia sẻ tài nguyên: máy in, máy fax, tệp tin, dữ liệu
Một máy tính được gọi là tự hoạt (autonomous) nếu nó có thể khởi động, vận hành các phần mềm đã cài đặt và tắt máy mà không cần phải có sự điều khiển hay chi phối bởi một máy tính khác.
Các thành phần của mạng có thể bao gồm:
Các hệ thống đầu cuối (end system) kết nối với nhau tạo thành mạng, có thể là các máy tính hoặc các thiết bị khác. Nói chung hiện nay ngày càng nhiều các loại thiết bị có khả năng kết nối vào mạng máy tính như điện thoại di động, PDA, tivi, .Môi trường truyền (media) mà các thao tác truyền thông được thực hiện qua đó. Môi trường truyền có thể là các loại dây dẫn (dây cáp), sóng điện từ (đối với các mạng không dây).Giao thức truyền thông (protocol) là các quy tắc quy định cách trao đổi dữ liệu giữa các thực thể.
100 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 1971 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Kiến thức mạng căn bản, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
nh÷ng thñ tôc gi¶i quyÕt tõng sù kiÖn, mét giao diÖn (Application Program Interface) lËp tr×nh lµ cÇn thiÕt ®Ó cung cÊp cho ngêi lËp tr×nh mét c¸ch tiÕp cËn ®¬n gi¶n, dÔ hiÓu h¬n.
TiÕn tr×nh øng dông
Th viÖn
Giao diÖn víi nh©n hÖ ®iÒu hµnh
Giao diÖn víi phÇn cøng
PhÇn cøng
UNIX cung cÊp cho ngêi lËp tr×nh hai giao diÖn chÝnh cho lËp tr×nh C:
Sockets lÇn ®Çu tiªn xuÊt hiÖn trong b¶n BSD UNIX n¨m 1982 vµ nhanh chãng ph¸t triÓn réng r·i trong mét kho¶ng thêi gian ng¾n. §îc ph¸t triÓn thªm vµo n¨m 1990 ®Ó hç trî giao thøc ISO. Socket ®îc g¾n víi kh¶ n¨ng truyÒn th«ng dÔ dµng gi÷a c¸c tiÕn tr×nh c¶ trªn m¹ng vµ trªn mét m¸y tÝnh. Môc tiªu cña nã lµ che dÊu cµng nhiÒu cµng tèt nh÷ng g× x¶y ra ë tÇng truyÒn th«ng phÝa díi.
TLI (Transport Layer Interface) Ph¸t triÓn ®Çu tiªn cho UNIX System V 3.0 cã nh÷ng hµm vµ thñ tôc t¬ng ®¬ng víi Socket nhng m« h×nh phøc t¹p h¬n ®Ó ®¹t ®îc tÝnh mÒm dÎo h¬n.
Network I/O vµ file I/O
HÖ ®iÒu hµnh UNIX, cã 6 lêi gäi hÖ thèng vµo ra file ®ã lµ:
open: Më file.
creat: T¹o file.
close: §ãng file.
read: §äc tõ file.
write: Ghi file.
lseek: ChuyÓn con trá file.
Vµ UNIX coi mçi thiÕt bÞ ®Òu nh mét file, cã thÓ ®îc truy cËp nh mét file.
Tuy nhiªn viÖc vµo ra trªn m¹ng víi giao diÖn lËp tr×nh øng dông phøc t¹p h¬n v×:
M« h×nh Client-Server lµ kh«ng ®èi xøng, ta ph¶i x¸c ®Þnh ch¬ng tr×nh nµo ®ãng vai trß Client, ch¬ng tr×nh nµo ®ãng vai trß Server.
Mét ®èi tho¹i trªn m¹ng cã thÓ lµ híng kÕt nèi hoÆc kh«ng kÕt nèi.
Mét tiÕn tr×nh con cã thÓ sö dông file descriptor cña ch¬ng tr×nh cha truyÒn cho ®Ó lµm viÖc víi file mµ kh«ng cÇn biÕt ®Õn tªn file thùc sù. C¸c øng dông trªn m¹ng cÇn biÕt ®îc ®Çu kia cña kÕt nèi ®Ó ch¾c ch¾n r»ng nã ®îc phÐp ®ßi hái dÞch vô.
Trong phÇn nãi vÒ giao thøc TCP/IP chóng ta ®· biÕt ®Ó thiÕt lËp kÕt nèi cÇn nhiÒu tham sè h¬n ®èi víi file I/O, ®ã lµ giao thøc (protocol), ®Þa chØ IP ®Ých (Destination IP Address), ®Þa chØ IP nguån (Source IP Address), sè hiÖu cæng ®Ých (Destination port number), sè hiÖu cæng nguån (Source port number).
Giao diÖn m¹ng ph¶i hç trî nhiÒu giao thøc truyÒn th«ng vÝ dô c¸c chuÈn cña tÇng cao víi tÇng thÊp h¬n.
Lµm viÖc víi Socket
Nh ®· giíi thiÖu ë trªn, Socket ®îc g¾n víi kh¶ n¨ng truyÒn th«ng dÔ dµng gi÷a c¸c tiÕn tr×nh c¶ trªn m¹ng vµ trªn mét m¸y tÝnh. Vµ nã lµ che dÊu cµng nhiÒu cµng tèt nh÷ng g× x¶y ra ë tÇng truyÒn th«ng phÝa díi. Chóng ta sÏ lùa chän Socket ®Ó ph¸t triÓn øng dông cña m×nh trªn m¹ng dùa trªn m« h×nh Client-Server.
Application
Socket Library
User
Kernel
Stream Head
SHOCKMOD
Transport Provider
TPI
Socket
Nãi chung c¬ chÕ socket t¬ng tù víi c¬ chÕ truy nhËp tÖp trong UNIX. Khi cÇn thiÕt tiÕn tr×nh cã thÓ t¹o ra mét socket, hÖ thèng tr¶ l¹i kÕt qu¶ lµ mét socket descriptor. Sù kh¸c biÖt gi÷a file descriptor vµ socket descriptor ë chç file descriptor ®îc g¾n liÒn víi mét tÖp hay thiÕt bÞ cè ®Þnh cßn socket descriptor kh«ng bÞ g¾n víi mét ®Þa chØ nµo. Ch¬ng tr×nh cã thÓ cung cÊp ®Þa chØ t¹i mçi lÇn truy nhËp tíi socket hay còng cã thÓ g¾n socket descriptor víi mét ®Þa chØ nhÊt ®Þnh. Do nã t¬ng thÝch víi c¬ chÕ truy nhËp tÖp, nªn vÉn cã thÓ dïng c¸c lÖnh th«ng dông nh read, write ®èi víi socket.
Mét Socket ®îc dïng nh mét endpoint. Mçi Socket g¾n víi mét nhãm
SHOCK_STREAM sö dông cho dÞch vô híng kÕt nèi .
SHOCK_DGRAM sö dông cho dÞch vô kh«ng kÕt nèi.
SHOCK_RAW cung cÊp truy cËp trùc tiÕp vµo giao thøc ®Ó x©y dùng c«ng cô qu¶n trÞ ë møc user.
SHOCK_SEQPACKET Gièng nh SHOCK_STREAM nhng cung cÊp biªn giíi c¸c mesage.
SHOCK_RDM Cung cÊp dÞch vô kh«ng kÕt nèi ®¬n gi¶n.
§Þa chØ Socket
Cã hai lo¹i ®Þa chØ ®îc g¸n víi mét socket: §Þa chØ local vµ ®Þa chØ TCP/IP. §Þa chØ nµy ®îc khai b¸o lµ nh÷ng b¶n ghi vµ ®îc dïng lµm tham sè cho nh÷ng lÖnh hÖ thèng vµ thñ tôc truy nhËp socket. §Þa chØ local lµ ®Þa chØ ®Ó x¸c ®Þnh socket trong néi bé m¸y.
CÊu tróc ®Þa chØ côc bé ®îc m« t¶ nh sau
Address family
Address bytes 0-1
Address bytes 2-5
Address bytes 6-9
Address bytes 10-13
struct sock_addr
{
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes address */
};
Trêng address family sÏ quyÕt ®Þnh cÊu tróc ®Þa chØ cña trêng Address bytes phÝa sau v× socket hç trî cho nhiÒu giao thøc kh¸c nhau nªn øng víi mçi giao thøc trêng ®Þa chØ sÏ cã cÊu tróc kh¸c nhau.
Protocol family
Description
PF_UNSPEC
Unspecified family
PF_UNIX
UNIX domain
PF_INET
Internet protocols
PF_IMPLINK
Arpanet IMP address
PF_PUP
Old Xerox protocols
PF_CHAOS
M.I.T. CHAOS protocols
PF_NS
Xerox Network system protocols
PF_NBS
NBS protocols
PF_ECMA
European Computer Manual
PF_DATAKIT
DATAKIT protocols
PF_CCITT
CCITT protocols
PF_SNA
IBM System Network Architeture
PF_DECnet
DECnet protocols
PF_DLI
DEC direct data link interface
PF_LAT
LAN terminal interface
PF_HYLINK
NSC Hyperchannel
PF_APPLETALK
Apple Talk protocols
PF_NIT
Network interface tap
PF_802
IEEE 802.2
PF_OSI
OSI protocols
PF_X25
CCITT X.25
PF_OSINET
OSI protocols
PF_GOSIP
U.S.government OSI protocols
Protocol Families
§Þa chØ TCP/IP ®îc khai b¸o víi tªn sockaddr_in. Nã chøa sè hiÖu port vµ ®Þa chØ IP 32-bit.
Address family
Protocol port
IP Address
Unused (0)
Unused (0)
struct in_addr /* 32-bit IP Addresss */
{
u_long s_addr; /* network byte order */
};
struct sockaddr_in
{
short sin_family; /* = AF_INET */
u_short sin_port; /* 16-bit port number */
struct in_addr sin_addr; /* 32-bit IP Addresss */
char sa_zero[14]; /*unused*/
};
Mét sè lêi gäi t¹o lËp socket
Lêi gäi socket():
Muèn lµm viÖc víi socket th× viÖc ®Çu tiªn lµ ph¶i t¹o socket ®ã. §Ó lµm viÖc ®ã cÇn gäi lÖnh socket() víi c¸c tham sè cÇn thiÕt. Hµm tr¶ l¹i mét socket descriptor nÕu thµnh c«ng, -1 nÕu cã lçi.
int socket (int family, int type, int protcol)
Tham sè family x¸c ®Þnh hä giao thøc ®îc sö dông víi socket nh ®· nãi ®Õn ë trÖn.
AF_UNIX Giao thøc néi bé UNIX
AF_INER Giao thøc Internet(TCP/IP)
AF_NS Giao thøc Xeror NS
AF_IMPLINK Giao thøc líp IMP
Tham sè type x¸c ®Þnh kiÓu cña liªn kÕt. Nh÷ng kiÓu cã thÓ sö dông lµ d¹ng stream cã ®é tin cËy cao (SOCK_STREAM), d¹ng datagram (SOCK_DGRAM) hay d¹ng th« (SOCK_RAW) cho phÐp truy nhËp tíi møc thÊp cña m¹ng.
VÝ dô:
AF_UNIX
AF_INET
AF_NS
SOCK_STREAM
Cã
TCP
Cã
SOCK_DGRAM
Cã
UDP
Cã
SOCK_RAW
IP
Cã
Do ®ã tham sè thø ba x¸c ®Þnh chÝnh x¸c giao thøc nµo ®îc sö dông cho socket. Tuy vËy trong rÊt nhiÒu øng dông tham sè nµy kh«ng ®îc sö dông.
Lêi gäi bind()
Khi míi ®îc t¹o ra, socket kh«ng ®îc g¾n víi bÊt cø ®Þa chØ nµo. Nãi riªng víi TCP/IP lµ nã cha ®îc g¸n víi sè hiÖu port cña tiÕn tr×nh göi, sè hiÖu port cña tiÕn tr×nh nhËn còng nh ®Þa chØ IP. NhiÒu ch¬ng tr×nh kh«ng quan t©m ®Õn sè hiÖu port vµ ®Þa chØ cña nã, vµ dµnh cho phÇn mÒm giao thøc tù g¸n. Tuy nhiªn c¸c ch¬ng tr×nh kh¸c vÉn cÇn biÕt ®Õn ®Þa chØ cña m×nh. LÖnh bind g¸n thiÕt lËp mét ®Þa chØ local cho socket vµ ®¨ng ký nã víi hÖ thèng.
int bind(int sock, struct sockaddr * localaddr, int addrlen)
Lêi gäi bind() ®îc sö dông trong c¸c trêng hîp sau:
Ch¬ng tr×nh server ®¨ng ký mét ®Þa chØ th«ng dông víi hÖ thèng. Mäi d÷ liÖu ®Õn ®Þa chØ nµy sÏ ®îc chuyÓn cho nã.
Mét ch¬ng tr×nh client ®¨ng ký mét ®Þa chØ ®Æc biÖt.
Mét ch¬ng tr×nh client cã kiÓu kh«ng kÕt nèi (connectionless) muèn kiÓm tra xem ®Þa chØ cña nã cã hîp lÖ hay kh«ng.
Lêi gäi connect
§Ó thiÕt lËp ®îc mét liªn kÕt gi÷a client víi server, tiÕn tr×nh cÇn ph¶i gäi lÖnh connect.
int connect(int sock, struct sockaddr * seraddr, int addrlen)
Tham sè lÖnh nµy t¬ng tù ®èi víi lÖnh bind() nhng seraddr trá tíi ®Þa chØ cña server (tøc lµ ®Çu kia cña liªn kÕt).
§èi víi c¸c giao thøc cã liªn kÕt (connection-oriented), connect() sÏ t¹o lËp mét liªn kÕt thùc sù gi÷a hai m¸y. C¸c th«ng tin ®îc trao ®æi nh»m thèng nhÊt mäi tham sè liªn quan. Nã sÏ cha tho¸t ra nÕu nh cha thiÕt lËp ®îc liªn kÕt hoÆc cha nhËn ®îc th«ng b¸o lçi.
§èi víi c¸c giao thøc kh«ng liªn kÕt (connectionless) lÖnh connect() ®¬n gi¶n chØ cÊt gi÷ ®Þa chØ server (biÕn seraddr) ®Ó tiÕn tr×nh sau nµy sö dông khi trao ®æi d÷ liÖu. Víi giao thøc nµy viÖc gäi lÖnh connect() cã thÓ bá qua nhng viÖc sö dông nã sÏ t¹o ra sù thuËn tiÖn ®èi víi ngêi lËp tr×nh. Sau khi ®¨ng ký ®Þa chØ víi hÖ thèng th× sÏ kh«ng cÇn ph¶i x¸c ®Þnh l¹i ®Þa chØ mçi khi göi ®i c¸c datagram. Ngêi sö dông cã thÓ dïng c¸c lÖnh read, write, recv, send t¬ng tù nh c¸c socket cã kÕt nèi.
Ngoµi ra, connect cßn kiÓm tra xem cã thùc sù mét tiÕn tr×nh nµo nhËn th«ng tin m×nh sÏ göi hay kh«ng. NÕu ®Þa chØ göi kh«ng tån t¹i connect sÏ tr¶ l¹i lçi cho tiÕn tr×nh gäi. ViÖc nµy lµm cho tiÕn tr×nh cã thÓ xö lý lçi tèt h¬n so víi c¸c giao thøc kh«ng kÕt nèi (vÝ dô UDP). Mét datagram cã thÓ chøa mét ®Þa chØ sai vµ hoµn toµn kh«ng cã ngêi nhËn.
Lêi gäi listen()
Ta sÏ xem xÐt mét tiÕn tr×nh server, tiÕn tr×nh nµy ®Çu tiªn t¹o ra mét socket, g¾n nã víi mét port th«ng dông råi chê cho ®Õn khi cã mét yªu cÇu ®îc göi tíi. NÕu nã lµ mét liªn kÕt kÕt nèi thùc sù, hoÆc nã ph¶i xö lý qu¸ l©u ®èi víi mçi yªu cÇu, sÏ x¶y ra trêng hîp lµ mét yªu cÇu míi sÏ tíi trong khi yªu cÇu cò cha ®îc xö lý xong. §Ó tr¸nh viÖc c¸c yªu cÇu míi bÞ tõ chèi, server ph¶i khai b¸o víi phÇn mÒm cña giao thøc t¹o ra cho nã mét hµng ®îi c¸c yªu cÇu. LÖnh listen() sÏ khai b¸o hµng ®îi nµy.
int listen(int sock, int qlen)
Tham sè sock lµ socket descriptor ®îc dïng bëi server.
Tham sè qlen quyÕt ®Þnh chiÒu dµi hµng ®îi c¸c yªu cÇu. Gi¸ trÞ tèi ®a cña tham sè nµy lµ 5.
Khi hµng ®îi nµy ®· ®Çy, hÖ thèng sÏ kh«ng chÊp nhËn thªm mét yªu cÇu nµo kh¸c. Mäi yªu cÇu tíi sau ®ã sÏ bÞ huû bá. listen() chØ ¸p dông víi socket kiÓu STREAM.
Lêi gäi accept()
Sau khi tiÕn tr×nh server gäi c¸c lÖnh socket(), bind(), listen() ®Ó t¹o ra mét socket, g¾n nã víi mét port th«ng dông, x¸c ®Þnh chiÒu dµi hµng ®îi, server sÏ gäi lÖnh accept() ®Ó t¹o ra mét kÕt nèi hoµn thiÖn.
int accept(int sock, struct sockaddr * addr, int addrlen)
Tham sè addr dïng ®Ó tr¶ l¹i ®Þa chØ cña tiÕn tr×nh göi yªu cÇu (client). accept() sÏ lÊy yªu cÇu ®Çu tiªn trong hµng ®îi vµ t¹o ra mét socket míi cã cïng thuéc tÝnh víi sock. NÕu trong hµng ®îi kh«ng cã mét yªu cÇu nµo th× nã sÏ chê cho ®Õn khi cã mét yªu cÇu ®îc göi tíi. Socket sock vÉn ®îc gi÷ nguyªn do vËy server vÉn tiÕp tôc chÊp nhËn c¸c yªu cÇu kh¸c göi tíi socket nµy.
Víi c¸ch tiÕp cËn t¬ng t¸c, server tù xö lý gi¶i quyÕt yªu cÇu sau ®ã ®ãng socket nµy l¹i vµ quay vÒ xö lý tiÕp c¸c yªu cÇu sau ®ã.
Cßn ®èi víi ph¬ng ph¸p ®ång thêi, sau khi lÖnh accept() tr¶ l¹i kÕt qu¶ server sÏ sinh ra mét tiÕn tr×nh con ®Ó gi¶i quyÕt yªu cÇu. TiÕn tr×nh con sÏ nhËn ®îc mét b¶n sao cña socket míi. Trong khi ®ã tiÕn tr×nh server sÏ lËp tøc ®ãng socket míi cña nã sau khi t¹o ra tiÕn tr×nh con vµ trë l¹i gäi accept() ®Ó nhËn mét yªu cÇu míi.
Lêi gäi close()
Khi mét tiÕn tr×nh th«i kh«ng sö dông socket th× nã gäi lÖnh close()
int close(int sock)
sock lµ socket cÇn huû bá. Khi mét tiÕn tr×nh kÕt thóc víi mäi lý do, hÖ thèng sÏ ®ãng tÊt c¶ c¸c socket cßn më. §èi víi c¸c giao thøc tin cËy, mÆc dï socket ®· bÞ ®ãng nhng kernel vÉn cè g¾ng göi ®i c¸c d÷ liÖu cßn l¹i trong hµng ®îi d÷ liÖu.
Mét sè lêi gäi göi d÷ liÖu qua socket
Cã 5 lêi gäi ®îc dïng ®Ó göi d÷ liÖu qua socket. C¸c lÖnh write, writev, send lµm viÖc víi c¸c socket ®· kÕt nèi v× chóng kh«ng cho phÐp khai b¸o ®Þa chØ ngêi nhËn.
Lêi gäi send()
Lêi gäi send cã 4 tham sè :
int send(int sock, char * buff, int len, int flag)
sock chØ ®Þnh socket ®îc sö dông,
buff trá tíi vïng d÷ liÖu ®îc göi ®i,
len x¸c ®Þnh sè byte trong buff ®îc göi ®i.
flag cho phÐp ngßi göi chän mét sè c¸ch thøc ®Ó göi d÷ liÖu vÝ dô nh göi d÷ liÖu out-of-band...
C¸c tham sè nµy kh¸c nhau ®èi víi mçi lo¹i socket. send() tr¶ l¹i m· lçi cho ch¬ng tr×nh gäi ®Ó ch¬ng tr×nh biÕt ®îc thao t¸c cã thµnh c«ng hay kh«ng.
Lêi gäi write()
Do c¸ch thøc truy nhËp tíi socket t¬ng tù truy nhËp ®Õn file nªn cã thÓ dïng lÖnh hÖ thèng write ®Ó göi d÷ liÖu qua socket.
int write(int fd, char * buff, int len)
Tham sè fd cã thÓ lµ mét socket descriptor hoÆc file descriptor.
Lêi gäi writev()
§Ó göi ®i mét danh s¸ch c¸c khèi d÷ liÖu ta dïng
int writev(int fd, struct iovec iovector[], int vectorlen)
C¸c lêi gäi sendto(), sendmsg()
§îc dïng cho c¸c socket kh«ng kÕt nèi. Hai lÖnh nµy yªu cÇu ph¶i cung cÊp ®Þa chØ ngêi nhËn.
int sendto(int sock, char * buff, int len, int flag, struct sockaddr * destaddr, int addrlen)
Bèn tham sè ®Çu gièng nh bèn tham sè cña send().
Hai tham sè sau lµ ®Þa chØ cña ngêi nhËn vµ ®é dµi cña ®Þa chØ.
Do sendto() cã qu¸ nhiÒu tham sè, lËp tr×nh viªn cã thÓ sö dông lêi gäi sendmsg()
int sendmsg(int sock, struct msghdr msg[], int flag)
Víi tham sè msg lµ mét cÊu tróc cã chøa ®Þa chØ vµ danh s¸ch nhiÒu ®o¹n d÷ liÖu cÇn göi ®i.
Mét sè lêi gäi nhËn d÷ liÖu tõ socket
T¬ng øng víi 5 lÖnh ®Ó göi d÷ liÖu cã 5 lÖnh dïng ®Ó nhËn d÷ liÖu víi tham sè vµ c¬ chÕ hoµn toµn gièng nhau.
int recv(int sock, char * buff, int len, int flag)
int read(int fd, char * buff, int len)
int readv(int fd, struct iovec iovector[], int * vectorlen)
int recvfrom(int sock, char * buff, int len, int flag, struct sockaddr * destaddr, int *addrlen)
int recvmsg(int sock, struct msghdr msg[], int flag)
M« h×nh Client-Server
Theo c¸ch nh×n cña ngêi lËp tr×nh, TCP/IP gièng nh hÇu hÕt c¸c giao thøc truyÒn th«ng kh¸c cung cÊp c¬ chÕ c¬ b¶n ®Ó truyÒn d÷ liÖu. §Æc biÖt, TCP/IP cho phÐp ngêi lËp tr×nh thiÕt lËp truyÒn th«ng gi÷a hai ch¬ng tr×nh øng dông vµ truyÒn d÷ liÖu qua l¹i. TCP/IP cung cÊp kÕt nèi b×nh ®¼ng gi÷a c¸c øng dông kÓ c¶ c¸c øng dông ch¹y trªn cïng mét m¸y.
Mét ph¸t triÓn cña m« h×nh peer-to-peer lµ m« h×nh Client-Server ®· trë thµnh m« h×nh c¬ b¶n ®îc sö dông trªn m¹ng m¸y tÝnh. Ch¬ng tr×nh Server lµ mét ch¬ng tr×nh chê ®îi kÕt nèi tõ ch¬ng tr×nh Client vµ cung cÊp dÞch vô cho Client.
M« h×nh ®îc m« t¶ nh sau:
TiÕn tr×nh Server ®îc khëi ®éng trªn mét hÖ thèng nµo ®ã sau ®ã chê ®îi mét tiÕn tr×nh Client kÕt nèi ®Õn yªu cÇu dÞch vô.
TiÕn tr×nh Client ®îc khëi ®éng trªn cïng hÖ thèng m¸y víi ch¬ng tr×nh Server hoÆc tõ mét hÖ thèng kh¸c kÕt nèi víi hÖ thèng chñ th«ng qua m¹ng. Client göi yªu cÇu qua m¹ng tíi tiÕn tr×nh Server ®ßi hái mét sè dÞch vô nh:
Tr¶ l¹i ngµy giê cho Client
In mét file cho Client
§äc hoÆc ghi file vµo hÖ thèng file cña Server
Cho phÐp Client login vµo hÖ thèng Server
Ch¹y ch¬ng tr×nh cña Client trªn hÖ thèng Server
Sau khi cung cÊp dÞch vô cho Client, Server tiÕp tôc nghØ vµ chê ®îi kÕt nèi kh¸c.
Chóng ta cã thÓ chia tiÕn tr×nh Server lµm 2 kiÓu:
T¬ng t¸c (Interative Server): Khi Client ®ßi hái nh÷ng dÞch vô ®· ®¨ng ký tríc víi kho¶ng thêi gian thùc hiÖn nhá, Server tù lµm c«ng viÖc ®ã vÝ dô dÞch vô tr¶ l¹i ngµy giê.
§ång thêi (Concurrent Server): Víi nh÷ng yªu cÇu ®ßi hái thêi gian thùc hiÖn lín, tiÕn tr×nh Server sinh mét tiÕn tr×nh con ®Ó thùc hiÖn yªu cÇu cßn nã tiÕp tôc chê ®îi yªu cÇu kh¸c. DÞch vô in file, ®äc-ghi file ®îc thùc hiÖn theo kiÓu nµy.
M« h×nh Client-Server sö dông dÞch vô kh«ng kÕt nèi
Víi m« h×nh kh«ng kÕt nèi, client kh«ng kÕt nèi víi server mµ chØ göi d÷ liÖu ®Õn sö dông lêi gäi sento(), ngîc l¹i, server sö dông lêi gäi recvfrom() chê ®îi d÷ liÖu tõ client chuyÓn ®Õn. Lêi gäi recvfrom() tr¶ l¹i ®Þa chØ cña client, nhê ®ã server cã thÓ göi kÕt qu¶ l¹i cho client.
recvfrom()
recvfrom()
bind()
bind()
socket()
sendto()
Server
(connectionless protocol)
block until data received from client
process request
sendto()
socket()
Client
data (reply)
data (request)
Lêi gäi socket cho m« h×nh client-server kh«ng kÕt nèi
M« h×nh Client-Server sö dông dÞch vô híng kÕt nèi
Víi m« h×nh Client-Server sö dông dÞch vô híng kÕt nèi, ®Çu tiªn Server ®îc khëi ®éng vµ chê ®îi mét kÕt nèi tõ client.
Sau khi kÕt nèi ®îc thiÕt lËp, hai bªn lu©n phiªn nhau göi nhËn d÷ liÖu th«ng qua ®êng truyÒn.
accept()
listen()
bind()
socket()
write()
write()
Server
(connection-oriented protocol)
Connect()
read()
read()
socket()
block until connection from client
Process request
Connection establishment
data (reply)
data (request)
Client
Lêi gäi socket cho m« h×nh client-server híng kÕt nèi
X©y dùng ch¬ng tr×nh truyÒn tÖp
ThiÕt kÕ vµ cµi ®Æt ch¬ng tr×nh
Giao thøc øng dông ®îc x©y dùng vµ sö dông trong ch¬ng tr×nh
B¶n th©n giao thøc TCP lµ mét giao thøc híng kÕt nèi vµ ®¸ng tin cËy, giao thøc nµy ®¶m b¶o d÷ liÖu truyÒn vµo socket ®Çy ®ñ, nhng ®Ó t¨ng cêng tÝnh tin cËy cña ch¬ng tr×nh øng dông vµ ®Ó kiÓm so¸t viÖc truyÒn d÷ liÖu nhÊt lµ trªn c¸c m¹ng cã ®é trÔ lín hay nh÷ng m¹ng thêng xuyªn x¶y ra hiÖn tîng qu¸ t¶i, mét giao thøc øng dông riªng ®îc x©y dùng cho ch¬ng tr×nh.
Gãi tin cña giao thøc øng dông ®îc m« t¶ nh sau:
0
1
2
D÷ liÖu tèi ®a 4094 byte
Size
Data
Size dµi 2 byte chøa ®é dµi cña phÇn d÷ liÖu cña gãi tin.
Data chøa d÷ liÖu, trêng nµy cã ®é dµi tèi ®a lµ 4094 byte v× giao thøc sö dông gãi tin dµi tèi ®a 4096 byte.
ViÖc sö dông c¸c kÕt nèi:
Ch¬ng tr×nh sö dông hai kÕt nèi, mét ®Ó truyÒn lÖnh vµ mét ®Ó truyÒn d÷ liÖu gi÷a client vµ server.
Kªnh truyÒn ®iÒu khiÓn dïng ®Ó truyÒn c¸c lÖnh vµ c¸c th«ng b¸o cã tÝnh chÊt ®iÒu khiÓn, ®iÒu nµy lµm gi¶m tÝnh phøc t¹p trong viÖc ph©n tÝch vµ xö lý c¸c lÖnh cña ch¬ng tr×nh.
Kªnh truyÒn d÷ liÖu ®îc thiÕt lËp ngay trong qu¸ tr×nh t¹o kÕt nèi gi÷a tiÕn tr×nh client vµ tiÕn tr×nh server vµ ®îc dïng ®Õn mçi khi cã d÷ liÖu cÇn truyÒn nhËn gi÷a client vµ server. C¸c khèi d÷ liÖu cã thÓ ®îc chia nhá thµnh c¸c gãi tin vµ truyÒn trªn kªnh d÷ liÖu, kÕt thóc mét khèi d÷ liÖu lµ mét gãi tin cã ®é dµi b»ng 0.
ViÖc sö dông hai kªnh truyÒn
Cã 3 lo¹i lÖnh trong ch¬ng tr×nh sö dông c¸c kªnh truyÒn nh sau:
Client göi lÖnh ®Õn server vµ nhËn vÒ mét th«ng b¸o trªn kªnh ®iÒu khiÓn vÝ dô th«ng b¸o lçi hoÆc hoµn thµnh lÖnh.
Server
Client
Göi lÖnh
NhËn lÖnh vµ thi hµnh
NhËn th«ng b¸o
Göi th«ng b¸o hoµn thµnh lÖnh hoÆc b¸o lçi
Client göi lÖnh ®Õn server vµ nhËn vÒ mét th«ng b¸o cã d÷ liÖu truyÒn “Openning data port”. Khi ®ã, client b¾t ®Çu nhËn d÷ liÖu trªn kªnh d÷ liÖu cho tíi khi nhËn ®îc mét gãi tin cã ®é dµi lµ 0.
Server
Client
Göi lÖnh
NhËn lÖnh vµ thi hµnh
NhËn th«ng b¸o
NhËn d÷ liÖu ë kªnh d÷ liÖu tíi khi gãi tin cã ®é dµi lµ 0
Göi th«ng b¸o cã d÷ liÖu cÇn truyÒn
Göi lÇn lît c¸c gãi tin kÕt thóc bëi mét gãi cã ®é dµi lµ 0
Client göi lÖnh yªu cÇu truyÒn tÖp lªn server, server göi l¹i th«ng b¸o chÊp nhËn. Client ghi d÷ liÖu cÇn truyÒn vµo kªnh d÷ liÖu, sau khi ghi xong, client chê ®îi mét th«ng b¸o cña server trªn kªnh ®iÒu khiÓn truyÒn l¹i sè lîng byte ®· nhËn vµ th«ng b¸o trªn mµn h×nh cña ngêi sö dông. Qu¸ tr×nh truyÒn nhËn th«ng tin trªn kªnh d÷ liÖu còng cã thÓ ®îc ®iÒu khiÓn trùc tiÕp trªn kªnh ®iÒu khiÓn vÝ dô dõng truyÒn.
Server
Client
Göi yªu cÇu truyÒn d÷ liÖu
NhËn lÖnh
NhËn vµ th«ng b¸o víi ngêi sö dông sè byte truyÒn
NhËn d÷ liÖu ë kªnh d÷ liÖu tíi khi gãi tin cã ®é dµi lµ 0
Göi th«ng b¸o chÊp nhËn
Th«ng b¸o sè byte ®· nhËn
Göi lÇn lît c¸c gãi tin kÕt thóc bëi mét gãi cã ®é dµi lµ 0
Cµi ®Æt ch¬ng tr×nh
Ch¬ng tr×nh truyÒn tÖp ®îc x©y dùng dùa trªn m« h×nh client-server sö dông th viÖn socket, giao thøc líp díi lµ giao thøc híng kÕt nèi TCP. TiÕn tr×nh server ho¹t ®éng theo kiÓu ®ång thêi (concurrent), server “nghe” ë cæng 1998, khi cã mét tiÕn tr×nh client kÕt nèi ®Õn, server nhËn sè hiÖu cæng cña client, sinh tiÕn tr×nh con ®Ó phôc vô cßn b¶n th©n tiÕn tr×nh cha tiÕp tôc quay l¹i nghe. TiÕn tr×nh server phôc vô t¹o mét kÕt nèi lÖnh ®Ó truyÒn lÖnh vµ mét kÕt nèi d÷ liÖu ®Ó truyÒn c¸c khèi d÷ liÖu gi÷a client vµ server.
PhÇn server ch¹y trªn c¸c m¸y chñ Unix, Windows NT phôc vô cho phÇn client ch¹y trªn c¸c m¸y Dos, Windows vµ Unix. Ch¬ng tr×nh ho¹t ®éng gÇn gièng FTP nhng cã mét sè tÝnh n¨ng n©ng cao:
Thùc hiÖn lÖnh tõ xa víi EXEC: Ch¬ng tr×nh server nhËn lÖnh göi tíi tõ client, thùc hiÖn lÖnh ®ã vµ göi tr¶ kÕt qu¶ vµo kªnh truyÒn, ch¬ng tr×nh client ®äc vµ hiÓn thÞ kÕt qu¶ ®ã trªn mµn h×nh cña ngêi sö dông.
Thùc hiÖn lÖnh cña hÖ ®iªu hµnh trªn m¸y tr¹m !CMD: Mét sè lÖnh cña hÖ ®iÒu hµnh cã thÓ ®îc thùc hiÖn trªn m¸y tr¹m, chóng ®îc tiÕn tr×nh client gi¶i quyÕt b»ng c¸ch gäi ch¬ng tr×nh th«ng dÞch cña hÖ ®iÒu hµnh.
Kh¶ n¨ng thay ®æi kÝch thíc bé ®Öm víi BUFSIZ kÝch thíc cña bé ®Öm cã thÓ ®îc thay ®æi b»ng c¸ch thay ®æi biÕn m«i trêng chøa kÝch thíc bé ®Öm. ViÖc nµy lµm t¨ng n¨ng suÊt cña viÖc truyÒn th«ng tin trªn m¹ng.
Mét sè thao t¸c víi th môc trªn m¸y chñ nh t¹o th môc, xo¸ th môc ®îc thùc hiÖn b»ng c¸ch gäi c¸c lÖnh cña hÖ ®iÒu hµnh Unix hoÆc nh÷ng hµm møc thÊp trong th viÖn cña C.
Ch¬ng tr×nh cßn cung cÊp mét sè lÖnh lµm viÖc trùc tiÕp víi tÖp nh OPEN, LSEEK, READ, WRITE... nh÷ng lÖnh nµy sö dông th nh÷ng lêi gäi møc thÊp cña hÖ thèng.
Sau ®©y lµ nh÷ng lÖnh ®· cµi ®Æt trªn server
LÖnh
M« t¶
EXEC command [option]
Ch¹y mét lÖnh Unix
USER username [PASS password]
§¨ng nhËp hÖ thèng
PASSWD password
NhËp password
CHPWD newpassword
§æi password
PORT portnumber
§¨ng ký mét cæng truyÒn d÷ liÖu
ABORT
Lo¹i bá qu¸ tr×nh truyÒn
PWD
LÖnh ®æi th môc
LIST [option] [directory]
LÖnh xem th môc
CHDIR [directory]
LÖnh ®æi th môc
MKDIR directory [mode]
T¹o th môc míi
RMDIR directory
Xo¸ th môc
UNLINK filename
Xo¸ tÖp
OPEN path openflag [mode]
Më tÖp
LSEEK fildes offset whence
ChuyÓn con trá tÖp
READ fildes nbytes
§äc tõ tÖp
WRITE fildes nbytes
Ghi tÖp
LOCKF fildes mode size
Kho¸ tÖp
CLOSE filedes
§ãng tÖp
TMPNAM [path[prefix]]
T¹o mét tÖp t¹m thêi
PUT filename
TruyÒn tÖp lªn m¸y chñ
APPEND filename
Më tÖp ®Ó append
GET filename
LÊy tÖp tõ m¸y chñ
HELP
Trî gióp
UNIX
Ho¹t ®éng ë mode Unix
TNET
Ho¹t ®éng ë mode Tnet
QUIT
Tho¸t
UMASK [mode]
§Æt mÆt n¹ mode cho file truyÒn
FMODE filename
Xem mode cña file
FSIZE filename
Xem ®é dµi cña file
BUFSIZ size_of_buffer
§Æt l¹i kÝch thíc cho bé ®Öm
REXEC host user passwd command
Ch¹y mét lÖnh tõ xa
PhÇn client giao tiÕp víi ngêi sö dông, nhËn lÖnh, ph©n tÝch lÖnh, xö lý hoÆc göi cho server, nhËn vµ tr¶ kÕt qu¶ l¹i cho ngêi sö dông.
(V¨n b¶n ch¬ng tr×nh client ®îc in trong phÇn phô lôc C)
Mét sè vÊn ®Ò n¶y sinh trong qu¸ tr×nh thùc hiÖn vµ c¸ch gi¶i quyÕt
VÊn ®Ò chuyÓn ®æi tÖp gi÷a hai hÖ ®iÒu hµnh.
Do kh¸i niÖm vÒ tÖp vµ sù qu¶n lý truy nhËp ë hai hÖ ®iÒu hµnh DOS vµ UNIX cã nhiÒu ®iÓm kh¸c nhau nªn sù chuyÓn ®æi tÖp gi÷a hai hÖ ®iÒu hµnh gÆp ph¶i mét sè vÊn ®Ò.
C¸c tÖp tin trªn DOS hoµn toµn kh«ng cã c¸c th«ng tin vÒ quyÒn së h÷u hay quyÒn truy nhËp nªn th«ng tin nµy sÏ bÞ mÊt khi sao chÐp mét tÖp tõ m¸y UNIX sang mét m¸y DOS.
Ngoµi ra mét vÊn ®Ò hÕt søc quan träng vµ còng khã cã c¸ch gi¶i quyÕt tèi u lµ vÊn ®Ò tªn tÖp. Tªn tÖp trªn UNIX cã thÓ dµi tíi 14 ký tù (®èi víi UNIX System V) hoÆc h¬n n÷a, c¸c ký tù cã thÓ lµ ch÷ in hoa, ch÷ thêng hay c¸c ký tù ®Æc biÖt ®Òu ®îc chÊp nhËn. C¸c th môc trong ®êng dÉn cña UNIX ®îc ph©n c¸ch bëi dÊu '/'. Trong khi ®ã tªn tÖp cña DOS chØ ®îc phÐp dµi tèi ®a 8 ký tù céng víi 3 ký tù cña phÇn më réng vµ bÞ h¹n chÕ toµn bé lµ ch÷ in hoa kh«ng sö dông ch÷ thêng cïng víi hµng lo¹t dÊu vµ ký tù ®Æc biÖt. C¸c th môc trong ®êng dÉn ®îc ph©n c¸ch bëi dÊu '\'. Cho nªn mét ¸nh x¹ 1-1 gi÷a hai lo¹i tªn tÖp lµ kh«ng thÓ tån t¹i. NÕu cã mét hµm nµo ®ã thùc hiÖn ®îc ¸nh x¹ nµy th× sau khi chuyÓn mét tÖp tõ m¸y UNIX tíi m¸y DOS, tªn tÖp ®Ých sÏ hoµn toµn xa l¹ víi tªn tÖp nguån g©y ra khã kh¨n cho ngêi sö dông.
VÝ dô, ta muèn cã mét tiÖn Ých thùc hiÖn viÖc backup mét sè tÖp trªn m¸y UNIX sang m¸y DOS. Ta sÏ ®¬n gi¶n chuyÓn c¸c tÖp ®ã sang m¸y DOS nhng khi cÇn chuyÓn c¸c tÖp nµy vÒ vÞ trÝ cò th× ta kh«ng thÓ x¸c ®Þnh chÝnh x¸c vÞ trÝ cò cña tÖp vµ kh«ng thÓ phôc håi l¹i ®Çy ®ñ tªn cña tÖp. NÕu dïng mét hµm nµo ®ã ®Ó t¹o ra ¸nh x¹ 1-1 th× khi sao chÐp sang m¸y DOS sÏ t¹o ra nh÷ng tªn tÖp ®Æc biÖt rÊt khã cho viÖc qu¶n lý.
Víi bµi to¸n nµy UNIX cã tiÖn Ých tar gi¶i quyÕt b»ng c¸ch gom tÊt c¶ c¸c tÖp vµo thµnh mét tÖp kÌm theo th«ng tin chi tiÕt vÒ tÖp ®ã, khi cÇn, cã thÓ phôc håi l¹i tÖp mét c¸ch chÝnh x¸c. Nhng tiÖn Ých nµy kh«ng thÓ ¸p dông cho mäi bµi to¸n vÝ dô cÇn ®äc vµ xö lý tÖp díi m«i trêng DOS...
Cã mét gi¶i ph¸p t¹m thêi cho vÊn ®Ò nµy lµ ph¶i c¾t bá phÇn ®»ng sau cña tªn tÖp trªn UNIX. §©y còng chÝnh lµ gi¶i ph¸p ®èi víi tªn tÖp dµi cña Windows 95 khi c¸c tÖp nµy ®îc truy nhËp bëi DOS 6.x (hoÆc c¸c phiªn b¶n DOS tríc). Víi c¸ch lµm nµy chóng ta ph¶i chó ý tíi sù trïng tªn sau khi c¾t bá phÇn ®u«i vµ xö lý mét sè ký tù ®Æc biÖt cßn l¹i.
VÝ dô : Hai tÖp
testdata001.dat vµ testdata002.dat
Cã thÓ sÏ bÞ c¾t thµnh testdata.dat vµ hai tÖp sÏ bÞ trïng tªn nhau, mét trong hai tÖp sÏ kh«ng thÓ tån t¹i.
Mét gi¶i ph¸p t¬ng tù nh trong Windows 95 sÏ ®îc sö dông ®ã lµ chuyÓn hai tÖp trªn thµnh
testda~1.dat vµ testda~2.dat
Gi¶i ph¸p ®Æt tªn cho c¸c tÖp trªn m¸y UNIX t¬ng tù nh trªn m¸y DOS lµ mét gi¶i ph¸p tåi. Nã kh«ng tËn dông tèi ®a kh¶ n¨ng cña hÖ ®iÒu hµnh lµ tªn tÖp linh ®éng h¬n. Nhng ta nhËn thÊy r»ng ph¬ng ph¸p nµy ®«i khi còng tá ra cã hiÖu qu¶ ®èi víi c¸c øng dông ®Æc biÖt. VÝ dô : phÇn më réng 3 ký tù cña tªn tÖp ®îc dïng ®Ó x¸c ®Þnh néi dung tÖp ®îc dïng kh¸ réng r·i trªn c¶ c¸c hÖ ®iÒu hµnh cã tªn tÖp dµi nh UNIX, Windows 95...
Mét gi¶i ph¸p kh¸c lµ viÖc thay thÕ hÖ ®iÒu hµnh DOS b»ng hÖ ®iÒu hµnh Windows 95. Trong Windows 95 tªn tÖp cã thÓ dµi h¬n (tíi 255 ký tù) vµ cã thÓ chøa mét sè ký tù mµ DOS kh«ng cho phÐp nh dÊu trèng, dÊu chÊm... ViÖc chuyÓn ®æi tªn tÖp sÏ ®¬n gi¶n chØ lµ xö lý mét sè trêng hîp c¸c ký tù ®Æc biÖt. Víi sù ph¸t triÓn hiÖn nay hÖ ®iÒu hµnh DOS ®ang dÇn bÞ thay thÕ bëi Windows 95 (kh«ng chØ bëi ®Æc tÝnh tªn tÖp mµ bëi nhiÒu tÝnh n¨ng vît tréi cña Windows 95) th× viÖc thay thÕ nµy hoµn toµn thÝch hîp.
VÊn ®Ò vÒ mét sè lÖnh t¬ng t¸c
V× ch¬ng tr×nh ®îc x©y dùng víi môc ®Ých truyÒn file, c¸c giao thøc ®îc x©y dùng nh»m híng tíi sù b¶o ®¶m tÝnh toµn vÑn cho tÖp tin. ViÖc ch¹y øng dông ®îc giao cho hÖ ®iÒu hµnh, ch¬ng tr×nh chØ lµm nhiÖm vô truyÒn tham sè dßng lÖnh vµ nhËn kÕt qu¶ tr¶ vÒ. V× lý do ®ã, mét sè lÖnh t¬ng t¸c víi ngêi dïng (cÇn nhËn th«ng tin tõ bµn phÝm) kh«ng thÓ ch¹y ®îc víi lÖnh EXEC.
Tµi liÖu tham kh¶o
T¸c gi¶
Tªn s¸ch
Nhµ xuÊt b¶n
N¨m xuÊt b¶n
Douglas E.Comer
Internetworking with TCP/IP
Prentice-Hall International
1991
Andrew S.Tanenbaum
Computer Network
Prentice-Hall International
1988
W.Richard Stevens
Unix Network Programming
Prentice-Hall International
1991
Bill Rieken and
Lyle Weiman
Unix Network Application Programming
John Wiley & Sons
1992
NguyÔn Thóc H¶i
M¹ng m¸y tÝnh vµ c¸c hÖ thèng më
Nhµ xuÊt b¶n Gi¸o Dôc
1997
Mét sè tµi liÖu kü thuËt cña CSE
Phô lôc A Mét sè kü thuËt m¹ng côc bé
M¹ng Ethernet vµ IEEE 802.3
Ethernet vµ IEEE 802.3 lµ hai chuÈn phæ biÕn nhÊt trong kiÕn tróc m¹ng côc bé. Chóng sö dông c«ng nghÖ gäi lµ CSMA/CD (Carrier Sense Multiple Access/Collision Detect). Multiple Access cã nghÜa lµ mäi m¸y tÝnh vµ thiÕt bÞ m¹ng cã thÓ truy cËp ®êng truyÒn cïng mét lóc. C«ng nghÖ Carrier Sense cho phÐp c¸c thiÕt bÞ nhËn biÕt khi nµo ®êng truyÒn ®ang bËn. Tríc khi thiÕt bÞ truyÒn th«ng tin, nã kiÓm tra ®êng truyÒn, nÕu ®êng truyÒn bËn, nã ®îi mét kho¶ng thêi gian ngÉu nhiªn nµo ®ã vµ tiÕp tôc. NÕu ®êng truyÒn kh«ng bËn, nã b¾t ®Çu truyÒn d÷ liÖu cña m×nh. NÕu 2 tr¹m cïng truyÒn th«ng tin mét lóc, d÷ liÖu cã thÓ bÞ ph¸ huû (collision), Collision Detection ®iÒu khiÓn thiÕt bÞ collision controller göi tÝn hiÖu “jam signal” ®Ó b¸o cho mäi thiÕt bÞ trªn m¹ng biÕt ®iÒu g× ®ang s¶y ra. NÕu gÆp collision, thiÕt bÞ ®îi mét kho¶ng thêi gian ngÉu nhiªn nµo ®ã tÝnh theo chu kú ®ång hå cña nã vÝ dô mét sè thiÕt bÞ ®îi trong kho¶ng 1 - 255 nhÞp. NÕu gÆp collision lÇn thø hai, nã ®îi mét kho¶ng trong 1 - 511. NÕu tiÕp tôc gÆp collision, thiÕt bÞ cè g¾ng thªm 6 lÇn. Thêi gian truyÒn th«ng tin trªn m¹ng Ethernet kh«ng thÓ x¸c ®Þnh ®îc chÝnh x¸c v× kh«ng ai cã thÓ ch¾c r»ng gãi th«ng tin kh«ng bÞ collision. Do vËy, thêng ngêi ta kh«ng dïng Ethernet víi c¸c øng dông thêi gian thùc. Mét ®Æc tÝnh cña m¹ng Ethernet n÷a lµ nã kh«ng cã c¬ chÕ b¸o nhËn, khi sö dông víi TCP/IP dÞch vô nµy ®îc tÇng transport (TCP) cung cÊp.
M¹ng Token-Pasing Rings (IEEE 802.5)
Tolen-Pasing Rings còng lµ mét c«ng nghÖ m¹ng côc bé phæ biÕn, viÖc ®iÒu khiÓn lu th«ng trªn m¹ng nµy ®îc sö dông bëi mét c¬ chÕ gäi lµ thÎ bµi “token”. Token lµ mét gãi tin ®îc chuyÓn vßng quanh m¹ng, mçi thiÕt bÞ chØ ®îc quyÒn truyÒn d÷ liÖu khi nã nhËn ®îc token.
Token
WS
WS
WS
WS
Mét ®Æc tÝnh chñ yÕu cña M¹ng Token-Pasing Rings lµ nã ph¶i ®îc nèi thµnh vßng, nÕu mét nót m¹ng bÞ lçi, toµn bé m¹ng sÏ ngõng ho¹t ®éng (®èi víi m¹ng Ethernet chØ mét ngõng ho¹t ®éng khi nã bÞ lçi). NÕu mét m¸y bÞ t¾t, m¹ng M¹ng Token-Pasing Rings vÉn cÇn giao diÖn cña nã ®Ó truyÒn th«ng, Token-ring Interface board lÊy n¨ng lîng tõ c¸p m¹ng ®Ó ho¹t ®éng. Khi thÎ bµi bÞ mÊt, sau mét thêi gian nµo ®ã, mét thiÕt bÞ ®iÒu khiÓn sÏ sinh mét thÎ bµi míi.
M¹ng Token-Passing Busses (IEEE 802.4)
Token-Passing cßn lµm viÖc trªn topo bus. Mét chuÈn ®Þnh nghÜa cho m¹ng nµy lµ IEEE 802.4, lµ mét phÇn cña chuÈn MAP (Manufacturing Automation Protocol). ChuÈn nµy sö dông thiÕt bÞ Broadband kh¸c víi Baseband sö dông trong Ethernet vµ Token-ring. Baseband chØ sö dông mét tÝn hiÖu trªn ®êng truyÒn trong khi broadband sö dông nhiÒu kªnh truyÒn víi c¸c tÇn sè tÝn hiÖu kh¸c nhau trªn ®êng truyÒn.
Mét sè m¹ng Broadband sö dông hai d©y dÉn, mét ®Ó truyÒn, mét ®Ó nhËn d÷ liÖu. HÖ thèng kh¸c l¹i chØ sö dông mét d©y nhng dïng 2 tÇn sè kh¸c nhau ®Ó truyÒn vµ nhËn. Th«ng thêng tÇn sè truyªn vµ nhËn t¹o thµnh mét cÆp tÇn sè (tÝnh b»ng MHz) ®Ó dÔ chuyÓn ®æi gi÷a tÇn sè göi vµ tÇn sè nhËn. Tuy sö dông Broadband ®¾t vµ phøc t¹p nhng nã lµm viÖc rÊt tèt víi h×nh ¶nh analog vµ ©m thanh.
Broadband
Baseband
Phô lôc B Mét sè kü thuËt chän ®êng ®i tèi u
ViÖc chän con ®êng tèi u ®Ó truyÒn c¸c gãi tin ®i trªn m¹ng ph¶i thùc hiÖn mét sè c«ng viÖc sau:
QuyÕt ®Þnh chän ®êng theo nh÷ng tiªu chuÈn tèi u nµo ®ã.
CËp nhËt th«ng tin chän ®êng.
Cã mét sè kü thuËt chän ®êng tèi u thêng ®îc sö dông khi x©y dùng tÇng m¹ng
Chän ®êng tËp trung ®Æc trng bëi sù tån t¹i cña mét sè trung t©m ®iÒu khiÓn m¹ng thùc hiÖn viÖc chän ®êng sau ®ã göi c¸c b¶ng chän ®êng tíi c¸c nót m¹ng. C¸c nót m¹ng ®Òu ®Æn göi th«ng tin cña chóng tíi c¸c chung t©m theo mét kho¶ng thêi gian hoÆc khi cã mét sù kiÖn nµo ®ã.
Chän ®¬ng ph©n t¸n ®îc thùc hiÖn t¹i mçi nót cña m¹ng. ViÖc nµy ®ßi hái sù trao ®æi th«ng tin thêng xuyªn gi÷a c¸c nót.
Gi¶i thuËt Dijkstra cho viÖc chän ®êng tËp trung
Gi¶i thuËt nµy t×m con ®êng cã “®é dµi” (chi phÝ) cùc tiÓu tõ mét nót nguån tíi mçi nót cßn l¹i cña m¹ng
Gäi l(i,j) lµ “®é dµi” cña ®êng nèi trùc tiÕp 2 nót i vµ j
l(i,j) =¥ nÕu kh«ng tån t¹i ®êng nèi
Nk lµ tËp hîp t¹o thµnh bëi k+1 phÇn tö (nguån vµ k nót gÇn nguån nhÊt sau k bíc thùc hiÖn giai thuËt).
Dk lµ “®é dµi” tõ nguån tíi nót n theo con ®êng “ng¾n” nhÊt bao hµm trong Nk
ThuËt to¸n sö dông c¸c bíc ®Ö quy sau:
Bíc 0 (khëi ®éng)
N0={1}
D0(v)=l(1,v) v Ï N0
Bíc k (tÝnh vµ cËp nhËt)
Nk = Nk-1 È {w}
trong ®ã w tho¶ m·n biÓu thøc
Dk-1(w) = min Dk-1(v), v Ï Nk-1
Dk(v) = min [Dk-1(v), Dk-1(w) + l(w,v)], v Ï Nk
ThuËt to¸n dõng khi tÊt c¶ c¸c nót ®· n»m trong N
Gi¶i thuËt Ford& Fulkerson cho viÖc chän ®êng ph©n t¸n
Gi¶i thuËt nµy cho phÐp t×m tÊt c¶ c¸c con ®êng “ng¾n” nhÊt tõ tÊt c¶ c¸c nut tíi mét ®Ých chung. Sau k bíc lÆp, mçi nót ®îc ®¸nh dÊu bëi cÆp gi¸ trÞ (nk(v), Dk(v))
Dk(v) lµ “®é dµi” cùc tiÓu (hiÖn t¹i) tõ nót v tíi ®Ých
nk(v) lµ nót tiÕp theo (hiÖn t¹i) trªn con ®êng “tèi u” tõ nót v tíi ®Ých, ®îc tÝnh ë bíc k.
Bíc 0 (khëi ®éng)
D0(1) = 0 vµ tÊt c¶ c¸c nót ®îc ®¸nh dÊu (·,¥)
Bíc k (tÝnh vµ cËp nhËt)
Víi mäi v ¹ 1 (®Ých), cËp nhËt Dk(v) nh sau:
Dk(v) = min [Dk-1(w) + l(v,w)]
wÎNv
trong ®ã Nv lµ tËp c¸c nót l¸ng giÒng cña v.
CËp nhËt nk(v) nh sau:
nk(v) = w1, víi w1 tho¶ m·n biÓu thøc :
Dk-1(w1) + l(v,w1) = min [Dk-1(w) + l(v,w)]
wÎNv
ThuËt to¸n dõng khi tÊt cÆp gi¸ trÞ ®¸nh dÊu cña mçi nót gi÷ nguyªn kh«ng thay ®æi n÷a.
Phô lôc C V¨n b¶n ch¬ng tr×nh (phÇn client)
Ch¬ng tr×nh chÝnh (main.c)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "socket.h"
int FAR PASCAL mInitTcpIp(void);
int FAR PASCAL mMakeConnect(LPSTR host,int port);
int mMakeDataConnect(SOCKET cmd_sock);
BOOL NEAR PASCAL mReadMsg(SOCKET sock, char *recv);
BOOL NEAR PASCAL mWriteMsg(SOCKET sock, char *buf);
BOOL NEAR PASCAL mReadData(SOCKET sock, char *name);
BOOL NEAR PASCAL mWriteData(SOCKET sock, char *name);
char * GetWord(char * source, char * dest);
int CmdAnalys(char * cmd);
BOOL DoCmd(char *cmd);
BOOL GetPass(char *cmd);
BOOL GetUser(char *cmd);
BOOL Login();
BOOL PutFile(char *cmd);
BOOL GetFile(char *cmd);
BOOL DoDisconnect();
BOOL DoConnect();
struct cmd_rec {
short code;
char cmd[16];
short data_expect;
BOOL (*func)(char *cmd);
};
#define CMD_ABORT 1
#define CMD_APPEND 2
#define CMD_BUFSIZE 33
#define CMD_CHDIR 3
#define CMD_CHPWD 4
#define CMD_CLOSE 5
#define CMD_EXEC 6
#define CMD_FMODE 7
#define CMD_FSIZE 8
#define CMD_FSTAT 9
#define CMD_GET 10
#define CMD_HELP 11
#define CMD_LIST 12
#define CMD_LOCKF 13
#define CMD_LSEEK 14
#define CMD_MKDIR 15
#define CMD_OPEN 16
#define CMD_PASS 17
#define CMD_PORT 18
#define CMD_PUT 19
#define CMD_PWD 20
#define CMD_QUIT 21
#define CMD_READ 22
#define CMD_REXE 23
#define CMD_RMDIR 24
#define CMD_TMPNAM 25
#define CMD_TNET 26
#define CMD_UMASK 27
#define CMD_UNIX 28
#define CMD_UNLINK 29
#define CMD_USER 30
#define CMD_WRITE 31
#define CMD_HASH 35
#define CMD_DEL 36
#define CMD_LCD 37
#define CMD_LDIR 38
#define CMD_HOST 39
#define CMD_LHELP 40
#define CMD_DISCON 41
#define cmd_num 48
struct cmd_rec cmd_list[cmd_num] = {
1, "ABORT", 0, NULL,
2, "APPEND", 0, NULL,
33, "BUFSIZE", 0, NULL,
33, "BUFSIZ", 0, NULL,
3, "CHDIR", 0, NULL,
3, "CD", 0, NULL,
4, "CHPWD", 0, NULL,
5, "CLOSE", 0, NULL,
6, "EXEC", 1, NULL,
7, "FMODE", 0, NULL,
8, "FSIZE", 0, NULL,
9, "FSTAT", 0, NULL,
10, "GET", 1, NULL,
11, "H", 0, NULL,
11, "HELP", 0, NULL,
11, "?", 0, NULL,
12, "L", 1, NULL,
12, "LIST", 1, NULL,
12, "LS", 1, NULL,
13, "LOCKF", 0, NULL,
14, "LSEEK", 0, NULL,
15, "MKDIR", 0, NULL,
16, "OPEN", 0, NULL,
17, "PASS", 0, NULL,
17, "PASSWD", 0, NULL,
18, "PORT", 0, NULL,
19, "PUT", 2, NULL,
20, "PWD", 0, NULL,
21, "Q", 0, NULL,
21, "QUIT", 0, NULL,
22, "READ", 1, NULL,
23, "REXE", 1, NULL,
24, "RMDIR", 0, NULL,
25, "TMPNAM", 0, NULL,
26, "TNET", 0, NULL,
27, "UMASK", 0, NULL,
28, "UNIX", 0, NULL,
29, "UNLINK", 0, NULL,
30, "USER", 0, NULL,
31, "WRITE", 2, NULL,
35, "HASH", 0, NULL,
36, "DEL", 0, NULL,
37, "LCD", 0, NULL,
38, "LDIR", 0, NULL,
39, "HOST", 0, NULL,
40, "LHELP", 0, NULL,
41, "DIS", 0, NULL,
41, "DISCONNECT",0, NULL
};
int BUFF_SIZE = 1024;
int HASH = 0;
int connected = 0;
SOCKET sock, data_sock;
char cmd[DATA_LEN];
char tmp[DATA_LEN];
int port;
char host[32];
int main( int argc, char *argv[ ])
{
if ((argc 3)){
printf("Usage: %s remote_host [remote_port]", argv[0]);
return 2;
}
if (mInitTcpIp()) {
printf("Error on init\n");
return 1;
}
if (argc == 3) {
strcpy(host, argv[1]);
port = atoi(argv[2]);
} else port = 1998;
DoConnect();
do {
printf(">");
gets(cmd);
CmdAnalys(cmd);
} while (strnicmp(cmd, "q", 1) != 0);
return 0;
}
char * GetWord(char * source, char * dest)
{
int i;
char * cmdPtr = source;
i = 0;
while (*cmdPtr == ' ' && *cmdPtr != 0) cmdPtr++;
while (*cmdPtr != ' ' && *cmdPtr != 0) {
dest[i++] = *cmdPtr; cmdPtr++;
}
dest[i] = 0;
return cmdPtr;
}
int CmdAnalys(char * cmd)
{
int i = 0, ret = 1;
char verb[8];
char *obj;
obj = GetWord(cmd, verb);
if (verb[0] == '#') {
char *p;
p = strchr(cmd, '#') + 1;
DoCmd(p);
return 0;
}
if (verb[0] == '!') {
char *p;
p = strchr(cmd, '!') + 1;
sprintf(tmp, "command /c %s", p);
system(tmp);
return 0;
}
do {
ret = stricmp(verb, cmd_list[i++].cmd);
} while (ret && (i <= cmd_num));
if (i > cmd_num) {
printf("XXXX Unknown command\n");
} else {
i--;
switch (cmd_list[i].code) {
case CMD_PORT :
printf("XXXX Unknown command\n");
break;
case CMD_BUFSIZE :
if (!connected) {
printf("Not connected\n"); return 1;
}
mWriteMsg(sock, cmd);
mReadMsg(sock, tmp);
if (strncmp(tmp, "0000", 4) == 0) BUFF_SIZE = atoi(obj);
break;
case CMD_USER :
if (!connected) {
printf("Not connected\n"); return 1;
}
mWriteMsg(sock, cmd);
mReadMsg(sock, tmp);
if (strncmp(tmp, "1006", 4) == 0) Login();
break;
case CMD_GET :
if (!connected) {
printf("Not connected\n"); return 1;
}
GetFile(cmd);
break;
case CMD_PUT :
if (!connected) {
printf("Not connected\n"); return 1;
}
PutFile(cmd);
break;
case CMD_HASH :
if (HASH) {
HASH = 0;
printf("Hash mark printing Off\n");
} else {
HASH = 1;
printf("Hash mark printing On (%i bytes/ hash mark)\n", BUFF_SIZE);
}
break;
case CMD_LCD : {
char path[MAX_PATH];
GetWord(obj, path);
if (path[0] != 0) ret = _chdir(path);
else ret = 0;
if (ret) {
printf("%s : File not found.\n", path);
} else {
printf("Local directory now %s\n", _getcwd(NULL, MAX_PATH));
}
break;
}
case CMD_LDIR :
break;
case CMD_HOST :
case CMD_OPEN :
{
char pc[8];
char *p;
if (connected) {
printf("Already connected to %s, use close first\n", host);
} else {
p = GetWord(obj, host);
GetWord(p, pc);
if (pc[0] != 0) {
port = atoi(pc);
} else port = 1997;
DoConnect();
}
break;
}
case CMD_LHELP :
break;
case CMD_HELP :
printf("Not availble. Please type #help for more information.\n");
break;
case CMD_DISCON :
case CMD_CLOSE :
if (!connected) {
printf("Not connected\n"); return 1;
}
DoDisconnect();
break;
default:
if (!connected) {
printf("Not connected\n"); return 1;
}
DoCmd(cmd);
}
}
return 0;
}
BOOL DoCmd(char *cmd)
{
mWriteMsg(sock, cmd);
mReadMsg(sock, tmp);
if (strncmp(tmp, "9001", 4) == 0) {
tmp[0] = 0;
mReadData(data_sock, tmp);
mReadMsg(sock, tmp);
}
return 1;
}
BOOL GetPass(char *cmd)
{
char *p = cmd;
char clr[2];
printf("Password:");
do {
*p++ = (char)_getch();
if (*(p-1) == '\b') p -= 2;
} while (*(p-1) != '\r');
*p = 0;
gets(clr);
return 1;
}
BOOL GetUser(char *cmd)
{
printf("User:");
gets(cmd);
return 1;
}
BOOL Login()
{
GetPass((char *)tmp);
sprintf(cmd, "pass %s", tmp);
mWriteMsg(sock, cmd);
mReadMsg(sock, tmp);
if (strncmp(tmp, "0000", 4) == 0) data_sock = mMakeDataConnect(sock);
return 1;
}
BOOL PutFile(char *cmd)
{
char source[32], desti[32];
char *p;
p = GetWord(cmd, source);
p = GetWord(p, source);
GetWord(p, desti);
if (desti[0] == 0) strcpy(desti, source);
sprintf(cmd, "PUT %s", desti);
mWriteMsg(sock,cmd);
mReadMsg(sock, tmp);
if (strncmp(tmp, "9001 ", 5) == 0) {
mWriteData(data_sock, source);
mReadMsg(sock, tmp);
} else {
return 0;
}
return 1;
}
BOOL GetFile(char *cmd)
{
HFILE handle;
char source[32], desti[32];
char *p;
p = GetWord(cmd, source);
p = GetWord(p, source);
GetWord(p, desti);
if (desti[0] == 0)
strcpy(desti, source);
if ((handle = _lcreat(desti, 0)) < 0) {
printf("Could not creat file %s", desti);
return FALSE;
}
_lclose(handle);
sprintf(cmd,"GET %s", source);
mWriteMsg(sock, cmd);
mReadMsg(sock, tmp);
if (memcmp(tmp, "9001", 4) != 0) {
mReadMsg(sock, tmp);
return 0;
} else {
mReadData(data_sock, desti);
mReadMsg(sock, tmp);
}
return 1;
}
BOOL DoDisconnect()
{
sprintf(cmd, "QUIT");
mWriteMsg(sock, cmd);
mReadMsg(sock, tmp);
if (strncmp(tmp, "9999", 4) == 0) {
data_sock = 0;
sock = 0;
connected = 0;
}
return 1;
}
BOOL DoConnect()
{
sock = mMakeConnect(host, port);
if (sock <= 0) printf("Could not make connect to %s\n", host);
else {
mReadMsg(sock, tmp);
}
connected = 1;
GetUser(tmp);
sprintf(cmd, "user %s", tmp);
mWriteMsg(sock, cmd);
mReadMsg(sock, tmp);
Login();
return 1;
}
Th viÖn sö dông (Socket.c)
/************************************************************************/
/***** CM *****/
/***** Module : SOCKET.C *****/
/***** Purposes : Provide socket doing functions *****/
/***** Date : 14-03-1998 *****/
/************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "socket.h"
#define TempFileName "C:\temp\temp.txt"
#define USER_CONNECT (WM_USER + 100)
char remote_host[SERV_LEN];
int remote_port = 1997;
char user_log[USER_LEN];
char pass_log[PASS_LEN];
UINT mode_log;
char lcTemp[DATA_LEN + 2];
char lcCmd[CMD_LEN];
struct sockaddr_in client_sockaddr;
BOOL TCP_INIT = FALSE;
struct timeval tv = {timeout, 0};
int FAR PASCAL mReadSocket(SOCKET sock,char *buffer,int len);
int FAR PASCAL mWriteSocket(SOCKET sock,char *buffer,int len);
int FAR PASCAL mInitTcpIp(void);
int mMakeDataConnect();
int FAR PASCAL mReadSocket(SOCKET sock,char *buffer,int len)
{
int i;
fd_set fds;
FD_ZERO(&fds);
FD_SET(sock, &fds);
if ((i = select(FD_SETSIZE, &fds, NULL, NULL, &tv)) < 0 && errno != WSAEINTR) return(i);
if (!i) return(0);
return (recv(sock, buffer, len, NO_FLAGS_SET));
}
int FAR PASCAL mWriteSocket(SOCKET sock, char *buffer, int len)
{
int i;
fd_set fds;
FD_ZERO(&fds);
FD_SET(sock, &fds);
if ((i = select(FD_SETSIZE, NULL, &fds, NULL, &tv)) < 0 && (errno != WSAEINTR)) return(i);
if (!i) return(i);
return(send(sock, buffer, len, NO_FLAGS_SET));
}
/***********************************************************/
/*** CM Function : mReadMsg */
/*** Purposes : Read a complete message from server with */
/*** checking size of message */
/***********************************************************/
BOOL NEAR PASCAL mReadMsg(SOCKET sock, char *recv)
{
char tmp[DATA_LEN + 7];
unsigned char tmp1[4];
BOOL loop;
int i, first;
int total_read = 0, total_send = 0;
*recv = 0;
loop = TRUE; first = 1;
do
{
if (first == 1) {
i = mReadSocket(sock, tmp1, SIZE_LEN);
if (i <= 0) loop = FALSE;
first = 2;
total_send = tmp1[0] + 256 * tmp1[1];
if (total_send == 0) loop = FALSE;
total_read = 0;
}
else {
i = mReadSocket(sock, tmp, min(DATA_LEN, total_send-total_read));
if (i < 0) {
#ifdef EXPECT_RET
*tmp = (char) CAN;
mWriteSocket(sock, tmp, 1);
#endif
return FALSE;
}
if (i == 0) loop = FALSE;
total_read += i;
if (total_read >= total_send) loop = FALSE;
tmp [i] = '\0';
strcat(recv, tmp);
printf("%s", recv);
if (first == 2) {
if (memcmp(tmp, "9998", 4) == 0) {
loop = FALSE;
exit(1);
}
} else first = 0;
}
} while (loop);
#ifdef EXPECT_RET
*tmp = (char) ACK;
mWriteSocket(sock, tmp, 1);
#endif
return TRUE;
}
/***********************************************************/
/*** CM Function : mReadData */
/*** Purposes : Read a huge amount of data from server */
/*** and put it in a file */
/***********************************************************/
BOOL NEAR PASCAL mReadData(SOCKET sock, char *name)
{
char tmp[DATA_LEN + 7];
unsigned char tmp1[4];
BOOL loop;
int i, first;
int total_read, total_send, len;
unsigned long rbyte = 0L;
char ret[1];
double mtime, av;
time_t before, post;
HFILE handle;
if (name[0] != 0) {
if ((handle = _lcreat(name, 0)) < 0) return FALSE;
} else handle = 1;
time(&before);
loop = TRUE; first = 1;
do {
if (first == 1) {
do {
i = mReadSocket(sock, tmp1, SIZE_LEN);
if (i <= 0) return FALSE;
}
while (i != SIZE_LEN);
first = 2;
total_send = tmp1[0] + 256 * tmp1[1];
if (total_send == 0) {
#ifdef EXPECT_RET
*ret = (char) ACK;
mWriteSocket(sock, ret, 1);
#endif
loop = FALSE;
}
total_read = 0;
}
else {
len = min(BUFF_SIZE, total_send - total_read);
do {
i = mReadSocket(sock, tmp, len);
if (i < 0) {
#ifdef EXPECT_RET
*ret = (char) CAN;
mWriteSocket(sock, ret, 1);
#endif
return FALSE;
}
} while (i == 0);
total_read += i;
rbyte += i;
if (total_read >= total_send) {
#ifdef EXPECT_RET
*ret = (char) ACK;
mWriteSocket(sock, ret, 1);
#endif
first = 1;
}
tmp[i] = 0;
if (handle == 1) printf("%s", tmp);
else {
_lwrite(handle, tmp, i);
if (HASH) putchar('#');
}
if (first == 2 || first == 1) {
if (memcmp(tmp,"9998",4) == 0) {
loop = FALSE;
return FALSE;
}
} else first = 0;
}
} while (loop);
if (handle != 1) _lclose(handle);
time(&post);
mtime = difftime(post, before);
av = rbyte/mtime;
printf("\nTransfered %d bytes in %.2f second(s) (%.0f bytes/s)\n", rbyte, mtime, av);
return TRUE;
}
/***********************************************************/
/*** CM Function : mWriteMsg */
/*** Purposes : Write a complete message to server with 2 */
/*** bytes size of message */
/***********************************************************/
BOOL NEAR PASCAL mWriteMsg(SOCKET sock, char *buf)
{
char cmd_and_size[DATA_LEN];
int l;
l = strlen(buf);
memcpy(cmd_and_size,(char *)&l, SIZE_LEN);
memcpy(cmd_and_size + SIZE_LEN, buf, l);
if (mWriteSocket(sock, cmd_and_size, l + SIZE_LEN) <= 0) {
exit(1);
}
#ifdef EXPECT_RET
if (mReadSocket(sock, cmd_and_size, 1) < 0) {
exit(1);
}
else if (*cmd_and_size != ACK) {
exit(1);
}
#endif
return TRUE;
}
BOOL NEAR PASCAL mWriteData(SOCKET sock, char *name)
{
char tmp[DATA_LEN+ SIZE_LEN];
int len, ret;
HFILE handle;
char cmd_and_size[DATA_LEN + SIZE_LEN];
unsigned long wbyte = 0L, count = 0L;
double mtime, av;
time_t before, post;
time(&before);
handle = _lopen(name, OF_READ);
if (handle < 0) return (FALSE);
do {
len = _lread(handle, tmp, BUFF_SIZE - 2);
if (len > 0)
{
wbyte += len;
memcpy(cmd_and_size, (char *)&len, SIZE_LEN);
memcpy(cmd_and_size + SIZE_LEN, tmp, len);
if ((ret = mWriteSocket(sock, cmd_and_size, len + SIZE_LEN)) <= 0) {
if (WSAGetLastError() == WSAEWOULDBLOCK)
printf("Error number is %i errno WSAEWOULDBLOCK ", ret);
else printf("Error number is %i errno %i", ret, WSAGetLastError());
closesocket(sock);
_lclose(handle);
exit(1);
}
#ifdef EXPECT_RET
if (mReadSocket(sock, cmd_and_size, 1) < 0) {
_lclose(handle);
return FALSE;
}
else if (*cmd_and_size != ACK) {
_lclose(handle);
return FALSE;
}
#endif
if (HASH) printf("#");
}
} while (len == BUFF_SIZE - 2);
len = 0;
memcpy(cmd_and_size,(char *)&len, SIZE_LEN + 2);
mWriteSocket(sock, cmd_and_size, SIZE_LEN);
#ifdef EXPECT_RET
if (mReadSocket(sock, cmd_and_size, 1) < 0) {
_lclose(handle);
return FALSE;
}
else if (*cmd_and_size != ACK) {
_lclose(handle);
return FALSE;
}
#endif
_lclose(handle);
time(&post);
mtime = difftime(post, before);
av = wbyte/mtime;
printf("\nTransfered %d bytes in %.2f second(s) (%.0f bytes/s)\n", wbyte, mtime, av);
return TRUE;
}
/* Inittialize tcp ip */
int FAR PASCAL mInitTcpIp(void)
{
WSADATA WSAData;
int status;
if ((status = WSAStartup(MAKEWORD(1,1), &WSAData)) != 0) {
printf("TCP/IP Error: %d is the err", status);
TCP_INIT = FALSE;
} else TCP_INIT = TRUE;
return status;
}
int FAR PASCAL mMakeConnect(LPSTR host,int port)
{
struct hostent* h;
struct sockaddr_in sin;
int sock;
unsigned long hostaddr;
int ret;
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
return -1;
}
hostaddr = inet_addr(host);
memset(&sin,0, sizeof(sin));
if ((long)hostaddr != -1L) {
memcpy(&sin.sin_addr,&hostaddr,sizeof(hostaddr));
} else
{
if ((h = gethostbyname(host)) == 0) {
closesocket(sock);
return -1;
}
memcpy(&sin.sin_addr,h->h_addr,h->h_length);
}
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)port);
if (connect(sock,(struct sockaddr FAR *)&sin, sizeof(sin)) < 0) {
ret = errno;
if (ret == -2){
struct timeval tv;
fd_set fds;
tv.tv_sec = timeout;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(sock, &fds);
if ((select(FD_SETSIZE, NULL, &fds, NULL, &tv)) <= 0) {
return -1;
}
return sock;
}
closesocket(sock);
return -1;
}
return sock;
}
int mStopConnect(int sock)
{
shutdown(sock, 2);
closesocket(sock);
return 0;
}
int mMakeDataConnect(SOCKET cmd_sock)
{
struct sockaddr_in server_sockaddr;
int server_socket, ret_socket;
int i;
memset(&server_sockaddr,0,sizeof(server_sockaddr));
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
server_socket = socket(AF_INET,SOCK_STREAM,0);
if (server_socket < 0) {
return -1;
}
if (bind(server_socket,(struct sockaddr FAR *)&server_sockaddr,sizeof(server_sockaddr)) < 0) {
closesocket(server_socket);
return -1;
}
i = sizeof(client_sockaddr);
if (getsockname(server_socket,(struct sockaddr FAR *)&client_sockaddr,&i) < 0)
return(-1);
listen(server_socket,5);
sprintf(lcCmd, "PORT %d", ntohs(client_sockaddr.sin_port));
mWriteMsg(cmd_sock, lcCmd);
ret_socket = accept(server_socket,(struct sockaddr FAR *)&client_sockaddr,&i);
mReadMsg(cmd_sock, lcTemp);
return ret_socket;
}
int mStopDataConnect(int data_sock)
{
shutdown(data_sock, 2);
closesocket(data_sock);
return 0;
}
/***********************************************************/
/*** CM Function : mDoneTcpIp */
/*** Purposes : Cleanup tcp ip will unload winsock.dll */
/***********************************************************/
int FAR PASCAL mDoneTcpIp(void)
{
if (TCP_INIT) {
TCP_INIT = FALSE;
return WSACleanup();
}
return -1;
}
Các file đính kèm theo tài liệu này:
- Kiến thức mạng căn bản.doc