Lời Mở Đầu Lập trình mạng là 1 môn học rất hữu ích, giúp cho sinh viên nắm được các kiến thức cơ sở về các kĩ thuật lập trình mạng TCPIP từ đó có thể lập trình được các ứng dụng có kết nối, truyền thông sử dụng mạng ở mức Socket. Nhằm muốn tìm hiểu sâu hơn và muốn thực hiện 1 ứng dụng cụ thể khi học môn lập trình mạng, nhóm chúng em đã chọn đề tài : lập trình HTTP Sever đơn giản sử dụng thư viện WinSock Chương trình nhóm thực hiệnsẽ tự biến máy tính thành một máy chủ HTTP server có khả năng thực hiện một số chức năng đơn giản là: • Duyệt toàn bộ file có trong một cây thư mục dưới dạng 1 list các đường dẫn trong một trang HTML để hiển thị trên Browser . • Hiển thị cấu hình máy (máy server) trên cùng trang HTML. • Cho phép tải về file có trong cây thư mục đó. Chương trình của nhóm được viết bằng ngôn ngữ C++ sử dụng công cụ Visual Studio để lập trình Trong quá trình thực hiện, nhómcó tham khảo 1 số tài liệu : • http:msdn.microsoft.com : Đặc tả các hàm và hằng số. • http:social.msdn.microsoft.com, http:stackoverflow.com : Các câu hỏi, bài viết của cộng đồng có liên quan tới chủ đề. Phần 1 : Phân tích các kỹ thuật sử dụng trong chương trình A. Truy nhập mạng Phần mềm sử dụng các hàm của bộ hàm của thư viện Winsock để thực hiện truy nhập mạng. Thư viện Winsock được Include vào phần mềm bằng khai báo: pragma comment(lib, ws2_32.lib) include Các phương thức được sử dụng: • socket() : Khởi tạo một socket với mục đích lắng nghe, chấp nhận một kết nối mạng hoặc gửinhận dữ liệu qua socket kết nối đã tạo dưới một dòng byte. • bind(): Gắn socket vào một giao diện mạng đã khai báo trong cấu trúc SOCKADDR_IN. • listen(): Lắng nghe kết nối tới socket. • accept(): Chấp nhận kết nối tới socket. • receive(): Lấy dữ liệu gửi tới từ socket. • send(): Gửi dữ liệu thông qua socket đã chấp nhận. • closesocket(), WSACleanup(): Giải phóng các tài nguyên đã cấp cho socket. • select(): Kiểm tra trạng thái của các socket, đợi nếu cần thiết, thực hiện vào ra một cách độc lập, không đông bộ (asynchronous)
Trang 1Lời Mở Đầu
Lập trình mạng là 1 môn học rất hữu ích, giúp cho sinh viên nắm được các kiến thức cơ sở về các kĩ thuật lập trình mạng TCP/IP từ đó có thể lập trình được các ứng dụng có kết nối, truyền thông sử dụng mạng ở mức Socket
Nhằm muốn tìm hiểu sâu hơn và muốn thực hiện 1 ứng dụng cụ thể khi học môn lập trình mạng, nhóm chúng em đã chọn đề tài : lập trình HTTP Sever đơn giản sử dụng thư viện WinSock
Chương trình nhóm thực hiện sẽ tự biến máy tính thành một máy chủ HTTP server có khả năng thực hiện một số chức năng đơn giản là:
• Duyệt toàn bộ file có trong một cây thư mục dưới dạng 1 list các đường dẫn trong một trang HTML để hiển thị trên Browser
• Hiển thị cấu hình máy (máy server) trên cùng trang HTML
• Cho phép tải về file có trong cây thư mục đó
Chương trình của nhóm được viết bằng ngôn ngữ C++ sử dụng công cụ Visual Studio để lập trình
Trong quá trình thực hiện, nhóm có tham khảo 1 số tài liệu :
• http://msdn.microsoft.com : Đặc tả các hàm và hằng số
• http://social.msdn.microsoft.com, http://stackoverflow.com : Các câu hỏi, bài viết của cộng đồng có liên quan tới chủ đề
Trang 2Phần 1 : Phân tích các kỹ thuật sử dụng trong chương trình
A Truy nhập mạng
Phần mềm sử dụng các hàm của bộ hàm của thư viện Winsock để thực hiện truy nhập mạng Thư viện Winsock được Include vào phần mềm bằng khai báo:
#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
Các phương thức được sử dụng:
• socket() : Khởi tạo một socket với mục đích lắng nghe, chấp nhận một kết
nối mạng hoặc gửi/nhận dữ liệu qua socket kết nối đã tạo dưới một dòng byte
• bind(): Gắn socket vào một giao diện mạng đã khai báo trong cấu trúc
SOCKADDR_IN
• listen(): Lắng nghe kết nối tới socket.
• accept(): Chấp nhận kết nối tới socket.
• receive(): Lấy dữ liệu gửi tới từ socket.
• send(): Gửi dữ liệu thông qua socket đã chấp nhận.
• closesocket(), WSACleanup(): Giải phóng các tài nguyên đã cấp cho socket.
• select(): Kiểm tra trạng thái của các socket, đợi nếu cần thiết, thực hiện vào
ra một cách độc lập, không đông bộ (asynchronous)
B Lấy thông số máy
Thư viện hỗ trợ: iostream
Trang 3Để lấy thông số cấu hình máy, ta sử dụng lệnh (Command) của window là
systeminfo.
Khi lệnh đã được thực thi, để lấy kết quả dưới dạng xâu, ta sử dụng hàm _popen()
để thực hiện lệnh từ trong mã phần mềm
FILE *pPipe;
if ((_popen("cd C:\\", "rt")) == NULL)
exit(1);
if ((pPipe = _popen("systeminfo", "rt")) == NULL)
exit(1);
Hàm trả về một con trỏ FILE, sau đó chúng ta đọc kết quả bằng hàm fread()
C Duyệt file
Khi nhập đường dẫn vào Browser, Browser sẽ gửi một Request tới Server có dạng
“localhost:<port>/Folder/File.exten” Tách lấy phần sau ta có đường dẫn của cây
thư mục có trong máy tính
Ví dụ: D:/Uploaded/aaa.txt
Ta sử dụng hàm GetFileAttributesA() để xác định xem đường dẫn đã nhận được là
thư mục con hay file
* Nếu đường dẫn là thư mục con:
Sau khi đã có đường dẫn cây thư mục, ta sử dụng các hàm
FindFirstFileA(),FindNextFileA() để lần lượt lấy tên của các thư mục và file có trong cây thư mục hiện tại Sau đó với mỗi thư mục/file , ta viết vào xâu char* buffer sẽ gửi đi một đoạn ký tự có cấu trúc:
"<a href=\"đường dẫn\">đường dẫn</a><br>"
Cuối cùng thêm vào buffer các thẻ <html>, <body>, <head>, thêm phần header:
"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=ISO-8859-4
\r\n\r\n"
Và gửi buffer tới địa chỉ đích bằng socket
Trang 4* Nếu đường dẫn là file
Mở file có đường dẫn như đã nhận được dưới dạng một xâu char
FILE* f = fopen(dirpath, "r");
fseek(f, 0, SEEK_END);
size_t size = ftell(f);
char* buffer = new char[size];
rewind(f);
fread(buffer, sizeof(char), size, f);
close(f);
Thêm phần header cho xâu trả về:
"HTTP/1.1 200
OK\r\nAccept-Range:bytes\r\nConnection:keep-alive\r\nContent-Type:
application/octet-stream\r\nContent-Length:lengthr\nContent-Disposition: attachment;
filename=\"filename\"\r\ncharset=ISO-8859-4; \r\n\r\n"
Với length là độ dài xâu đọc được từ file và filename là tên file lấy từ đường dẫn
và gửi xâu tới địa chỉ đích bằng socket
Trang 5Phần 2 Giao diện
Khi người dùng nhập đường dẫn “localhost:9999/” trên Browser, trang hiển thị
dưới dạng file HTML được trả về bởi phần mềm và được hiển thị ngay trên
Browser
Trang gồm 2 phần:
A Danh sách duyệt file
Danh sách duyệt file có dạng một danh sách các đường dẫn (link) có tên là toàn bộ các file và thư mục có trong cây thư mục
Trang 6Danh sách duyệt file
Click vào đường dẫn sẽ hiển thị toàn bộ các file có bên trong nếu đường dẫn hiển thị Folder, hoặc download file nếu đường dẫn là một file
Trang 7B Phần hiển thị cấu hình máy
Phần hiển thị cấu hình máy gửi về từ phần mềm cho phép xem các thông số của máy tính được sử dụng làm server như: Tên máy, tên, phiên bản hệ điều hành, nhà sản xuất, dòng máy, dung lượng bộ nhớ chính,