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 16940 Free
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