Bài giảng Lập trình mạng (Network Programming) - Lương Ánh Hoàng

 Mục đích

• Cung cấp các kiến thức cơ bản về lập trình ứng dụng mạng

–Xây dựng ứng dụng Server.

–Xây dựng ứng dụng Client.

–Các kỹ thuật vào ra.

• Cung cấp các kỹ năng cần thiết để thiết kế và xây dựng ứng dụng mạng

–Sử dụng thư viện, môi trường, tài liệu.

–Thiết kế, xây dựng chương trình.

 

pdf 165 trang phuongnguyen 9700
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình mạng (Network Programming) - Lương Ánh Hoàng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình mạng (Network Programming) - Lương Ánh Hoàng

Bài giảng Lập trình mạng (Network Programming) - Lương Ánh Hoàng
Lương Ánh Ho{ng 
hoangla@soict.hut.edu.vn 
LẬP TRÌNH MẠNG 
Network Programming 
• Cung cấp các kiến thức cơ bản về lập trình ứng dụng mạng 
 –Xây dựng ứng dụng Server. 
 –Xây dựng ứng dụng Client. 
 –Các kỹ thuật vào ra. 
• Cung cấp các kỹ năng cần thiết để thiết kế và xây dựng ứng dụng mạng 
 –Sử dụng thư viện, môi trường, tài liệu. 
 –Thiết kế, xây dựng chương trình. 
Mục đích 
2 
• Yêu cầu về kiến thức: 
– Mạng máy tính. 
– Ngôn ngữ lập trình C/C++. 
– Ngôn ngữ lập trình C#. 
• Lên lớp đầy đủ 
Yêu cầu 
3 
• Thời lượng: 45 tiết 
– Lý thuyết: 30 tiết 
– Bài tập:15 tiết 
Thời lượng môn học 
4 
• Network Programming for Microsoft Windows Second 
Edition. Anthony Jone, Jim Ohlun. 
• C# Network Programming. Sybex 
T{i liệu 
5 
• Bài tập lớn: 70% 
• Quá trình: 30% 
Đ|nh gi| 
6 
• Chương 1. Giới thiệu các mô hình lập trình mạng. 
• Chương 2. Bộ giao thức TCP/IP 
• Chương 3. Windows Socket 
• Chương 4. MFC Socket 
• Chương 5. .NET Socket 
Nội dung 
7 
Lương Ánh Ho{ng 
hoangla@soict.hut.edu.vn 
Chương 1. Giới thiệu c|c mô 
hình lập trình mạng 
• 1.1. Tổng quan về lập trình mạng 
• 1.2. Giao thức Internet 
Chương 1. Giới thiệu c|c mô hình lập trình 
mạng 
9 
• Khái niệm 
– Lập trình mạng là các kỹ thuật lập trình nhằm xây dựng 
ứng dụng, phần mềm khai thác hiệu quả tài nguyên 
mạng máy tính. 
1.1. Tổng quan về lập trình mạng 
10 
• Ngôn ngữ lập trình mạng 
– C/C++: Mạnh và phổ biến, được hầu hết các lập trình 
viên sử dụng để viết các ứng dụng mạng hiệu năng cao. 
– Java: Khá thông dụng, sử dụng nhiều trong các điện 
thoại di động (J2ME). 
– C#: Mạnh và dễ sử dụng, tuy nhiên chạy trên nền .Net 
Framework và chỉ hỗ trợ họ hệ điều hành Windows. 
– Python, Perl, PHP...Ngôn ngữ thông dịch, sử dụng để 
viết các tiện ích nhỏ, nhanh chóng 
– Giáo trình này sẽ chỉ đề cập đến hai ngôn ngữ C/C++ và 
C#. 
1.1. Tổng quan về lập trình mạng 
11 
• Thư viện 
– Windows Socket API ( WinSock) 
• Thư viện liên kết động (WS2_32.DLL) đi kèm trong 
hệ điều hành Windows của Microsoft. 
• Thường sử dụng cùng với C/C++. 
• Cho hiệu năng cao nhất. 
– System.Net và System.Net.Sockets 
• Hai namespace trong bộ thư viện .NET của Microsoft 
• Dễ sử dụng 
• Thường sử dụng với C# 
1.1. Tổng quan về lập trình mạng 
12 
• Thư viện 
– MFC Socket 
• Nằm trong bộ thư viện MFC của Microsoft 
• Đóng gói các hàm của WinSock dưới dạng các lớp 
hướng đối tượng. 
• Dễ sử dụng và hiệu năng cao. 
– Các thư viện của các ngôn ngữ khác: Java, PHP, Python... 
– Thư viện sử dụng trong giáo trình: WinSock, MFC 
Socket, System.Net và System.Net.Sockets 
1.1. Tổng quan về lập trình mạng 
13 
• Công cụ lập trình 
– Visual Studio (6.0, 2003 
.NET, 2005, 2008) 
• Rất mạnh 
• Hỗ trợ cả WinSock, MFC 
Socket và .NET Socket 
(Phiên bản 2003.NET trở 
lên). 
• Cài thêm Visual Assist X 
– Dev C++ 
• Miễn phí 
• Chỉ hỗ trợ WinSock 
1.1. Tổng quan về lập trình mạng 
14 
• Công cụ gỡ rối 
– TCPView: Hiển thị các kết nối hiện tại của máy tính. 
– Resource Monitor: ~ TCPView. 
– Wireshark, Microsoft Network Monitor 
– Netcat (Netcat Win32) 
1.1. Tổng quan về lập trình mạng 
15 
• Tài liệu tra cứu 
– Microsoft Developer 
Network – MSDN 
• Cực kỳ chi tiết và chuyên 
nghiệp 
• Công cụ không thể thiếu 
– Google 
1.1. Tổng quan về lập trình mạng 
16 
• Giao thức Internet (Internet Protocol) 
– Giao thức mạng thông dụng nhất trên thế giới. 
– Thành công của Internet là nhờ IPv4. 
– Được hỗ trợ trên tất cả các hệ điều hành. 
– Là công cụ sử dụng để lập trình ứng dụng mạng 
1.2. Giao thức Internet 
17 
Lương Ánh Ho{ng 
hoangla@soict.hut.edu.vn 
Chương 2. Bộ giao thức Internet 
TCP/IP 
• 2.1. Giới thiệu 
• 2.2. Giao thức IPv4 
• 2.3. Giao thức IPv6 
• 2.4. Giao thức TCP 
• 2.5. Giao thức UDP 
• 2.6. Hệ thống phân giải tên miền 
Chương 2. Bộ giao thức Internet (TCP/IP) 
19 
• Bộ giao thức Internet 
– TCP/IP: Transmission Control Protocol/Internet 
Protocol. 
– Là bộ giao thức truyền thông được sử dụng trên 
Internet và hầu hết các mạng thương mại. 
– Được chia thành các tầng gồm nhiều giao thức, thuận 
tiện cho việc quản lý và phát triển. 
– Là thể hiện đơn giản hóa của mô hình lý thuyết OSI. 
2.1. Giới thiệu 
20 
• Bộ giao thức Internet 
– Gồm bốn tầng 
• Tầng ứng dụng – Application Layer. 
• Tầng giao vận – Transport Layer. 
• Tầng Internet – Internet Layer. 
• Tầng truy nhập mạng – Network Access Layer. 
2.1. Giới thiệu 
21 
• Bộ giao thức Internet 
– Tầng ứng dụng 
• Đóng gói dữ liệu người dùng theo giao thức riêng và 
chuyển xuống tầng dưới. 
• Các giao thức thông dụng: HTTP, FTP, SMTP, POP3, 
DNS, SSH, IMAP... 
• Việc lập trình mạng sẽ xây dựng ứng dụng tuân theo 
một trong các giao thức ở tầng này hoặc giao thức 
do người phát triển tự định nghĩa 
2.1. Giới thiệu 
22 
• Bộ giao thức Internet 
– Tầng giao vận 
• Cung cấp dịch vụ truyền dữ liệu giữa ứng dụng - 
ứng dụng. 
• Đơn vị dữ liệu là các đoạn (segment). 
• Các giao thức ở tầng này: TCP, UDP, ICMP. 
• Việc lập trình mạng sẽ sử dụng dịch vụ do các giao 
thức ở tầng này cung cấp để truyền dữ liệu 
2.1. Giới thiệu 
23 
• Bộ giao thức Internet 
– Tầng Internet 
• Định tuyến và truyền các gói tin liên mạng. 
• Cung cấp dịch vụ truyền dữ liệu giữa máy tính – 
máy tính trong cùng nhánh mạng hoặc giữa các 
nhánh mạng. 
• Đơn vị dữ liệu là các gói tin (packet). 
• Các giao thức ở tầng này: IPv4, IPv6.... 
• Việc lập trình ứng dụng mạng sẽ rất ít khi can thiệp 
vào tầng này, trừ khi phát triển một giao thức liên 
mạng mới. 
2.1. Giới thiệu 
24 
• Bộ giao thức Internet 
– Tầng truy nhập mạng 
• Cung cấp dịch vụ truyền dữ liệu giữa các nút mạng 
trên cùng một nhánh mạng vật lý. 
• Đơn vị dữ liệu là các khung (frame). 
• Phụ thuộc rất nhiều vào phương tiện kết nối vật lý. 
• Các giao thức ở tầng này đa dạng: MAC, LLC, ADSL, 
802.11... 
• Việc lập trình mạng ở tầng này là xây dựng các trình 
điều khiển phần cứng tương ứng, thường do nhà sản 
xuất thực hiện. 
2.1. Giới thiệu 
25 
• Bộ giao thức Internet 
– Dữ liệu gửi đi qua mỗi tầng sẽ được thêm phần thông 
tin điều khiển (header). 
– Dữ liệu nhận được qua mỗi tầng sẽ được bóc tách 
thông tin điều khiển. 
2.1. Giới thiệu 
26 
• Giao thức IPv4 
– Được IETF công bố dưới dạng RFC 791 vào 9/1981. 
– Phiên bản thứ 4 của họ giao thức IP và là phiên bản 
đầu tiên phát hành rộng rãi. 
– Là giao thức hướng dữ liệu (phân biệt với hướng thoại, 
video). 
– Sử dụng trong hệ thống chuyển mạch gói. 
– Truyền dữ liệu theo kiểu Best-Effort 
– Không đảm bảo tính trật tự, trùng lặp, tin cậy của gói 
tin. 
– Kiểm tra tính toàn vẹn của dữ liệu qua checksum 
2.2. Giao thức IPv4 
27 
• Địa chỉ IPv4 
– Sử dụng 32 bit để đánh địa chỉ các máy tính trong 
mạng. 
– Bao gồm: phần mạng và phần host. 
– Số địa chỉ tối đa: 232 ~ 4,294,967,296. 
– Dành riêng một vài dải đặc biệt không sử dụng. 
– Chia thành bốn nhóm 8 bít (octet). 
2.2. Giao thức IPv4 
28 
Dạng biểu diễn Gi| trị 
Nhị phân 11000000.10101000.00000000.00000001 
Thập phân 192.168.0.1 
Thập lục phân 0xC0A80001 
• Các lớp địa chỉ IPv4 
– Có năm lớp địa chỉ: A,B,C,D,E. 
– Lớp A,B,C: trao đối thông tin thông thường. 
– Lớp D: multicast 
– Lớp E: để dành 
2.2. Giao thức IPv4 
29 
Lớp MSB Địa chỉ đầu Địa chỉ cuối 
A 0xxx 0.0.0.0 127.255.255.255 
B 10xx 128.0.0.0 191.255.255.255 
C 110x 192.0.0.0 223.255.255.255 
D 1110 224.0.0.0 239.255.255.255 
E 1111 240.0.0.0 255.255.255.255 
• Mặt nạ mạng (Network Mask) 
– Phân tách phần mạng và phần host trong địa chỉ IPv4. 
– Sử dụng trong bộ định tuyến để tìm đường đi cho gói 
tin. 
– Với mạng có dạng 
2.2. Giao thức IPv4 
30 
Network Host 
192.168.0. 1 
11000000.10101000.00000000. 00000001 
• Mặt nạ mạng (Network Mask) 
– Biểu diễn theo dạng /n 
• n là số bit dành cho phần mạng. 
• Thí dụ: 192.168.0.1/24 
– Biểu diễn dưới dạng nhị phân 
• Dùng 32 bit đánh dấu, bít dành cho phần mạng là 1, 
cho phần host là 0. 
• Thí dụ: 11111111.11111111.11111111.00000000 
 hay 255.255.255.0 
– Biểu diễn dưới dạng Hexa 
• Dùng số Hexa: 0xFFFFFF00 
• Ít dùng 
2.2. Giao thức IPv4 
31 
• Số lượng địa chỉ trong mỗi mạng 
– Mỗi mạng sẽ có n bit dành cho phần mạng, 32-n bit 
dành cho phần host. 
– Phân phối địa chỉ trong mỗi mạng: 
• 01 địa chỉ mạng (các bit phần host bằng 0). 
• 01 địa chỉ quảng bá (các bit phần host bằng 1). 
• 2n-2 địa chỉ gán cho các máy trạm (host). 
– Với mạng 192.168.0.1/24 
• Địa chỉ mạng: 192.168.0.0 
• Địa chỉ quảng bá: 192.168.0.255 
• Địa chỉ host: 192.168.0.1- 192.168.0.254 
2.2. Giao thức IPv4 
32 
• Các dải địa chỉ đặc biệt 
– Là những dải được dùng với mục đích riêng, không sử 
dụng được trên Internet. 
2.2. Giao thức IPv4 
33 
Địa chỉ Diễn giải 
10.0.0.0/8 Mạng riêng 
127.0.0.0/8 Địa chỉ loopback 
172.16.0.0/12 Mạng riêng 
192.168.0.0/16 Mạng riêng 
224.0.0.0/4 Multicast 
240.0.0.0/4 Dự trữ 
• Dải địa chỉ cục bộ 
– Chỉ sử dụng trong mạng nội bộ. 
– Muốn tham gia vào Internet phải có thiết bị NAT. 
– Khắc phục vấn đề thiếu địa chỉ của IPv4. 
2.2. Giao thức IPv4 
34 
Tên Dải địa chỉ Số lượng Mô tả mạng Viết gọn 
Khối 24-bit 
10.0.0.0–
10.255.255.255 
16,777,216 
Một dải trọn vẹn 
thuộc lớp A 
10.0.0.0/8 
Khối 20-bit 
172.16.0.0–
172.31.255.255 
1,048,576 
Tổ hợp từ mạng 
lớp B 
172.16.0.0/12 
Khối 16-bit 
192.168.0.0–
192.168.255.25
5 
65,536 
Tổ hợp từ mạng 
lớp C 
192.168.0.0/16 
• Giao thức IPv6 
– IETF đề xuất năm 1998. 
– Sử dụng 128 bit để đánh địa chỉ các thiết bị. 
– Khắc phục vấn đề thiếu địa chỉ của IPv4. 
– Vẫn chưa phổ biến và chưa thể thay thế hoàn toàn 
IPv4. 
2.3. Giao thức IPv6 
35 
• Giao thức TCP: Transmission Control Protocol 
– Giao thức lõi chạy ở tầng giao vận. 
– Chạy bên dưới tầng ứng dụng và trên nền IP 
– Cung cấp dịch vụ truyền dữ liệu theo dòng tin cậy giữa 
các ứng dụng. 
– Được sử dụng bởi hầu hết các ứng dụng mạng. 
– Chia dữ liệu thành các gói nhỏ, thêm thông tin kiểm 
soát và gửi đi trên đường truyền. 
– Lập trình mạng sẽ sử dụng giao thức này để trao đổi 
thông tin. 
2.4. Giao thức TCP 
36 
• Cổng (Port) 
– Một số nguyên duy nhất trong khoảng 0-65535 tương 
ứng với một kết nối của ứng dụng. 
– TCP sử dụng cổng để chuyển dữ liệu tới đúng ứng 
dụng hoặc dịch vụ. 
– Một ứng dụng có thể mở nhiều kết nối => có thể sử 
dụng nhiều cổng. 
– Một số cổng thông dụng: HTTP(80), FTP(21), 
SMTP(25), POP3(110), HTTPS(443)... 
2.4. Giao thức TCP 
37 
• Đặc tính của TCP 
– Hướng kết nối: connection oriented 
• Hai bên phải thiết lập kênh truyền trước khi truyền 
dữ liệu. 
• Được thực hiện bởi quá trình gọi là bắt tay ba bước 
(three ways handshake). 
– Truyền dữ liệu theo dòng (stream oriented): tự động 
phân chia dòng dữ liệu thành các đoạn nhỏ để truyền 
đi, tự động ghép các đoạn nhỏ thành dòng dữ liệu và 
gửi trả ứng dụng. 
– Đúng trật tự (ordering guarantee): dữ liệu gửi trước sẽ 
được nhận trước 
2.4. Giao thức TCP 
38 
• Đặc tính của TCP 
– Tin cậy, chính xác: thông tin gửi đi sẽ được đảm bảo 
đến đích, không dư thừa, sai sót... 
– Độ trễ lớn, khó đáp ứng được tính thời gian thực. 
– Các đặc tính khác: QoS... 
2.4. Giao thức TCP 
39 
• Header của TCP 
– Chứa thông tin về đoạn dữ liệu tương ứng 
2.4. Giao thức TCP 
40 
TCP Header 
Bit 
offs
et 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 
0 Source port Destination port 
32 Sequence number 
64 Acknowledgment number 
96 Data offset Reserved 
C 
W 
R 
E 
C 
E 
U 
R 
G 
A 
C 
K 
P 
S 
H 
R 
S 
T 
S 
Y 
N 
F 
I 
N 
Window Size 
128 Checksum Urgent pointer 
160 
... 
Options (if Data Offset > 5) 
... 
• Các dịch vụ trên nền TCP 
– Rất nhiều dịch vụ chạy trên nền TCP: FTP(21), 
HTTP(80), SMTP(25), SSH(22), POP3(110), 
VNC(4899)... 
• Sử dụng netcat để kết nối đến một dịch vụ chạy 
trên nền TCP: 
– nc.exe –vv [host] [port] 
– Thí dụ 
 nc.exe -vv www.google.com 80 
2.4. Giao thức TCP 
41 
• Giao thức UDP: User Datagram Protocol 
– Cũng là giao thức lõi trong TCP/IP. 
– Cung cấp dịch vụ truyền dữ liệu giữa các ứng dụng. 
– UDP chia nhỏ dữ liệu ra thành các datagram 
– Sử dụng trong các ứng dụng khắt khe về mặt thời gian, 
chấp nhận sai sót: thoại, video, game... 
2.5. Giao thức UDP 
42 
• Đặc tính của UDP 
– Không cần thiết lập kết nối trước khi truyền 
(Connectionless). 
– Nhanh, chiếm ít tài nguyên dễ xử lý. 
– Hạn chế: 
• Không có cơ chế báo gửi (report). 
• Không đảm báo trật tự các datagram (ordering). 
• Không phát hiện được mất mát hoặc trùng lặp 
thông tin (loss, duplication). 
2.5. Giao thức UDP 
43 
• Header của UDP 
2.5. Giao thức UDP 
44 
+ Bits 0 - 15 16 - 31 
0 Source Port Destination Port 
32 Length Checksum 
64 
Data 
• Các dịch vụ trên nền UDP 
– Phân giải tên miền: DNS (53) 
– Streamming: MMS, RTSP... 
– Game 
2.5. Giao thức UDP 
45 
• Địa chỉ IP khó nhớ với con người. 
• DNS – Domain Name System 
– Hệ thống phân cấp làm nhiệm vụ ánh xạ tên miền sang 
địa chỉ IP và ngược lại. 
2.6. Hệ thống ph}n giải tên miền DNS 
46 
• DNS – Domain Name System 
– Các tên miền được phân cấp và quản lý bởi INTERNIC 
– Cấp cao nhất là ROOT, sau đó là cấp 1, cấp 2,... 
– Thí dụ: www.hut.edu.vn 
2.6. Hệ thống ph}n giải tên miền DNS 
47 
Cấp Cấp 4 Cấp 3 Cấp 2 Cấp 1 
Tên miền www. hut. edu. vn 
• DNS – Domain Name System 
– Tổ chức được cấp tên miền cấp 1 sẽ duy trì cơ sở dữ 
liệu các tên miền cấp 2 trực thuộc, tổ chức được cấp 
tên miền cấp 2 sẽ duy trì cơ sở dữ liệu các tên miền cấp 
3 trực thuộc... 
– Một máy tính muốn biết địa chỉ của một máy chủ có 
tên miền nào đó, nó sẽ hỏi máy chủ DNS mà nó nằm 
trong, nếu máy chủ DNS này không trả lời được nó sẽ 
chuyển tiếp câu hỏi đến máy chủ DNS cấp cao hơn, 
DNS cấp cao hơn nếu không trả lời được lại chuyển 
đến DNS cấp cao hơn nữa... 
2.6. Hệ thống ph}n giải tên miền DNS 
48 
• DNS – Domain Name System 
– Việc truy vấn DNS sẽ do hệ điều hành thực hiện. 
– Dịch vụ DNS chạy ở cổng 53 UDP. 
– Công cụ thử nghiệm: nslookup 
• Thí dụ: nslookup www.google.com 
2.6. Hệ thống ph}n giải tên miền DNS 
49 
Lương Ánh Ho{ng 
hoangla@soict.hut.edu.vn 
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 
Chương 3. Windows Socket 
51 
• 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. 
3.1 Kiến trúc 
52 
Application 
Winsock 2 DLL ( WS2_32.DLL) 
Layered/Base Provider 
RSVP Proxy Default 
Provider 
MSAFD.DLL 
Winsock Kernel Mode Driver (AFD.SYS) 
Transport Protocols 
• Windows Socket (WinSock) 
– Phiên bản hiện tại là WinSock 2.0 
– 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. 
– Wi ...  LPDWORD lpdwFlags 
); 
s là socket muốn kiểm tra kết quả 
lpOverlapped là con trỏ đến cấu trúc OVERLAPPED 
lpcbTransfer là con trỏ đến biến sẽ lưu số byte trao đổi được 
fWait là biến báo cho hàm đợi cho đến khi thao tác vào ra hoàn tất 
lpdwFlags : cờ kết quả của thao tác 
Hàm trả về TRUE nếu thao tác hoàn tất hoặc FALSE nếu thao tác chưa hoàn tất, có lỗi 
hoặc không thể xác định. 
3.4 C|c phương ph|p v{o ra 
132 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Xử lý qua event 
– Tạo đối tượng event với WSACreateEvent. 
– Khởi tạo cấu trúc OVERLAPPED với event vừa tạo. 
– Gửi yêu cầu vào ra với tham số là cấu trúc OVERLAPPED vừa tạo, tham số 
liên quan đến CompletionRoutine phải luôn bằng NULL. 
– Đợi thao tác kết thúc qua hàm WSAWaitForMultipleEvents. 
– Nhận kết quả vào ra qua hàm WSAGetOverlappedResult 
3.4 C|c phương ph|p v{o ra 
133 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Thí dụ xử lý qua event 
 // Khởi tạo WinSock v{ kết nối đến 127.0.0.1:8888 
 OVERLAPPED overlapped; // Khai b|o cấu trúc OVERLAPPED 
 WSAEVENT receiveEvent = WSACreateEvent(); // Tạo event 
 memset(&overlapped,0,sizeof(overlapped)); 
 overlapped.hEvent = receiveEvent; 
 char buff[1024]; // Bộ đệm nhận dữ liệu 
 WSABUF databuff; // Cấu trúc mô tả bộ đệm 
 databuff.buf = buff; 
 databuff.len = 1024; 
 DWORD bytesReceived = 0; // Số byte nhận được 
 DWORD flags = 0; / Cờ quy định c|ch nhận, bắt buộc phải có 
 while (1) 
 { 
 DWORD flags = 0; 
 // Gửi yêu cầu nhận dữ liệu 
 rc = WSARecv(s,&databuff,1,&bytesReceived,&flags,&overlapped,0); 
3.4 C|c phương ph|p v{o ra 
134 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Thí dụ xử lý qua event 
 if (rc == SOCKET_ERROR) 
 { 
 rc = WSAGetLastError(); 
 if (rc != WSA_IO_PENDING) 
 { 
 printf("Loi %d !\n",rc); 
 continue; 
 } 
 }; 
 rc = WSAWaitForMultipleEvents(1,&receiveEvent,TRUE,WSA_INFINITE,FALSE); 
 if ((rc == WSA_WAIT_FAILED)||(rc==WSA_WAIT_TIMEOUT)) continue; 
 WSAResetEvent(receiveEvent); 
 rc = WSAGetOverlappedResult(s,&overlapped,&bytesReceived,FALSE,&flags); 
 // Kiểm tra lỗi 
 // Hiển thị 
 buff[bytesReceived] = 0; 
 printf(buff); 
 } 
3.4 C|c phương ph|p v{o ra 
135 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Xử lý Completion Routine 
– Hệ thống sẽ thông báo cho ứng dụng biết thao tác vào ra kết thúc thông qua một 
hàm callback gọi là Completion Routine 
– Nguyên mẫu của hàm như sau 
 void CALLBACK CompletionROUTINE( 
 IN DWORD dwError, // M~ lỗi 
 IN DWORD cbTransferred, // Số byte trao đổi 
 IN LPWSAOVERLAPPED lpOverlapped, // Cấu trúc lpOverlapped 
 // tương ứng 
 IN DWORD dwFlags ); // Cờ kết quả thao t|c v{o ra 
– WinSock sẽ bỏ qua trường event trong cấu trúc OVERLAPPED, việc tạo đối tượng 
event và thăm dò là không cần thiết nữa. 
3.4 C|c phương ph|p v{o ra 
136 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Xử lý Completion Routine 
– Ứng dụng cần chuyển luồng sang trạng thái alertable ngay sau khi gửi yêu cầu vào 
ra. 
– Các hàm có thể chuyển luồng sang trạng thái alertable: 
WSAWaitForMultipleEvents, SleepEx 
– Nếu ứng dụng không có đối tượng event nào thì có thể sử dụng SleepEx 
 DWORD SleepEx(DWORD dwMilliseconds, // Thời gian đợi 
 BOOL bAlertable // Trạng th|i alertable 
 ); 
3.4 C|c phương ph|p v{o ra 
137 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Thí dụ Completion Routine 
// Khai b|o c|c cấu trúc cần thiết 
SOCKET s; 
OVERLAPPED overlapped; 
char buff[1024]; 
WSABUF databuff; 
DWORD flags; 
DWORD bytesReceived = 0; 
Int rc = 0; 
void CALLBACK CompletionRoutine( IN DWORD dwError, 
 IN DWORD cbTransferred, 
 IN LPWSAOVERLAPPED lpOverlapped, 
 IN DWORD dwFlags) 
{ 
 if (dwError != 0||cbTransferred==0) // Xử lý lỗi 
 { 
 closesocket(s); 
 return; 
 }; 
3.4 C|c phương ph|p v{o ra 
138 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Thí dụ Completion Routine 
 // Hiển thị x}u ra m{n hình 
 buff[cbTransferred]=0; 
 printf(buff); 
 // Khởi tạo lại cấu trúc overlapped v{ lại gửi tiếp yêu cầu nhận dữ liệu 
 memset(&overlapped,0,sizeof(overlapped)); 
 flags = 0; 
 rc = WSARecv(s, &databuff, 1, &bytesReceived, &flags, &overlapped, 
 CompletionRoutine); 
 if (rc == SOCKET_ERROR) 
 { 
 rc = WSAGetLastError(); 
 if (rc != WSA_IO_PENDING) 
 printf("Loi %d !\n",rc); 
 }; 
 return; 
} 
3.4 C|c phương ph|p v{o ra 
139 
• Các mô hình vào ra của WinSock 
• Mô hình Overlapped – Thí dụ Completion Routine 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
 // Khởi tạo v{ kết nối đến 127.0.0.1:8888 
 // Khởi tạo cấu trúc overlapped 
 memset(&overlapped,0,sizeof(overlapped)); 
 // Khởi tạo bộ đệm dữ liệu 
 databuff.buf = buff; 
 databuff.len = 1024; 
 // Gửi yêu cầu v{o ra 
 rc = WSARecv(s, &databuff,1,&bytesReceived,&flags,&overlapped, 
 CompletionRoutine); 
 // Xử lý lỗi 
 // Chuyển luồng sang trạng th|i alertable 
 while (1) SleepEx(1000,TRUE); 
 getch(); 
 closesocket(s); 
 WSACleanup(); 
 return 0; 
} 
Lương Ánh Ho{ng 
hoangla@soict.hut.edu.vn 
Chương 4. MFC Socket 
• 4.1. Giới thiệu 
• 4.2. CSocket 
• 4.3. CAsyncSocket 
Chương 4. MFC Soket 
141 
• MFC: Microsoft Foundation Classes 
• Bộ thư viện hướng đối tượng C++ lập trình ứng dụng trên 
Window. 
• Cung cấp hai lớp hỗ trợ lập trình mạng 
– CAsyncSocket: Đóng gói lại thư viện WinSock dưới dạng hướng đối 
tượng. Hoạt động ở chế độ bất đồng bộ. 
– CSocket: Kế thừa từ CAsyncSocket và cung cấp giao diện ở mức cao 
hơn nữa. Hoạt động ở chế độ đồng bộ. 
• Hai lớp này không thread-safe: đối tượng tạo ra ở luồng 
nào thì chỉ có thể được sử dụng ở luồng đó. 
• Tệp tiêu đề: afxsock.h 
Chương 4.1 Giới thiệu 
142 
• Khởi tạo thư viện: tự động bởi framework qua hàm AfxSocketInit 
• Khởi tạo đối tượng CSocket: Phương thức Create 
Chương 4.2 CSocket 
143 
BOOL Create( 
 UINT nSocketPort = 0, // Cổng, mặc định là 0 
 int nSocketType = SOCK_STREAM, // Kiểu socket 
 LPCTSTR lpszSocketAddress = NULL) // Địa chỉ giao diện mạng, thí dụ 
 // “192.168.1.1” 
Giá trị trả về: 
 - Khác NULL nếu thành công 
 - NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError() 
Thí dụ: 
CSocket Server, Client 
Server.Create(8888); 
Client.Create(); 
• Kết nối đến máy khác: Phương thức Connect 
Chương 4.2 CSocket 
144 
BOOL Connect( 
 LPCTSTR lpszHostAddress, // Địa chỉ/tên miền máy đích 
 UINT nHostPort // Cổng 
); 
BOOL Connect( 
 const SOCKADDR* lpSockAddr, // Địa chỉ máy đích dưới dạng SOCKADDR 
 int nSockAddrLen // Chiều dài cấu trúc địa chỉ 
); 
Giá trị trả về: 
 - Khác NULL nếu thành công 
 - NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError() 
Thí dụ: 
CSocket s; 
s.Create(); 
s.Connect(“www.google.com.vn”, 80); 
• Đợi kết nối từ máy khác: Phương thức Listen 
Chương 4.2 CSocket 
145 
BOOL Listen( 
 int nConnectionBacklog = 5 ) 
Giá trị trả về: 
 - Khác NULL nếu thành công 
 - NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError() 
• Đóng kết nối: Phương thức Close 
virtual void Close( ) 
• Chấp nhận kết nối từ máy khác: Phương thức Accept 
Chương 4.2 CSocket 
146 
virtual BOOL Accept( 
 CSocket& rConnectedSocket, // Socket tương ứng với kết nối mới 
 SOCKADDR* lpSockAddr = NULL,// Địa chỉ socket mới dưới dạng SOCKADDR 
 int* lpSockAddrLen = NULL // Chiều dài địa chỉ 
); 
Giá trị trả về: 
 - Khác NULL nếu thành công 
 - NULL nếu thất bại. Mã lỗi có thể truy nhập qua hàm GetLastError() 
Thí dụ: 
CSocket Server, Client; 
// Khởi tạo socket Server 
// Chấp nhận kết nối 
Server.Accept(Client); 
// Gửi nhận dữ liệu trên Client 
• Gửi dữ liệu đến máy khác: Phương thức Send 
Chương 4.2 CSocket 
147 
virtual int Send( 
 const void* lpBuf, // Bộ đệm chứa dữ liệu cần gửi 
 int nBufLen, // Số byte cần gửi 
 int nFlags = 0 // Cờ, chỉ có thể là MSG_OOB nếu có 
); 
Giá trị trả về: 
 - Số byte gửi được nếu thành công 
 - SOCKET_ERROR nếu thất bại 
Thí dụ: 
char buff[]=“Hello MFC Socket”; 
Client.Send(buff,strlen(buff)); 
• Nhận dữ liệu từ máy khác: Phương thức Receive 
Chương 4.2 CSocket 
148 
virtual int Receive( 
 void* lpBuf, // Bộ đệm sẽ nhận dữ liệu 
 int nBufLen, // Kích thước bộ đệm 
 int nFlags = 0 // Cờ, có thể là MSG_PEEK hoặc MSG_OOB 
); 
Giá trị trả về: 
 - Số byte nhận được nếu thành công 
 - NULL nếu kết nối bị đóng 
 - SOCKET_ERROR nếu thất bại 
Thí dụ: 
char buff[1024]; 
int buflen = 1024, nBytesReceived; 
nBytesReceived = connectedSocket. Receive(buff,1024); 
Chương 4.2 CSocket 
149 
• Xây dựng Client bằng CSocket 
CSocket s; 
unsigned char buff[1024]; 
char * request = “GET / HTTP/1.0\r\nHost:www.google.com\r\n\r\n”; 
int len = 0; 
s.Create(); 
s.Connect(www.google.com,80); 
s.Send(request,strlen(request)); 
len = s.Receive(buff,1024); 
buff[len] = 0; 
printf(“%s”,buff); 
Chương 4.2 CSocket 
150 
• Xây dựng Server bằng CSocket 
CSocket listen,connect; 
Char * buff = “Hello Network Programming”; 
listen.Create(80,SOCK_STREAM,”192.168.1.10”); 
listen.Listen(); 
listen.Accept(connect); 
connect.Send(buff,strlen(buff)); 
connect.Close(); 
Chương 4.3 CAsyncSocket 
151 
• Đóng gói hoạt động của socket bất đồng bộ 
• Nguyên mẫu các hàm vào ra tương tự CSocket nhưng trở về ngay lập 
tức từ lời gọi. 
• Ứng dụng không sử dụng trực tiếp lớp này mà kế thừa và chồng lên các 
phương thức ảo của lớp để xử lý các sự kiện. 
• Các phương thức hay được chồng 
– OnAccept: Phương thức này sẽ được gọi mỗi khi có yêu cầu kết nối. 
– OnClose: Phương thức này sẽ được gọi mỗi khi socket đầu kia bị đóng. 
– OnSend: Phương thức này được gọi khi socket có thể gửi dữ liệu. 
– OnReceive: Phương thức này được gọi khi socket nhận được dữ liệu và 
chờ ứng dụng xử lý 
– OnConnect: Phương thức này được gọi khi yêu cầu kết nối được chấp 
nhận và socket đã sẵn sàng để gửi nhận dữ liệu. 
Chương 4.3 CAsyncSocket 
152 
• Khởi tạo đối tượng: Phương thức OnCreate 
BOOL Create( 
 UINT nSocketPort = 0, // Cổng 
 int nSocketType = SOCK_STREAM, // Kiểu socket 
 long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, 
 // Mặt nạ sự kiện 
 LPCTSTR lpszSocketAddress = NULL // Địa chỉ socket 
); 
Giá trị trả về : 
 - Khác NULL nếu thành công 
 - NULL nếu thất bại 
Sự khác biệt duy nhất với CSocket ở phương thức này là tham số lEvent chứa mặt nạ các sự 
kiện ứng dụng mong muốn nhận được 
Chương 4.3 CAsyncSocket 
153 
• Xử lý các sự kiện: chồng lên phương thức tương ứng với sự kiện mong 
muốn 
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket kế thừa từ 
 // AsyncSocket 
{ 
 static int i = 0; 
 i++; 
 TCHAR buff[4096]; 
 int nRead; 
 nRead = Receive(buff, 4096); 
 switch (nRead) 
 { 
 case 0: 
 Close(); 
 break; 
 case SOCKET_ERROR: 
 if (GetLastError() != WSAEWOULDBLOCK) 
 { 
 AfxMessageBox (_T("Error occurred")); 
 Close(); 
 } 
 break; 
Chương 4.3 CAsyncSocket 
154 
• Xử lý các sự kiện (tiếp) 
 default: 
 buff[nRead] = _T('\0'); // Kết thúc x}u 
 CString szTemp(buff); 
 m_strRecv += szTemp; // Chèn x}u nhận được v{o cuối m_strRecv 
 if (szTemp.CompareNoCase(_T("bye")) == 0) 
 { 
 ShutDown(); 
 s_eventDone.SetEvent(); 
 } 
 } 
 CAsyncSocket::OnReceive(nErrorCode); 
} 
Lương Ánh Ho{ng 
hoangla@soict.hut.edu.vn 
Chương 5. NET Socket 
• 5.1. Giới thiệu 
• 5.2. TCP Server 
• 5.3. TCP Client 
• 5.4. UDP Server/Client 
Chương 5. NET Soket 
156 
Chương 5.1 Giới thiệu 
157 
• .NET Framework là bộ thư viện chạy trên đa kiến trúc của 
Microsoft 
• Hai namespace hỗ trợ lập trình mạng: System.Net và 
System.Net.Sockets 
• Một vài lớp chính 
– IPAddress: Lưu trữ và quản lý địa chỉ IP. 
– IPEndPoint: Lưu trữ thông tin về một địa chỉ socket, tương tự như 
SOCKADDR_IN. Bao gồm IPAddress và cổng. 
– DNS: Hỗ trợ các thao tác phân giải tên miền 
– Socket: Xử lý các thao tác trên socket 
Chương 5.1 Giới thiệu 
158 
• IPAddress: Đóng gói một địa chỉ IP 
– Khởi tạo: IPAddress.Parse(“192.168.1.1”); 
– Lấy dạng chuỗi: IPAddress.ToString(); 
– Các địa chỉ đặc biệt: IPAddress.Any, IPAddress.Broadcast, 
IPAddress.Loopback 
• IPEndPoint: Đóng gói một địa chỉ socket 
– Khởi tạo: IPEndPoint(IPAddress, Int32) 
– Lấy dạng chuỗi: IPEndPoint.ToString(); 
• DNS: thực hiện phân giải tên miền 
– Lấy địa chỉ IP: 
 IPAddress[] DNS.GetHostAddress(“www.google.com”); 
– Lấy thông tin về host: 
 IPHostEntry DNS.GetHostEntry(“www.google.com”); 
Chương 5.2 TCP Server 
159 
• Trình tự tạo TCP Server 
– 1.Tạo một Socket 
– 2.Liên kết với một IPEndPoint cục bộ 
– 3.Lắng nghe kết nối 
– 4.Chấp nhận kết nối 
– 5.Gửi nhận dữ liệu theo giao thức ñã thiết kế 
– 6.Đóng kết nối sau khi đã hoàn thành và trở lại trạng thái lắng nghe 
chờ kết nối mới. 
Chương 5.2 TCP Server 
160 
• Thí dụ 
 // Thiết lập địa chỉ của server 
 IPEndPoint ie = new IPEndPoint(IPAddress.Any, 8888); 
 // Tạo socket server 
 Socket server = new Socket(AddressFamily.InterNetwork, 
 SocketType.Stream, ProtocolType.Tcp); 
 int ret; 
 // Bind và Listen 
 server.Bind(ie); 
 server.Listen(10); 
 Console.WriteLine(“Doi ket noi tu client..."); 
 // Chấp nhận kết nối mới 
 Socket client = server.Accept(); 
 Console.WriteLine("Chap nhan ket noi tu:{0}", 
 client.RemoteEndPoint.ToString()); 
 string s = “Hello Net Socket"; 
 byte[] data = new byte[1024]; 
 data = Encoding.ASCII.GetBytes(s); 
 client.Send(data, data.Length, SocketFlags.None); 
Chương 5.2 TCP Server 
161 
• Thí dụ (tiếp) 
 while (true) 
 { 
 data = new byte[1024]; 
 ret = client.Receive(data); 
 if (ret == 0) break; 
 Console.WriteLine("Du lieu tu client:{0}", 
 Encoding.ASCII.GetString(data,0,ret)); 
 } 
 client.Shutdown(SocketShutdown.Both); 
 client.Close(); 
Chương 5.3 TCP Client 
162 
• Trình tự 
– Xác định địa chỉ của Server 
– Tạo Socket 
– Kết nối đến Server 
– Gửi nhận dữ liệu theo giao thức đã thiết kế 
– Đóng Socket 
Chương 5.3 TCP Client 
163 
• Thí dụ 
 // Thiết lập địa chỉ 
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888); 
// Tạo socket client 
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
ProtocolType.Tcp); 
// Kết nối đến server 
client.Connect(iep); 
byte[] data = new byte[1024]; 
int recv = client.Receive(data); // Nhận c}u ch{o từ server 
string s = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine("Server 
gui:{0}", s); 
string input; 
while (true) { 
 input = Console.ReadLine(); 
 //Chuyen input thanh mang byte gui len cho server 
 data = Encoding.ASCII.GetBytes(input); 
 client.Send(data, data.Length, SocketFlags.None); 
Chương 5.3 TCP Client 
164 
• Thí dụ (tiếp) 
 if (input.ToUpper().Equals("QUIT")) break; 
} 
 client.Disconnect(true); 
 client.Close(); 
} 
Chương 5.4 UDP Server/Client 
165 
• Trình tự UDP Server 
– Tạo một Socket 
– Liên kết với một IPEndPoint cục bộ qua hàm Bind (UDP Server) 
hoặc xác định địa chỉ Server để gửi dữ liệu (UDP Client) 
– Gửi nhận dữ liệu theo giao thức đã thiết kế bằng hàm 
ReceiveFrom/SendTo 
– Đóng Socket 

File đính kèm:

  • pdfbai_giang_lap_trinh_mang_chuong_5_lap_trinh_mang_network_pro.pdf