Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
1,24 MB
Nội dung
Chương 1: TỔNG QUAN VỀ LẬP TRÌNH MẠNG I Họ giao thức TCP/IP Mục tiêu _ Cung cấp dịch vụ truyền thông liên mạng, che dấu chi tiết kiến trúc liên mạng, che dấu chi tiết phần cứng _ Kiến trúc phân lớp Địa IP a) Khái niệm _ Địa luận lý (địa cấp phát động tĩnh): xác định máy mạng, khác với địa card mạng _ Địa vật lý (địa card mạng): nhà sản xuất cấp phát _ Phiên bản: • Ipv4: 32 bit, dạng biểu diễn số chấm thập phân (ví dụ: 192.168.10.1) • Ipv6: 128 bit b) Phân lớp địa _ Xác định bit nhận dạng (Class ID): – Sự tương quan lớp kích thước mạng: _ Các địa IP đặc biệt: _ Các vùng địa IP dành riêng (Private Network): • 10.0.0.0 – 10.255.255.255.255 • 172.16.0.0 – 172.31.255.255 • 192.168.0.0 – 192.168.255.255 Một số giao thức a) Lớp Internet (Internet Layer) _ Giao thức Internet (IP – Internet Protocol) _ Giao thức Kiềm soát Thông điệp Internet (Internet Control Message Protocol – ICMP) _ Giao thức Nhóm Thơng điệp Internet (Internet Group Message Protocol – IGMP) _ Giao thức Phân giải Địa (Address Resolution Protocol – ARP), giao thức Chuyển đổi Địa (Address Reverse Protocol – ARP): chuyển đổi địa vật lý, luận lý CuuDuongThanCong.com https://fb.com/tailieudientucntt b) Lớp Giao vận (Transport Layer) _ Cung cấp dịch vụ truyền thông tiến trình _ Thơng tin xác định tiến trình: • Địa IP • Cổng (16 bit): – 1023: well-know port, IANA (Internet Assigned Numbers Authority) 1024 – 49151: registered port 49152 – 65535: dynamic port _ Giao thức Kiểm sốt Truyền thơng (Transmission Control Protocol – TCP): • Có thiết lập cầu nối: full duplex • Tin cậy: trình tự, khơng thất thốt, khơng trùng lấp • Byte stream: đệm liệu (nơi lưu trữ liệu trước gửi; ví dụ: đệm KB, gói liệu KB có 1KB chuyển phải gửi lại thêm KB nữa) _ Giao thức Dữ liệu Người dùng (User Datagram Protocol – UDP): • Khơng thiết lập cầu nối • Không tin cậy • Dạng truyền thông (broadcast) • Dữ liệu Người dùng (datagram) c) Lớp Ứng dụng (Application Layer) _ Cung cấp việc vận chuyển liệu suốt hệ thống đầu cuối (end systems) II Ứng dụng mạng _ Truyền tải tập tin (File Transfer) _ Trình duyệt web / server (Web Browser / Server) _ Thư điện tử (Electric Mail) _ Truyền tải giọng nói (Voice over IP) _ Xem phim, nghe nhạc trực tuyến (Audio / Video Online) _ Hội họp từ xa (Remote Conferencing) _ Trò chơi trực tuyến (Game Online) _… III Mơ hình ứng dụng _ Mơ hình tầng (2-tiers): Client / Server _ Mơ hình đa tầng (N-tiers) _ Mơ hình hàng ngang (Peer to Peer) IV Giao diện lập trình socket Window Socket API _ Khái quát: • Phát triển theo đặc tả giao diện Phân phối Phần mềm Berkeley (Berkeley Soft ware Distribution – BSD Socket) • Bổ sung tính hoạt động mơi trường Windows • Hiện thực dạng thư viện liên kết động: wsock32.dll (winsock.h), ws2_32.del (winsock.h) • Thư viện lập trình giao tiếp với giao thức mạng _ Dữ liệu: socket, địa IP, thông tin máy _ Các hàm: liên kết thư viện truy xuất thông tin, chuyển đổi liệu, làm việc với socket Tiếp cận hướng đối tượng a) MFC _ Thư viện hỗ trợ Microsoft: • Che giấu chi tiết sử dụng hàm Winsock API • Hỗ trợ xây dựng ứng dụng Internet _ Windows Sockets: CasyncSocket, Csocket, CsocketFile _ Mở rộng: Win32 Internet Extensions Winlnet: • ElnternetSession • ElnternetConnection: CftpConnection, CgopherConection, ChttConnection • CgopherLocation CuuDuongThanCong.com https://fb.com/tailieudientucntt • ElnternetFile • EfileFmd b) NET _ System.Net: • DNS • IPAddress • EndPoint • IPHostEntry • Socket Address • WebRequest, WebResponse • WebClient •… _ System.Net.Socket: • Socket • SocketException • TcpClient, TcpListener • UdpClient •… _ System.Net.Mail: • Enet •… c) Java _ Java.Net: • InetAddress • Socket, ServerSocket • SocketException • URI+, URL _ Javamail CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 2: CĂN BẢN LẬP TRÌNH WINSOCK I Socket Khái niệm _ Cơ chế trừu tượng dùng cho q trình truyền thơng tiến trình _ Tương ứng với cấu trúc chứa thơng tin cần cho q trình truyền thơng tiến trình (IP, port) Quản lý socket _ Cấu trúc liệu hệ điều hành quản lý _ Ứng dụng sử dụng thông qua handle Phân loại _ Stream Socket: TCP Socket _ Datagram Socket: UDP Socket _ Raw Socket II Phân nhóm hàm thư viện _ Liên kết thư viện, kết thúc _ Truy xuất thông tin _ Chuyển đổi dạng liệu _ Các hàm thao tác socket: • Tạo socket, đóng socket • Thiết lập cầu nối • Gửi, nhận liệu III Liên kết thư viện _ Liên kết thư viện: int WSAStartup (WORD wVersionRequested, LPWSADATA lpwaData); _ Kết thúc: int WSACleanup(); _ Truy xuất mã lỗi sai: int WSAGetLastError(); _ Lưu ý: • File StdAfx.h: #include • Lớp ứng dụng: bool CDDemoApp :: InitInstance() { if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return false; } return false; } IV Truy xuất thông tin Thông tin máy _ Các phương thức: • int gethost name (char FAR* name, int len); • PHOSTENT gethostbyname (const char FAR* hostname); • PHOSTENT gethostbyaddr (const char FAR* addr, int len, int af); _ Ví dụ: char sethostName [MAX_LEN]; if (gethostname (sethostName, MAX_LEN) != SOCKET_ERROR) { //… } else { //… } _ Cấu trúc thông tin máy: • struct hostent { CuuDuongThanCong.com https://fb.com/tailieudientucntt char FAR* h_name; char FAR* FAR* h_aliases; short h_addtype; short h_lenght; char FAR* FAR* h_addr_list; #define h_addr h_addr_list[0]; }; • PHOSTENT pHostEnt = gethostbyname (set); if (pHostEnt != NULL) { //… } Thông tin dịch vụ _ Cú pháp: PSERVENT getservbyname (constchar char FAR* name, const FAR* proto); V Chuyển đổi thông tin liệu Chuyển đổi trật tự byte _ Trật tự byte: • Lưu trữ số nguyên máy tính: Host Byte Order Little-Endian Big-Endian short 12AB AB12 12AB long 12AB34CD CS34AB12 12AB34CD • Quy ước lưu trữ số nguyên mạng (Network Byte Order): Big-Endian _ Các hàm chuyển đổi: • u_short ntohs (u_short); • u_long ntohl (u_long); • u_short htons (u_short); • u_long htonl (u_long); Chuyển đổi dạng địa _ Dạng biểu diễn địa IPv4: • Số nguyên byte • Chuỗi dấu chấm thập phân (Dotted Decimal) _ Các hàm chuyển đổi: • unsigned long inet_addr (const char FAR* CD); • char FAR* inet_ntoa (struct in_addr in); _ Cấu trúc địa chỉ: struct in_addr { union { struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; #define #define #define #define #define #define s_addr S_un.S_addr // can be used for most tcp & ip code s_host S_un.S_un_b.s_b2 // host on imp s_net S_un.S_un_b.s_b1 // network s_imp S_un.S_un_w.s_w2 // imp s_impno S_un.S_un_b.s_b4 // imp # s_lh S_un.S_un_b.s_b3 // logical host CuuDuongThanCong.com https://fb.com/tailieudientucntt }; _ Ví dụ: //… PHOSTENT pHost = gethostbyname (“…”); if (pHost != NULL) { IN_ADDR inAddr; memcpy (&inAddr, pHost->h_addr, 4); // inAddr.s_addr = pHost->h_addr; Cstring sAddress = inet_ntoa (inAddr); //… } memcpy (&inAddr, pHost->h_addr, 4); VI Các hàm socket Quy trình sử dụng a) Có thiết lập cầu nối b) Không thiết lập cầu nối CuuDuongThanCong.com https://fb.com/tailieudientucntt Chi tiết sử dụng a) Tạo socket _ Cú pháp: SOCKET socket (int af, int type, int protocol); _ Thơng số: • af: họ địa AF_INET • type: loại địa – SOCK_STREAM (có thiết lập cầu nối – TCP), SOCK_DGRAM (khơng thiết lập cầu nối – UDP) • protocol: loại giao thức – _ Kết trả về: • Thành cơng: handle socket vừa tạo • Thất bại: INVALID_SOCKET _ Ví dụ: SOCKET s; // socket descriptor char lpszMessage[100]; // informational message s = socket(AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) wsprintf (lpszMessage, “socket() generated error %d”, WSAGetLastError()); else lstrcpy(lpszMessage, “socket() succeeded”); MessageBox(NULL, lpszMessage, “Info”, MB_OK); b) Đóng socket _ Cú pháp: int closesocket(SOCKET s); _ Thông số: s: handle máy muốn đóng _ Kết trả về: Thất bại: SOCKET_ERROR c) Gán thông tin socket _ Cú pháp: int bind (SOCKET s, const struct sockaddr FAR* addr, int addrlen); _ Thơng số: • s: handle socket chờ gán thơng tin • addr: địa cấu trúc dùng để chứa thơng tin socket phía kết nối đến • addrlen: địa biến chứa kích thước cấu trúc addr _ Cấu trúc thông tin socket: struct sockaddr { u_short sa_family; // address family char sa_data[14]; // up to 14 bytes of direct address }; struct sockaddr_in { short sin_family; // address family u_short sin_port; // service port struct in_addr sin_addr; // Internet address char sin_zero[8]; // filler CuuDuongThanCong.com https://fb.com/tailieudientucntt }; _ Ví dụ: SOCKET s; // socket descriptor char lpszMessage[100]; // informational message SOCKADDR_IN addr; // Internet address // create a stream socket s = socket(AF_INET, SOCK_STREAM, 0); if (s != INVALID_SOCKET) { // fill out the socket’s address information addr.sin_family = AF_INET; addr.sin_port = htons(1050); addr.sin_addr.s_addr = htonl(INADDR_ANY); // bind the socket to its address if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR) { wsprintf(lpszMessage, “ bind() generated error %d”, WSAGetLastError()); MessageBox(NULL, lpszMessage, “Info”, MB_OK); } else { // } } • Trường hợp khơng định port: sin_port = 0; • Lấy thơng tin socket: int getsockname (SOCKET s, struct sockAddr* addr, int* addrlen); d) Lắng nghe _ Cú pháp: int listen (SOCKET s, int backlog); _ Thơng số: • s: handle máy muốn đóng • backlog: kích thước hàng đợi kết nối _ Kết trả về: Thất bại: SOCKET_ERROR _ Ví dụ: SOCKET s; // socket descriptor char lpszMessage[100]; // informational message SOCKADDR_IN addr; // Internet address // create a stream socket s = socket(AF_INET, SOCK_STREAM, 0); if (s != INVALID_SOCKET) { // fill out the socket’s address information addr.sin_family = AF_INET; addr.sin_port = htons(1050); addr.sin_addr.s_addr = htonl(INADDR_ANY); // bind the socket to its address if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) != SOCKET_ERROR) { // listen for connections (queueing up to three) if (listen(s, 3) == SOCKET_ERROR) { wsprintf(lpszMessage, “listen() generated error %d”, WSAGetLastError()); MessageBox(lpszMessage, “Info”); } else { // } } } e) Tiếp nhận _ Cú pháp: SOCKET socket (SOCKET s, struct sockAddr FAR* addr, int FAR* addrlen); CuuDuongThanCong.com https://fb.com/tailieudientucntt _ Thông số: • s: handle socket chờ tiếp nhận “nói” (“lắng nghe”) • addr: địa cấu trúc dùng để chứa thơng tin socket phía kết nối đến • addrlen: địa biến chứa kích thước cấu trúc addr _ Kết trả về: • Thành cơng: handle socket giao tiếp với phía kết nối đến • Thất bại: INVALID_SOCKET _ Ví dụ: SOCKET s; // socket descriptor SOCKET clientS; // client socket descriptor char lpszMessage[100]; // informational message SOCKADDR_IN addr; // Internet address SOCKADDR_IN clientAddr; // Internet address IN_ADDR clientIn; // IP address int nClientAddrLen; // create a stream socket s = socket(AF_INET, SOCK_STREAM, 0); if (s != INVALID_SOCKET) { // fill out the socket’s address information addr.sin_family = AF_INET; addr.sin_port = htons(1050); addr.sin_addr.s_addr = htonl(INADDR_ANY); // bind the socket to its address if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) != SOCKET_ERROR) { // listen for connections (queueing up to three) if (listen(s, 3) != SOCKET_ERROR) { // set the size of the client address structure nClientAddrLen = sizeof(clientAddr); // accept a connection clientS = accept(s, (LPSOCKADDR)&clientAddr, &nClientAddrLen); if (clientS == INVALID_SOCKET) { wsprintf(lpszMessage, “ accept() generated error %d”, WSAGetLastError()); MessageBox(lpszMessage, “Info”); } else { // copy the four byte IP address into an IP address structure memcpy(&clientIn, &clientAddr.sin_addr.s_addr, 4); // print an informational message wsprintf(lpszMessage, “accept() ok: client IP address is %s, port is %d”, inet_ntoa(clientIn), ntohs(clientAddr.sin_port)); 114 Part II n Basics of WinSock Programming MessageBox(lpszMessage, “Info”); } } } } CuuDuongThanCong.com https://fb.com/tailieudientucntt _ Trường hợp lấy thông tin phía kết nối sau tiếp nhận kết nối: int getpeername (SOCKET s, struct sockAddr* addr, int* addrlen); _ Ví dụ: // accept a connection clientS = accept(s, NULL, NULL); if (clientS == INVALID_SOCKET) { wsprintf(lpszMessage, “accept() generated error %d”, WSAGetLastError()); MessageBox(lpszMessage, “Info”); } else { if (getpeername(clientS, (LPSOCKADDR)&clientAddr, &nClientAddrLen)) == SOCKET_ERROR) { wsprintf(lpszMessage, “getpeername() generated error %d”, WSAGetLastError()); MessageBox(lpszMessage, “Info”); } else { // copy the four byte IP address into an IP address structure memcpy(&clientIn, &clientAddr.sin_addr.s_addr, 4); // print an informational message wsprintf(lpszMessage, “client IP address is %s, port is %d”, inet_ntoa(clientIn), ntohs(clientAddr.sin_port)); MessageBox(lpszMessage, “Info”); // } } f) Kết nối _ Cú pháp: int connect (SOCKET s, const struct sockAddr FAR* addr, int addrlen); _ Thông số: • s: handle socket thực kết nối • addr: địa cấu trúc dùng để chứa thông tin socket phía chờ kết nối • addrlen: địa biến chứa kích thước cấu trúc addr _ Kết trả về: Thất bại: SOCKET_ERROR _ Ví dụ: bool ConnectToServer (const Cstring &sServerAddress, short nServerPort) { bool bSuccess = true; m_hSocket = socket (AP_INET, SOCK_STREAM, 0); if (m_hSocket == INVALID_SOCKET) bSuccess = false; else { SOCKADD_IN sockAddr; addrServer.sin_family = AF_INET; addrServer.sin_port = htons(nServerPort); addrServer.sin_addr.s_addr = inet_addr(sServerAddress); if (connect(s, (LPSOCKADDR) &addrServer, sizeof(addrServer)) == SOCKET_ERROR) { bSuccess = false; closesock(m_hSocket); CuuDuongThanCong.com https://fb.com/tailieudientucntt b) Gởi nhận liệu cấu trúc _ Cấu trúc thông điệp: struct Message { long m_lMagicNumber; short m_nCommand; short m_nParam1; short m_nParam1; } void Message::Serialize(CArchive ar) { if (ar.IsStoring()); { ar w; m_nCommand = ntohs((short) w); ar >> w; m_nParam1 = ntohns((short) w); ar >> dw; m_nParam2 = ntohnl((long) w); } } _ VÍ dụ: CString SinhVien::toString()const { CString kq; kq.Format(_T("%s, %s, %d"), m_sMaso, m_sHoTen, m_nNamSinh); } c) Mơ hình xử lý _ Bất đồng bộ: dùng CAsyncSocket _ Đồng bộ: thường dùng CSocket (đa luồng) CuuDuongThanCong.com https://fb.com/tailieudientucntt Chương 3: ỨNG DỤNG INTERNET I Hệ thống FTP Giới thiệu _ Giao thức cấp ứng dụng: • Hỗ trợ dùng chung tập tin, sử dụng tập tin máy xa • Che dấu khác biệt hệ thống lưu trữ tập tin • Cung cấp dịch vụ chuyển tập tin tin cậy hiệu máy _ Đặc điểm: • Mơ hình client – server: Server: Quản lý hệ thống tập tin máy xa Đáp ứng yêu cầu làm việc tập tin từ phía lcient Client: Giao tiếp với server: làm việc với tập tin máy xa Giao tiếp người dùng • Sử dụng giao thức TCP: Trao đổi liệu tin cậy Có thiết lập cầu nối: Cầu nối điều khiển (control connection) Cầu nối liệu (data connection) • Yêu cầu chứng thực người dùng: Người dùng đăng ký tài khoản: tên mật Người dùng chưa đăng ký: bí danh _ Mơ hình hoạt động: • Client: Giao diện người dùng (User Interface – UI): Giao diện dạng dòng lệnh Giao diện đồ họa Giao thức phiên dịch (Protocol Interpreter – PI): Diễn dịch yêu cầu từ UI Giao tiếp với server PI: Thiết lập cầu nối điều khiển Gởi yêu cầu (FTP command) Xử lý hồi đáp Điều khiên họa động client DTP Tiến trình Vận chuyển Dữ liệu (Data Transfer Process – DTP) • Server: Giao thức phiên dịch (Protocol Interpreter – PI): Chờ yêu cầu kết nối từ client Giao tiếp với client PI: Nhận yêu cầu (FTP commmand) Giụ hồi đáp Điều khiển hoạt động server DTP Tiến trình Vận chuyển Dữ liệu (Data Transfer Process – DTP) _ FTP NVT: • FTP client thiết lập cầu nối • FTP client dàn xếp việc thiết lập cầu nối hai FTP server _ Hai loại cầu nối: • Cầu nối điều khiển: Client PI / server PI trao đổi yêu cầu / hồi đáp Đặc điểm: Thiết lập bắt đầu phiên làm việc CuuDuongThanCong.com https://fb.com/tailieudientucntt Duy trì kết thúc phiên làm việc Thiết lập: Server PI lắng nghe cổng dành riêng (port 21) Client PI chủ động kết nối đến server PI Server PI gởi hối đáp sẵn sàng kết nối thành cơng • Cầu nối liệu: Client DTP / server DTP gởi nhận liệu Đặc điểm: Thiết lập trước bắt đầu truyền liệu Duy trì suốt trình truyền liệu, đóng sau kết thúc q trình truyền liệu Thiết lập: Server mở cầu nối chủ động: Client DTP lắng nghe cổng tự chọn (mở cầu nối thụ động) Client PI gởi thông tin địa cổng “lắng nghe” cho server PI Server DTP chủ động kết nối theo địa cổng nhận Server mở cầu nối thụ động: Client PI báo cho server DTP mở cầu nối thụ động (gởi lệnh PASV) Server PI gởi hồi đáp thông tin địa cổng “lắng nghe” cho client PI Client DTP chủ động kết nối đến server DTP _ Vấn đề truyền liệu: • Tùy chọn: Dạng biểu diễn liệu Ký tự định dạng Cấu trúc Chế độ truyền • Tổng kết: Ứng dụng FTP hỗ trợ: Điều khiển không định dạng in (Nonprint format control) Cấu trúc tập tin (File structure) Chế độ dòng (Stream mode) Người dùng lựa chọn loại tập tin: ASCII Image (binary) _ Tập lệnh: • Các lệnh kiểm sốt truy cập (access control commands): USER (USER ): Cung cấp tên người dùng cho FTP server Lệnh gởi sau thiết lập cầu nối điều khiển Mã hồi đáp PASS (PASS): Cung cấp mật người dùng cho FTP Server Thực sau lệnh USER, bổ sung thông tin xác nhận người dùng Mã hồi đáp ACCT, CWD, CDUP, SMNT, REIN, QUIT • Các lệnh truyền tải biến (transfer-parameter commands): PORT (PORT ): Cung cấp thông tin để thiết lập cầu nối liệu Thông tin cung cấp theo định dạng byte, bao gồm : Địa máy: h1, h2, h3, h4 Cổng chờ kết nối: p1, p2 Mã hồi đáp PASV (PASV): CuuDuongThanCong.com https://fb.com/tailieudientucntt Báo cho tiến trình truyền liệu phía server lắng nghe port liệu (không phải port liệu mặc định) chờ kết nối đến Phía server đáp ứng cách gởi hồi đáp kèm thông tin địa server port liệu với định dạng lệnh PORT Mã hồi đáp TYPE, STRU, MODE • Các lệnh dịch vụ (service commands): RETR (RETR ): Yêu cầu server gởi tập tin (tải xuống) Mã hồi đáp STOR (RETR ): Yêu cầu server nhận tập tin (tải lên) Mã hồi đáp LIST (LIST ): Yêu cầu danh sách tập tin thư mục hay thông tin tập tin định Dữ liệu truyền qua cầu nối liệu Mã hồi đáp STAT (STAT ): Xác định trạng thái FTP server Server gởi thông tin trạng thái thông qua hồi đáp (qua cầu nối điều khiển) Khi thơng số đường dẫn, lệnh STAT có tác dụng lệnh LIST liệu gửi qua cầu nối điều khiển Mã hồi đáp NOOP (NOOP): Thường dùng để kiểm tra cầu nối Khi nhận được, server gởi hồi đáp OK Mã hồi đáp STOU, APPE, ALLO, REST, ABOR, RNFR, RNTO, DELE, RMD, MKD, PWD, NLIST, HELP _ Mã hồi đáp (xyz): • x: 1yz: Positive Preliminary reply Server chờ hồi đáp khác trước xử lý lệnh 2yz: Positive Completion reply Server đáp ứng hoàn tất yêu cầu 3yz: Positive Intermediate reply Server chấp nhận yêu cầu cần thên thông tin 4yz: Transient Negative Completion reply u cầu khơng chấp nhận, gởi u cầu lại sau 5yz: Permanent Negative Completion reply Server khơng chấp nhận u cầu • y: x0z: Syntax Liên quan đến lỗi sai cú pháp x1z: Information Hồi đáp cho yêu cầu thông tin (STAT, HELP, …) x2z: CuuDuongThanCong.com https://fb.com/tailieudientucntt Connection Liên quan đến cầu nối x3z: Authentication, accounting Liên quan đến trình chứng thực, đăng ký x4z: chưa dùng x5z: File system Liên quan đến trạng thái hệ thống tập tin _ Minh họa: • Dạng tương tác dòng lệnh: ftp> open nic.ddn.mil Name (nic.ddn.mil:happy):anonymous ftp> get index.txt ftp> get index.txt ftp> close • Phiên làm việc điển hình II Giao diện lập trình WinInet Giới thiệu _ WinInet – Win32 Internet Extensions • Giao diện lập trình cấp cao: Hỗ trợ ây dựng ứng dụng FTP client, HTTP client, Gopher client • Hai cách sử dụng: Các hàm WinInet Các lớp MFC WinInet (afxinet.h) Các hàm WinInet Các lớp MFC WinInet Các bước xây dựng FTP Client a) Khởi đầu phiên làm việc _ Tạo đối tượng CInternetSession: Duy trì đối tượng CInternetSession đến cuối phiên làm việc CInternetSession *m_pSession; m_pSession = new CinternetSession(); _ Tạo cầu nối: GetFtpConnection(…) GetHttpConnection(…) GetGopherConnection(…) b) Kết nối đến FTP server _ Kết nối: • CFtpConnection *m_pConnection = m_pSession->GetFtpConnection (sServerName, sUserName, sPassword); • CInternetSession::GetFtpConnection • CFtpConnection: GetCurrentDirector( ) SetCurrentDirectory( ) CreateDirectory( ) RemoveDirectory( ) GetFile( ) PutFile( ) Remove( ) Rename( ) Command( ) c) Chọn thư mục làm việc _ Chọn thư mục lảm việc: CuuDuongThanCong.com https://fb.com/tailieudientucntt • m_pConnection->SetCurrentDirectory(sDirName) • CftpConnection::GetCurrentDirectory(…) • CftpConnection::SetCurrentDirectory(…) d) Duyệt nội dung thư mục FTP server _ Thực hiện: • Tạo đối tượng duyệt tập tin • Lập duyệt tập tin • Ví dụ: try { CftpFileFind ftpFind(m_pConnection); Bool bWorking = ftpFind.FindFile(_T(“*”)); while(bWorking) { bWorking = ftpFind.FindNextFile(); lbox.AddString(ftpFind.GetFileURL()); } } catch (CinternetException *pEx) { } _ CftpFileFind: • Phương thức thiết lập • Phương thức duyệt tập tin • Phương thức khác: GetFileName, GetFileTitle, GetFilePath, GetRoot GetFileURL GetCreationTime, GetLastAccessTime, GetLastWrithTime GetLength e) Làm việc tập tin _ Tải xuống: • m_pConnection->GetFile(sRemoteFileName, sLocalFileName) • CFtp::GetFile( ) _ Tải lên: • m_pConnection->PutFile(sLocalFileName, sRemoteFileName) • CFtp::PutFile( ) _ Đọc / ghi: • CFtpConnection::OpenFile( ) • CInternetFile::Read( ) • CInternetFile::Write( ) f) Thao tác khác _ m_pConnection->Remove(sFileName) _ m_pConnection->Rename(sExsistingName, sNewName) _ m_pConnection->RemoveDirectory(sDirName) _ m_pConnection->CreateDirectory(sDirName) g) Kết thúc phiên làm việc _ Các cầu nối, tập tin tự động đóng: delete m_pSession III Lập trình mạng với NET (.NET Network Programming) Thư viện hỗ trợ lập trình mạng a) System.Net _ Dns _ EndPoint, IPEndPoint _ IPAddress _ IPHostEntry _ SocketAddress CuuDuongThanCong.com https://fb.com/tailieudientucntt _ WebClient _ WebRequest, WebResponse _ FtpWebRequest, FtpWebResponse _ HttpWebRequest, HttpWebResponse _ HttpListener b) System.Net.Sockets _ Socket _ SocketException _ TcpClient _ TcpListener _ UdpClient _ NetworkStream c) System.Net.Mail _ Attachment _ MailAddress _ MailAddressCollection _ MailMessage _ SmtpClent _ MailPriority _ SmtpAccess _ SmtpDeliveryMethod _ SmtpStatusCode Xác định thông tin máy a) DNS _ Phương thức: • static String GetHostName() • static IPHostEntry GetHostByName(String name) • static IPHostEntry GetHostByAddress(IPAddress addr) • static IPHostEntry Resolve(String name) _ Hoạt động bất đồng • BeginGetHostByName, EndGetHostByName • BeginGetHostByAddress, EndGetHostByAddress • BeginRessolve, EndRessolve b) IPHostEntry _ Đặc tả thông tin máy: tên máy, tên địa _ Thuộc tính: • Danh sách địa chỉ: AddressList • Danh sách tên máy (bí danh): Aliases • Tên máy: Host IV Lập trình Socket Các lớp liên qnan a) System.Net _ IP Address: • Hằng định nghĩa sẵn: IPAddress.Any IPAddress.Broadcast IPAddress.Loopback IPAddress.None • Thuộc tính: Địa IP: Address Họ địa chỉ: AddressFamily • Phương thức: Chuyển đổi trật tự byte: short, int, long: CuuDuongThanCong.com https://fb.com/tailieudientucntt static T HostToNetworkOrder (T num) static T NetworkToHostOrder (T num) static bool IsLoopback (IPAddress addr) static IPAddress Parse (String ipString) static bool TryParse (String ipString, ) string ToString() byte[] GetAddressByte() _ IPEndPoing: • Thuộc tính: Địa IP: Address Họ địa chỉ: AddressFamily Số hiệu cổng: Port • Phương thức: IPEndPoint (long addr, int port) IPEndPoint (IPAddress addr, int port) EndPoint Create (SocketAddress sockAddr) SocketAddress Serialize() b) System.Net.Sockets _ Hằng liệt kê: • AddressFamily: InterNetwork InterNetworkV6 • ProtocolType: Tcp Udp … • SocketType: Stream Dgram Raw … • SocketFlags: None DontRoute OutOfBand … _ Socket: • Thuộc tính: AddressFamily, SocketType, ProtocolType Available Blocking Connected Handle LocalEndPoint, RemoteEndPoint … • Phương thức: Tạo lập: Socket(AddressFamily family, ProtocolType protocol) void Bind(EndPoint localEP) Thiết lập cầu nối: void Listen(int backlog) Socket Accept() CuuDuongThanCong.com SocketType https://fb.com/tailieudientucntt sockType, void Connect (EndPoint remoteEP) Gởi / nhận: int Receive(byte[] data) int Eeceive(byte[] data, SocketFlags flag) int Send(byte[] data) int Send(byte[] data, SocketFlags flag) int ReceiveFrom(byte[] data, ref Endpoint ep) int ReceiveFrom(byte[] data, SocketFlags flag, ref Endpoint ep) int SendTo(byte[] data, ref Endpoint ep) int SendTo(byte[] data, SocketFlags flag, ref Endpoint ep) Khác: void Shutdow (SocketShutdown how) void Close() GetSocketOption SetSocketOption bool Pool (int microSeconds, SelectMode mode) static void Select(IList read, IList write, ILst err, int microSeconds) Hoạt động bất đồng bộ: BeginAccept, EndAccept BeginConnect, EndConnect BeginReceive, EndReceive BeginSend, EndSend BeginReceiveFrom, EndReceiveFrom BeginSendTo, EndSendTo • Minh họa: Client: IPAddress host = IPAddress.Parse(“192.168.1.1”); IPEndPoint hostep = new IPEndPoint (host, 8000); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Client.Connect (hostep); Server: IPHostEntry local = Dns.GetHostByName(Dns.GetHostName()); IPEndPoint iep = new IPEndPoint(local.AddressList[0], 8000); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Server.Bind (iep); Server.Listen (5); Socket client = server.Accept(); _ Helper Class: • Khái quát: • Xây dựng dựa Socket Class • Che dấu chi tiết sử dụng socket: TCP: TcpClient: TcpListener: UDP: UdpClient: • TcpClient: CuuDuongThanCong.com https://fb.com/tailieudientucntt Thuộc tính: Avaliable Connected: ReceiveBufferSize SendBufferSize: mặc định 8192 byte ReceiveTimeout SendTimeout: mặc định ms Phương thức thiết lập: Tạo đối tượng TcpClient kết nối đến địa cổng mặc định: TcpClient() TcpClient(AddressFamily family) TcpClient(IPEndPoint localEndPoint) TcpClient(String addr, int port) Kết nối: Đồng bộ: void Connect(IPEndPoint ep) void Conenct(IPAddress addr, int port) void Connect(String addr, int port) IAsyncResult BeginConnect(IPAddress address, int port, AsyncCallback requestCallback, Object state) Bất đồng bộ: void RndConnect (IasyncResult asyncResult()) Gửi / nhận: Thông qua NetworkStream: Truy xuất NetworkStream: NetworkStream GetStream() Thuộc tính: CanRead, CanWrite, DataAvailable, ReadTimeout, WriteTimeout Đọc / ghi: Đồng bộ: int Read(byte[] buffer, int size) int ReadByte() int Write(byte[] buffer, int size) void WriteByte (byte data) offset, int offset, int Bất đồng bộ: IAsyncResult BeginRead (byte[] buffer, int offset, int size, AsyncCallback callback, Object state) Đóng Dữ liệu ký tự: System.Text gồm phương thức GetBytes(…) GetString(…): ASCIIEncoding UnicodeEncoding UTF7Encoding UTF8Encoding Kết hợp stream: TcpClient client = new TcpClient (server, port) BinaryWrite out = new BinaryWriter(new BufferedStream(client.GetStream) Đóng socket Minh họa: TcpClient newclient = new TcpClient (www.isp.net, 8000); NetworkStram ns = newclient.GetStream(); byte[] outbytes = ASCIIEncoding.GetBytes(“Testing”); ns.Write(outbytes, 0, outbytes.Length); byte[] inbytes = new byte[1024]; CuuDuongThanCong.com https://fb.com/tailieudientucntt ns.Read(inbytes, 0, inbytes.Length); String instring = ASCIIEncoding.GetString (inbytes); Console.WriteLine(instring); ns.Close(); newclient.Close(); • TcpListener: Phương thức thiết lâp: TcpListener (int port) TcpListener (IPEndPoint ep) TcpListener (IPAddress addr, int port) Lắng nghe / Đóng: void Start() void Stop() Kiểm tra có yêu cầu kết nối: bool Pending() Tiếp nhận: Đồng bộ: Socket AcceptSocket() TcpClient AcceptTcpClient() Bất đồng bộ: BeginAcceptSocket EndAcceptSocket BeginAcceptTcpClient EndAcceptTcpClient Minh họa: TcpListener newserver = new TcpListener(9050); newserver.Start(); TcpClient newclient = new server.AcceptTcpClient(); NetworkStream ns = newclient.GetStream(); Byte[] outbytes = Encoding.ASCII.GetBytes(“Testing”); ns.Write(outbytes, 0, oubytes.Length); byte[] inbytes = new byte[1024]; ns.Read(inbytes, 0, inbytes.Length); String instring = Encoding.ASCII.GetString(inbytes); console.WriteLine(instring); ns.Close(); newclient.Close(); newserver.Stop(); Kỹ thuật tránh blocking a) Non-blocking socket _ Sử dụng thuộc tính Blocking Đặt Blocking = false để đặt socket vào chế độ hoạt động non-blocking _ Ở chế độ non-blocking: • Khi phương thức gọi khơng thể hồn tất Trả mã báo sai, chương trình khơng bị chặn • Ví dụ: Phương thức Receive trả chưa có liệu để nhận b) Phương thức Poll _ Dùng phương thức Poll trước gọi hàm gây blocking: bool Poll(int microseconds, SelectMode mode) _ Sử dụng phương thức Select để đưa socket danh sách giám sát: Sau Select hoàn tất, IList chứa socket thỏa điều kiện kiểm tra: void Select(IList read IList write, IList err, int microseconds) _ Minh họa: CuuDuongThanCong.com https://fb.com/tailieudientucntt ArrayList socketList = new ArrayList(5); socketList.Add(sock1); socketList.Add(sock2); Socket.Select(socketList, null, null, 5000000); byte[ buffer = new byte[1024]; for(i = 0; I < socket.List.Count; i++) { ((Socket)socketLst[i]).Receive(buffer); Console.WriteLine(Encoding.ASCII.GetString(buffer)); } c) Tổng kết _ Tiếp nhận kết nối: • Dùng Socket: Trước gọi Accept(): Đặt vào chế độ non-blocking Gọi Poll() Select() • Dùng TcpListener: Chỉ gọi AcceptSocket() / AcceptTcpClient() Peding() = true _ Kết nối: Dùng Socket trước gọi Connect: • Đặt vào chế độ non-blocking • Gọi Poll() Select() _ Gởi liệu: • Dùng Socket: Trước gọi Send() / SendTo(): Đặt vào chế độ non-blocking Gọi Poll() Select() Đặt giá trị thuộc tính SendTimeout • Dùng TcpClient: Đặt giá trị thuộc tính SendTimeout trước gọi Write() network stream _ Nhận liệu: • Dùng Socket: Trước gọi Receive() / Receive To(): Đặt vào chế độ non-blocking Gọi Poll() Select() Đặt giá trị thuộc tính SendTimeout Chỉ gọi Receive() / Receive To() giá trị thuộc tính Available > • Dùng TcpClient: Đặt giá trị thuộc tính ReceiveTimeout trước gọi Write() network stream Chi gọi Read() giá trị thuộc tính Available = true; Xử lý bất đồng _ Sử dụng phương thức hoạt động theo chế độ hoạt động bất đồng • Gọi phương thức bắt đầu Begin để đăng ký trình xử lý cho kiện mong đợi • Gọi phương thức bắt đầu End trình xử lý để hồn tất xử lý bất đồng cho kiện mong đợi _ Minh họa: • Client: void ButtonConnectOnClick(object ob), EventArgs ea) { conStatus.Text = “Connecting…”; m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Socket newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(“127.0.0.1”), 9050); m_socket.BeginConnect(iep, new AsyncCallback(Connected), null); CuuDuongThanCong.com https://fb.com/tailieudientucntt // newSocket.BeginConnect(iep, new AsyncCallback(Connected), newSocket); } void Connected(IAsyncResult iar) { //Socket client = (Socket)iar.AsyncState; try { m_socket.EndConnect(iar); // client.EndConnect(iar); conStatus.Text = “Connect to: “ + m_socket.RemoteEndPoint.ToString(); //conStatus.Text = “Connect to: “ + client.RemoteEndPoint.ToString(); m_socket.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), null); // client BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), null); } catch (SocketException) { conStatus.Text = “Error connecting”; } } void ReceiveData(IAsyncResult iar) { // Socket client = (Socket)iar.AsyncState; int recv = m_socket.EndReceive(iar); // int recv = client.EndReceive(iar); string stringData = Encoding.ASCII.GetString(data, 0, recv); results.Items.Add(stringData); } • Server: void ButtonListenOnClick(object ob), EventArgs ea) { m_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iap = new IPEndPoint(IPAddress.Any, 9050); m_server.Bind(iap); m_server.Listen(5); m_server.BeginAccept(new AsyncCallback(AcceptConnection), null); } void AcceptConnection(IAsyncResult iar) { Socket client = m_server.EndAccept(iar); conStatus.Text = “Connect to: “ + client.RemoteEndPoint.ToString(); string stringData = “Welcome to my server”; byte[] message1 = Encoding.ASCII.GetBytes(stringData); CuuDuongThanCong.com https://fb.com/tailieudientucntt client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client); } void SendData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; int sent = client.EndSend(iar); client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(SendData), client); } void ReceiveData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; int recv = client.EndReceive(iar); if(recv == 0) { client.Close(); conStatus.Text = “Waiting for client ”; m_server.BeginAccept(new AsyncCallback(AcceptConnection), null); return; } string receiveData = Encoding.ASCII.GetString(data, 0, recv); results.Items.Add(receivedData); byte[] message = Encoding.ASCII.GetBytes(receiveData); client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), client); } Sử dụng thread _ Server: class ThreadedTcpSrvr { private TcpListener listener; public ThreadedTcpSrvr() { listener = new new TcpListener(9050); listener.Start(); Console.WriteLine(“Waiting for clients…”); while(true) { while (!listener.Pending()) Thread.Sleep(1000); ConnectionThread newclient = new ConnectionThread(); Newclient.threadListener = this.listener; Thread newthread = new Thread(new ThreadStart(newclient.HandleConnection)); newthread.Start(); } } public static void Main() { ThreadedTcpSrvr server = new ThreadedTcpSrvr(); } } CuuDuongThanCong.com https://fb.com/tailieudientucntt class ConnectionThread { private static int connections = 0; public TcpListener threadListener; public void HandleConnection() { int recv; byte[] data = new byte[1024]; TcpClient client = threadListener.AcceptTcpClient(); NetworkStream ns = client.GetStream(); connections++; Console.WriteLine(“New client accepted: [0] active connections”, connections); string welcome = “Welcome to my server”; data = Encoding.ASCII.GetBytes(welcome); ns.Write(data, 0, data.Length); while(true) { data = new byte[1024]; recv = ns.Read(data, 0, data.Length); if (recv == 0) break; ns.Write(data, 0, recv); } ns.Close(); client.Close(); connections ; Console.WriteLine(“Client disconnected: [0] active connections”, connections); } } CuuDuongThanCong.com https://fb.com/tailieudientucntt ... 2: CĂN BẢN LẬP TRÌNH WINSOCK I Socket Khái niệm _ Cơ chế trừu tượng dùng cho trình truyền thơng tiến trình _ Tương ứng với cấu trúc chứa thông tin cần cho trình truyền thơng tiến trình (IP, port)... CASynSocket _ Đặc tả khái niệm socket _ Kế thừa từ CObject: • Cung cấp giao diện lập trình mạng: Giao diện lập trình mạng mức thấp (che giấu chi tiết sử dụng Windows API): Các hàm thành phần: tương... Các cầu nối, tập tin tự động đóng: delete m_pSession III Lập trình mạng với NET (.NET Network Programming) Thư viện hỗ trợ lập trình mạng a) System.Net _ Dns _ EndPoint, IPEndPoint _ IPAddress