bc ltm de in

69
Báo cáo bài tập lớn: Lập Trình Mạng FTP SERVER

Upload: ngoc-vuquoc

Post on 18-Jan-2016

29 views

Category:

Documents


6 download

DESCRIPTION

báo cáo lập trình mạng, dùng winsock, tạo server và client

TRANSCRIPT

Page 1: BC LTM de in

Báo cáo bài tập lớn: Lập Trình Mạng

FTP SERVER

Page 2: BC LTM de in

Phân công công việc

Phần I:Tổng quan về họ giao thức TCP/IP

Trẩn Đình Tuấn

Phần II A.Giới thiệu ; B.Khái quát Trẩn Đình Tuấn C.Phương thức truyền dữ liệu Nguyễn Nam Tiến D.Phương thức truyền file Nguyễn Ngọc Cao E.Thông số kỹ thuật Vũ Quốc NgọcPhần III.Cài đặt bằng VS C++ Cả nhóm

Page 3: BC LTM de in

ContentsPHẦN I: TỔNG QUAN VỀ HỌ GIAO THỨC TCP/IP..........................................4

1.Giới thiệu.....................................................................................................42.Cấu trúc phân tầng của TCP........................................................................43.Họ giao thức TCP........................................................................................54.IPv4..............................................................................................................6

PHẦN II: FTP.........................................................................................................10A.Giới thiệu..................................................................................................10B.Khái quát...................................................................................................10

1.Một số thuật ngữ..............................................................................102.Mô hình FTP....................................................................................13

C.Phương thức truyền dữ liệu......................................................................141.Dữ liệu đại diện và lưu trữ...............................................................14

a)Kiểu dữ liệu...........................................................................15b)Cấu trúc dữ liệu.....................................................................17

2.Thiết lập kết nối dữ liệu...................................................................183.Quản lí kết nối dữ liệu......................................................................194.Chế độ truyền...................................................................................19

a)Stream mode..........................................................................20b)Block mode...........................................................................20c)Compress mode.....................................................................21

5.Khôi phục lỗi và khởi tạo lại............................................................22D.Phương thức truyền file............................................................................23

1.FTP command..................................................................................23a)Lệnh truy cập điều khiển.......................................................23b)Cấu hình tham số khi truyền..................................................25c)Lệnh sử dụng dịch vụ của FTP..............................................26

2.FTP reply..........................................................................................30E.Thông số kĩ thuật.......................................................................................34

1.Cài đặt tối thiểu................................................................................342.Kết nối..............................................................................................353.Lệnh.................................................................................................35

a)Lệnh FTP...............................................................................36b)Tham số của các lệnh............................................................37c)Chuỗi mã reply của các lệnh..................................................37

PHẦN III. CÀI ĐẶT BẰNG VISUAL C++...........................................................42

Page 4: BC LTM de in

PHẦN 1: TỔNG QUAN VỀ HỌ GIAO THỨC TCP/IP

1. Giới thiệu

Bộ giao thức TCP/IP, ngắn gọn là TCP/IP (tiếng Anh: Internet protocol suite hoặc IP suite hoặc TCP/IP protocol suite - bộ giao thức liên mạng), là một bộ các giao thức truyền thông cài đặt tầng giao thức mà Internet và hầu hết các mạng máy tính thương mại đang chạy trên đó. Bộ giao thức này được đặt tên theo hai giao thức chính của nó là TCP (Giao thức Điều khiển Giao vận) và IP (Giao thức Liên mạng). Chúng cũng là hai giao thức đầu tiên được định nghĩa.

2. Cấu trúc phân tầng của TCP/IP

TCP/IP là một thể hiện thực tế của mô hình OSI. Mô hình OSI nguyên bản chia thành 7 tầng giao thức, tuy nhiên TCP/IP hiện thực v{ đơn giản hóa đi chỉ còn 4 tầng.

Page 5: BC LTM de in

Tầng ứng dụng (Application Layer): gồm các giao thức đóng gói dữ liệu từ ứng dụng người dùng rồi truyền xuống tầng thấp hơn. Các giao thức ở tầng này là: HTTP, FTP, Telnet, DNS, SSH, SMTP, POP3,…

Tầng giao vận (Transport Layer): Nhận dữ liệu từ ứng dụng tầng trên và thông qua tầng dưới, truyền dữ liệu tới ứng dụng ở máy tính đích. Tầng này cung cấp dịch vụ truyền dữ liệu giữa ứng dụng - ứng dụng. Các giao thức ở tầng này: TCP, UDP, ICMP.

Tầng liên mạng (Network Layer): Định tuyến và truyền gói tin liên mạng, cung cấp dịch vụ truyền dữ liệu là các gói tin giữa các nút mạng trong cùng một mạng hoặc liên mạng. Các giao thức ở tầng này: IPv4, IPv6,…

Tầng liên kết (Network Acess Layer, Datalink Layer): Truyền dữ liệu giữa các nút mạng trên cùng một nhánh mạng. Tầng này làm việc trực tiếp với thiết bị chịu trách nhiệm chuyển đổi các bit sang một dạng tín hiệu vật lý khãc (ánh sáng, điện, điện từ…)

Dữ liệu của người dùng sẽ lần lượt đi qua các tầng trong mô hình, ở mỗi tầng, dữ liệu sẽ được thêm phần header để điều khiển và chuyển xuống tầng thấp hơp. Bên nhận sẽ lần lượt bóc tách các header từ tầng thấp và chuyển lên tầng cao, cho đến người dùng.

Page 6: BC LTM de in

3. Họ giao thức TCP/IP

Bao gồm hai phần chính:

Các giao thức tạo thành hệ thống truyền dẫn. Các giao thức hỗ trợ ứng dụng.

Tầng liên mạng (Internet)

Sử dụng giao thức connectionless – IP, là hạt nhân hoạt động của hệ thống truyền dẫn Internet.

Các thuật toán định tuyến RIP, OSFD, BGP Cho phép kết nối một cách mềm dẻo và linh hoạt các loại mạng “vật lý”

khác nhau; như: Ethernet, Token Ring, X25 v.v. dựa trên địa chỉ IP.

Tầng giao vận (Transport)

TCP là giao thức hướng liên kết (connection – oriented) UDP là giao thức không hướng liên kết (connectionless)

Page 7: BC LTM de in

4. IPv4

Giao thức Internet phiên bản 4 (IPv4) là phiên bản thứ tư trong quá trình phát triển của các giao thức Internet (IP). Đây là phiên bản đầu tiên của IP được sử dụng rộng rãi. IPv4 cùng với IPv6 (giao thức Internet phiên bản 6) là nòng cốt của giao tiếp internet. Hiện tại, IPv4 vẫn là giao thức được triển khai rộng rãi nhất trong bộ giao thức của lớp internet. Các giao thức IP chạy ở tầng liên mạng.

Giao thức này được công bố bởi IETF trong phiên bản RFC 791 (9 - 1981), thay cho phiên bản RFC 760 (công bố vào tháng 1 - 1980). Giao thức này cũng được chuẩn hóa bởi bộ quốc phòng Mỹ trong phiên bản MIL-STD-1777.

IPv4 là giao thức hướng dữ liệu, được sử dụng cho hệ thống chuyển mạch gói (tương tự như chuẩn mạng Ethernet). Đây là giao thức truyền dữ liêu hoạt động dựa trên nguyên tắc tốt nhất có thể, trong đó, nó không quan tâm đến thứ tự truyền gói tin cũng như không đảm bảo gói tin sẽ đến đích hay việc gây ra tình trạng lặp gói tin ở đích đến. Việc xử lý vấn đề này dành cho tầng trên của bộ giao thức TCP/IP. Nhưng IPv4 có cơ chế đảm bảo toàn vẹn dữ liệu = trường checksum.

Địa chỉ IPv4 Sử dụng 32 bit để đánh địa chỉ các máy tính trong mạng. Bao gồm: phần mạng và phần host. Số địa chỉ tối đa: 2^32 ~ 4,294,967,296. Dành riêng một vài dải đặc biệt không sử dụng. Chia thành bốn nhóm 8 bít (octet).

Page 8: BC LTM de in

Các lớp địa chỉ IPv4 Có năm lớp địa chỉ: A,B,C,D,E. Lớp A,B,C: trao đối thông tin thông thường. Lớp D: multicast Lớp E: để dành

Mặt nạ mạng Phân tách phần mạng và phần host trong địa chỉ IPv4. Sử dụng trong bộ định tuyến để tìm đường đi cho gói tin. Với mạng có dạng

Biểu diễn theo dạng /n n là số bit dành cho phần mạng. Thí dụ: 192.168.0.1/24

Biểu diễn dưới dạng nhị phân Dùng 32 bit đánh dấu, bít dành cho phần mạng là 1, cho phần host là 0.

Page 9: BC LTM de in

Thí dụ: 11111111.11111111.11111111.00000000 hay 255.255.255.0 Biểu diễn dưới dạng Hexa

Dùng số Hexa: 0xFFFFFF00 Ít dùng

Số lượng địa chỉ của mỗi mạng Mỗi mạng sẽ có n bit dành cho phần mạng, 32-n bit dành cho phần host. Phân phối địa chỉ trong mỗi mạng:

o 01 địa chỉ mạng (các bit phần host bằng 0).

o 01 địa chỉ quảng bá (các bit phần host bằng 1).

o 2^n - 2 địa chỉ gán cho các máy trạm (host).

5. TCP/IP Giao thức TCP: Transmission Control Protocol

o Giao thức lõi chạy ở tầng giao vận.

o Chạy bên dưới tầng ứng dụng và trên nền IP

o Cung cấp dịch vụ truyền dữ liệu theo dòng tin cậy giữa các ứng dụng.

o Được sử dụng bởi hầu hết các ứng dụng mạng.

o Chia dữ liệu thành các gói nhỏ, thêm thông tin kiểm soát và gửi trên

đường truyền. Lập trình mạng sẽ sử dụng giao thức này để trao đổi thông tin.

Cổng (Port)o Một số nguyên duy nhất trong khoảng 0-65535 tương ứng với một kết

nối của ứng dụng.o TCP sử dụng cổng để chuyển dữ liệu tới đúng ứng dụng hoặc dịch vụ.

o Một ứng dụng có thể mở nhiều kết nối => có thể sử dụng nhiều cổng.

o Một số cổng thông dụng: HTTP(80), FTP(21), SMTP(25), POP3(110),

HTTPS(443)... Đặc tính của TCP

o Hướng kết nối: connection oriented

Hai bên phải thiết lập kênh truyền trước khi truyền dữ liệu. Thực hiện bởi quá trình bắt tay ba bước (three ways handshake).

Page 10: BC LTM de in

o Truyền dữ liệu theo dòng (stream oriented): tự động phân chia dòng dữ

liệu thành các đoạn nhỏ để truyền đi, tự động ghép các đoạn nhỏ thành dòng dữ liệu và gửi trả ứng dụng.

o Đúng trật tự (ordering guarantee): dữ liệu gửi trước sẽ được nhận trước

o Tin cậy, chính xác: thông tin gửi đi sẽ được đảm bảo đến đích, không

thừa, sai sót...o Độ trễ lớn, khó đáp ứng được tính thời gian thực.

o Các đặc tính khác: QoS...

Header của TCP: Chứa thông tin về đoạn dữ liệu tương ứng

Rất nhiều dịch vụ chạy trên nền TCP: FTP(21), HTTP(80), SMTP(25), SSH(22), POP3(110), VNC(4899)...

PHẦN 2: FTP

I. GIỚI THIỆU

Mục tiêu của FTP là:

thúc đẩy sự chia sẻ file (chương trình máy tính và dữ liệu) truy cập từ xa bảo vệ người dùng trong các hệ thống file giữa các host trao đổi dữ liệu tin cậy và hiệu quả

Page 11: BC LTM de in

FTP có thể sử dụng trực tiếp từ người dùng hoặc thiết kế để sử dụng trong các chương trình FTP program

II. KHÁI QUÁT1. Một vài thuật ngữ

ASCII: tập kí tự định nghĩa trong ARPANET protocol. Trong FTP, ASCII được xác định là nửa dưới của bộ mã 8 bit (phần lớn các bit =0)

Access control (điều khiển truy cập): định nghĩa người dùng quyền truy cập để sử dụng hệ thống, truy cập file trong hệ thống ngăn ngừa người dùng bất hợp pháp hoặc vô tình truy cập vào hệ thống file cá nhân của người dùng khác. Đây là tiến trình của FTP – server.

Byte size: Có 2 byte size cần chú ý trong FTP: logical byte size của file và transfer byte size sử dụng để truyền data. Transfer byte size luôn là 8 bit (1byte), và không sử dụng để lưu trữ file trong hệ thống mà logical byte size làm nhiệm vụ này.

Control connection: Lien kết truyền thông giữa USER-PI và SERVER-PI để trao đổi thông tin của command và reply. Kết nối tuân theo giao thức TELNET

Data connection: Lien kết 2 hướng để truyền data qua nó với các chế độ và kiểu cụ thể. Có thể trao đổi 1 phần, 1 thực thể hay 1 nhóm của file. Có thể là lien kết giữa server-DTP với user-DTP hoặc giữa 2 server-DTP

Data port: Tiến trình truyền data bị động sẽ nghe trên 1 cổng cho kết nối chủ động từ 1 tiến trình truyền data chủ động để mở kết nối dữ liệu

DTP: Data transfer process: thiết lập và quản lí kết nối dữ liệu. có thể chủ động hay bị động

End-of-Line: EOL Chuỗi định nghĩa dấu phân cách của 1 dòng: carriage return + line feed (CRLF: \r\n)

EOF: End-of-File Là điều kiện để kết thúc việc truyền 1 file EOR: End-of-Record: Điều kiện để kết thúc 1 bản ghi (record) khi truyền

data. Error recovery: Thủ tục cho phép người dùng khôi phục lại từ 1 lỗi nào đó

trong khi thao tác với FTP server. Trong FTP, việc này cho phép 1 người dùng có thể truyền lại file từ 1 điểm khôi phục nào đó.

Page 12: BC LTM de in

FTP command: Tập các lệnh chứa thông tin điều khiển lưu lượng từ tiến trình user-FTP đến server-FTP

File: 1 tập có thứ tự các dữ liệ (gồm cả chương trình), kích thước tùy ý, có tên phân biệt với các file khác.

Mode: Chế độ mà data có thể truyền qua kết nối data, định nghĩa khuôn dạng dữ liệu trong quá trình truyền bao gồm cả EOR và EOF. Mô tả trong chương transmisstion mode

NVT: Network virtual terminal: định nghĩa trong Telnet-protocol NVFS: Network virtual file system: khái niệm định nghĩa 1 mạng lưới hệ

thống file cơ bản với các lệnh cơ bản và quy ước tên đường dẫn. Page: 1 file có thể cấu tạo như 1 tập của các phần riêng rẽ gọi là page

(trang). FTP hỗ trợ truyền file gián đoạn theo các trang được đánh số. Pathname: Định nghĩa tên đường dẫn là 1 chuỗi xâu kí tự, được user nhập

vào để nhận ra file. Pathname thường chứa tên ổ đĩa, và/hoặc tên thư mục, và filename cụ thể. Các hệ thống FTP khác nhau có thể có quy ước khác nhau với pathname

PI: Protocol interpreter: user PI và server PI đảm nhiệm vai trò khác nhau trong quá trình truyền command, file

Record: Chuỗi file có thể cấu tạo từ các phần liên tiếp nhau gọi là 1 record. Cấu trúc record được FTP hỗ trợ, nhưng file không cần theo cấu trúc này

Reply: Là 1 thông báo (xác nhận hoặc phủ nhận), gửi từ server đến user qua kết nối điều khiển, đáp lại các FTP command. Được quy định là mã có 3 số (dùng cho các chương trình FTP), theo sau bởi các xâu kí tự (thông báo trên giao diện người dùng)

Server DTP: Data transfer process: thường ở trạng thái chủ động (active), thiết lập kết nối điều khiển với 1 cổng data port được nghe. Thiết lập tham số cho việc truyền và lưu file. Khi ở trạng thái bị động (passive), nó sẽ nghe 1 data port.

Server FTP process: Tiến trình hoặc là 1 tập các tiến trình thực hiện các thủ tục truyền file cùng với user FTP process, và có thể với các server khác. Bao gồm server PI và server DTP.

Server PI: Server protocol interpreter: nghe trên 1 port L cho 1 kết nối từ user PI và thiết lập 1 kết nối điều khiển. Nó nhận các FTP command từ user PI, gửi lại reply và quản lí tiến trình user DTP

Page 13: BC LTM de in

Type: Kiểu dữ liệu điển hình cho việc truyền data và lưu trữ. Nó bao hàm sự chuyển đổi nào đó giữa việc truyền và lưu data. Được mô tả trong chương thiết lập kết nối dữ liệu

User: Người dùng hoặc 1 tiến trình thực hiện của 1 người dùng muốn sử dụng dịch vụ FTP.

User DTP: Data transfer process: nghe trên 1 cổng data cho 1 kết nối dữ liệu từ server FTP. Nếu 2 server trao đổi dữ liệu với nhau thì 1 trong 2 sẽ ở chế độ active

User DTP process: Tập các thủ tục gồm 1 PI, 1 DTP và 1 user interface (giao diện người dùng) cùng thực hiện thao tác truyền file với >= 1 server FTP process.

User PI: Khởi tạo 1 kết nối điều khiển từ cổng U của nó tới server FTP process. Khởi tạo FTP command và quản lí user DTP nếu nó là 1 phần của tiến trình FTP

Page 14: BC LTM de in

2. Mô hình FTP

Mô hình trên là mô hình cơ bản của FTP. Chú ý là kết nối dữ liệu không nhất thiết phải tồn tại mọi lúc.

Trong mô hình này, user PI khởi tạo 1 kết nối điều khiển theo giao thức Telnet. Sau khi tạo kết nối điều khiển, user PI phát sinh các FTP command cơ bản và truyền đến FTP server thông qua kết nối này. Các reply cơ bản sẽ được gửi từ server PI về cho user cũng qua kết nối điều khiển.

FTP command chỉ rõ tham số cho kết nối dữ liệu (data port, transfer mode, representation type, structure) và các thao tác tự nhiên với hệ thống file (store, retrieve, append, delete, vv…). User DTP sẽ nghe trên 1 data port cụ thể và server khởi tạo kết nối dữ liệu với các tham số phù hợp.

Một số tình huống, user lại muốn trao đổi file giữa 2 host, chứ không phải là với nó. Khi đó, user tạo kết nối điều khiển đến cả 2 server đó và sắp xếp 1 kết nối dữ liệu giữa chúng thông tin điều khiển từ 2 server sẽ đến user song dữ liệu lại truyền trực tiếp giữa 2 server mà không qua user

Page 15: BC LTM de in

Giao thức yêu cầu duy trì kết nối điều khiển trong khi trao đổi dữ liệu để lắng nghe xem user có yêu cầu ngừng truyền tải file không? Nếu có, server sẽ hủy bỏ thao tác. Server cũng sẽ hủy bỏ truyền tải dữ liệu nếu như kết nối điều khiển bị ngắt.

FTP sử dụng giao thức Telnet trong kết nối điều khiển, có 2 cách để thực hiện điều này: 1 là user PI và server PI phải cài đặt các quy tắc của Telnet trực tiếp trong các thủ tục của chúng. 2 là user PI và server PI có thể dùng 1 module Telnet trong hệ thống

III. PHƯƠNG THỨC TRUYỀN DỮ LIỆU

File chỉ được truyền qua kết nối dữ liệu. Kết nối điều khiển sử dụng cho truyền command (mô tả các lệnh sẽ thực hiện) và reply cho các command đó. 1 số command lien quan đến việc trao đổi file giữa 2 host. Các lệnh truyền file gồm:

MODE: chỉ rõ cách thức truyền các bit dữ liệu STRUCT và TYPE: định nghĩa các cấu trúc cho việc truyền dữ liệu

Về cơ bản các chế độ truyền và kiểu file không liên quan nhưng “Stream” mode lại phụ thuộc vào thuộc tính cấu trúc, nếu “Compressed” mode được sử dụng thì các byte chèn thêm vào phụ thuộc vào kiểu đại diện

1. Dữ liệu đại diện và dữ liệu lưu trữ

Dữ liệu được trao đổi từ 1 thiết bị lưu trữ trong host gửi đến thiết bị lưu trữ của host nhận. Thường thì có vài thao tác chuyển đổi dữ liệu vì có thể dữ liệu đại diện trên host gửi và host nhận là khác nhau.

Một vấn đề khác là khi ta truyền dữ liệu theo byte (không phải theo mã kí tự) giữa các host mà khác nhau về độ dài của word trở ngại khi sender gửi và receiver lưu dữ liệu. Ví dụ khi sender gửi 32-bit byte từ hệ thống 32-bit word sang hệ thống 36-bit word làm thế nào lưu được trên hệ thống 36 bit word length. Trong bất kì trường hợp nào, user sẽ có 1 tùy chọn cụ thể cho kiểu dữ liệu đai diện và thao tác biến đổi. FTP cung cấp khá hạn chế các kiểu dữ liệu đại diện việc chuyển kiểu sẽ thực hiện trực tiếp bởi user.

Page 16: BC LTM de in

a) Data type

Chuyển kiểu đại diện được thực hiện trực tiếp trên FTP bởi user. Kiểu có thể là ngầm định (ASCII) hoặc được chỉ rõ (1 kiểu Local byte của host gửi). Nhưng kích thước đơn vị dữ liệu được truyền luôn bằng 8-bit byte

ASCII type: là kiểu mặc định và phải được chấp nhận trên mọi cài đặt FTP. Sử dụng cho truyền các file văn bản, trừ khi 2 host tìm 1 EBCDIC code phù hợp hơn để truyền.Sender chuyển dữ liệu từ kiểu kí tự nội bộ sang kiều đại diện 8-bit NVT-ASCII. Bên nhận sẽ chuyển từ NVT-ASCII sang kiểu cục bộ của nó.Trong kiều NVT cơ bản, chuỗi <CRLF> sẽ dùng để chỉ ra EOL trong text. Sử dụng kiểu đại diện NVT-ASCII dữ liệu phải chuyển sang 8-bit byte.

EBCDIC type: nhằm cho việc trao đổi dữ liệu hiệu quả hơn giữa 2 host sử dụng EBCDIC cho các kiểu kí tự riêng của chúng. Để truyền file, dữ liệu đại diện là kí tự 8-bit EBCDIC. Mã kí tự chỉ khác thao tác cụ thể của EBCDIC và ASCII. EOL (khác với EOR) sẽ hiếm khi sử dụng trong EBCDIC cho mục đích chỉ rõ structure, nhưng nó sẽ cần kí tự new line <NL>

IMAGE type: dữ liệu được gửi như các bít liền kề, được gói trong 8-bit byte để truyền. Bên nhận sẽ lưu dữ liệu như các bit liên tiếp nhau. Cấu trúc của hệ thống lưu sẽ phải cần đệm vào dữ liệu (cho bằng 1 byte, word hay block). Các bit đệm vào là 0, điều này chỉ xảy ra đối với EOF, hoặc EOR. phải có cách để nhận biết các byte padding này và tách chúng ra khỏi dữ liệu nhận được, ghép lại thành dữ liệu hoàn chỉnh chuyển đổi padding phải được công khai để người dùng có thể xử lí file.ImageType được dùng để lưu có hiệu quả và lấy về bằng cách trao đổi các dữ liệu nhị phân. được mọi cài đặt FTP chấp nhận.

LOCAL type: dữ liệu được trao đổi với kích thước các byte logic cụ thể chỉ ra trong tham số thứ 2, Byte size. Giá trị của byte size là 1 số nguyên, và không có giá trị mặc định. Logical byte size không cần thiết cho kích thước gói truyền (do luôn là 8-bit byte). Nếu có 1 giá trị khác của byte size, logical byte sẽ gói dữ liệu liên tiếp có thể truyền các bit padding như nói trên.

Page 17: BC LTM de in

Khi nhận dữ liệu, receiver sẽ chuyển lại dữ liệu phụ thuộc vào logical byte size và đặc thù của host. Thứ tự chuyển sẽ ngược lại với sender

FORMAT CONTROL:

Cả ASCII và EBCDIC cũng có 1 tham số thứ 2 (tùy chọn), chỉ ra định dạng điều khiển nếu có, gắn với 1 file. Các kiểu đại diện sau được định nghĩa: 1file kí tự có thể tuyền đến 1 host cho 1 trong 3 mục đích: hiển thị (printing), lưu trữ & lấy lại sau (store & retrieval), và cho xử lí (processing). Nếu file truyền cho việc hiển thị, receiver phải hiểu ra định dạng điều khiển đại diện. Trường hợp thứ 2, nó phải có thể lưu file trên host rồi lấy lại sau với cùng định dạng. Cuối cùng, nó phải chuyển file từ 1 host đến host khác và xử lí file tại host thứ 2.

NON PRINT: là định dạng mặc định sử dung nếu tham số thứ 2 bị bỏ qua. Được mọi cài đặt FTP chấp nhận. file không cần chứa thông tin định dạng. Nếu file qua 1 tiến trình xử lí in, tiến trình này sẽ bỏ qua. Định dạng này sử dụng cho các file lưu trữ hoặc xử lí

TELNET FORMAT CONTROL: file chứa các ASCII / EBCDIC format control (<CR>,<LF>,<NL>,<VT>,<FF>, …) mà printer sẽ xử lí phù hợp. <CRLF> để xác định End-of-Line.

CARIAGE CONTROL (ASA): file chứa các kí tự định dạng điều khiển ASA (FORTRAN). Trong một dòng của record format tùy theo kiểu ASA, kí tự đầu tiên sẽ không được in. Thay vì vậy, nó sẽ sử dụng để xác định chuyển động lên xuống của trang giấy (vd ms word) diễn ra trước khi in phần còn lại của bản ghi. 1 số kí tự của ASA:

Blank chuyển tờ lên 1 dòng0 chuyển tờ lên 2 dòng1 chuyển tờ lên đầu của tờ tiếp theo

+ không di chuyển (vd: in chèn lên)

Rõ rang phải có 1 cách để tiến trình in phát hiện EOR. Nếu 1 file có record structure, nó sẽ không có vấn đề. Record sẽ được đánh dấu trong khoảng thời gian truyền, <CRLF> EOL sử dụng để phân biệt các dòng được in, nhưng nó sẽ bị ghi đè bởi ASA

Page 18: BC LTM de in

b) DATA STRUCTURES

Khi thêm các kiểu đại diện khác, FTP cho phép cấu trúc 1 file cụ thể. Có 3 kiểu cấu trúc sau được định nghĩa trên FTP:

File structure: file không có các cấu trúc con và được xem như chuỗi byte liên tiếp

Record structure: file tạo từ các chuỗi các record (bản ghi) Page structure: file tạo từ các trang (page) riêng biệt, được đánh chỉ số

File structure là giá trị mặc định nếu user không sử dụng lệnh STRU (structure command), cả file & record structure phải chấp nhận kiểu text file trong mọi cài đặt FTP. Cấu trúc file ảnh hưởng đến cả chế độ truyền, chuyển, và lưu file.

Cấu trúc tự nhiên của file sẽ phụ thuộc vào host lưu nó. 1 source-file sẽ thường lưu trên 1 IBM Mainframe trong 1 bản ghi có độ dài cố định nhưng trong DEC TOPS-20 lại lưu như là 1 luồng kí tự chia thành các dòng bởi <CRLF>. Nếu truyền file giữa 2 site là hữu ích, phải có cách để 1 site nhận ra site còn lại đang giữ file

File structure: được đặt mặc định nếu như STRU (structure command) không được dùng. Trong file structure, không có cấu trúc bên trong và file được xem như là các chuỗi data byte liên tiếp

Record structure: kiểu này phải được chấp nhận cho text file (vd với ASCII và EBCDIC) bởi mọi cài đặt FTP. File được tạo thành từ chuỗi các record

Page structure: dùng khi FTP muốn truyền file 1 cách gián đoạn. Trong cấu trúc này, file được xem như là các file truy cập ngẫu nhiên. Thỉnh thoảng trong file sẽ xuất hiện vài thông tin liên kết với file như nói chung (vd 1 thông tin file), hoặc với 1 đoạn của file (vd truy cập điều khiển trang – page access control), hoặc cả 2. Trong FTP, đoạn của file gọi là page.Để cung cấp các page với kích thước khác nhau và các thông tin liên kết, mỗi page được gửi cùng với 1 page header. 1 page header có các trường:

Header length: số byte trong 1 header bao gồm cả nó. Tối thiểu là 4 Page index: đánh dấu chỉ số page của nó trong file. Nó không phải là

chuỗi thứ tự truyền file, nhưng nó dùng để định danh 1 page trong file Data length: số logical byte của data kèm theo. Tối thiểu là 0 Page type: kiểu page. Có các kiểu sau được định nghĩa:

Page 19: BC LTM de in

o 0 = Last page: dùng để định danh page cuối trong các page truyền.

Header length phải =4 và data length phải =0o 1 = Simple page: chỉ các page bình thường và không có các thông

tin điều khiển. header length phải bằng 4o 2 = descriptor page: sử dụng để truyền các thông tin đặc tả file

o 3 = access controlled page: bao gồm 1 trường phụ cho page file với

thông tin mức điều khiển truy cập. header length phải = 5 Optional Fields: dùng để hỗ trợ cho mỗi thông tin điều khiển page, vd

cho thông tin điều khiển truy cậpMọi trường đều là 1 logical byte. Logical byte size được đặt cụ thể trong command TYPE.

2. Thiết lập kết nối dữ liệu

Kĩ thuật truyền dữ liệu gồm: thiết lập 1 kết nối dữ liệu đến 1 cổng thích hợp và chọn tham số cho truyền. Cả USER và SERVER-DTP đều có cổng mặc định. User-process có cổng mặc định là cổng cho kết nối điều khiển (U). Server-process có cổng mặc định là cổng liền kề với cổng kết nối điều khiển (giá trị là L-1)

1 transfer byte là 8-bit byte. Kích thước này chỉ phù hợp với việc truyền dữ liệu, không hiệu quả khi biểu diễn dữ liệu trong phạm vi 1 hệ thống file của 1 host.

Tiến trình truyền file thụ động (có thể là user DTP hoặc 1 server DTP thứ 2), sẽ nghe trên 1 data port trước khi gửi request command. FTP request command xác định hướng truyền dữ liệu. Server nhận request sẽ tạo 1 kết nối dữ liệu đến port. Khi thiết lập xong kết nối, dữ liệu cho truyền đã sẵn sàng thì server PI sẽ gửi 1 reply xác nhận đến user PI

Mọi cài đặt của FTP phải hỗ trợ sử dụng cổng mặc định, và chỉ user PI có thể khởi tạo thay đổi cho port mặc định. Khi đó user sử dụng command PORT, user có thể muốn lấy lại file hoặc đưa file sang 1 host khác. Trường hợp 2: user PI sẽ tạo cả 2 kết nối điều khiển đến cả 2 server PI, 1 server PI sẽ cho user PI biết port nó nghe kết nối, và server PI còn lại sẽ tạo kết nối đến port đó với các tham số được user PI gửi đến, sau đó cả 2 server sẽ truyền file qua kết nối riêng của chúng. Trình tự các command và reply gửi giữa user và server được nói trong chương FTP reply

Page 20: BC LTM de in

Nói chung server chịu trách nhiệm duy trì kết nối dữ liệu: khởi tạo và hủy nó. Trừ khi user DTP gửi dữ liệu trong chế độ truyền yêu cầu kết nối đóng để tạo EOF. Server phải đóng kết nối dữ liệu trong các điều kiện sau:

Server đã gửi xong data trong transfer mode yêu cầu đóng kết nối để tạo EOF

Server nhận 1 command ABORT từ user Port được thay đổi bởi command từ user Kết nối điều khiển bị đóng 1 lỗi không thể khôi phục xảy ra

Khi đóng kết nối data, server phải tạo 1 reply với mã 250 hoặc 226 đến user

3. Quản lí kết nối dữ liệu

Để dùng 1 cổng nghe dữ liệu không mặc định: user PI phải chỉ rõ 1 cổng khác bằng lệnh PORT. Ngược lại dùng PASV. Khi kết nối được tạo giữa 2 địa chỉ, nó vẫn cho phép thực hiện cả 2 lệnh trên để thay đổi port mới trên cả 2 điểm kết nối

Dùng lại kết nối dữ liệu: khi dùng stream mode để truyền dữ liệu, EOF phải được tạo khi đóng kết nối vấn đề nếu có nhiều file được truyền trong cùng 1 phiên, TCP không cho phép dùng lại kết nối trong 1 khoảng thời gian để đảm bảo tính tin cậy khi truyền thông kết nối sẽ không được mở lại ngay. Có 2 cách giải quyết là: 1 là dùng 1 non-defaul port, 2 là dùng chế độ truyền khác.

Chú ý là stream transfer mode vốn đã không tin cậy, khi chúng xác định kết nối đóng sớm hay không. Các chế độ truyền khác (block, compressed) không đóng kết nối để tạo EOF, mà nó phân tích dữ liệu nhận được để xem đã đến EOF chưa.

4. Transmission modes

Có 3 chế độ: 1 định dạng dữ liệu và cho phép khởi tạo lại thủ tục, 1 nén dữ liệu cho việc truyền data hiệu quả hơn, và 1 sẽ truyền dữ liệu với với tiến trình nhỏ hoặc không cần tiến trình. Trong trường hợp cuối, mode tác động với thuộc tính cấu trúc để xác nhận kiểu tiến trình. Trong chế độ nén, kiểu đại diện xác nhận byte làm đầy.

Page 21: BC LTM de in

Mọi dữ liệu truyền phải kết thúc với EOF, có thể định trực tiếp hoặc gián tiếp qua việc đóng kết nối data. Với file có cấu trúc record, mọi EOR được đánh dấu rõ ràng. Trong file với cấu trúc page, “last-page” sẽ được sử dụng để kết thúc truyền

Với mục đích là chuẩn hóa việc truyền file, sender sẽ chuyển EOL hoặc EOR của nó thành kiểu đại diện tương ứng với chế độ truyền và file structure, bên nhận sẽ chuyển ngược lại dữ liệu sang kiểu nội bộ của nó.

a) STREAM mode

Data được truyền như dòng các byte. Chế độ này không hạn chế kiểu đại diện, kể cả record structure.

Trong record structure, EOR và EOF sẽ được biểu diễn bằng 2 byte điều khiển. Byte đầu sẽ là toàn số 1 (kí tự ESC). Byte thứ 2 sẽ dùng các bít thấp nhất để biểu diễn EOR (00000001) và bit thứ 2 để biển diễn EOF (00000010). Nếu cùng chỉ ra cả EOR và EOF trong record thì sẽ dùng cả 2 bit này (00000011). Nếu 1 byte gồm toàn số 1 được dùng để gửi như dữ liệu thì nó sẽ được lặp lại trong byte thứ 2 của control code.

Nếu cấu trúc là file structure, EOF tương ứng việc host gửi sẽ đóng kết nối dữ liệu

b) BLOCK mode

File được truyền như chuỗi các khối (block) dữ liệu theo trước bởi >= 1 header byte. Header byte chứa 1 trường count, và mã đặc tả (descriptor). Count chỉ ra tổng độ dài của block, như vậy đánh dấu điểm đầu của các khối dữ liệu sau (không có bit padding). Descriptor định nghĩa: block cuối của file (EOF) hay của record (EOR), đánh dấu điểm restart, hoặc các bit khả nghi (không dùng trong bảo mật, mà dùng để truyền thông tin khẩn cấp). Record structure sẽ được dùng được mọi chế độ chấp nhận, mọi kiểu đại diện có thể sử dụng.

Header gồm 3 byte (24 bit). 16 bit thấp = byte count, 8 bit cao = descriptor

Descriptor8 bit

Byte count16-bit

Descriptor code chỉ ra bởi bit cờ trong descriptor byte. Có các giá trị:

Page 22: BC LTM de in

128: EOR 64: EOF 32: lỗi khả nghi trong data block 16: block này là restart marker (điểm khôi phục)

Có thể có nhiều hơn 1 trạng thái descriptor code có thể tồn tại trong 1 block. Restart marker được nhúng trong luồng dữ liệu như 1 số nguyên 8-bit byte, tượng trưng cho 1 kí tự hiển thị trong ngôn ngữ truyền qua kết nối điều khiển (vd NVT-ASCII). <SP> - space không được dùng trong restart marker. VD:

c) COMPRESS mode

Có 3 kiểu thông tin được gửi: dữ liệu thông thường – gửi trong 1 byte string; dữ liệu nén – gồm bản sao của nó và các bit đệm; và thông tin điều khiển – gửi trong 1 chuỗi 2 byte ESC. Nếu n>0 byte (<=127) của các thông tin được gửi, có n byte sau nó là dữ liệu, byte đầu tiên có bit trái nhất là 0 và 7 bit còn lại đặt giá trị là n.

Page 23: BC LTM de in

Để nén chuỗi n bản sao của byte dữ liệu d, 2 byte sau được gửi:

1 chuỗi của n byte đệm có thể nén trong 1 byte duy nhất. byte đệm có thể khác nhau với các kiểu khác nhau: ASCII và EBCDIC là <SP>, Image Type là byte 0.

Chuỗi ESC là cặp byte, byte đầu là byte ESC (các bit là 0) và byte thứ 2 chứa mã đặc tả như định nghĩa trong Block mode. Descriptor này có cùng nghĩa với Block mode và dùng để kết xâu kí tự.

Chế độ này giúp cho việc truyền file hiệu quả hơn và sử dụng ít tài nguyền mạng

5. Khôi phục lỗi và khởi tạo lại

FTP không có cơ chế phát hiện việc mất bit hoặc sự hỗn độn của dữ liệu nhận được, điều này do TCP xử lí. Nhưng nó cần có thủ tục khởi tạo lại việc truyền file từ thời điểm bị lỗi cho user.

Restart: chỉ dành cho BLOCK và COMPRESS mode. Nó yêu cầu seder chèn 1 mã đánh dấu vào luồng dữ liệu với 1 vài thông tin đánh dấu. Thông tin này chỉ cho sender, nhưng phải gồm các kí tự hiển thị được của kết nối điều khiển. Marker có thể đánh dấu bit-count, record-count hoặc bất kì thông tin nào khác để hệ thống có thể nhận ra điểm đánh dấu dữ liệu. Bên nhận, nếu có 1 thủ tục restart sẽ đánh dấu những điểm tương ứng với các marker, và trả về thông tin cho user. Khi đó, user có thể truyền lại data tại điểm restart được đánh dấu bằng thủ tục restart.

Page 24: BC LTM de in

IV. PHƯƠNG THỨC TRUYỀN FILE

Giao tiếp vật lí từ user PI đến server PI được thiết lập như TCP từ user đến 1 cổng của server. User PI chịu trách nhiệm gửi lệnh FTP và đọc reply gửi từ server trả về, server PI gửi reply và điều khiển server DTP để tạo 1 kết nối dữ liệu và truyền data. Nếu bên thứ 2 của kết nối dữ liệu là user DTP, thì nó sẽ chịu quản lí của user FTP. Nếu là server DTP, nó sẽ chịu quản lí bởi các command từ user FTP gửi đến.

1. FTP commandsa) Lệnh truy cập điều khiển - Access control commands

Các lệnh sau được chỉ rõ định danh trong dấu ngoặc đơn

USER NAME (USER)

Tham số là Telnet string, để định danh user. Server cần user xác thực 1 tải khoản để có thể truy cập tới hệ thống file. Đây thường là commands đẩu tiên trao đổi giữa user và server sau khi thiết lập kết nối điều khiển. Có thể kèm theo thông tin về password và/hoặc account. Server có thể chấp nhận 1 lệnh USER mới để có thể thay đổi điều khiển truy cập và/hoặc thông tin tài khoản có tác dụng loại bỏ thông tin về người dùng trước đó và bắt đầu lại trình tự đăng nhập.

PASSWORD (PASS)

Đối số là 1 Telnet string, chỉ rõ mật khẩu của user, phải lập tức theo sau lệnh USER, để hoàn thành đăng nhập (1 số server yêu cầu thêm account).

ACCOUNT (ACCT)

Tham số của lệnh acct là chuỗi Telnet string, chỉ rõ tài khoản của user. Command này không cần liên quan đến USER command, nhưng 1 vài server có thể yêu cầu thông tin này để hoàn thành đăng nhập, một số khác cần thông tin này để user có thể lưu file trên server (khi đó command này có thể xảy ra bất kì lúc nào).Có 1 số kiểu reply lại command này: khi thông tin account cần cho đăng nhập, reply sẽ có mã 332 – hoàn thành lệnh PASS. Mặt khác, nếu

Page 25: BC LTM de in

account không cần cho việc đăng nhập, reply có mã là 230 – hoàn thành đăng nhập. Nếu thông tin này cần cho các thao tác truy cập thì nó sẽ trả về mã 332 hoặc 532, phụ thuộc liệu nó sẽ lưu hoặc hủy command.

CHANGE WORKING DIRECTORY (CWD)

Cho phép user thay đổi thư mục / dữ liệu thao tác hiện tại mà không ảnh hưởng đến thông tin đăng nhập. Thông số truyền là không đổi. Đối số của lệnh này là 1 đường dẫn cụ thể hoặc trên hệ thống khác tùy vào nhóm file

CHANGE TO PARENT DIRECTORY (CDUP)

Là 1 trường hợp cụ thể của lệnh CWD, cho phép trở lại thư mục cha của thư mục hiện tại. Mã reply trả về là mã reply của CWD command

STRUCTURE MOUNT (SMNT)

Cho phép user gắn 1 cấu trúc hệ thống file khác mà không làm thay đổi thông tin đăng nhập. Thông số truyền là không thay đổi. Đối số của lệnh là đường dẫn cụ thể của thư mục hoặc hệ thống file khác tùy nhóm file

REINITIALIZE (REIN)

Lệnh này hủy USER, làm sạch mọi I/O và thông tin account, ngoại trừ cho phép bất kì tiến trình trao đổi nào hoàn thành. Mọi tham số được reset về giá trị mặc định và mở lại kết nối điều khiển. Ngay sau đó có 1 yêu cầu xác thực tài khoản (bằng lệnh USER)

LOGOUT (QUIT)

Lệnh này hủy USER. Nếu file truyền không trong một tiến trình, server đóng kết nối điều khiển. Nếu file đang trong quá trình truyền, kết nối sẽ vẫn mở cho kết quả trả về và server sẽ đóng nó sau. Nếu user PI trao đổi file cho vài USER nhưng không muốn đóng và mở lại kết nỗi cho mỗi user thì sử dụng lệnh REIN thay vì QUIT. Nếu vô tình đóng kết nối điều khiển => là nguyên nhân của hiệu ứng abort (ABOR) và logout (QUIT)

Page 26: BC LTM de in

b) Cấu hình tham số khi truyền - Transfer parameter command

Mọi tham số truyền dữ liệu có 1 giá trị mặc định, và lệnh chỉ rõ thông số truyền được yêu cầu chỉ khi giá trị mặc định cần thay đổi. Giá trị mặc định sẽ là giá trị của lần trước được sử dụng, nếu không có thì nó sẽ dùng giá trị mặc định của server. Như vậy server phải nhớ được giá trị phù hợp. Lệnh có thể ở bất kì trình tự nào, ngoại trừ nó phải đi trước các FTP service request.

DATA PORT (PORT)

Đối số có dạng là HOST-PORT cụ thể cho data port để dùng cho kết nối dữ liệu. nếu lệnh không dùng thì giá trị mặc định cho cả user và server sẽ được dùng. Nếu lệnh được dùng, đối số sẽ là chuỗi 32-bit host address và 16-bit TCP port. Chúng sẽ được chia thành các trường 8 bit, mỗi trường là 1 số nguyên (từ 0 đến 255).Ví dụ: PORT h1,h2,h3,h4,p1,p2 IP: h1.h2.h3.h4, Port: p1 = 8 bit cao, p2 = 8 bit thấp

PASSIVE (PASV)

Lệnh này yêu cầu server DTP nghe trên 1 port (không phải là port mặc dịnh) và chờ cho 1 kết nối đến port đó chứ không phải là tạo 1 kết nối dữ liệu đến user. Trong reply lại lệnh này sẽ chứa host IP và port mà server đang nghe trên đó

REPRESENTATION TYPE (TYPE)

Đối số chỉ rõ kiểu đại diện được mô tả trong chương Data Representation & Store. Vài kiểu có 1 đối số thứ 2. Tham số thứ nhất chỉ ra bởi 1 kí tự Telnet. Tham số thứ 2 sẽ là 1 kí tự cho kiểu ASCII và EBCDIC, hoặc là 1 số nguyên hệ 10 chỉ rõ kích cỡ byte. Các tham số cách nhau bởi dấu cách <SP> (ASCII code=32). Mặc định của kiểu đại diện là ASCII Non-print.

Page 27: BC LTM de in

FILE STRUCTURE (STRU)

Đối số là 1 kí tự Telnet, chỉ rõ cấu trúc file mô tả trong chương Data Representation & Store. Có các cấu trúc sau (mặc định là kiểu File):

TRANSFER MODE (MODE)

Tham số là 1 kí tự Telnet chỉ rõ chế độ truyền file mô tả trong chương Section on Transmission Modes. Có các chế độ sau (mặc định = Stream)

c) Lệnh sử dụng dịch vụ của FTP - FTP service commands

Định nghĩa truyền file hoặc hàm yêu cầu file của user. Đối số của lệnh này sẽ thường là đường dẫn thư mục/tệp. Cấu trúc của đường dẫn phải đúng với quy ước của server và ngôn ngữ dùng trong kết nối điều khiển. giá trị mặc định có thể là giá trị đường dẫn dùng trước đó, hoặc thư mục gốc của user. Trình tự các command này là bất kì ngoại trừ “rename from” phải lập tức theo sau bởi “rename to” command và “restart” command phải lập tức theo sau bởi “interrupted service command”. Dữ liệu truyền luôn qua kết nối dữ liệu trừ 1 số thông tin nào đó.

RETRIEVE (RETR)

Cho phép server truyền 1 bản sao của file chỉ rõ trong pathname đến user DTP qua kết nối dữ liệu. Trạng thái, nội dung file trên server không bị thay đổi

STORE (STOR)

Lệnh này cho phép server DTP chấp nhận dữ liệu truyền qua kết nối dữ liệu và lưu nó vào hệ thống dữ liệu của server. Nếu file chỉ trong pathname đã tồn tại, nội dung của nó sẽ bị thay bởi nội dung file được gửi. Nếu file chưa tồn tại, server sẽ tạo 1 file mới:

Page 28: BC LTM de in

STORE UNIQUE (STOU)

Cũng như STORE, ngoại trừ kết quả file được tạo trong thư mục hiện thời dưới 1 tên duy nhất. reply có mã 250 kèm theo tên file được tạo

APPEND (APPE)

Cho phép server chấp nhận trao đổi dữ liệu qua kết nỗi dữ liệu và lưu dữ liệu trong 1 file tại server. Nếu file chỉ trong pathname tồn tại trên server, dữ liệu sẽ được thêm vào file đó, ngược lại sẽ tạo file mới trên server.

ALLOCATE (ALLO)

Lệnh này có thể được yêu cầu bởi vài server để đặt trước 1 không gian lưu trữ đủ để cho file mới được truyền đến. đối số là số nguyên đại diện cho số byte (dùng cho logical byte size). Với file gửi theo kiểu record hoặc page structure, 1 max record hoặc max page sẽ cần thiết – được chỉ trong đối số thứ 2 của lệnh, đối số này là tùy chọn, nhưng khi có sẽ được ngăn với đối số thứ 1 bằng 3 kí tự Telnet: <SP>R<SP>. Lệnh này theo sau bởi STOR hoặc APPE command. ALLO command sẽ trả về như 1 NOOP (no operation) khi server không yêu cầu kích thước tối đa cho file mà chỉ quan tâm đến max record / page thì nó sẽ chấp nhận 1 giá trị giả ở đối số thứ 1 và bỏ qua nó.

RESTART (REST)

Đối số của lệnh này đại diện cho điểm đánh dấu file để bắt đầu lại việc truyền file. Nó không là nguyên nhân để truyền file nhưng có thề truyền luôn tại điểm đánh dấu mà không cần truyền lại file từ đầu. Lệnh này ngay lập tức theo sau bởi 1 FTP service command để truyền file

RENAME FROM (RNFR)

Chỉ rõ tên đường dẫn cũ của file để đổi tên. Phải lập tức theo sau bởi lệnh “rename to” chỉ rõ tên đường dẫn mới

RENAME TO (RNTO)

Chỉ rõ tên đường dẫn mới của file cụ thể trong lệnh RNFR. Cả 2 lệnh này là nguyên nhân thay đổi tên file

Page 29: BC LTM de in

ABORT (ABOR)

Lệnh này nói cho server để hủy bỏ FTP service command trước đó và mọi liên kết truyền dữ liệu. Lệnh này có thể cần đến 1 hoạt động đặc biệt như đã nói ở chương FTP commands, để server có thể nhận ra. Không hoạt động nào được tiếp nhận nếu lệnh này trước đó đã thực thi xong, kể cả truyền data. Kết nối điều khiển không đóng, nhưng kết nối dữ liệu sẽ bị đóng.Có 2 trường hợp cho server khi nhận được lệnh ABOR:

1 là FTP service command đã được hoàn thành: server chỉ việc đóng kết nối dữ liệu nếu nó mở và trả về mã 226 reply chỉ ra abort command đã hoàn thành

2 là FTP service command vẫn đang chạy: server sẽ hủy FTP service command và đóng kết nối dữ liệu, trả về mã 426 reply để chỉ ra service request đã bị hủy đột ngột, rồi gửi tiếp 226 reply để chỉ rằng ABOR command đã thành công

DELETE (DELE)

Làm cho 1 file cụ thể trong đường dẫn bị xóa trên server.

REMOVE DIRECTORY (RMD)

Xóa 1 thư mục chỉ trong đường dẫn (nếu đường dẫn là tuyệt đối) hoặc xóa thư mục con của thư mục hiện thời (nếu đường dẫn là tương đối)

MAKE DIRECTORY (MKD)

Tạo 1 thư mục mới có tên trong đường dẫn (nếu đường dẫn là tuyệt đối) và tạo ra thư mục con của thư mục hiện tại (nếu đường dẫn là tương đối)

PRINT WORKING DIRECTORY (PWD)

Trả về tên của thư mục đang làm việc

LIST (LIST)

Server nhận lệnh này sẽ gửi 1 danh sách đến user. Nếu đường dẫn chỉ rõ 1 thư mục hoặc một nhóm file cụ thể, server sẽ gửi danh sách các file trong thư mục đó. Nếu đường dẫn chỉ rõ 1 file thì server sẽ gửi thông tin

Page 30: BC LTM de in

hiện tại của file. Nếu đối số là NULL thì ám chỉ đến thư mục hiện tại. Data truyền qua kết nối dữ liệu theo kiểu ASCII hoặc EBCDIC (user đảm bảo là kiểu tương ứng).Có thể đòi hỏi nhiều thời gian.

NAME LIST (NLST)

Liệt kê 1 danh sách thư mục và trả lại cho user. Đường dẫn sẽ là 1 thư mục cụ thể hoặc 1 hệ thống nhóm file cụ thể khác. Nếu tham số là NULL sẽ ám chỉ thư mục hiện tại. server sẽ trả về luồng tên file hoặc thông tin khác. Dữ liệu sẽ truyền ở kiểu ASCII hoặc EBCDIC, qua kết nối dữ liệu như 1 đường dẫn hợp lệ ngăn cách nhau bởi <CRLF> hoặc <NL> (user phải đảm bảo đúng kiểu tương ứng). Sử dụng lệnh này có mục đích cho việc xử lí file tự động, vd: hàm “multiple get”: lấy cùng lúc nhiều file

SITE PARAMETERS (SITE)

Sử dụng bởi server để cung cấp dịch vụ cụ thể đến hệ thống file của nó cho truyền file nhưng không đủ để tác động toàn bộ bao gồm các command trong giao thức. có thể dùng lệnh HELP SITE để biết rõ

SYSTEM (SYST)

Tìm thông tin OS của server.

STATUS (STAT)

Lệnh sẽ làm server trả về trạng thái, qua kết nối điều khiển trong 1 khuôn dạng của reply. Lệnh này có thể gửi cả trong quá trình truyền file, khi đó server sẽ trả về trạng thái thực thi của các tiến trình hiện tại hoặc thông tin 1 file (nếu có đối số là 1 đường dẫn, lúc này lệnh giống với LIST chỉ khác là LIST có respond qua kết nối dữ liệu). Nếu 1 phần đường dẫn được gửi, server sẽ trả về 1 danh sách tên file hoặc thuộc tính liên kết

HELP (HELP)

Server sẽ đáp lại lệnh này các thông tin hữu ích về các vấn đề cần chú ý của user, qua kết nối điều khiển đến user. Command này có thể có đối số như tên của các command khác, và trả về nhiều thông tin cụ thể. Reply có mã 211 hoặc 214. Được chấp nhận trước cả lệnh USER.

Page 31: BC LTM de in

NOOP (NOOP)

Không ảnh hưởng gì đến các tham số hoặc các lệnh trước đó. Nó chỉ là 1 hoạt động server gửi 1 OK reply

FTP command là chuỗi Telnet string, kết thúc bởi Telnet EOL. Mã lệnh là các kí tự alphabetic kết thúc bởi kí tự <SP> nếu có tham số theo sau, nếu không thì kết thúc bằng Telnet EOL. Mã lệnh và ý nghĩa của chúng được mô tả sau, cùng với các chi tiết về reply tương ứng và trình tự của các command & reply.

Có thể chia FTP command theo định danh, tham số truyền dữ liệu hoặc các FTP service request. Vài command (vd ABOR, STAT, QUIT…) có thể gửi qua kết nối điều khiển trong khi truyền dữ liệu. Vài server có thể không giám sát cả kết nối điều khiển và dữ liệu đồng thời có vài hoạt động đặc thù sẽ cần để server sẽ giám sát chúng, như thứ tự sau:

(1)User chèn tín hiệu Telnet “Interrupt Process” (IP) trong luồng Telnet(2)User gửi tín hiệu Telnet “Synch”(3)User chèn lệnh (vd ABOR) trong luồng Telnet stream(4)Server PI, sau khi nhận “IP”, sẽ quét luồng Telnet stream để xác thực 1

FTP command

2. FTP reply

Reply lại các FTP command được đề ra để đảm bảo đồng bộ các yêu cầu và hoạt dộng trong xử lí truyền file, và đảm bảo user luôn biết trạng thái của server. Mọi command phải phát sinh tối thiểu 1 reply (có thể nhiều hơn 1 reply cho 1 command, các reply phải được phân biệt). 1 số command đi theo nhóm (vd USER, PASS, ACCT hoặc RNFR, RNTO). Reply hiển thị sự tồn tại của 1 trạng thái trung gian nếu mọi command trước đó đã hoàn tất. Lỗi tại 1 điểm trong trình tự sẽ yêu cầu lặp lại toàn bộ trình tự từ đầu

1 FTP reply gồm 1 bộ 3 số (truyền dưới dạng 3 kí tự alphanumeric) theo sau bởi các đoạn text. Bộ 3 số này dùng để các hệ thống nhận ra trạng thái hiện tại để đến trạng thái tiếp theo, còn text dùng trong giao diện để tương tác với người dùng. Về bản chất chỉ cần có bộ 3 số này là đủ, text kèm theo thì user PI có thể hủy bỏ nó

Page 32: BC LTM de in

hoặc chuyển đến user một cách thích hợp. Text có thể khác nhau với các máy chủ khác nhau. Cấu trúc của 1 reply:

xxx <SP> <Text>

trong đó xxx là bộ mã 3 số, <SP> là dấu cách, <text> là 1 dòng văn bản tùy chọn của mỗi server. Kết thúc bằng Telnet EOL. Có cả trường hợp text dài quá giới hạn của 1 dòng. Khi đó cần có 1 khuôn dạng đặc thù cho dòng đầu tiên để chỉ ra có nhiều hơn 1 dòng sẽ đến, cho đến khi gặp dòng cuối cùng. Ít nhất trong chúng phải có chứa 1 mã thích hợp để chỉ ra trạng thái của giao dịch. Dòng lệnh đầu tiên và cuối cùng có cùng mã.

Ví dụ về multiple line reply: dòng lệnh đầu tiên, theo sau bộ 3 số là dấu “-”, rồi đến text. Dòng cuối cùng có cùng mã như dòng đầu tiên, theo sau bởi <SP>, rồi đến text, kết thúc bởi Telnet EOL.

User process có thể chỉ cần biết dòng đầu tiên và cuối cùng, nó sẽ tìm dòng có cùng mã với dòng đầu tiên, theo sau bởi dấu cách. Với những dòng trung gian mà có mã reply thì phải đệm vào trước bộ 3 mã để tránh xung đột trong xử lí bên user.

3 số trong reply có ý nghĩa đặc biệt, nhằm cho phép phạm vi các đáp ứng từ đơn giản đến phức tạp. Số đầu tiên chỉ reply phản hồi là tốt, tồi hay còn thiếu. 1 user process sẽ xác định được hoạt động tiếp theo (theo kế hoạch, quay lại, giảm bớt, ..) bằng cách xem xét số thứ nhất. Nếu muốn biết được lỗi cụ thể xảy ra thì có thể xem số thứ 2, số thứ 3 dự trù cho việc phân cấp thông tin 1 cách tốt nhất (vd: RNTO command mà không có RNFR trước đó).

Có 5 giá trị của số đầu tiên trong reply code (giá trị thứ 6 cho protect reply – RFC 2228 - sẽ không được nói đến trong bài báo cáo này):

1yz xác thực sơ bộ: Hoạt dộng của request đang khởi tạo, chờ thêm 1 reply nữa trước khi xử lí với lệnh mới (tiến trình user gửi command khác trước khi hoàn thành reply sẽ vi phạm giao thức, nhưng server FTP sẽ xếp hàng bất kì command nào đến trong khi xử lí lệnh trước đó). Kiểu reply này

Page 33: BC LTM de in

có thể dùng để chỉ ra command đã được chấp nhận và user có thể chú ý đến kết nối dữ liệu, khi mà việc xử lí đồng thời nhiều request là khó khăn. FTP server có thể gửi nhiều nhất 1 reply 1yz cho mỗi command

2yz xác nhận hoàn thành: thực hiện xong lệnh. Có thể gửi request mới 3yz xác nhận hoạt động trung gian: Command tạm thời được chấp nhận,

nhưng việc xử lí yêu cầu bị tạm ngưng trong khi nhận thêm các thông tin cần thiết khác. User sẽ gửi các lệnh khác chỉ rõ các thông tin đó. Thường dùng với các lệnh theo nhóm

4yz từ chối tạm thời: Command sẽ không được chấp nhận và yêu cầu hoạt động không được thực hiện, nhưng lỗi này chỉ là tạm thời và user vẫn có thể gửi lại yêu cầu này lần nữa. User sẽ trở lại điểm bắt đầu trình tự thực hiện command. Rất khó để nói là tạm thời khi mà 1 trong 2 user hoặc server đã chấp nhận command. Mỗi reply 4yz phải có 1 1 giá trị hiện thời khác nhau, nhưng mục đích là để khuyến khích user thử lại lần nữa.

5yz từ chối vĩnh viễn: Command đã không được chấp nhận và yêu cầu không được thi. Tiến trình user không muốn lặp lại yêu cầu đó nữa (trong cùng chuỗi trình tự).

Các nhóm chức năng sau được mã hóa trong số thứ 2 của reply

x0z cú pháp – reply tham chiếu đến 1 lỗi cú pháp, cú pháp không đúng, không thể thực hiện hoặc command thừa

x1z thông tin – đây là reply đến yêu cầu cho thông tin, vd STAT, HELP x2z kết nối – reply tham chiếu đến 1 kết nối điều khiển hoặc dữ liệu x3z chứng thực và tài khoản – reply cho tiến trình đăng nhập và account x4z không rõ ràng x5z hệ thống file – reply chỉ rõ trạng thái của hệ thống file server đối diện

chuyển yêu cầu hoặc để hệ thống file khác hoạt động

Số thứ 3 cho các cấp thông tin tốt nhất trong mỗi chức năng, chỉ ra trong số thứ 2. Danh sách các reply dưới sẽ minh họa điều này. Chú ý text gắn với mỗi reply là khuyến cáo, có thể thay đổi tùy theo lệnh. Mã reply phải được tuân thủ đúng các

Page 34: BC LTM de in

quy tắc đã được đặt ra, không được cài đặt thêm mã mới cho các tình huống hơi khác nhau từ những mô tả này, mà nên thích ứng với các mã được định nghĩa sẵn.

Bây giờ ta sẽ liệt kê các mã reply theo thứ tự tăng dần:

110 restart marker reply: trường hợp này, text là chính xác và không sai để thực hiện cụ thể, nó phải đọc: MARK yyyy=mmmm yyyy là dữ liệu đánh dấu luồng của user process, mmmm là điểm đánh dấu tương đương (có dấu <SP> giữa marker và “=”)

120 dịch vụ sẵn sàng trong nnn phút nữa125 kết nối dữ liệu đã mở, bắt đầu truyền150 trạng thái file OK, quay lại mở kết nối dữ liệu200 command OK202 command không thực hiện, không cần thiết trong tiến trình211 trạng thái hệ thống, hoặc hệ thống hỗ trợ reply212 trạng thái thư mục213 trạng thái file214 thông báo trợ giúp: làm thế nào sử dụng server hoặc có ý nghĩa

của 1 command không chuẩn. hữu ích cho user215 tên kiểu hệ thống: đáp trả lệnh SYST220 dịch vụ sẵn sàng choc ho người dùng mới221 dịch vụ đóng kết nối điều khiển. đăng xuất nếu cần225 mở kết nối dữ liệu, không có tiến trình truyền226 đóng kết nối dữ liệu, yêu cầu file được thực hiện (vd truyền file

hoặc ABORT file)227 nhập chế độ thụ động (h1,h2,h3,h4,p1,p2)230 user đăng nhập, tiếp tục250 yêu cầu file OK, hoàn thành257 “pathname” được tạo331 user OK, cần password332 cần account cho đăng nhập350 tiến trình yêu cầu file cần tiếp thông tin sau421 dịch vụ không sẵn sàng, đóng kết nối điều khiển. nếu server

biết nó cần phải tắt, nó sẽ gửi đến mọi command

Page 35: BC LTM de in

425 không thể mở kết nối dữ liệu426 đóng kết nối dữ liệu, hủy việc truyền file450 yêu cầu file không được nhận, file không sẵn sàng (vd file bận)451 yêu cầu đã bị hủy: lỗi cục bộ trong xử lí452 yêu cầu không tiếp nhận. không đủ không gian lưu trữ file500 lỗi cú pháp, không nhận ra command. Bao gồm cả command

quá dài501 lỗi cú pháp trong tham số hoặc đối số502 command không được thực hiện503 trình tự các command tồi504 command không được thực hiện cho tham số này530 không đăng nhập532 cần account để lưu file550 yêu cầu không được tiếp nhận. file không sẵn sàng (không tìm

thấy, không truy cập được)551 yêu cầu bị hủy: page type lạ552 yêu cầu file bị hủy. chỉ định không gian lưu quá lớn (cho thư

mục hiện tại hoặc tập dữ liệu)553 yêu cầu không được tiếp nhận. không chấp nhận tên file

V. THÔNG SỐ KĨ THUẬT1. Cài đặt tối thiểu

Để tạo 1 FTP có thể chạy mà không cần báo lỗi, cài đặt tối thiểu sau là cần thiết cho mọi server:

Các giá trị mặc định cho tham số truyền file:

Page 36: BC LTM de in

Mọi host cần chấp nhận các giá trị trên như tiêu chuẩn mặc định

2. Kết nối - Connections

Server PI sẽ nghe trên port L. user hoặc user PI sẽ khỏi tạo 1 kết nối điều khiển 2 hướng. server và user process sẽ trao đổi theo giao thức Telnet. Server không có nghĩa vụ cung cấp để chỉnh sửa command, nó yêu cầu lệnh từ user. Kết nối điều khiển sẽ được server đóng theo yêu cầu của user, sau khi mọi trao đổi dữ liệu và reply được hoàn tất

User DTP phải nghe trên 1 port cụ thể, có thể là port mặc định của nó (U) hoặc 1 port cụ thể trong command PORT. Server sẽ tạo 1 kết nối dữ liệu từ cổng mặc định của server (L-1) đến port cụ thể của User. Hướng truyền dữ liệu và port sẽ được xác nhận bởi các service command

Chú ý mọi cài đặt FTP phải hỗ trợ truyền dữ liệu dùng port mặc định, và chỉ USER PI mới có thể khởi tạo 1 port không mặc định

3. Lệnh - Commands

Lệnh là các chuỗi kí tự Telnet truyền qua kết nối điều khiển và mô tả trong chương FTP command. Lệnh bắt đầu bằng 1 mã lệnh theo sau bởi 1 trường tham số. Mã lệnh gồm 4 hoặc một vài kí tự alphabetic. Cả chữ hoa lẫn chữ thường đều được coi như nhau (vd A & a là 1). Như vậy các từ sau đều đại diện cho command retrieve:

Quy tắc trên cũng áp dụng cho cả các kí tự đại diện cho tham số. Mã command và trường đối số được phân chia bởi 1 hoặc nhiều dấu <SP>. Trường đối số bao gồm

Page 37: BC LTM de in

1 xâu kí tự có độ dài thay đổi, kết thúc bởi chuỗi <CRLF> cho kiểu NVT-ASCII. Cho kiểu khác có thể dùng EOL. Nó sẽ chú ý rằng server sẽ nhận tham số cho đến khi nó đọc được kí tự EOL thì nó coi là command đã được đọc xong.

a) Lệnh FTP - FTP commands:

Các chuỗi sau là FTP commands:

USER <SP> <user name> <CRLF>PASS <SP> <password> <CRLF>ACCT <SP> <account information> <CRLF>CWD <SP> <pathname> <CRLF>CDUP <CRLF>SMNT <SP> <pathname> <CRLF>QUIT <CRLF>REIN <CRLF>PORT <SP> <host-port> <CRLF>PASV <CRLF>TYPE <SP> <type code> <CRLF>STRU <SP> <structure code> <CRLF>MODE <SP> <mode code> <CRLF>RETR <SP> <pathname> <CRLF>STOR <SP> <pathname> <CRLF>STOU <CRLF>APPE <SP> <pathname> <CRLF>ALLO <SP> <dec-integer>

[<SP> R <SP> <dec-integer>] <CRLF>REST <SP> <marker> <CRLF>RNFR <SP> <pathname> <CRLF>RNTO <SP> <pathname> <CRLF>ABORT <CRLF>DELE <SP> <pathname> <CRLF>RMD <SP> <pathname> <CRLF>MKD <SP> <pathname> <CRLF>PWD <CRLF>LIST [<SP> <pathname>] <CRLF>

Page 38: BC LTM de in

NLST [<SP> <pathname>] <CRLF>SITE <SP> <string> <CRLF>SYST <CRLF>STAT [<SP> <pathname>] <CRLF>HELP [<SP> <string>] <CRLF>NOOP <CRLF>

b) Tham số của FTP command

Cú pháp của trường đối số ở các command trên là:

c) Chuỗi các reply có thể có của 1 command Thiết lập kết nối

120 220 220 421

Login USER 230 530 500, 501, 421

Page 39: BC LTM de in

331, 332 PASS 230 202 530 500, 501, 503, 421 332 ACCT 230 202 530 500, 501, 503, 421 CWD 250 500, 501, 502, 421, 530, 550 CDUP 200 500, 501, 502, 421, 530, 550 SMNT 202, 250 500, 501, 502, 421, 530, 550

Logout REIN 120 220 220 421 500, 502 QUIT 221 500

Transfer parameters PORT 200 500, 501, 421, 530

Page 40: BC LTM de in

PASV 227 500, 501, 502, 421, 530 MODE 200 500, 501, 504, 421, 530 TYPE 200 500, 501, 504, 421, 530 STRU 200 500, 501, 504, 421, 530

File action commands ALLO 200 202 500, 501, 504, 421, 530 REST 500, 501, 502, 421, 530 350 STOR 125, 150 (110) 226, 250 425, 426, 451, 551, 552 532, 450, 452, 553 500, 501, 421, 530 STOU 125, 150 (110) 226, 250 425, 426, 451, 551, 552 532, 450, 452, 553 500, 501, 421, 530 RETR

Page 41: BC LTM de in

125, 150 (110) 226, 250 425, 426, 451 450, 550 500, 501, 421, 530 LIST 125, 150 226, 250 425, 426, 451 450 500, 501, 502, 421, 530 NLST 125, 150 226, 250 425, 426, 451 450 500, 501, 502, 421, 530 APPE 125, 150 (110) 226, 250 425, 426, 451, 551, 552 532, 450, 550, 452, 553 500, 501, 502, 421, 530 RNFR 450, 550 500, 501, 502, 421, 530 350 RNTO 250 532, 553 500, 501, 502, 503, 421, 530 DELE 250

Page 42: BC LTM de in

450, 550 500, 501, 502, 421, 530 RMD 250 500, 501, 502, 421, 530, 550 MKD 257 500, 501, 502, 421, 530, 550 PWD 257 500, 501, 502, 421, 550 ABOR 225, 226 500, 501, 502, 421

Informational commands SYST 215 500, 501, 502, 421 STAT 211, 212, 213 450 500, 501, 502, 421, 530 HELP 211, 214 500, 501, 502, 421

Miscellaneous commands (command hỗn hợp) SITE 200 202 500, 501, 530 NOOP 200 500 421

Page 43: BC LTM de in

PHẦN III: CÀI ĐẶT BẰNG VISUAL C++

Một vài chức năng chính của chương trình Xóa màn hình hiển thị

void CBTL_FTP_SERVERDlg::OnBnClickedClearScreen(){

// TODO: Add your control notification handler code heremListBox.ResetContent();

}

Thêm 1 tài khoản user tương ừng với root folder hiện tạivoid CBTL_FTP_SERVERDlg::OnBnClickedButtonAddUser(){

// TODO: Add your control notification handler code hereint lenUser=CUserDir.GetLength();int lenPass=CUserPass.GetLength();int lenSys=wcslen(sysFile);if(!lenUser || !lenPass || !lenSys){

MessageBox(L"Some Blank Field!!!",L"Add User",MB_OK);return;}wchar_t user_tmp[MAX_DIR_LEN];wcscpy(user_tmp,sysFile);wcscat(user_tmp,L"\\");wcscat(user_tmp,CUserDir);if(GetFileAttributes(user_tmp)!=INVALID_FILE_ATTRIBUTES){

MessageBox(L"User Already Exist!!!",L"Add User",MB_OK);return;}DWORD k=CreateDirectory(user_tmp,NULL);if(k==0){

MessageBox(L"Not Add User!!!",L"Add User",MB_OK);return;}wchar_t pass_tmp[MAX_DIR_LEN];wchar_t pass_file[MAX_DIR_LEN];wcscpy(pass_file,user_tmp);wcscat(pass_file,L"\\pass");wcscpy(pass_tmp,CUserPass);char pass[MAX_DIR_LEN];ZeroMemory(pass,sizeof(pass));strcpy(pass,WcharToChar(pass_tmp));FILE *f=_wfopen(pass_file,L"w");if(f==NULL){

Page 44: BC LTM de in

RemoveDirectory(user_tmp);MessageBox(L"Not Add User2!!!",L"Add User",MB_OK);return;

}strupr(pass);fputs(pass,f);fclose(f);MessageBox(L"Add User OK!!!",L"Add User",MB_OK);

}

Xoa 1 user cung tat ca cac file lien quan trong thu muc cua uservoid CBTL_FTP_SERVERDlg::OnBnClickedButtonDeleUser(){

// TODO: Add your control notification handler code hereint lenUser=CUserDir.GetLength();int lenSys=wcslen(sysFile);if(!lenUser || !lenSys)

MessageBox(L"Some Blank Field!!!",L"Add User",MB_OK);wchar_t user_tmp[MAX_DIR_LEN];wcscpy(user_tmp,sysFile);wcscat(user_tmp,L"\\");wcscat(user_tmp,CUserDir);if(GetFileAttributes(user_tmp)==INVALID_FILE_ATTRIBUTES){

MessageBox(L"User Not Exist!!!",L"Delete User",MB_OK);return;}BOOL k=DeleteDirectory(user_tmp);if(k==FALSE){

MessageBox(L"Not Delete User!!!",L"Delete User",MB_OK);return;}MessageBox(L"Delete User OK!!!",L"Delete User",MB_OK);

}

Hiển thị danh sách user hiện tại ứng với root folder hiện tạivoid CBTL_FTP_SERVERDlg::OnBnClickedButtonViewUserList(){

// TODO: Add your control notification handler code hereHANDLE hFind=INVALID_HANDLE_VALUE;wchar_t path[MAX_FILE_LEN];wcscpy(path,sysFile);wcscat(path,L"\\*");

Page 45: BC LTM de in

WIN32_FIND_DATA fdd;hFind=FindFirstFile(path,&fdd);if(hFind==INVALID_HANDLE_VALUE) return;do{

if(wcscmp(fdd.cFileName,L".")==0)continue;if(wcscmp(fdd.cFileName,L"..")==0)continue;if(fdd.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)

mListBox2->InsertString(-1,fdd.cFileName);}while(FindNextFile(hFind,&fdd));

}

Chuyển control port của server, nếu port hợp lệ sẽ hiện thông báo thành công, nếu không hiện thông báo Lỗi

void CBTL_FTP_SERVERDlg::OnBnClickedButtonOk(){

// TODO: Add your control notification handler code hereif(run)return;int len=CListenPort.GetLength();if(len<=0){

MessageBox(L"Blank Field!!!",L"Listen Port",MB_OK);return;}int port;//gia tri port khong hop leswscanf(CListenPort,L"%d",&port);if((port<1) || (port>=65536)){

MessageBox(L"Port not compatible!!!",L"Listen Port",MB_OK);return;

}//van la gia tri cuif(ControlPort==(WORD)port)return;ControlPort=(WORD)port;DataPort=ControlPort-1;wchar_t tmp[MAX_BUF_LEN];ZeroMemory(tmp,sizeof(tmp));wsprintf(tmp,L"Now: FTP server listen port = %d\nDefault data port = %d",ControlPort,DataPort);DWORD k;for(int k=0;k<event_total;k++){

closesocket(sock_manage[k].sControl);closesocket(sock_manage[k].sData);

Page 46: BC LTM de in

closesocket(sock_manage[k].sDataAccept);WSAResetEvent(event_control[k]);

}event_total=0;TerminateThread(FTP_SERVER_THREAD->m_hThread,0);Sleep(10);sock_manage[0].sControl=socket(AF_INET,SOCK_STREAM,0);sock_manage[0].addrControl.sin_family=AF_INET;sock_manage[0].addrControl.sin_port=htons(ControlPort);sock_manage[0].addrControl.sin_addr.s_addr=htonl(INADDR_ANY);int ret = bind(sock_manage[0].sControl,(sockaddr*)&sock_manage[0].addrControl,sizeof(SOCKADDR_IN));if(ret==SOCKET_ERROR){

MessageBox(L"Error when listening port!!!",L"Listen Port",MB_OK);return;

}MessageBox(tmp,L"Listen Port",MB_OK);event_control[0]=WSACreateEvent();event_data[0]=WSACreateEvent();event_data_accept[0]=WSACreateEvent;WSAEventSelect(sock_manage[0].sControl,event_control[0],FD_ACCEPT|FD_CLOSE);event_total++;listen(sock_manage[0].sControl,5);FTP_SERVER_THREAD=AfxBeginThread(FTP_SERVER,NULL);

//AfxBeginThread(FTP_SERVER);}

Duyệ folder để chọn 1 folder làm folder gốcvoid CBTL_FTP_SERVERDlg::OnBnClickedButtonBrowser(){

// TODO: Add your control notification handler code hereBROWSEINFO BI;ZeroMemory(&BI,sizeof(BI));wchar_t path[MAX_FILE_LEN];BI.hwndOwner=h;BI.iImage=0;BI.lParam=NULL;BI.pidlRoot=0;

Page 47: BC LTM de in

BI.lpszTitle=L"Browser Root Folder!!";BI.pszDisplayName=path;if(run)return;LPITEMIDLIST lpItIdL=SHBrowseForFolder(&BI);wchar_t pathFile[MAX_FILE_LEN];if(lpItIdL!=NULL)

if(!SHGetPathFromIDList(lpItIdL,pathFile)){MessageBox(L"Can not open folder!!!",L"Open Root Dir",MB_OK);return;

}wcscpy(sysFile,pathFile);MessageBox(L"Change Root Directory OK!!!",L"Open Root Dir",MB_OK);mRootDir.SetCueBanner(pathFile);

}

Chạy chương trình tiếpvoid CBTL_FTP_SERVERDlg::OnBnClickedButtonRunPause(){

// TODO: Add your control notification handler code hereif(!run){

run=true;mCheckStop.SetCheck(BST_UNCHECKED);mCheckRun.SetCheck(BST_CHECKED);

}}

Tạm dừng chương trìnhvoid CBTL_FTP_SERVERDlg::OnBnClickedButtonStop(){

// TODO: Add your control notification handler code hereif(run){

run=false;mCheckRun.SetCheck(BST_UNCHECKED);mCheckStop.SetCheck(BST_CHECKED);

}}

Thoát khỏi chương trìnhvoid CBTL_FTP_SERVERDlg::OnBnClickedQuit()

Page 48: BC LTM de in

{// TODO: Add your control notification handler code hereif(MessageBox(L"You Realy want to quit FTP server?",L"Quit",MB_OKCANCEL)==IDOK){

run=false;quit=true;Sleep(1000);DWORD i;for(i=0;i<event_total;i++){

send(sock_manage[index].sControl,SERVER_DOWN,strlen(SERVER_DOWN),0);WSAResetEvent(event_control[i]);closesocket(sock_manage[i].sControl);

}WSACleanup();OnOK();

}}

Hình ảnh minh họa chạy chương trình