1. Trang chủ
  2. » Cao đẳng - Đại học

Bài giảng môn Lập trình Mạng

40 71 0

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

Ngày đăng: 27/12/2019, 19:13

Xem thêm:

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN