Kiến thức mạng căn bản

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ể.

doc100 trang | Chia sẻ: tlsuongmuoi | Lượt xem: 1859 | Lượt tải: 0download
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 nh­ng 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 nh­ng 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ã ch­a ®­î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() nh­ng 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Ï ch­a tho¸t ra nÕu nh­ ch­a thiÕt lËp ®­îc liªn kÕt hoÆc ch­a 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 nh­ng 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ò ch­a ®­î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 nh­ng 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 ®ñ, nh­ng ®Ó 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 nh­ng 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 nh­ng 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. Nh­ng 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. Nh­ng 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 l­u 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 nh­ng 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 nh­ng 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 tr­ng 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:

  • docKiến thức mạng căn bản.doc
Tài liệu liên quan