Giáo trình Kiến thức mạng cơ bản
Sử dụng chung tài nguyên (resource sharing): Chương trình, dữ liệu,
thiết bị có thể được dùng chung bởi người dùng từ các máy tính trên mạng.
Tăng độ tin cậy của hệ thống thông tin (reliability): Nếu một máy tính
hay một đơn vị dữ liệu nào đó bị hỏng thì luôn có thể sử dụng một máy
tính khác hay một bản sao khác của dữ liệu, nhờ đó, khả năng mạng bị
ngừng sử dụng được giảm thiểu.
Tạo ra môi trường truyền thông mạnh giữa nhiều người sử dụng trên
phạm vi địa lý rộng: Mục tiêu này ngày càng trở nên quan trọng nhất là
khi mạng máy tính đã phát triển trên phạm vi toàn cầu như ngày nay.
Tiết kiệm chi phí: Do tài nguyên được dùng chung, hệ thống tin cậy hơn
nên chi phí thiết bị và bảo dưỡng của mạng máy tính thấp hơn so với
trường hợp máy tính riêng lẻ.
Tóm tắt nội dung tài liệu: Giáo trình Kiến thức mạng cơ bản
0 KIẾN THỨC MẠNG CƠ BẢN 1 CHƯƠNG I. MẠNG MÁY TÍNH I. Mạng máy tính ........................................................................................ 5 II. Phân loại mạng máy tính ........................................................................ 6 II.1. Phân loại theo kiến trúc (topology) của mạng ................................. 6 II.1.1. Mạng điểm-điểm (point-to-point network) ............................... 6 II.1.2. Mạng quảng bá (broadcast network) ......................................... 7 II.2. Phân loại theo phương thức chuyển mạch (Swiched Method) ......... 7 II.2.1. Chuyển mạch kênh (Circuit Swiched Network) ........................ 7 II.2.2. Chuyển mạch tin báo (Message Swiched Network) .................. 8 II.2.3. Chuyển mạch gói (Packed Swiched Network) .......................... 8 II.3. Phân loại theo phạm vi hoạt động ................................................... 8 II.3.1. Mạng LAN (Local Area Network) ........................................... 8 II.3.2. Mạng MAN (Metropolian Area Network) ................................ 8 II.3.3. Mạng WAN (Wide Area Network) .......................................... 8 II.3.4. Liên mạng (internet) ................................................................. 8 CHƯƠNG II. GIAO THỨC TRUYỀN THÔNG VÀ CÁC MÔ HÌNH THAM CHIẾU I. Giao thức truyền thông .......................................................................... 11 II. Mô hình tham chiếu OSI ...................................................................... 12 II.1. Giới thiệu mô hình OSI ................................................................. 12 II.2. Các tầng của mô hình OSI ............................................................. 14 II.2.1. Tầng vật lý (Physical layer) .................................................... 14 II.2.2. Tầng liên kết dữ liệu (Data link layer) .................................... 14 II.2.3. Tầng mạng (Network layer) ................................................... 15 II.2.4. Tầng giao vận (Transport layer) ............................................. 15 II.2.5. Tầng phiên (Session layer) ..................................................... 16 II.2.6. Tầng trình diễn (Presentation layer) ....................................... 16 II.2.7. Tầng ứng dụng (Application layer) ......................................... 16 II.3. Những vấn đề về OSI .................................................................... 16 III. Kiến trúc giao thức IPX/SPX .............................................................. 17 III.1. Kiến trúc giao thức IPX/SPX ....................................................... 17 III.2. Gói tin IPX .................................................................................. 18 III.3. Cơ chế hoạt động của Novell Netware ......................................... 19 CHƯƠNG III. BỘ GIAO THỨC TCP/IP I. Bộ giao thức TCP/IP ............................................................................. 20 II. Kiến trúc của bộ giao thức TCP/IP ....................................................... 21 2 II.1. Kiến trúc phân tầng của TCP/IP .................................................... 21 II.2. Cơ chế địa chỉ Internet .................................................................. 24 II.2.1. Địa chỉ lớp A .......................................................................... 25 II.2.2. Địa chỉ lớp B .......................................................................... 26 II.2.3. Địa chỉ lớp C .......................................................................... 26 II.3. Mạng con và Subnet mask ............................................................ 26 III. Tầng mạng (Network Layer) .............................................................. 29 IV. Tầng Internet (Internet Layer) ........................................................... 30 IV.1. Gói tin IP ..................................................................................... 31 IV.2. Giao thức chuyển địa chỉ ARP (Address Resolution Protocol) và cơ giao thức chuyển ngược địa chỉ RARP (Reverse Address Resolution Protocol) ............................................................................................... 34 IV.2.1. Chuyển giao trực tiếp ............................................................ 34 IV.2.2. Chuyển giao địa chỉ động ..................................................... 34 IV.2.3. Gói tin ARP .......................................................................... 35 IV.3. Giao thức điều khiển truyền tin (Internet Control Message Protocol - ICMP) ................................................................................................ 37 IV.3.1. Gói tin ICMP ........................................................................ 37 IV.3.2. Điều khiển dòng dữ liệu ........................................................ 38 IV.3.3. Thông báo lỗi ........................................................................ 38 IV.3.4. Định hướng lại ...................................................................... 38 IV.3.5. Kiểm tra trạm làm việc ......................................................... 39 IV.4. Thuật toán dẫn đường .................................................................. 39 V. tầng giao vận ....................................................................................... 43 V.1. Giao thức không kết nối (User Datagram Protocol - UDP) ........... 43 V.1.1. Gói thông tin UDP ................................................................. 43 V.1.2. Phân kênh, hợp kênh và Ports ................................................ 44 V.2. Giao thức điều khiển truyền tin (Transmission Control Protocol - TCP) ..................................................................................................... 46 V.2.1. Gói tin TCP ............................................................................ 49 V.2.2. Cổng, kết nối và điểm kết nối ................................................. 49 VI. Tầng ứng dụng của TCP/IP ................................................................ 51 VI.1. Dịch vụ tên miền (Domain Name Service - DNS) ....................... 51 VI.2. Đăng nhập từ xa (Telnet) ............................................................. 53 VI.3. Thư điện tử (Electronic Mail) ...................................................... 54 VI.4. Giao thức truyền tệp (File Transfer Protocol - FTP) .................... 56 VI.5. Nhóm tin (News groups) ............................................................. 57 VI.6. Tìm kiếm tệp (Archie) ................................................................. 57 VI.7. Tra cứu thông tin theo thực đơn (Gopher).................................... 57 VI.8. Tìm kiếm thông tin theo chỉ số (WAIS) ....................................... 57 VI.9. Siêu văn bản (WWW) .................................................................. 58 3 CHƯƠNG IV. XÂY DỰNG CHƯƠNG TRÌNH TRUYỀN TỆP I. Giao diện lập trình ................................................................................. 59 I.1. Giao diện lập trình .......................................................................... 59 I.2. Network I/O và file I/O .................................................................. 60 I.3. Làm việc với Socket ....................................................................... 61 I.3.1. Socket ...................................................................................... 61 I.3.2. Địa chỉ Socket ......................................................................... 62 I.3.3. Một số lời gọi tạo lập socket .................................................... 64 I.3.4. Một số lời gọi gửi dữ liệu qua socket ....................................... 68 I.3.5. Một số lời gọi nhận dữ liệu từ socket ....................................... 69 II. Mô hình Client-Server ......................................................................... 70 II.1. Mô hình Client-Server sử dụng dịch vụ không kết nối .................. 71 II.2. Mô hình Client-Server sử dụng dịch vụ hướng kết nối .................. 72 III. Xây dựng chương trình truyền tệp ...................................................... 73 III.1. Thiết kế và cài đặt chương trình ................................................... 73 III.1.1. Giao thức ứng dụng được xây dựng và sử dụng trong chương trình .................................................................................................. 73 III.1.2. Cài đặt chương trình ............................................................. 75 III.2. Một số vấn đề nảy sinh trong quá trình thực hiện và cách giải quyết78 III.2.1. Vấn đề chuyển đổi tệp giữa hai hệ điều hành. ....................... 78 III.2.2. Vấn đề về một số lệnh tương tác ........................................... 80 Phụ lục A. MỘT SỐ MẠNG CỤC BỘ I. Mạng Ethernet và IEEE 802.3 ............................................................... 82 II. Mạng Token-Pasing Rings (IEEE 802.5) ............................................. 82 III. Mạng Token-Passing Busses (IEEE 802.4) ......................................... 84 Phụ lục B. MỘT SỐ KỸ THUẬT CHỌN ĐƯỜNG ĐI NGẮN NHẤT I. Giải thuật Dijkstra cho việc chọn đường tập trung ................................ 86 II. Giải thuật Ford& Fulkerson cho việc chọn đường phân tán ................. 87 Phụ lục C. VĂN BẢN CHƯƠNG TRÌNH (PHẦN CLIENT) I. Chương trình chính (main.c) ................................................................. 89 4 II. Thư viện sử dụng (Socket.c) ................................................................ 96 5 CHƯƠNG I . MẠNG MÁY TÍNH I. MẠNG MÁY TÍNH 6 Mạng máy tính là hệ thống các máy tính độc lập (autonomous) được kết nối với nhau. Khái niệm độc lập ở đây có nghĩa là chúng không có mối quan hệ chủ/tớ (master/slave) rõ ràng. Hai máy tính được gọi là được kết nối với nhau nếu chúng có khả năng trao đổi thông tin. Sự kết nối có thể thông qua dây dẫn, tia laser, sóng điện từ hay vệ tinh viễn thông... Việc kết nối các máy tính có những ưu điểm sau Sử dụng chung tài nguyên (resource sharing): Chương trình, dữ liệu, thiết bị có thể được dùng chung bởi người dùng từ các máy tính trên mạng. Tăng độ tin cậy của hệ thống thông tin (reliability): Nếu một máy tính hay một đơn vị dữ liệu nào đó bị hỏng thì luôn có thể sử dụng một máy tính khác hay một bản sao khác của dữ liệu, nhờ đó, khả năng mạng bị ngừng sử dụng được giảm thiểu. Tạo ra môi trường truyền thông mạnh giữa nhiều người sử dụng trên phạm vi địa lý rộng: Mục tiêu này ngày càng trở nên quan trọng nhất là khi mạng máy tính đã phát triển trên phạm vi toàn cầu như ngày nay. Tiết kiệm chi phí: Do tài nguyên được dùng chung, hệ thống tin cậy hơn nên chi phí thiết bị và bảo dưỡng của mạng máy tính thấp hơn so với trường hợp máy tính riêng lẻ. II. PHÂN LOẠI MẠNG MÁY TÍNH II.1. Phân loại theo kiến trúc (topology) của mạng Phân loại theo kiến trúc là cách phân loại mạng máy tính theo cách kết nối các máy tính trong mạng II.1.1. Mạng điểm-điểm (point-to-point network) Các đường truyền nối các cặp nút với nhau, mỗi nút có trách nhiệm lưu trữ tạm thời sau đó chuyển tiếp dữ liệu tới đích. Cách làm việc này còn gọi là lưu và chuyển tiếp (store-and-forward). Mạng điểm-điểm cần sử dụng lượng cáp nối lớn hoặc nhiều đường điện thoại thuê riêng (leased telephone lines), mỗi 7 đường nối một cặp điểm làm việc. Nếu 2 điểm làm việc muốn gửi thông tin cho nhau mà không có đường truyền trực tiếp, dữ liệu của chúng cần được truyền qua một số nút khác do đó, thuật toán dẫn đường có vai trò rất quan trọng trong kiến trúc mạng điểm-điểm. II.1.2. Mạng quảng bá (broadcast network) Tất cả các nút cùng dùng chung một đường truyền vật lý. Dữ liệu được tiếp nhận bởi tất cả các máy tính, nếu máy tính nào kiểm tra thấy gói tin được gửi cho mình, nó sẽ giữ lại và xử lý. Các mạng quảng bá thường cho phép sử dụng địa chỉ broadcasting để gửi thông báo tới toàn mạng. II.2. Phân loại theo phương thức chuyển mạch (Swiched Method) II.2.1. Chuyển mạch kênh (Circuit Swiched Network) Thông tin truyền qua một kênh vật lý cố định, tốc độ và độ tin cậy cao nhưng lãng phí đường truyền do không sử dụng hết. Star Tree Ring Satellite Bus Ring 8 II.2.2. Chuyển mạch tin báo (Message Swiched Network) Liên lạc được thiết lập khi có thông tin cần truyền, thông tin được định dạng gồm header và data và có độ dài không cố định: Mối liên lạc được thiết lập và chỉ giải phóng khi truyền xong dữ liệu do đó không quản lý được thời gian chiếm đường truyền II.2.3. Chuyển mạch gói (Packed Swiched Network) Thông tin được cắt ra thành các gói có độ dài quy định Ví dụ Erthenet IEEE 802.3 chia message thành các gói 1500 bytes. Mỗi gói đều có header và data. Các gói của các message khác nhau có thể truyền xen kẽ trên đường truyền do đó thời gian chờ đợi chung của hệ thống giảm. II.3. Phân loại theo phạm vi hoạt động Theo phạm vi hoạt động, người ta chia mạng máy tính thành những loại sau II.3.1. Mạng LAN (Local Area Network) Thường là mạng được sử dụng cho một công ty, trường học hay trong một toà nhà, khoảng cách tương đối nhỏ (cỡ vài trăm m tới vài Km) tốc độ truyền lớn, độ trễ nhỏ. (Phụ lục A trình bày một số mạng cục bộ thường được sử dụng) II.3.2. Mạng MAN (Metropolian Area Network) Mạng được cài đặt trong phạm vi một đô thị hay trung tâm kinh tế - xã hội (có bán kính khoảng 100 Km) II.3.3. Mạng WAN (Wide Area Network) Mạng diện rộng có thể bao trùm một vùng rộng lớn cỡ quốc gia hay lục địa. II.3.4. Liên mạng (internet) Phần lớn các mạng cục bộ đều độc lập với nhau về phần cứng cũng như phần mềm, chúng được thiết lập nhằm mục đích phục vụ những nhóm người cụ thể 9 nào đó. Trong mỗi mạng đó, người dùng tự lựa chọn một công nghệ phần cứng phù hợp với công việc của họ. Một điều quan trọng nữa là không thể xây dựng một mạng chung dựa trên một công nghệ sử dụng trên một mạng đơn lẻ nào đó bởi vì không có công nghệ mạng nào có thể thoả mãn nhu cầu cho tất cả mọi người. Một số người có nhu cầu sử dụng đường nối cao tốc để truyền dữ liệu của mình trong khi các mạng LAN không thể mở rộng phạm vi hoạt động quá xa. Một số mạng tốc độ chậm lại có thể kết nối máy tính tới hàng ngàn dặm... Liên mạng máy tính (internetworking hay internet) là một công nghệ được đưa ra nhằm kết nối các mạng thành một thể thống nhất. Công nghệ internet che dấu đi kiến trúc vật lý của mạng và cho phép máy tính truyền thông một cách độc lập với liên kết vật lý của mạng. Một liên mạng đã khá quen thuộc với chúng ta là mạng Internet Giới thiệu mạng Internet Internet là một tổ hợp hàng triệu máy được kết nối với nhau thông qua các thiết bị ghép nối thường gọi là gateway để có thể chia sẻ thông tin với nhau, trong đó có đủ loại máy tính, và chúng sử dụng nhiều hệ điều hành khác nhau. Thông tin trên Internet gồm đủ loại từ thư điệu tử, các file đồ hoạ đến video và còn nhiều thứ khác được cung cấp bởi những người sử dụng I ... 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; 92 } 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); 93 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) { 94 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); 95 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); 96 } connected = 1; GetUser(tmp); sprintf(cmd, "user %s", tmp); mWriteMsg(sock, cmd); mReadMsg(sock, tmp); Login(); return 1; } II. 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; 97 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); 98 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); 99 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); 100 } #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; } 101 #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; } 102 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; 103 return WSACleanup(); } return -1; }
File đính kèm:
- giao_trinh_kien_thuc_mang_co_ban.pdf