Bài giảng Lập trình mạng - Chương 4: MFC Socket - Trương Đình Huy

Chương 4. MFC Socket  
Trương Đình Huy  
Chương 4. MFC Soket  
• 4.1. Giới thiệu  
4.2. CSocket  
4.3. CAsyncSocket  
2
Chương 4.1 Giới thiệu  
MFC: Microsoft Foundation Classes  
• Bộ thư viện hướng đối tượng C++ lập trình ứng dụng trên  
Window.  
• Cung cấp hai lớp hỗ trợ lập trình mạng  
– CAsyncSocket: Đóng gói lại thư viện WinSock dưới dạng hướng đối  
tượng. Hoạt động ở chế độ bất đồng bộ.  
– CSocket: Kế thừa từ CAsyncSocket và cung cấp giao diện ở mức cao  
hơn nữa. Hoạt động ở chế độ đồng bộ.  
• Hai lớp này không thread-safe: đối tượng tạo ra ở luồng  
nào thì chỉ có thể được sử dụng ở luồng đó.  
• Tệp tiêu đề: afxsock.h  
3
Chương 4.2 CSocket  
• Khởi tạo thư viện: tự động bởi framework qua hàm AfxSocketInit  
• Khởi tạo đối tượng CSocket: Phương thức Create  
BOOL Create(  
UINT nSocketPort = 0,  
int nSocketType = SOCK_STREAM,  
// Cổng, mặc định là 0  
// Kiểu socket  
LPCTSTR lpszSocketAddress = NULL) // Địa chỉ giao diện mạng, thí dụ  
// “192.168.1.1”  
Giá trị trả về:  
- Khác NULL nếu thành công  
- NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError()  
Thí dụ:  
CSocket  
Server, Client  
Server.Create(8888);  
Client.Create();  
4
Chương 4.2 CSocket  
• Kết nối đến máy khác: Phương thức Connect  
BOOL Connect(  
LPCTSTR lpszHostAddress,  
UINT nHostPort  
// Địa chỉ/tên miền máy đích  
// Cổng  
);  
BOOL Connect(  
const SOCKADDR* lpSockAddr, // Địa chỉ máy đích dưới dạng SOCKADDR  
int nSockAddrLen // Chiều dài cấu trúc địa chỉ  
);  
Giá trị trả về:  
- Khác NULL nếu thành công  
- NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError()  
Thí dụ:  
CSocket  
s;  
s.Create();  
5
Chương 4.2 CSocket  
• Đợi kết nối từ máy khác: Phương thức Listen  
BOOL  
Listen(  
int nConnectionBacklog = 5 )  
Giá trị trả về:  
- Khác NULL nếu thành công  
- NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError()  
• Đóng kết nối: Phương thức Close  
virtual  
void  
Close( )  
6
Chương 4.2 CSocket  
• Chấp nhận kết nối từ máy khác: Phương thức Accept  
virtual BOOL Accept(  
CSocket& rConnectedSocket,  
SOCKADDR* lpSockAddr = NULL,// Địa chỉ socket mới dưới dạng SOCKADDR  
int* lpSockAddrLen = NULL // Chiều dài địa chỉ  
);  
Giá trị trả về:  
- Khác NULL nếu thành công  
// Socket tương ứng với kết nối mới  
- NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError()  
Thí dụ:  
CSocket  
Server, Client;  
// Khởi tạo socket Server  
// Chấp nhận kết nối  
Server.Accept(Client);  
// Gửi nhận dữ liệu trên Client  
7
Chương 4.2 CSocket  
• Gửi dữ liệu đến máy khác: Phương thức Send  
virtual int Send(  
const void* lpBuf,  
int nBufLen,  
// Bộ đệm chứa dữ liệu cần gửi  
// Số byte cần gửi  
int nFlags = 0  
// Cờ, chỉ có thể là MSG_OOB nếu có  
);  
Giá trị trả về:  
- Số byte gửi được nếu thành công  
- SOCKET_ERROR nếu thất bại  
Thí dụ:  
char  
buff[]=“Hello MFC Socket”;  
Client.Send(buff,strlen(buff));  
8
Chương 4.2 CSocket  
• Nhận dữ liệu từ máy khác: Phương thức Receive  
virtual int Receive(  
void* lpBuf,  
int nBufLen,  
int nFlags = 0  
// Bộ đệm sẽ nhận dữ liệu  
// Kích thước bộ đệm  
// Cờ, có thể là MSG_PEEK hoặc MSG_OOB  
);  
Giá trị trả về:  
- Số byte nhận được nếu thành công  
- NULL nếu kết nối bị đóng  
- SOCKET_ERROR nếu thất bại  
Thí dụ:  
char buff[1024];  
int buflen = 1024, nBytesReceived;  
nBytesReceived = connectedSocket. Receive(buff,1024);  
9
Chương 4.2 CSocket  
• Xây dựng Client bằng CSocket  
CSocket  
unsigned char  
char  
s;  
buff[1024];  
* request = “GET / HTTP/1.0\r\nHost:www.google.com\r\n\r\n”;  
int  
len = 0;  
s.Create();  
s.Send(request,strlen(request));  
len = s.Receive(buff,1024);  
buff[len] = 0;  
printf(“%s,buff);  
10  
Chương 4.2 CSocket  
• Xây dựng Server bằng CSocket  
CSocket  
Char  
listen,connect;  
* buff = “Hello Network Programming”;  
listen.Create(80,SOCK_STREAM,”0.0.0.0”);  
listen.Listen();  
listen.Accept(connect);  
connect.Send(buff,strlen(buff));  
connect.Close();  
11  
Chương 4.3 CAsyncSocket  
• Đóng gói hoạt động của socket bất đồng bộ  
• Nguyên mẫu các hàm vào ra tương tự CSocket nhưng trở về ngay lập  
tức từ lời gọi.  
• Ứng dụng không sử dụng trực tiếp lớp này mà kế thừa và chồng lên các  
phương thức ảo của lớp để xử lý các sự kiện.  
• Các phương thức hay được chồng  
OnAccept: Phương thức này sẽ được gọi mỗi khi có yêu cầu kết nối.  
OnClose: Phương thức này sẽ được gọi mỗi khi socket đầu kia bị đóng.  
OnSend: Phương thức này được gọi khi socket có thể gửi dữ liệu.  
OnReceive: Phương thức này được gọi khi socket nhận được dữ liệu và  
chờ ứng dụng xử lý  
OnConnect: Phương thức này được gọi khi yêu cầu kết nối được chấp  
nhận và socket đã sẵn sàng để gửi nhận dữ liệu.  
12  
Chương 4.3 CAsyncSocket  
• Khởi tạo đối tượng: Phương thức Create  
BOOL Create(  
UINT nSocketPort = 0,  
int nSocketType = SOCK_STREAM,  
// Cổng  
// Kiểu socket  
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,  
// Mặt nạ sự kiện  
LPCTSTR lpszSocketAddress = NULL  
);  
// Địa chỉ socket  
Giá trị trả về :  
- Khác NULL nếu thành công  
- NULL nếu thất bại  
Sự khác biệt duy nhất với CSocket ở phương thức này là tham số lEvent chứa mặt nạ các sự  
kiện ứng dụng mong muốn nhận được  
13  
Chương 4.3 CAsyncSocket  
• Xử lý các sự kiện: chồng lên phương thức tương ứng với sự kiện mong  
muốn  
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket kế thừa từ  
// AsyncSocket  
{
static int i = 0;  
i++;  
TCHAR buff[4096];  
int nRead;  
nRead = Receive(buff, 4096);  
switch (nRead)  
{
case 0:  
Close();  
break;  
case SOCKET_ERROR:  
if (GetLastError() != WSAEWOULDBLOCK)  
{
AfxMessageBox (_T("Error occurred"));  
Close();  
}
break;  
14  
Chương 4.3 CAsyncSocket  
• Xử lý các sự kiện (tiếp)  
default:  
buff[nRead] = _T('\0'); // Kết thúc xâu  
CString szTemp(buff);  
m_strRecv += szTemp; // Chèn xâu nhận được vào cuối m_strRecv  
if (szTemp.CompareNoCase(_T("bye")) == 0)  
{
ShutDown();  
s_eventDone.SetEvent();  
}
}
CAsyncSocket::OnReceive(nErrorCode);  
}
15  
Chương 4.3 CAsyncSocket  
• 3.Viết chương trình HTTP Streaming server thực hiện thao tác  
sau:  
– Đợi kết nối ở cổng 80  
– Cho phép giới hạn tốc độ upload  
– Xử lý các request từ client gửi đến có dạng  
GET  
Host:  
….  
/<TenFile>  
HTTP/1.1  
\n\n  
– Phản hồi các request như sau:  
• Nếu tên <TenFile> tồn tại trong thư mục hiện tại thì gửi trả phản  
hồi có dạng  
Status:OK-200\n  
Content-Length:<KichThuocFile>\n  
Content-Type:video/mp4\n  
\n  
\n  
<NoiDungFile>  
16  
Chương 4.3 CAsyncSocket  
• 3.Viết chương trình HTTP Streaming server thực hiện thao  
tác sau:  
– Phản hồi các request như sau:  
• Nếu file không tồn tại thì phản hồi lại như sau  
Status: Not Found 404\n  
Content-Length:<Chieu dai xau phan hoi>\n  
Content-Type:text/html\n  
\n  
\n  
Không tìm thấy tệp tin  
17  
Chương 4.3 CAsyncSocket  
• 1.Viết chương trình gửi file bằng CAsyncSocket  
• 2. Viết chương trình gửi tin nhắn mã hóa qua mạng bằng  
blocking. Cách thức mã hóa như sau:  
– Server chọn một số nguyên x (0-255) làm mật khẩu. và  
gửi cho mỗi client khi kết nối đến.  
– Mã ASCII của ký tự được gửi sẽ được cộng thêm x trước  
khi truyền, bên nhận trừ đi x để hiển thị. Nếu giá trị  
công thêm >255 thì truyền đi phần dư của giá trị đó khi  
chia cho 256.  
18  
pdf 18 trang Thùy Anh 12/05/2022 2940
Bạn đang xem tài liệu "Bài giảng Lập trình mạng - Chương 4: MFC Socket - Trương Đình Huy", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_mang_chuong_4_mfc_socket_truong_dinh_huy.pdf