Bài giảng "Lập trình mạng - Bài 2: Bắt đầu với lập trình WinSock" cung cấp cho người học các kiến thức: Giới thiệu một số hàm lập trình WinSock cơ bản, xây dựng một ứng dụng TCP cơ bản, xây dựng một ứng dụng UDP cơ bản, thiết kế giao thức ứng dụng. . | BÀI 2. BẮT ĐẦU VỚI LẬP TRÌNH WINSOCK 1 Nội dung • Giới thiệu một số hàm lập trình WinSock cơ bản • Xây dựng một ứng dụng TCP cơ bản • Xây dựng một ứng dụng UDP cơ bản • Thiết kế giao thức ứng dụng 2 1 1. MỘT SỐ HÀM CƠ BẢN 3 Khởi tạo WinSock • WinSock cần được khởi tạo ở đầu mỗi ứng dụng trước khi có thể sử dụng • Hàm WSAStartup sẽ làm nhiệm khởi tạo int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); • wVersionRequested: [IN] phiên bản WinSock cần dùng. • lpWSAData: [OUT] con trỏ chứa thông tin về WinSock cài đặt trong hệ thống. • Giá trị trả về: • Thành công: 0 • Thất bại: SOCKET_ERROR 4 2 Giải phóng WinSock • Ứng dụng khi kết thúc sử dụng WinSock có thể gọi hàm sau để giải phóng tài nguyên về cho hệ thống int WSACleanup(void); • Giá trị trả về: • Thành công: 0 • Thất bại: SOCKET_ERROR // Initiates Winsock WSADATA wsaData; WORD wVersion = MAKEWORD(2,2); WSAStartup(wVersion,&wsaData); //do something with WinSock //. //Terminates use of the WinSock WSACleanup(); 5 Xác định lỗi • Phần lớn các hàm của WinSock nếu thành công đều trả về 0. • Nếu thất bại, giá trị trả về của hàm là SOCKET_ERROR. • Ứng dụng có thể lấy mã lỗi gần nhất bằng hàm int WSAGetLastError(void); • Tra cứu lỗi với công cụ Error Lookup trong Visual Studio 6 3 Địa chỉ socket • Xác định địa chỉ • WinSock sử dụng cấu trúc sockaddr_in để lưu địa chỉ của socket • Địa chỉ IPv6: sockaddr_in6 • Ứng dụng cần khởi tạo thông tin trong cấu trúc này struct sockaddr_in{ short sin_family; // Họ giao thức u_short sin_port; // Số hiệu cổng(big-endian) struct in_addr sin_addr; // Địa chỉ IPv4 char sin_zero[8]; // Không sử dụng }; struct in_addr { unsigned long s_addr; }; 7 Các hàm hỗ trợ xử lý địa chỉ socket • Chuyển đổi địa chỉ IP dạng xâu sang số nguyên 32 bit unsigned long inet_addr(const char FAR *cp); • Chuyển đổi địa chỉ từ dạng in_addr sang dạng xâu char FAR *inet_ntoa(struct in_addr in); • Chuyển đổi host order => big-endian (network order) u_long htonl(u_long .