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 5520
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