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

pdf 104 trang kimcuc 5680
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Kiến thức mạng cơ bản", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Kiến thức mạng cơ bản

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:

  • pdfgiao_trinh_kien_thuc_mang_co_ban.pdf