Bài giảng Lập trình mạng (Network Programming): Chương 4 - Lương Ánh Hoàng

15 7 0
Bài giảng Lập trình mạng (Network Programming): Chương 4 - Lương Ánh Hoàng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chương 4 - MFC Socket. Chương 4 trình bày những nội dung chính sau: Giới thiệu về MFC (Microsoft Foundation Classes), CSocket, CAsyncSocket. Mời các bạn cùng tham khảo để biết thêm chi tiết.

Chương MFC Socket Lương Ánh Ho{ng hoangla@soict.hut.edu.vn Chương MFC Soket • 4.1 Giới thiệu • 4.2 CSocket • 4.3 CAsyncSocket 141 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 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ạng hướng đối tượng Hoạt động chế độ bất đồng – CSocket: Kế thừa từ CAsyncSocket cung cấp giao diện mức cao Hoạt động chế độ đồng • Hai lớp không thread-safe: đối tượng tạo luồng sử dụng luồng • Tệp tiêu đề: afxsock.h 142 Chương 4.2 CSocket • Khởi tạo thư viện: tự động framework qua hàm AfxSocketInit • Khởi tạo đối tượng CSocket: Phương thức Create BOOL Create( UINT nSocketPort = 0, // Cổng, mặc định int nSocketType = SOCK_STREAM, // Kiểu socket LPCTSTR lpszSocketAddress = NULL) // Địa giao diện mạng, thí dụ // “192.168.1.1” Giá trị trả về: - Khác NULL thành công - NULL thất bại Mã lỗi truy nhập qua hàm GetLastError() Thí dụ: CSocket Server, Client Server.Create(8888); Client.Create(); 143 Chương 4.2 CSocket • Kết nối đến máy khác: Phương thức Connect BOOL Connect( LPCTSTR lpszHostAddress, // Địa chỉ/tên miền máy đích UINT nHostPort // Cổng ); BOOL Connect( const SOCKADDR* lpSockAddr, // Địa máy đích dạng SOCKADDR int nSockAddrLen // Chiều dài cấu trúc địa ); Giá trị trả về: - Khác NULL thành công - NULL thất bại Mã lỗi truy nhập qua hàm GetLastError() Thí dụ: CSocket s; s.Create(); s.Connect(“www.google.com.vn”, 80); 144 Chương 4.2 CSocket • Đợi kết nối từ máy khác: Phương thức Listen BOOL Listen( int nConnectionBacklog = ) Giá trị trả về: - Khác NULL thành công - NULL thất bại Mã lỗi truy nhập qua hàm GetLastError() • Đóng kết nối: Phương thức Close virtual void Close( ) 145 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, // Socket tương ứng với kết nối SOCKADDR* lpSockAddr = NULL,// Địa socket dạng SOCKADDR int* lpSockAddrLen = NULL // Chiều dài địa ); Giá trị trả về: - Khác NULL thành công - NULL thất bại Mã lỗi 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 liệu Client … 146 Chương 4.2 CSocket • Gửi liệu đến máy khác: Phương thức Send virtual int Send( const void* lpBuf, int nBufLen, int nFlags = ); // Bộ đệm chứa liệu cần gửi // Số byte cần gửi // Cờ, MSG_OOB có Giá trị trả về: - Số byte gửi thành cơng - SOCKET_ERROR thất bại Thí dụ: char buff[]=“Hello MFC Socket”; Client.Send(buff,strlen(buff)); 147 Chương 4.2 CSocket • Nhận liệu từ máy khác: Phương thức Receive virtual int Receive( void* lpBuf, int nBufLen, int nFlags = ); // Bộ đệm nhận liệu // Kích thước đệm // Cờ, MSG_PEEK MSG_OOB Giá trị trả về: - Số byte nhận thành công - NULL kết nối bị đóng - SOCKET_ERROR thất bại Thí dụ: … char buff[1024]; int buflen = 1024, nBytesReceived; nBytesReceived = connectedSocket Receive(buff,1024); … 148 Chương 4.2 CSocket • Xây dựng Client 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); … 149 Chương 4.2 CSocket • Xây dựng Server 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(); … 150 Chương 4.3 CAsyncSocket • Đóng gói hoạt động socket bất đồng • Nguyên mẫu hàm vào tương tự CSocket trở từ lời gọi • Ứng dụng không sử dụng trực tiếp lớp mà kế thừa chồng lên phương thức ảo lớp để xử lý kiện • Các phương thức hay chồng – – – – OnAccept: Phương thức gọi có yêu cầu kết nối OnClose: Phương thức gọi socket đầu bị đóng OnSend: Phương thức gọi socket gửi liệu OnReceive: Phương thức gọi socket nhận liệu chờ ứng dụng xử lý – OnConnect: Phương thức gọi yêu cầu kết nối chấp nhận socket sẵn sàng để gửi nhận liệu 151 Chương 4.3 CAsyncSocket • 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ạ kiện LPCTSTR lpszSocketAddress = NULL // Địa socket ); Giá trị trả : - Khác NULL thành công - NULL thất bại Sự khác biệt với CSocket phương thức tham số lEvent chứa mặt nạ kiện ứng dụng mong muốn nhận 152 Chương 4.3 CAsyncSocket • Xử lý kiện: chồng lên phương thức tương ứng với 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; 153 Chương 4.3 CAsyncSocket • Xử lý 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 v{o cuối m_strRecv if (szTemp.CompareNoCase(_T("bye")) == 0) { ShutDown(); s_eventDone.SetEvent(); } } CAsyncSocket::OnReceive(nErrorCode); } 154 .. .Chương MFC Soket • 4. 1 Giới thiệu • 4. 2 CSocket • 4. 3 CAsyncSocket 141 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... ); Giá trị trả về: - Khác NULL thành công - NULL thất bại Mã lỗi truy nhập qua hàm GetLastError() Thí dụ: CSocket s; s.Create(); s.Connect(“www.google.com.vn”, 80); 144 Chương 4. 2 CSocket • Đợi... về: - Số byte nhận thành công - NULL kết nối bị đóng - SOCKET_ERROR thất bại Thí dụ: … char buff[10 24] ; int buflen = 10 24, nBytesReceived; nBytesReceived = connectedSocket Receive(buff,10 24) ;

Ngày đăng: 10/05/2021, 13:40

Tài liệu cùng người dùng

Tài liệu liên quan