Bài giảng Lập trình mạng - Chương 1: Lập trình mạng theo mô hình Client/Server dùng giao thức TCP/IP (Cụ thể là Winsock) - Nguyễn Văn Hiệp
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình mạng - Chương 1: Lập trình mạng theo mô hình Client/Server dùng giao thức TCP/IP (Cụ thể là Winsock) - Nguyễn Văn Hiệp", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_lap_trinh_mang_chuong_1_lap_trinh_mang_theo_mo_hin.pdf
Nội dung text: Bài giảng Lập trình mạng - Chương 1: Lập trình mạng theo mô hình Client/Server dùng giao thức TCP/IP (Cụ thể là Winsock) - Nguyễn Văn Hiệp
- TTẬẬPP SLIDESLIDE BBÀÀII GIGIẢẢNGNG MMÔÔNN LLẬẬPP TRTRÌÌNHNH MMẠẠNGNG Người soạn : TS. Nguyễn Văn Hiệp Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Trường ĐH Bách Khoa Tp.HCM Slide 1
- MÔN LẬP TRÌNH MẠNG Đối tượng : SV ₫ại học ngành Công nghệ thông tin Nội dung chính : 1. Lập trình ứng dụng mạng theo mô hình Client/Server dùng giao thức TCP/IP. 2. Lập trình Web chạy trên Client và trên Server bằng các công nghệ phổ biến. Tài liệu tham khảo chính : [1] Computer Networks, A.S. Tanenbaum, Prentice-Hall, Edition 3. [2] Bộ CD MSDN của Microsoft. [3] Online Help của môi trường lập trình JBuilder [4] CDROM chứa RFCs. [5] Core Servlets and JavaServer Pages, Marty Hall, Sun Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Trường ĐH Bách Khoa Tp.HCM Slide 2
- MÔN LẬP TRÌNH MẠNG Đốitượng : SV ₫ạihọcngành Công nghệ thông tin Nội dung chính gồm10ch ương : 1. Lập trình m ạng theo mô hình Client/Server dùng giao thức TCP/IP (cụ thể là Winsock) 2. Viết hệ th ống MiniChatter bằng VC++ & dùng kỹ thuật xử lý sự kiện. 3. Viết hệ th ống MiniChatter bằng Java & dùng kỹ thu ật xử lý multi-thread. 4. Tổng quát về lập trình Web. 5. DHTML & Client Script. 6. Lập trình Web chạy trên Client dùng Applet Java. 7. Lập trình Web chạy trên Client dùng ActiveX. 8. Lập trình Web chạy trên Server bằng công nghệ Microsoft. 9. Lập trình Web chạy trên Server bằng PHP. 10. Lập trình Web chạy trên Server bằng Java. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Trường ĐH Bách Khoa Tp.HCM Slide 3
- MÔN LẬP TRÌNH MẠNG Chương 1 LẬP TRÌNH MẠNG THEO MÔ HÌNH CLIENT/SERVER DÙNG GIAO THỨC TCP/IP (CỤ THỂ LÀ WINSOCK) I.1 Ôn lại kiến trúc mạng Internet I.2 Mô hình hoạt ₫ộng client/server dùng socket I.3 Đặc tả các hàm Winsock cơ bản I.4 Vấn ₫ề bất ₫ồng bộ trong gởi/nhận thông tin I.5 Thí dụ v ềứng dụng m ạng cơ bản Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 4
- I.1 Ôn lại kiến trúc mạng Internet Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 5
- Tổng quát về lập trình mạng trên Internet Xem kiến trúc của mạng Internet trong slide trước, ta thấy việc lập trình ứng dụng sẽ dựa vào 1 trong 2 giao thức TCP|UDP của cấp TCP. Giao thức TCP dùng cầu nối nên rất tin cậy (không mất, không sai, không thay ₫ổi thứ tự truyền/nhận). Giao thức UDP không dùng cầu nối nên không tin cậy, code của ứng dụng cần kiểm soát lỗi trong quá trình gởi/nhận thông tin (nếu muốn). Hiện trên các platform khác nhau, người ta cung cấp giao tiếp lập trình của thư viện socket ₫ể lập trình trên cấp TCP. Thư viện socket trên Windows ₫ược gọi là Winsock. Trong phần còn lại của chương 1, chúng ta sẽ trình bày chi tiết về các hàm thư viện winsock cơ bản và cách sử dụng chúng ₫ể lập trình 1 ứng dụng nhỏ. Các thông tin của chương này có thể ₫ược áp dụng trên các platform khác với sự thay ₫ổi nhỏ (do có sự khác biệt nhỏ giữa các thư viện socket trên các platform khác nhau). Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 6
- I.2 Mô hình hoạt ₫ộng client/server dùng socket Hai ứng dụng client/server lúc còn ₫ộc lập nhau Server ClientClient Server Hai ứng dụng client/server lúc giao tiếp nhau (dùng cầu nối TCP và giao thức request/reply) connection request ClientClient ServerServer reply Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 7
- Mô hình hoạt ₫ộng client/server dùng socket Server Client socket()socket() bind()bind() socket()socket() listen()listen() gởi thông báo TCP yêu cầu tạo cầu nối connect()connect() gởi thông báo TCP chấp nhận tạo cầu nối accept()accept() send()send() // recv()recv() recv()recv() // send()send() closesocket()closesocket() closesocket()closesocket() Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 8
- I.3 Đặc tả các hàm Winsock Để biết chi tiết và chính xác về ₫ặc tả sử dụng & tính năng của các hàm trong thư viện Winsock, bạn nên ₫ọc trang Web tương ứng trong ₫ĩa CD MSDN của Microsoft (hoặc vào website của Microsoft). Trong các slide ở mục I.3, chúng tôi chỉ cố gắng tóm tắt lại các ₫iểm cơ bản nhất về ₫ặc tả sử dụng cũng như tính năng của các hàm winsock thiết yếu nhất. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 9
- Đặc tả hàm socket() Chức năng : tạo record socket ₫ể chứa các thông tin về cổng giao tiếp của ứng dụng. SOCKET socket ( int af, int type, int protocol ); af : Họ ₫ịa chỉ, thường là AF_INET : Internet type : Kiểu socket (SOCK_STREAM, SOCK_DGRAM) protocol : giao thức ₫ược dùng, default = 0 return - INVALID_SOCKET : error - handle của socket vừa ₫ược tạo, ứng dụng sẽ lưu giữ handle này ₫ể gọ i hàm dịch vụ của socket khi cần. Thí dụ : // Tạ o socket mới, nếu thất bại báo sai ser_sock=socket(AF_INET,SOCK_STREAM,0); if(ser_sock==INVALID_SOCKET) { MessageBox("Không tạo ₫ược socket"); return TRUE; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 10
- Đặc tả hàm bind() Chức năng : khởi ₫ộng các thông tin trạng thái ban ₫ầu cho socket server. int bind (SOCKET s, const struct sockaddr FAR* name, int namelen); name : record chứa thông tin cần khởi ₫ộng namelen : ₫ộ dài của record "name", return SOCK_ERROR nếu bị lỗi Thí dụ : // thi ết lập ₫ịa chỉ ₫iểm ₫ầu mút và bind nó với socket SOCKADDR_IN local_addr; local_addr.sin_family=AF_INET; local_addr.sin_port=256; local_addr.sin_addr.s_addr=INADDR_ANY; if(bind(ser_sock,(LPSOCKADDR)&local_addr,sizeof(local_addr))==SO CKET_ERROR) { MessageBox("Không bind socket ₫ược"); return TRUE; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 11
- Đặc tả cấu trúc sockaddr_in Chức năng : ₫ược dùng trong tham số của nhiều hàm socket. struct sockaddr_in { short sin_family; // họ socket Internet unsigned short sin_port; // cổng giao tiếp struct in_addr sin_addr; // ₫ịa chỉ IP của máy char sin_zero[8]; // 8 byte 0 }; Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 12
- Đặc tả hàm listen() Chức năng : khai báo ₫ộ ₫ài hàng chờ cho các yêu cầu nối kết. int listen (SOCKET s, int backlog ); backlog = ₫ộ ₫ài hàng chờ chứa các yêu cầu nối kết (nên dùng hằng mặc ₫ịnh SOMAXCONN) return < 0 error Thí dụ : // Khai báo ₫ộ dài hàng chờ chứa các yêu cầu kết nối if (listen(ser_sock,SOMAXCONN)==SOCKET_ERROR) { MessageBox("Không listen ₫ược"); return TRUE; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 13
- Đặc tả hàm accept () Chức năng : lắng nghe và phục vụ yêu cầu kết nối. SOCKET accept (SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen ); addr : record chứa thông tin về cổng từ xa yêu cầu kết nối addrlen : ₫ộ dài record "addr" return handle socket phục vụ giao tiếp với client tương ứng Thí dụ : SOCKADDR_IN remote_addr; SOCKET sock; // Lắng nghe và phục vụ yêu cầu kết nối int len=sizeof(remote_addr); sock=accept(ser_sock,(LPSOCKADDR)&remote_addr,&len); if(sock==INVALID_SOCKET) { MessageBox("Không accept ₫ược"); return; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 14
- Đặc tả hàm connect () Chức năng : yêu cầu tạo cầu nối tới server. int connect (SOCKET s, const struct sockaddr FAR* name, int namelen ); s : socket client name : record chứa thông tin về cổng giao tiếp từ xa cần nối kết namelen : ₫ộ dài của vùng name return <0 : error Thí dụ : // thi ết lậ p ₫ịa chỉ cổng giao tiếp của server từ xa SOCKADDR_IN ser_addr; ser_addr.sin_family=AF_INET; ser_addr.sin_port=condlg.m_port; if ('0'<=condlg.m_ipaddr[0] && condlg.m_ipaddr[0]<='9') // ₫ịa chỉ IP ser_addr.sin_addr.s_addr=inet_addr(condlg.m_ipaddr); Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 15
- Đặc tả hàm connect (tt) else { // tên gợi nhớ của server PHOSTENT phe = gethostbyname(condlg.m_ipaddr); char szTemp[128]; if (phe == NULL) { wsprintf(szTemp,"Khong co may '%s'", condlg.m_ipaddr); MessageBox(szTemp); return; } memcpy((char FAR *)&(ser_addr.sin_addr), phe->h_addr, phe->h_length); } // Yeu cau noi ket toi server if(connect(sock,(LPSOCKADDR)&ser_addr,sizeof(ser_addr))==SOCKET_ERROR ) { MessageBox("Khong ket noi duoc"); return; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 16
- Đặc tả hàm send () Chức năng : gởi 1 chuỗi byte ra cầu nối ₫ể ₫ến ₫ối tác. int send (SOCKET s, const char FAR * buf, int len, int flags); buf : pointer tới bộ ₫ệm dữ liệu len : ₫ộ dài bộ ₫ệm flags : NO_FLAGS_SET, return số byte gởi ₫ược thực sự Thí dụ : CString mesg; // Xây dựng thông báo cần gởi mesg = _T("LOGIN ")+condlg.m_groupname + _T(",") + condlg.m_username; if (send(sock,mesg,strlen(mesg),0) <0) { MessageBox("Không gởi ₫ược lệnh LOGIN"); return; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 17
- Đặc tả hàm recv () Chức năng : chờ nhận thông tin từ xa gởi tới. int recv ( SOCKET s, char FAR* buf, int len, int flags); buf : pointer tới bộ ₫ệm dữ liệu nhận len : ₫ộ dài bộ ₫ệm flags : NO_FLAGS_SET return SOCKET_ERROR : error Thí dụ : status = recv(sock, mesg, MSG_LENGTH, 0); if (status==0) return; // tiếp tục xử lý thông tin nhận ₫ược Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 18
- Đặc tả hàm closesocket () Chức năng : yêu cầu ₫óng và xóa socket. int closesocket (SOCKET s); Thí dụ : LRESULT CMiniChatClientDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WSA_RDCLOSE : if (WSAGETSELECTEVENT(lParam) == FD_READ) { status = recv(sock, mesg, MSG_LENGTH, 0); if (status==0) return; // tiếp tục xử lý thông tin nhận ₫ược } else // ₫óng socket closesocket (wParam); return 1; } return CDialog::WindowProc(message, wParam, lParam); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 19
- I.4 Vấn ₫ề bất ₫ồng bộ trong gởi/nhận thông tin Hãy quan sát 2 hàm accept() và recv(), mặc ₫ịnh chúng có hành vi ₫ặc biệt : bị kẹt nếu ₫ối tác không giao tiế p với mình (blocking). Để tránh bị kẹt khi gọi 1 trong 2 hàm này, người ta dùng 1 trong 4 phương pháp sau : 1. dùng socket ở chế ₫ộ non-blocking : int non_block = 1; rc = ioctlsocket(s, FIONBIO, &non_block); if (rc == SOCKET_ERROR) { dos_net_perror("ioctlsocket() call failed"); closesocket(s); exit(1); } //trên unix, thay vì gọi hàm ioctlsocket, ta gọi hàm : //fcntl(sockfd, F_SETFL, O_NONBLOCK); Ở chế ₫ộ non-blocking, khi gọi các hàm accept(), recv(), mà dữ liệu chưa có, hàm sẽ trả ₫iều khiển về ngay với mã lỗi tương ứng. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Ch ương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 20
- Vấn ₫ề bất ₫ồng bộ trong gởi/nhận thông tin 2. gọi hàm select() ₫ể khảo sát trạng thái sẵn sàng ₫ọc, sẵn sàng ghi, của 1 số socket xác ₫ịnh. int select (int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout); Một số macro thêm/xóa 1 socket vào/ra 1 tập hợp : FD_SET(socket,&readfds) : thêm socket vào tập hợp FD_ISSET(socket, &readfds) : kiểm tra xem socket có trong tập hợp FD_CLR(socket,&readfds) : xóa socket khỏi tập hợp Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 21
- Vấn ₫ề bất ₫ồng bộ trong gởi/nhận thông tin 3. dùng cơ chế lập trình Multi-thread : thread chính sẽ tạo thread con và nhờ thread con này thực hiện hàm accept() hay recv(). Thread con bị kẹt khi gọi hàm nhưng thread cha thì vẫn chạy bình thường. 4. Tạo thông báo Windows kết hợp với s ự kiện liên quan ₫ến cổng giao tiếp. Khi có sự kiện qui ₫ịnh, Windows s ẽ gởi thông báo về cửa sổứng dụng ₫ể kích kh ởi hàm xử lý sự kiện, code của hàm này sẽ kiểm tra sự kiện, và g ọi hàm accept() hay recv(). 2 hàm winsock ₫ược dùng thông thường cho cơ chế này là WSAAsyncSelect() và WSAGETSELECTEVENT(). Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 22
- Đặc tả hàm WSAAsyncSelect () Chức năng : khai báo các biến cố bất ₫ồng bộ kết hợp với socket. int WSAAsyncSelect (SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent ); hWnd : cửa sổ chương trình sẽ nhận message. wMsg : thông báo sẽ tạo ra lEvent : tổ hợp các biế n cố network sẽ gây ra thông báo. Thí dụ : // Khai báo chờ yêu cầu kết nối if (WSAAsyncSelect(ser_sock, m_hWnd, WSA_ACCEPT, FD_ACCEPT) > 0) { MessageBox("Error on WSAAsyncSelect()"); closesocket(ser_sock); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 23
- I.5 Thí dụ vềứng dụng mạng cơ bản Hệ thống MiniChatter Chứ c năng: cho phép nhiều user ₫ăng ký vào các nhóm ₫ể trò chuyện với nhau. Mô hình chọn lựa: client/server Server: quản lý các nhóm và các user từng nhóm, phân phối các chuỗi thông tin từ một user ₫ến các user khác cùng nhóm Client: giao tiếp với user, cho phép họ ₫ăng ký nhóm, gởi/nhận thông tin lẫn nhau. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 24
- Thí dụ vềứng dụng mạng cơ bản Định nghĩa giao thức ₫ược dùng bởi hệ thống MiniChatter : Gồm 5 thông báo request sau : 1. Lệnh GLIST 2. Lệnh ULIST 3. Lệnh LOGIN "," 4. Lệnh SEND 5. Lệnh LOGOU Và ₫ịnh dạng thông báo reply cho tất cả các request : n n = 1 : thành công, n = 0 : thất bại. Chương 2 sẽ trình bày qui trình viết hệ thống MiniChatter bằng VC++ và dùng kỹ thu ật xử lý sự kiện. Chươ ng 3 s ẽ trình bày qui trình viết hệ thống MiniChatter bằng Java (thông qua môi trường JBuilder) và dùng kỹ thuật xử lý multi-thread. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 1: Lập trình mạng theo mô hình client/server dùng giao thức TCP/IP Trường ĐH Bách Khoa Tp.HCM Slide 25