Tải bản đầy đủ (.pdf) (40 trang)

đồ án tốt nghiệp Giao thức FTP

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.6 MB, 40 trang )

Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
1

Lời mở đầu

Internet ngày nay đã trở thành một phương tiện truyền thông hiệu quả
nhất để gắn kết mọi người từ khắp nơi trên Thế Giới lại với nhau. Không
những phục vụ cho nhu cầu giải trí, giao lưu văn hóa nghệ thuật, Internet đang
là công cụ chính trong tất cả các lĩnh vực của đời sống Xã Hội, từ kinh doanh
cho đến quản lý, từ dịch vụ cho đến hệ thống …

Từ những gói tin dữ liệu (vài chục KB) được gửi đi và về, ngày nay hệ
thống Internet đã phát triển với mức độ chóng mặt, về dung lượng và tốc độ.
Bên cạnh đó các giao thức, các mô hình, các kiểu cấu trúc mạng, các hình thái
hệ điều hành, máy chủ, máy con, phần mềm, phần cứng … cũng được phát
triển cho phù hợp

Tuy nhiên có một giao thức đã ra đời từ rất sớm vẫn không thay đổi là
bao nhiêu. Nói như vậy không có nghĩa là phủ nhận tầm quan trọng của nó, mà
trái lại, nó đang làm nền tảng cho sự ổn định, phát triển của Internet ngày nay
và cho cả tương lai.

Đó là giao thức FTP (File Transfer Protocol) – Giao thức truyền tập tin
– thường được dùng để trao đổi tập tin qua mạng lưới truyền thông dùng giao
thức TCP/IP

Trong phạm vi đề tài tốt nghiệp này, em đã nghiên cứu và tìm hiểu hoạt
động, cấu trúc của FTP trên phương diện Server (máy chủ), từ đó xây dựng
một ứng dụng FTP Server giúp hình dung rõ ràng nhất về giao thức trên


Xin được gửi lời cảm ơn chân thành của em đến Khoa CNTT – Trường
ĐHNT nói chung và thầy giáo hướng dẫn Th.s Phạm Văn Nam nói riêng đã
truyền đạt và tận tình giúp đỡ em trong suốt những năm học qua, đặc biệt là
quãng thời gian em làm đồ án tốt nghiệp

Em xin chân thành cảm ơn !


SVTT

Nguyễn Quốc Khánh






Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
2

Mục Lục


A. Đặt vấn đề 3

1. Khái quát 3
2. Tóm tắt đề tài 3

B. FTP (File Transfer Protocol) 5


I. Khái niệm, khuôn mẫu tổng quát 5
1. Định nghĩa về giao thức FTP 5
2. Giao tiếp Socket và mô hình Client – Server 6
a. Socket là gì ? 6
b. Khởi tạo Socket 6
c. Ứng dụng Client – Server là gì ? 10
d. Hoạt động của Client/Server trong TCP 11
e. Hoạt động của Client/Server trong UDP 12
f. Một số hàm liên quan đến gửi/nhân dữ liệu 12
3. Công cụ lập trình 16
a. Giới thiệu về MFC 16
b. Giới thiệu về Visual C++ 18

II. Các vấn đề về FTP Server 20
1. Kiểu Server 20
2. Mã hóa dữ liệu 24
3. Các chế độ truyền dữ liệu 26
4. Quản lý và cấp quyền người dùng 27
5. Xử lý lệnh trong FTP Server 30
a. Xử lý Login 30
b. Các lệnh giao tiếp với Server 32
c. Gửi và nhận file 34
6. Mã hồi âm của FTP 35
7. Demo chương trình 36

III. Kết luận 38
1. Những vấn đề về bảo an khi dùng FTP 38
2. Những hạn chế trong FTP Server 38
3. Những ưu điểm của chương trình FTP Server 39


C. Tài liệu tham khảo 40




Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
3

A. Đặt Vấ n Đề:

1 – Khái quát:

FTP (File Transfer Protocol) thường được dùng để trao đổi tập tin qua
mạng lưới truyền thông dùng giao thức TCP/IP (Internet – mạng ngoại bộ, hoặc
Intranet – mạng nội bộ) . Hoạt động của FTP cần có 2 máy tính, một máy chủ
và một máy khách. Máy chủ FTP, chạy phần mềm cung cấp dịch vụ FTP, gọi
là trình chủ, lắng nghe yêu cầu về dịch vụ của các máy tính khác trên mạng
lưới. Máy khách chạy phần mềm FTP dành cho người sử dụng dịch vụ, gọi là
trình khách, thì khởi đầu một liên kết đến máy chủ. Một khi hai máy đã liên kết
với nhau, máy khách có thể xử lý một số thao tác về tập tin, như tải tập tin lên
máy chủ, tải tập tin từ máy chủ xuống máy mình, đổi tên của tập tin, hoặc xóa
tập tin ở máy chủ… Vì giao thức FTP là một giao thức chuẩn công khai, cho
nên bất cứ một công ty phần mềm nào, hay một lập trình viên nào cũng có thể
viết trình chủ FTP hoặc trình khách FTP. Hầu như bất cứ một nền tảng hệ điều
hành máy tính nào cũng hộ trợ giao thức FTP. Điều này cho phép tất cả các
máy tính kết nối với một mạng lưới có nền TCP/IP, xử lý tập tin trên một máy
tính khác trên cùng một mạng lưới với mình, bất kể máy tính ấy dùng hệ điều
hành nào (nếu các máy tính ấy đều cho phép sự truy cập của các máy tính khác,

dùng giao thức FTP). Hiện nay trên thị trường có rất nhiều trình khách và trình
chủ FTP, và phần đông các trình ứng dụng này cho phép người dùng được lấy
tự do, không mất tiền.

Chính vì khả năng tương thích cao và phổ biến của giao thức FTP, việc
viết các trình chủ và trình khách FTP cũng được thực hiện ở nhiều nơi, nhiều
phiên bản, ứng dụng và tính năng khác nhau tùy thuộc vào nhu cầu và mục
đích của công ty, tổ chức hoặc cá nhân tham gia.

2 – Tóm tắt đề tài:

Đề tài gồm 3 phần chính:

• Khái niệm, khuôn mẫu tổng quát
 Định nghĩa về giao thức FTP
 Giao tiếp Socket và mô hình Client – Server
 Công cụ lập trình

• Các vấn đề về FTP Server
 Kiểu Server
 Mã hóa dữ liệu
 Các chế độ truyền dữ liệu
 Quản lý và cấp quyền người dùng
 Xử lý lệnh trong FTP Server
 Mã hồi âm của FTP
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
4

 Demo chương trình


• Kết luận
 Những vấn đề về bảo an khi dùng FTP
 Những hạn chế trong FTP
 Ưu điểm của chương trình FTP Server









































Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
5

B. FTP (File Transfer Protocol)

I. Khái niệm, khuôn mẫu tổng quát:

1. Định nghĩa về giao thức FTP:

FTP (file transfer protocol - giao thức truyền file) đã có từ rất lâu và đã rất
quen thuộc với nhiều người sử dụng hoặc làm việc với Internet. Tuy nhiên, có
những điều liên quan tới lịch sử hình thành cũng như mức độ an toàn hiện tại
mà có thể còn ít người biết tới


FTP được phát triển từ rất sớm, chỉ sau khi mạng Internet ra đời khoảng 19
tháng. Vậy mà nó vẫn được sử dụng rộng rãi cho tới tận bây giờ, phục vụ
những mục đích như cập nhật nội dung các website hay truyền những file lớn
qua mạng. Về mặt kỹ thuật, từ đầu FTP đã được thiết kế tốt đến nỗi ít ai thấy
có nhu cầu thay thế nó. Tuy nhiên, chính sự đơn giản của FTP đã bắt đầu dẫn
tới những ẩn hoạ về an ninh mà từ thời kỳ đầu của Internet chưa hề tồn tại

Được phát triển từ đầu những năm 1970 và trở nên phổ biến từ khoảng năm
1985 trở đi, FTP qua nhiều năm được dùng như cách thức tiêu chuẩn và phổ
biến để truyền file. Qua đó, hai máy tính được nối mạng có thể truyền file xuôi
ngược cho nhau, bất kể là file loại gì hoặc mỗi máy tính sử dụng hệ thống file
hay lưu trữ kiểu gì

Kể từ đầu thập kỷ 1990, giao thức truyền siêu ký tự (HTTP) trở thành tiêu
chuẩn để truyền những đoạn ký tự hoặc hình ảnh nhỏ qua trình duyệt. Nhưng
FTP vẫn được ưa chuộng cho việc truyền những file lớn hơn. Các phần mềm
(ví dụ như CuteFTP) giúp những người phát triển và quản trị website tải các
trang web lên máy chủ để hiển thị cho người xem

FTP có các tuỳ chọn bảo vệ bằng mật khẩu, nhưng chính các tên truy nhập
và mật khẩu lại được gửi qua Internet mà không được mã hoá, nên kẻ xấu hoàn
toàn có thể đánh cắp chìa khoá và sau đó là thông tin. Vấn đề lớn hơn nữa là
khả năng của FTP cho phép mọi người truy nhập tự do. Mục đích ban đầu là để
khuyến khích chia sẻ, nhưng mặt khác điều này cũng dễ gây ra việc vô tình mất
những thông tin, dữ liệu riêng tư hoặc nhạy cảm

Tên truy nhập thông thường là "anonymous" và mật khẩu có thể là bất kỳ
cái gì. Mặc dù tính năng truy cập tự do này có thể được tắt đi, nhưng nhiều hệ
thống cũ vẫn đặt nó là mặc định, do đó người quản trị thiếu kinh nghiệm hoặc
lơ đễnh có thể quên không thiết lập lại và mở ra lỗ hổng an ninh cho hệ thống






Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
6

2. Giao tiếp Socket và mô hình Client – Server:

a. Socket là gì ?



Socket là một cổng logic mà một chương trình sử dụng để kết nối với một
chương trình khác chạy trên một máy tính khác trên Internet. Chương trình
mạng có thể sử dụng nhiều Socket cùng một lúc, nhờ đó nhiều chương trình có
thể sử dụng Internet cùng một lúc

Socket trong Winsock như là một “phương tiện” để ứng dụng mạng có thể
trao đổi dữ liệu. Nghĩa là 1 Server thì sẽ cần một Socket để lắng nghe, chờ đợi
các kết nối từ client và Client thì phải cần có một Socket để kết nối tới Sever

b. Khởi tạo Socket:

Ta sử dụng cấu trúc SOCKET để lưu giữ 1 Socket. Và có thể sử dụng
hàm sau đây để tạo Socket.

SOCKET socket (

int af,
int type,
int protocol
);

Ví dụ: SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

Trong đó:
* af: Là một con số ID để quyết định Socket của ta sử dụng giao thức
(protocol) để kết nối.
- AF_INET : TCP/IP (Phổ biến nhất hiện nay -> dùng địa chỉ IP để truyền dữ
liệu)
- AF_NETBIOS: NetBIOS (Giao thức dùng tên máy để truyền dữ liệu)
- AF_APPLETALK: AppleTalk
- AF_ATM: ATM
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
7




* type: Quy định giao thức vận chuyển dữ liệu

Ví dụ: với giao thức TCP/IP thì có 2 giao thức cốt lõi là UDP và TCP:

- SOCK_DGRAM: Hay là giao thức UDP. Khi chương trình chúng ta dùng
UDP để truyền dữ liệu thì chuyện gì sẽ xảy ra giữa bên gởi và bên nhận ? Bên
gửi cứ gửi và gửi và nó không hề quan tâm tới vấn đề bên nhận có nhận được
nó hay không?


=> Ưu điểm: Tốc độ truyền dữ liệu nhanh.
=> Nhược điểm: Khả năng sai, mất dữ liệu sẽ rất lớn.

Vậy dùng UDP khi nào? Những ứng dụng cần dữ liệu tức thời như:

- Chương trình nghe nhạc trực tuyến. Vấn đề sai bit (vấp khi nghe nhạc) không
quan trọng mấy vì yêu cầu của nó là đảm bảo tốc độ nhanh.
- Chương trình Chat
- Hoặc GameOnline (thỉnh thoảng bạn bị trường hợp LAG chính là do bị mất
dữ liệu trên đường truyền đó)

- SOCK_STREAM: Đây là giao thức TCP. Nó ngược với UDP vì nó đảm bảo
giữa bên gửi và bên nhận dữ liệu phải chính xác. Vì vậy 2 bên sẽ phải bắt tay
rất nhiều lần khi truyền được dữ liệu (ví dụ như bên gửi sẽ gửi n gói tin
(packet), bên nhận sẽ kiểm tra có bị mất hay sai gói tin nào hay không, nếu đủ
thì nó sẽ yêu cầu bên gửi gửi tiếp n gói tin tiếp theo, ngược lại thì nó sẽ yêu cầu
gửi lại)

=> Ưu điểm: Chất lượng gởi tin cậy.
=> Nhược điểm: Chậm hơn UDP.
Những ứng dụng như WEB, MAIL, FTP,…

- SOCK_RAW: Là giao thức để kiểm soát mạng, kiểm tra kết nối…
Ví dụ:
Start -> Run -> CMD: “ping diendantinhoc.com”.
Nếu bạn nhận được Reply có nghĩa là giữa máy tính của bạn với máy chủ
“diendantinhoc.com” có “thông mạng” với nhau. Và gói tin mà bạn PING
chính là SOCK_RAW (ICMP Packet)


* protocol: Chỉ định rõ lại giao thức. Vì SOCK_RAW có 2 protocol là ICMP
và RAW nên nó cần điều này

- SOCK_DGREAM -> protocol là: IPPROTO_UDP
- SOCK_STREAM -> protocol là: IPPROTO_IP
- SOCK_RAW -> protocol có thể là: IPPROTO_RAW hay IPPROTO_ICMP
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
8


Có thể tham khảo thêm bảng thể hiện các thuộc tính của hàm Socket



Một số hàm lấy thông tin về mạng:

• Lấy thông tin Socket

int WSAEnumProtocols (
LPINT lpiProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer,
LPDWORD lpdwBufferLength
);
lpiProtocols: NULL
lpProtocolBuffer: Kiểu dữ liệu trả về
lpdwBufferLength: Kích thước của kiểu dữ liệu

Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458

9

• Lấy tên máy tính của mình

int gethostname(char* name, int namelen);
Ví dụ:
char lpMyPCName[10];
gethostbyname(lpMyPCName,10)
cout<< lpMyPCName;

• Làm việc với IP

Địa chỉ IP là 1 con số 4 byte để xác định 1 host trên mạng.

Ví dụ:
“192.168.11.1” [Byte1: 192] [Byte2: 168][ [Byte3: 11][ [Byte4: 1]
Có thể biểu diễn địa chỉ IP: unsigned long (4 bytes)
Hoặc một char* lpIP;

Sử dụng inet_addr và inet_ntoa để chuyển đổi qua lại giữa u_long và char*

Ví dụ:
u_long YahooAddr = inet_addr("216.109.112.135");
cout << "IP: " << inet_ntoa(*(in_addr*) &YahooAddr) << "\n";

• Lấy IP theo tên máy

struct hostent* FAR gethostbyname(const char* name);

với:


typedef struct hostent {
char FAR* h_name; // Tên máy tính
char FAR FAR** h_aliases; // Bí danh máy tính
short h_addrtype; // Kiểu IP (AF_INET)
short h_length; // Kích thước IP
char FAR FAR** h_addr_list; // Danh sách các địa chỉ IP
// 1 host có thể có 1 hoặc nhiều IP
} HOSTENT,

Ví dụ:

char lpHostName[100];
hostent *MyPC;
gethostname(lpHostName,100);
MyPC = gethostbyname(lpHostName);

• Lấy tên máy theo địa chỉ IP
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
10


hostent* FAR gethostbyaddr(const char* addr, int len, int type);

Ví dụ: lấy thông tin Yahoo.com (có địa chỉ IP là 216.109.112.135)

hostent *Yahoo;
u_long YahooAddr = inet_addr("216.109.112.135");
Yahoo = gethostbyaddr((char*)&YahooAddr,4,AF_INET);


c. Ứng dụng Client – Server là gì ?




Mục tiêu lập trình mạng sẽ đưa ra những ứng dụng dạng Client – Server. Tức là
sẽ có 2 loại ứng dụng chính đó là Client và Server.

Quy trình hoạt động của ứng dụng Server – Client như sau:

Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
11

- Server có nhiệm vụ của là lắng nghe, chờ đợi kết nối từ Client trên địa chỉ IP
của mình với PORT được quy định sẵn. Khi client gởi dữ liệu tới Server thì nó
phải giải quyết một công việc là nhận dữ liệu đó -> xử lý -> trả kết quả lại cho
Client.

- Client là ứng dụng được phục vụ, nó chỉ gởi truy vấn và chờ đợi kết quả từ
Server.

Trong mô hình TCP/IP có 2 giao thức là TCP và UDP và 2 giao thức này sẽ
quyết định cách thức hoạt động của Client - Server như thế nào?

d. Hoạt động của Client – Server trong giao thức TCP (SOCK
STREAM)

e. Hoạt động của Client – Server trong giao thức UDP

(SOCK_DGRAM)

Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
12



f. Một số hàm liên quan đến gửi và nhận dữ liệu:

• Bind

int bind(
SOCKET s,
const struct sockaddr FAR* name,
int namelen
);



Hàm Bind gồm có 3 thông số:

- SOCKET s: Socket được thiết lập
- sockaddr name: Cấu trúc ADDR bao gồm địa chỉ IP và PORT
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
13

- int namelen: Kích thước của cấu trúc sockaddr


Ví dụ:
#define MYPORT 12345

SOCKET sockfd = socket(AF_INET, SOCK_STREAM, 0); // Chọn giao thức
TCP
sockaddr_in my_addr; // Thiết lập IP
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); // Đưa IP
và PORT vào SOCKET

Tác dụng dụng của BIND là sẽ giúp cho SOCKET của SERVER biết rằng nó
sẽ chờ đợi kết nối và nhận dữ liệu trên IP nào và PORT bao nhiêu?


Khoảng PORT nên chọn:
- 0 -1023: Là những PORT đã được sử dụng bởi các dịch vụ như WEB, FTP
- 1024-49151: Là PORT dành cho SERVER lắng nghe. SERVER nên chọn
trong khoảng này.
- 49152-65535: Là PORT khởi tạo ngẫu nhiên dành cho CLIENT kết nối tới
Server.

• Listen

int listen(
SOCKET s,
int backlog
);


Kể từ khi gọi hàm này thì SERVER sẽ bắt đầu lắng nghe kết nối
Hàm LISTEN gồm có 2 thông số:

- SOCKET s: Socket đã được thiết lập IP và PORT.
- int backlog: Số kết nối cho phép chờ trong hàng đợi khi Server chưa chấp
nhận kết nối. (vì đôi lúc có thể có tới 2 hay 3 client kết nối tới cùng 1 lúc). Giá
trị tốt nhất là khoảng từ 5 – 10.

• Connect

int connect(
SOCKET s,
struct sockaddr *serv_addr,
int addrlen );
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
14


Hàm được gọi từ CLIENT nếu nó muốn kết nối tới SERVER

- SOCKET s: Socket đã được khởi tạo.
- sockaddr *serv_addr: IP và PORT của Server.
- int addrlen: Sizeof của cấu trúc sockaddr.

• Accept

SOCKET accept(
SOCKET s,

struct sockaddr FAR* addr,
int FAR* addrlen
);

Khi Client kết nối tới Server. Nó phải chờ Server chấp nhận kết nối (nếu ở giao
thức TCP) bằng hàm accept trên.

Hàm ACCEPT gồm có 2 thông số:
- SOCKET s: Socket lắng nghe của SERVER.
- sockaddr addr: Là cấu trúc sockaddr lưu địa chỉ IP và PORT của CLIENT
kết nối tới SERVER.
- int addrlen: Kích thước cấu trúc địa chỉ IP này.

Hàm ACCPET trả về 1 SOCKET mới
Socket mới được tạo này đại diện cho 1 Connection (kết nối) mới giữa Server
và Client. Sau khi đã truyền dữ liệu thì ta phải đóng SOCKET này lại bằng
hàm close như closesocket(connect);

• Revc/Send

* Nhận dữ liệu trên giao thức TCP

int recv(
SOCKET s,
char FAR* buf,
int len,
int flags
);

* Gửi dữ liệu giao thức TCP


int send(
SOCKET s,
const char FAR * buf,
int len,
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
15

int flags
);

- SOCKET s: Là SOCKET được tạo ra khi Server chấp nhận kết nối từ
CLIENT
- char FAR* buf: Là dữ liệu (dạng BYTE – char) nhận hay gửi.
- int len: Kích thước của dữ liệu.
- int flags: Một số cờ hiệu đi kèm (thông thường là 0).

• RevcFrom/SendTo

Được sử dụng trên giao thức UDP

int recvfrom(
SOCKET s,
char FAR* buf,
int len,
int flags,
struct sockaddr *from,
int *fromlen);


Các thông số:
- SOCKET s: Là SOCKET được tạo ra ban đầu.
- char FAR* buf: Là dữ liệu (dạng BYTE – char) nhận
- int len: Kích thước của dữ liệu nhận.
- int flags: Một số cờ hiệu đi kèm (thông thường là 0).
- sockaddr *from: IP và PORT từ bên gửi.
- int *fromlen: Sizeof cấu trúc addr.

int sendto(
SOCKET s,
const char FAR *buf,
int len,
int flags,
const struct sockaddr* to,
int tolen
);

- SOCKET s: Là SOCKET được tạo ra ban đầu.
- char FAR* buf: Là dữ liệu (dạng BYTE – char) gửi
- int len: Kích thước của dữ liệu gửi.
- int flags: Một số cờ hiệu đi kèm (thông thường là 0).
- sockaddr *to: IP và PORT tới bên nhận.
- int tolen: Sizeof cấu trúc addr.

• Close/Shutdown
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
16



int shutdown(
SOCKET s,
int how
);

int closesocket (SOCKET s);

Hủy SOCKET sau một kết nối hoặc kết thúc chương trình.
Tham số how của shutdown:
- SD_RECEIVE: Đóng SOCKET, không cho phép NHẬN nhưng cho phép
GỬI.
- SD_SEND: Đóng SOCKET, không cho phép GỬI nhưng cho phép NHẬN.
- SD_BOTH: Không cho GỬI và NHẬN (giống gọi hàm closesocket).





























3. Công cụ lập trình:

a. Giới thiệu về MFC


Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
17

- MFC viết tắt là Microsoft Foundation Class
- MFC là một thư viện các lớp (class, OOP) trong ngôn ngữ Visual C++,
được sử dụng để xây dựng các ứng dụng trên Windows
- MFC được xây dựng trên cơ sở các hàm thư viện API của Windows
- Trong một ứng dụng MFC, ta sẽ không gọi trực tiếp các hàm Windows
API mà sẽ tạo các object từ những lớp của MFC, sau đó gọi hàm của
Object này
- Đa số các hàm của lớp MFC có cùng tên với những hàm Windows API
- MFC tạo ra một Application Framework giúp cho lập trình viên thiết kế
kiến trúc của ứng dụng nhất quán và khoa học

- Thông qua các Class trong MFC, người lập trình có thể xây dựng ứng
dụng nhanh và ít tốn sức hơn so với việc sử dụng đơn thuần các hàm thư
viện API của Windows
- Trong MFC có thể gọi các hàm Windows API
- MCF có nhiều version 1,2,3, 6. Version 6.0 có khoảng 200 Class

Một số tính năng của MFC qua các Version:

- Version 1: (Visual C++ 1.0)
• Các lớp List, Array, String, Time, Date, File access
• Các lớp giao diện cơ bản
• MDI, OLE 1.0
- Version 2: (Visual C++ 1.0)
• File open, save
• Print preview, printing
• Scrolling window, spliter window
• Tool bar, status bar
• Access to Visual Basic controls
• Context-sensitive help
• An improved interface to OLE version 1.0
• DLL
- Version 2.5: (Visual C++ 1.5)
Hỗ trợ kết nối ODBC (Open Database Connectivity) cho phép
truy xuất đến các CSDL Access, FoxPro, SQL Server
OLE 2.01
- Version 3: (Visual C++ 1.51)
Hỗ trợ Tab dialog (property sheet)
Docking tool bar
- Version 3.1: (Visual C++ 2.1)
Hỗ trợ các Control chuẩn của Windows 95

ODBC Level 2
Các lớp Winsock phục vụ lập trình TCP/IP
- Version 4.0: (Visual C++ 4.0)
Hỗ trợ kết nối DAO (Data Access Object)
Windows 95 docking control bar
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
18

Bổ sung thêm Treeview và RichEdit
Các lớp đồng bộ hóa tiểu trình
OLE control container
- Version 4.2: (Visual C++ 4.2)
Các lớp WinInet
Các lớp ActiveX document server
Các tính năng mở rộng của ActiveX control
Cải tiến một số tính năng của ODBC
- Version 4.21: (Visual C++ 5.0)
Sửa một số lỗi trong version 4.2
Redesigned IDE, Developer Studio 97
Hỗ trợ lập trình COM (Component Object Model)
- Version 6.0: (Visual C++ 6.0)
Hỗ trợ các lớp cho những Control chuẩn trong ID 4.0
Hỗ trợ Dynamic HTML, cho phép tạo lập động các trang HTML
Active Document Containment, cho phép ứng dụng MFC có thể
chứa các Active document
OLE DB và ADO

b. Giới thiệ u về Visual C++:




- Là lập trình sự kiện dựa vào thông điệp (message), Multitasking, Multi-
CPU, Tích hợp sẵn Multimedia, Hỗ trợ 32 bit hoặc cao hơn nữa, Hỗ trợ
nhiều công nghệ DLL, COM, DDE, OLE
- Lập trình sự kiện và xử lý sự kiện
- Các thành phần giao diện đồ họa: Dialog, SDI (Single Document
Interface), MDI (Multiple Document Interface)
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
19

- Tài nguyên của ứng dụng:
• Resource là 1 đối tượng (Object) được sử dụng trong ứng dụng, ví
dụ: Menu bar, Tool bar, dialog, icon, cursor, bitmap
• Resource được định nghĩa bên ngoài (tách biệt với Source Code) và
được thêm vào trong tập tin thi hành (EXE) của ứng dụng khi biên
dịch (Linking)









































Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458

20

II. Các vấn đề về FTP Server:

1. Kiểu Server:

Khác với nhiều loại Server (Web, Mail…) FTP Server luôn có 2 kiểu phục
vụ là: Active Mode & Passive Mode. Mỗi kiểu Server có một đặc trưng và cách
hoạt động khác nhau, nhưng vẫn đáp ứng được nhu cầu phục vụ cho mỗi Client
ở mức độ tốt nhất

Active Mode:

Trong chế độ Active, từ 1 dãy Port ngẫu nhiên (N>1023), Client mở kết
nối đến Port lệnh của Server, đó là Port 21. Sau đó, Client bắt đầu lắng nghe
trên Port N+1 và gửi lệnh N+1 đến Server. Sau đó, từ Port dữ liệu trên Server,
đó là Port 20, Server sẽ kết nối ngược trở lại đến Port dữ liệu đã được chỉ định
trên Client (PORT N+1)


Hoạt động:

B1: Từ Port 1026, Client kết nối đến Server và gửi lệnh PORT 1027
B2: Server gửi ACK (Acknowledgement) cho Client
B3: Server tạo 1 kết nối từ Port 21 data trên nó (20) đến Port đã chỉ định trước
trên Client (1027)
B4: Cuối cùng Client gửi ACK cho Server

Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458

21


Dùng một chương trình của hãng thứ 3 (Cute FTP) kết nối đến


Kiểu Server sẽ kết nối: Active Mode
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
22




Trong Active Mode, Client gửi lệnh PORT IP_Client,x,y
Cách tính Port mà Client mở cho kết nối data là : x*256 + y

Ví dụ: PORT 192,168,1,9,8,216
 Port : 8*256 + 216 = 2264
 Port 2264 sẽ là Port trên Client trao đổi dữ liệu với Port
20 của Server


Passive Mode:

Trong chế độ Passive, Client khởi tạo cả 2 kết nối đến Server. Khi mở 1
kết nối FTP, Client mở ngẫu nhiên trên nó 2 dãy Port (N>1023 và N). Port đầu
tiên (N>1023) kết nối đến Port 21 của Server, nhưng thay vì dùng lệnh PORT
và cho phép Server kết nối ngược lại Port data, Client lại dùng lệnh PASV. Kết
quả của việc này là Server phải mở một dãy Port ngẫu nhiên (P>1023) và gửi

lệnh PORT ngược lại Client. Tiếp đến Client khởi tạo một kết nối nữa từ Port
N+1 đến Port P
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
23



Hoạt động:

B1: Từ Port N (1026), Client kết nối đến Port 21 của Server và gửi lệnh PASV
B2: Server trả lời lại với lệnh PORT 2024, nói cho Client biết rằng Port nào
đang lắng nghe các kết nối dữ liệu
B3: Client khởi tạo một kết nối dữ liệu từ Port N+1 (1027) đến Port đã được
chỉ ra trên Server (2024)
B4: Cuối cùng Server gửi 1 ACK cho Client


Kiểu Server sẽ kết nối là : Passive Mode
Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
24



Trong Passive Mode, Server gửi lệnh PASV IP_Server,x,y

Ví dụ: PASV 208,75,203,43,144,172
 Port : 144*256 + 172 = 37036
 Port 37036 sẽ là Port trên Server trao đổi dữ liệu với

Client

So sánh giữa 2 chế độ Active & Passive

Active Mode:
Command: Client (N>1023) → Server (21)
Data: Client (N+1) ← Server (20)

Passive Mode:
Command: Client (N>1023) → Server (21)
Data: Client (N+1) → Server (P>1023)

Active Mode thì có lợi cho người quản lý FTP Server nhưng gây khó
khăn cho Client. Vì Server mở một dãy Port ngẫu nhiên, một trong các Port này
có thể bị Block lại bởi tường lửa phía Client. Ngược lại, trong Passive Mode,
Client lại thoải mái hơn vì được phép gửi hai kết nối, nhưng trong đó có một
kết nối xuất phát từ một dãy Port ngẫu nhiên và một trong các Port này có thể
sẽ bị Block lại bởi tường lửa phía Server


2. Mã hóa dữ liệu

Cả 2 chế độ được dùng để truyền tải dữ liệu là : ASCII và Binary. Hai chế
độ này khác nay trong cách chúng gửi dữ liệu







Đồ Án Tốt Nghiệp Th.s Phạm Văn Nam
SVTT: Nguyễn Quốc Khánh MSSV: 44D1458
25

ASCII:

Khi một tập tin được truyền dùng chế độ ASCII, mỗi một chữ, một con
số và mỗi kí tự đều được gửi trong dạng mã ASCII. Máy nhận tin lưu trữ chúng
trong một tập tin văn bản thường, dưới dạng thức thích hợp (chẳng hạn, một
máy dùng Macintosh sẽ lưu trữ nó trong dạng thức của Mac). Vì thế, khi chế
độ ASCII được dùng cho một cuộc truyền tải dữ liệu, phần mềm FTP sẽ tự cho
rằng các dữ liệu được truyền gửi có dạng thức văn bản thường (plain text) và
lưu trữ trên máy nhận theo dạng thức văn bản của máy đó

Chuyển đổi giữa các dạng thức văn bản thường bao gồm việc thay thế
mã kết dòng và mã kết tập tin, từ những mã tự được dùng ở máy nguồn sang
những mã tự được dùng ở máy đích, chẳng hạn một máy dùng HĐH Windows
nhận một tập tin từ máy dùng HĐH Unix, máy dùng Windows sẽ thay thế
những chữ xuống dòng (Carriage Return) bằng một cặp mã, bao gồm cả mã
xuống hàng và mã thêm hàng (Carriage Return and line feed pairs)



Tốc độ truyền tải tập tin dùng mã ASCII cũng nhanh hơn một chút, vì
bit ở hàng cao nhất của mỗi byte của tập tin bị bỏ

BINARY:

Máy gửi tập tin gửi từng bit một sang cho máy nhận. Máy nhận đồng ý
lưu trữ dòng bit, y như nó đã được gửi sang. Nếu dữ liệu không phải ở dạng

thức văn bản thường, thì chúng ta phải truyền chúng ở chế độ nhị phân, nếu
không dữ liệu sẽ bị thoái hóa, không dùng được

Các khuôn dạng dữ liệu dùng cho ASCII và BINARY

×