Bài giảng Lập trình mạng - Chương 3: Windows Socket - Trương Đình Huy

Chương 3. Windows Socket  
Trương Đình Huy  
Chương 3. Windows Socket  
• 3.1. Kiến trúc  
• 3.2. Đặc tính  
• 3.3. Lập trình WinSock  
• 3.4. Các phương pháp vào ra  
2
3.1 Kiến trúc  
Windows Socket (WinSock)  
– Bộ thư viện liên kết động của Microsoft.  
– Cung cấp các API dùng để xây dựng ứng dụng mạng hiệu  
năng cao.  
Application  
Winsock 2 DLL ( WS2_32.DLL)  
Layered/Base Provider  
Default  
Provider  
RSVP  
Proxy  
MSAFD.DLL  
Winsock Kernel Mode Driver (AFD.SYS)  
Transport Protocols  
3
3.1 Kiến trúc  
Windows Socket (WinSock)  
– Phiên bản hiện tại là WinSock 2.2  
– Các ứng dụng sẽ giao tiếp với thư viện liên kết động ở  
tầng trên cùng: WS2_32.DLL.  
Provider do nhà sản xuất của các giao thức cung cấp.  
Tầng này bổ sung giao thức của các tầng mạng khác  
nhau cho WinSock như TCP/IP, IPX/SPX, AppleTalk,  
NetBIOS...tầng này vẫn chạy ở UserMode.  
WinSock Kernel Mode Driver (AFD.SYS) là driver  
chạy ở KernelMode, nhận dữ liệu từ tầng trên, quản lý  
kết nối, bộ đệm, tài nguyên liên quan đến socket và giao  
tiếp với driver điều khiển thiết bị.  
4
3.1 Kiến trúc  
Windows Socket (WinSock)  
Transport Protocols là các driver ở tầng thấp nhất,  
điều khiển trực tiếp thiết bị. Các driver này do nhà sản  
xuất phần cứng xây dựng, và giao tiếp với AFD.SYS  
thông qua giao diện TDI ( Transport Driver Interface)  
– Việc lập trình Socket sẽ chỉ thao tác với đối tượng  
SOCKET.  
– Mỗi ứng dụng cần có một SOCKET trước khi muốn trao  
đổi dữ liệu với ứng dụng khác.  
– Đường dây ảo nối giữa các SOCKET sẽ là kênh truyền dữ  
liệu của hai ứng dụng.  
5
3.2 Đặc tính  
• Hỗ trợ các giao thức hướng thông điệp (message  
oriented)  
– Thông điệp truyền đi được tái tạo nguyên vẹn cả về kích  
thước và biên ở bên nhận  
6
3.2 Đặc tính  
• Hỗ trợ các giao thức hướng dòng (stream  
oriented)  
– Biên của thông điệp không được bảo toàn khi truyền đi  
7
3.2 Đặc tính  
• Hỗ trợ các giao thức hướng kết nối và không kết  
nối  
– Giao thức hướng kết nối (connection oriented) thực  
hiện thiết lập kênh truyền trước khi truyền thông tin.  
Thí dụ: TCP  
– Giao thức không kết nối (connectionless) không cần  
thiết lập kênh truyền trước khi truyền. Thí dụ: UDP  
8
3.2 Đặc tính  
• Hỗ trợ các giao thức hướng kết nối và không kết  
nối  
– Giao thức hướng kết nối (connection oriented) thực  
hiện thiết lập kênh truyền trước khi truyền thông tin.  
Thí dụ: TCP  
– Giao thức không kết nối (connection less) không cần  
thiết lập kênh truyền trước khi truyền. Thí dụ: UDP  
9
3.2 Đặc tính  
• Hỗ trợ các giao thức tin cậy và trật tự  
– Tin cậy (reliability): đảm bảo chính xác từng byte được  
gửi đến đích.  
– Trật tự (ordering): đảm bảo chính xác trật tự từng byte  
dữ liệu. Byte nào gửi trước sẽ được nhận trước, byte gửi  
sau sẽ được nhận sau.  
10  
3.2 Đặc tính  
Multicast  
– WinSock hỗ trợ các giao thức Multicast: gửi dữ liệu đến  
một hoặc nhiều máy trong mạng.  
• Chất lượng dịch vụ - Quality of Service (QoS)  
– Cho phép ứng dụng yêu cầu một phần băng thông dành  
riêng cho mục đích nào đó. Thí dụ: truyền hình thời gian  
thực.  
11  
3.3 Lập trình WinSock  
• Chuẩn bị môi trường  
– Hệ điều hành Windows XP/2003/Vista/7.  
Visual Studio C++  
– Thư viện trực tuyến MSDN  
– Thêm tiêu đề WINSOCK2.H vào đầu mỗi tệp mã nguồn.  
– Thêm thư viện WS2_32.LIB vào mỗi Project bằng cách  
Project => Property => Configuration Properties=>  
Linker=>Input=>Additional Dependencies  
12  
3.3 Lập trình WinSock  
• 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  
13  
3.3 Lập trình WinSock  
• Khởi tạo WinSock  
– Thí dụ  
WSADATA  
wsaData;  
WORD wVersion = MAKEWORD(2,2); // Khởi tạo phiên bản 2.2  
if (WSAStartup(wVersion,&wsaData))  
{
printf(“Version not supported”);  
}
14  
3.3 Lập trình WinSock  
• 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  
15  
3.3 Lập trình WinSock  
• 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  
16  
3.3 Lập trình WinSock  
• Tạo SOCKET  
– SOCKET là một số nguyên trừu tượng hóa kết nối mạng của ứng  
dụng.  
– Ứng dụng phải tạo SOCKET trước khi có thể gửi nhận dữ liệu.  
Hàm socket được sử dụng để tạo SOCKET  
SOCKET socket (  
int af,  
int type,  
int protocol );  
Trong đó:  
. af: [IN] Address Family, họ giao thức sẽ sử dụng, thường là  
AF_INET, AF_INET6.  
. type: [IN] Kiểu socket, SOCK_STREAM cho TCP/IP và  
SOCK_DGRAM cho UDP/IP.  
. protocol: [IN] Giao thức tầng giao vận, IPPROTO_TCP hoặc  
IPPROTO_UDP  
17  
3.3 Lập trình WinSock  
• Tạo SOCKET  
– Thí dụ  
SOCKET  
s1,s2; // Khai báo socket s1,s2  
// Tạo socket TCP  
s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
// Tạo socket UDP  
s2 = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);  
18  
3.3 Lập trình WinSock  
• Xác định địa chỉ  
– WinSock sử dụng sockaddr_in để lưu địa chỉ của ứng dụng đích  
cần nối đến.  
– Ứng dụng cần khởi tạo thông tin trong cấu trúc này  
struct sockaddr_in{  
short  
u_short  
sin_family; // Họ giao thức, thường là AF_INET  
sin_port; // Cổng, dạng big-endian  
struct in_addr sin_addr; // Địa chỉ IP  
char sin_zero[8]; // Không sử dụng với IPv4  
};  
19  
3.3 Lập trình WinSock  
• Xác định địa chỉ  
– Sử dụng các hàm hỗ trợ :  
• 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 little-endian => big-endian (network order)  
// Chuyển đổi 4 byte từ little-endian=>big-endian  
u_long htonl(u_long hostlong)  
// Chuyển đổi 2 byte từ little-endian=>big-endian  
u_short htons(u_short hostshort)  
• Chuyển đổi big-endian => little-endian (host order)  
// Chuyển 4 byte từ big-endian=>little-endian  
u_long ntohl(u_long netlong)  
// Chuyển 2 byte từ big-endian=>little-endian  
u_short ntohs(u_short netshort)  
20  
Tải về để xem bản đầy đủ
pdf 95 trang Thùy Anh 12/05/2022 2820
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 3: Windows Socket - Trương Đình Huy", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_mang_chuong_3_windows_socket_truong_dinh.pdf