Bài giảng Lập trình mạng - Chương 4: MFC Soket - Lương Ánh Hoàng

• 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

pdf 15 trang kimcuc 18580
Bạn đang xem tài liệu "Bài giảng Lập trình mạng - Chương 4: MFC Soket - Lương Ánh Hoàng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình mạng - Chương 4: MFC Soket - Lương Ánh Hoàng

Bài giảng Lập trình mạng - Chương 4: MFC Soket - Lương Ánh Hoàng
Lương Ánh Ho{ng 
hoangla@soict.hut.edu.vn 
Chương 4. MFC Socket 
• 4.1. Giới thiệu 
• 4.2. CSocket 
• 4.3. CAsyncSocket 
Chương 4. MFC Soket 
141 
• 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 
Chương 4.1 Giới thiệu 
142 
• 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 
Chương 4.2 CSocket 
143 
BOOL Create( 
 UINT nSocketPort = 0, // Cổng, mặc định là 0 
 int nSocketType = SOCK_STREAM, // 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(); 
• Kết nối đến máy khác: Phương thức Connect 
Chương 4.2 CSocket 
144 
BOOL Connect( 
 LPCTSTR lpszHostAddress, // Địa chỉ/tên miền máy đích 
 UINT nHostPort // 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(); 
s.Connect(“www.google.com.vn”, 80); 
• Đợi kết nối từ máy khác: Phương thức Listen 
Chương 4.2 CSocket 
145 
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( ) 
• Chấp nhận kết nối từ máy khác: Phương thức Accept 
Chương 4.2 CSocket 
146 
virtual BOOL Accept( 
 CSocket& rConnectedSocket, // Socket tương ứng với kết nối mới 
 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 
 - 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 
• Gửi dữ liệu đến máy khác: Phương thức Send 
Chương 4.2 CSocket 
147 
virtual int Send( 
 const void* lpBuf, // Bộ đệm chứa dữ liệu cần gửi 
 int nBufLen, // 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)); 
• Nhận dữ liệu từ máy khác: Phương thức Receive 
Chương 4.2 CSocket 
148 
virtual int Receive( 
 void* lpBuf, // Bộ đệm sẽ nhận dữ liệu 
 int nBufLen, // Kích thước bộ đệm 
 int nFlags = 0 // 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); 
Chương 4.2 CSocket 
149 
• Xây dựng Client bằng CSocket 
CSocket s; 
unsigned char buff[1024]; 
char * request = “GET / HTTP/1.0\r\nHost:www.google.com\r\n\r\n”; 
int len = 0; 
s.Create(); 
s.Connect(www.google.com,80); 
s.Send(request,strlen(request)); 
len = s.Receive(buff,1024); 
buff[len] = 0; 
printf(“%s”,buff); 
Chương 4.2 CSocket 
150 
• Xây dựng Server bằng CSocket 
CSocket listen,connect; 
Char * buff = “Hello Network Programming”; 
listen.Create(80,SOCK_STREAM,”192.168.1.10”); 
listen.Listen(); 
listen.Accept(connect); 
connect.Send(buff,strlen(buff)); 
connect.Close(); 
Chương 4.3 CAsyncSocket 
151 
• Đó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. 
Chương 4.3 CAsyncSocket 
152 
• Khởi tạo đối tượng: Phương thức OnCreate 
BOOL Create( 
 UINT nSocketPort = 0, // Cổng 
 int nSocketType = SOCK_STREAM, // 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 
Chương 4.3 CAsyncSocket 
153 
• 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; 
Chương 4.3 CAsyncSocket 
154 
• 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); 
} 

File đính kèm:

  • pdfbai_giang_lap_trinh_mang_chuong_4_mfc_soket_luong_anh_hoang.pdf