






Preview text:
  lOMoAR cPSD| 58605085
ÔN TẬP LẬP TRÌNH MẠNG 
Chương 1. Những vấn đề cơ bản của lập trình mạng 
1. Mô tả các bước trong mô hình Client- Server của dịch vụ Web ( vẽ mô hình và 
trình bày chi tiêt các bước) 
Dưới đây là các bước chi tiết trong mô hình Client-Server: 
-Client gửi yêu cầu: Đầu tiên, máy khách (client) gửi yêu cầu thông qua các thiết bị hỗ 
trợ mạng. Yêu cầu này có thể là yêu cầu dữ liệu, yêu cầu dịch vụ, hoặc bất kỳ yêu 
cầu nào khác mà client muốn. 
-Server nhận và xử lý yêu cầu: Máy chủ (server) nhận yêu cầu từ client, sau đó xử lý 
yêu cầu đó. Server có thể là một máy tính từ xa, có chức năng cung cấp thông tin 
(dữ liệu) cho một dịch vụ cụ thể hoặc quyền truy cập đối với dịch vụ. 
-Server trả kết quả về cho Client: Cuối cùng, sau khi xử lý xong yêu cầu, server sẽ 
gửi phản hồi cho client. Phản hồi này có thể là dữ liệu mà client yêu cầu, hoặc là kết 
quả của dịch vụ mà client yêu cầu. Mô hình đơn giản mô tả Client-Server:   
2. Các hàm IPAddress(), IPHostEntry() 
Hàm IPAddress(): Hàm này được sử dụng để tạo một đối tượng IPAddress mới. Đối tượng 
này chứa địa chỉ IP của máy tính hoặc máy chủ. 
Hàm IPHostEntry(): Hàm này được sử dụng để lấy thông tin về máy chủ từ tên máy chủ2. 
Thông tin này bao gồm danh sách các địa chỉ IP của máy chủ 
Chương 2. Lập trình Socket hướng kết nối (TCP socket)  1. Giao thức TCP 
Giao thức TCP (Transmission Control Protocol) là một giao thức tiêu chuẩn trên Internet 
đảm bảo trao đổi thành công các gói dữ liệu giữa các thiết bị qua mạng. TCP là giao 
thức truyền tải cơ bản cho nhiều loại ứng dụng, bao gồm máy chủ web và trang web, 
ứng dụng email, FTP và các ứng dụng ngang hàng.      lOMoAR cPSD| 58605085
TCP hoạt động theo tiến trình bắt tay 3 bước (3 way handshake). Tiến trình này hoạt động  như sau: 
1.Máy khách gửi cho máy chủ một gói SYN — một yêu cầu kết nối từ port nguồn của nó 
đến port đích đến của máy chủ. 
2.Máy chủ phản hồi bằng gói SYN/ACK, xác nhận việc nhận được yêu cầu kết nối. 
3.Máy khách nhận gói SYN/ACK và trả lời bằng gói ACK của chính nó. 
-Sau khi kết nối được thiết lập, TCP hoạt động bằng cách chia nhỏ dữ liệu đã truyền thành 
các segment (phân đoạn), mỗi segment được đóng gói thành một gói dữ liệu và được  gửi đến đích của nó 
2. Mô hình ứng dụng client- server hướng kết nối   
3. Các bước cần thiết để xây dựng 1 ứng dụng Client – Server hướng kết nối 
Để xây dựng một ứng dụng Client-Server hướng kết nối, bạn cần thực hiện các bước sau  đây: 
1.Giai đoạn 1 - Server tạo Socket và lắng nghe yêu cầu nối kết: 
• socket(): Server yêu cầu tạo một socket để có thể sử dụng các dịch vụ của tầng vận  chuyển. 
• bind(): Server yêu cầu gán số hiệu cổng (port) cho socket. 
• listen(): Server lắng nghe các yêu cầu nối kết từ các client trên cổng đã được gán. 
Giai đoạn 2 - Client tạo Socket và yêu cầu thiết lập một nối kết với Server: 
• socket(): Client yêu cầu tạo một socket để có thể sử dụng các dịch vụ của tầng vận  chuyển.      lOMoAR cPSD| 58605085
• connect(): Client gửi yêu cầu nối kết đến server có địa chỉ IP và Port xác định. 
• accept(): Server chấp nhận nối kết của client, khi đó một kênh giao tiếp ảo được hình 
thành, Client và server có thể trao đổi thông tin với nhau thông qua kênh ảo này. 
Giai đoạn 3 - Trao đổi thông tin giữa Client và Server: Sau khi chấp nhận yêu cầu nối 
kết, server thực hiện lệnh read() và chờ cho đến khi có thông điệp yêu cầu từ client gửi 
đến. Server phân tích và thực thi yêu cầu. Kết quả sẽ được gửi về client bằng lệnh 
write(). Sau khi gửi yêu cầu bằng lệnh write(), client chờ nhận thông điệp kết quả từ  server bằng lệnh read(). 
Giai đoạn 4 - Kết thúc phiên làm việc: Các câu lệnh read(), write() có thể được thực hiện 
nhiều lần. Kênh ảo sẽ bị xóa khi Server hoặc Client đóng socket bằng lệnh close(). 
4. Các hàm sử dụng phổ biến ( socket(). Bind(), listen(), connect(), accept(). 
Write(), read(), close(), SendData(), ReceiveData()…) 
1.socket(): Hàm này được sử dụng để tạo một socket mới. Nó trả về một mã số socket, hoặc  -1 nếu có lỗi. 
2.bind(): Hàm này được sử dụng để gắn kết một địa chỉ với một socket đã được tạo. Địa 
chỉ này có thể là địa chỉ IP và số cổng. 
3.listen(): Hàm này được gọi trên socket của máy chủ để chuyển nó vào chế độ lắng nghe 
(listen mode), cho phép máy chủ chấp nhận các kết nối đến từ các client. 
4.connect(): Hàm này được sử dụng để kết nối một socket client với một máy chủ đã được 
xác định bởi địa chỉ IP và số cổng. 
5.accept(): Hàm này được gọi trên socket của máy chủ để chấp nhận một kết nối đến từ 
một client. Nó trả về một socket mới để sử dụng cho việc truyền dữ liệu với client  này. 
6.write() hoặc send(): Hàm này được sử dụng để gửi dữ liệu qua kết nối TCP từ một socket  đến socket khác. 
7.read() hoặc recv(): Hàm này được sử dụng để đọc dữ liệu từ kết nối TCP vào bộ đệm của  socket. 
8.close(): Hàm này được sử dụng để đóng một kết nối socket. 
9.SendData(): Một hàm tùy chỉnh có thể được tạo ra để đóng gói dữ liệu và gửi nó qua kết  nối socket. 
10.ReceiveData(): Một hàm tùy chỉnh có thể được tạo ra để nhận dữ liệu từ kết nối socket  và xử lý nó. 
5. Các trường hợp ngoại lệ, xử lý ngoại lệ và bắt lỗi 
Các trường hợp ngoại lệ 
1. Socket không thể tạo được 
2. Lỗi khi kết nối đến máy chủ 
3. Lỗi khi gửi hoặc nhận dữ liệu 
4. Timeout khi chờ đợi dữ liệu 
5. Kết nối bị đóng bởi đối tác      lOMoAR cPSD| 58605085
6. Lỗi cú pháp hoặc định dạng dữ liệu không hợp lệ Các trường hợp xử lý ngoại lệ và  bắt lỗi 
1. Sử dụng try-catch (hoặc tương đương) 
2. Kiểm tra trạng thái trước khi thực hiện hoạt động trên socket 
3. Thiết lập cơ chế timeout  4. Ghi nhật ký (logging 
5. Xử lý ngoại lệ đặc biệt 
6. Đóng socket và giải phóng tài nguyên 
Chương 3. Lập trình socket phi kết nối (UDP socket)  1. Giao thức UDP 
Giao thức UDP (User Datagram Protocol) là một giao thức cốt lõi của giao thức TCP/IP 
được sử dụng để thiết lập các kết nối có độ trễ thấp và giảm mất mát giữa các ứng dụng 
trên Internet. UDP cung cấp hai dịch vụ không được cung cấp bởi lớp IP, đó là: Cung 
cấp các port number để giúp phân biệt các yêu cầu khác nhau từ người dùng và sử dụng 
một thuật toán checksum để xem dữ liệu có được toàn vẹn hay không. 
UDP là một giải pháp được dùng thay cho giao thức TCP. Cả hai giao thức này đều hoạt 
động trên lớp IP và có lúc được gọi là UDP/IP hoặc TCP/IP1. Mặc dù đều hoạt động 
trên giao thức IP, nhưng UDP và TCP có những khác biệt rất quan trọng. Cụ thể: 
Giao thức TCP hỗ trợ giao tiếp máy chủ tới máy chủ (host-to-host). Được coi là phương 
thức vận chuyển bảo mật đáng tin cậy nhưng có tốc độ truyền chậm hơn. 
Giao thức UDP cho phép giao tiếp quy trình tới quy trình (process-to-process). UDP 
chỉ gửi gói tin được gọi là datagram, các gói tin này được truyền đi theo các đường dẫn 
khác nhau giữa người gửi và người nhận.  2. 
Các thao tác để xây dựng ứng dụng client-server không hướng kết nối 
Giai đoạn 1 - Server tạo Socket và gán số hiệu cổng: socket(): Server yêu cầu tạo 
một socket để có thể sử dụng các dịch vụ của tầng vận chuyển. 
bind(): Server yêu cầu gán số hiệu cổng (port) cho socket Giai đoạn 2 - Client tạo 
Socket: socket(): Client yêu cầu tạo một socket để có thể sử dụng các dịch vụ của tầng 
vận chuyển. Thông thường, hệ thống tự động gán một số hiệu cổng còn rảnh cho socket  của Client. 
Giai đoạn 3 - Trao đổi thông tin giữa Client và Server: Sau khi tạo Socket xong, 
Client và Server có thể trao đổi thông tin qua lại với nhau thông qua hai hàm send() và 
receive(). Đơn vị dữ liệu trao đổi giữa Client và Server là các Datagram Package (Gói 
tin thư tín). Protocol của ứng dụng phải định nghĩa khuôn dạng và ý nghĩa của các 
Datagram Package. Mỗi Datagram Package có chứa thông tin về địa chỉ người gửi và  người nhận (IP, Port)      lOMoAR cPSD| 58605085
3. Các lớp AddressFamily, SocketType, ProtocolType 
Lớp AddressFamily: Lớp này xác định tập hợp các giá trị mà bạn có thể sử dụng để xác 
định họ địa chỉ của giao thức. Ví dụ, AddressFamily.InterNetwork đại diện cho giao  thức IPv4. 
Lớp SocketType: Lớp này xác định tập hợp các giá trị mà bạn có thể sử dụng để xác định 
loại socket. Ví dụ, SocketType.Stream đại diện cho một loại socket cung cấp dịch vụ 
truyền tin đáng tin cậy, hai chiều, liên tục, dựa trên kết nối. 
Lớp ProtocolType: Lớp này xác định tập hợp các giá trị mà bạn có thể sử dụng để xác 
định giao thức mà socket sẽ sử dụng. Ví dụ, ProtocolType.Tcp đại diện cho giao thức  TCP.  4. Hàm IPEndPoint() 
Lớp IPEndPoint trong ngôn ngữ lập trình C# đại diện cho một điểm cuối mạng dưới dạng 
địa chỉ IP và số cổng. Đối tượng IPEndPoint thường được sử dụng để truyền trực tiếp 
cho các đối tượng UDP, TCP. 
Các thành viên chính của lớp IPEndPoint bao gồm: 
Address: Địa chỉ IP của điểm cuối mạng. Port: 
Số cổng của điểm cuối mạng. 
5. Mô hình ứng dụng client-server không hướng kết nối 
6. Các hàm đ ược sử dụng phổ biến (SendTo(), ReceiveFrom()… )   
Các hàm SendTo() và ReceiveFrom() là hai hàm quan trọng trong lập trình mạng với ngôn 
ngữ C# khi sử dụng giao thức UDP (User Datagram Protocol).      lOMoAR cPSD| 58605085
Hàm SendTo(): Hàm này được sử dụng để gửi dữ liệu từ một socket đến một điểm cuối 
mạng cụ thể. Hàm này nhận vào hai tham số chính: một mảng byte chứa dữ liệu cần gửi 
và một đối tượng EndPoint đại diện cho điểm cuối mạng mà bạn muốn gửi dữ liệu đến. 
Hàm ReceiveFrom(): Hàm này được sử dụng để nhận dữ liệu từ một socket. Hàm 
này nhận vào một tham số là một mảng byte để lưu dữ liệu nhận được. Hàm này trả về 
một đối tượng EndPoint đại diện cho điểm cuối mạng mà dữ liệu được nhận từ. 7. Các 
trường hợp ngoại lệ, xử lý ngoại lệ và bắt lỗi  
Chương 4. Các lớp trợ giúp 
1. Ưu điểm khi sử dụng các lớp trợ giúp TcpListener, TcpClient, UdpClient so với  lớp Socket trong C# 
Đơn giản hóa lập trình socket: Các lớp này giúp đơn giản hóa lập trình socket bằng 
cách che bớt một số chi tiết của lớp Socket. Ví dụ, lớp UdpClient giúp đơn giản hóa 
việc gửi nhận dữ liệu. 
Hỗ trợ lập trình mạng: Các lớp này hỗ trợ thực hiện các nhiệm vụ đặc biệt của lập trình 
mạng. Ví dụ, lớp TcpListener giúp tạo ra socket tiếp nhận kết nối, trong khi lớp 
TcpClient giúp tạo ra socket gửi/nhận dữ liệu. 
Tương tác tốt hơn với người dùng: Ứng dụng không bị “treo” khi thực hiện các nhiệm 
vụ kéo dài. Điều này có lợi ích lớn khi phát triển chương trình client. 
Server có khả năng phục vụ đồng thời nhiều client: Điều này giúp tăng hiệu suất của  server. 
Thực thi nhanh hơn trên các hệ thống nhiều CPU hoặc nhiều lõi: Điều này giúp 
tăng hiệu suất của ứng dụng 
2. Các bước tạo ra 1 ứng dụng TCP Server, TCP client dùng các lớp trợ giúp  (helper) của C#  Server:  Tạo  socket:  Socket  newsock  =  new 
Socket(AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp); 
Gắn socket với địa chỉ: newsock.Bind(ipep); 
Lắng nghe kết nối: newsock.Listen(10); 
Chấp nhận kết nối: Socket client = newsock.Accept(); Client:  Tạo  socket:  Socket  server  =  new 
Socket(AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp); 
Kết nối đến Server: server.Connect(ipep); 
Sau khi kết nối, Client và Server có thể trao đổi thông tin qua lại bằng cách sử dụng 
hàm Send() và Receive(). Khi kết thúc, đóng socket bằng hàm Close(). 3. Các bước 
tạo ra ứng dụng 1 server nhiều client 
Bước 1: Tạo một Solution trống đặt tên là TcpSocket.      lOMoAR cPSD| 58605085
Bước 2: Xây dựng lần lượt hai project thuộc kiểu 
Console App trong solution trên với tên gọi lần lượt  là Server và Client. 
Bước 3: Thiết lập để có thể debug đồng thời cả hai 
chương trình, trong đó Server sẽ khởi động trước. 
Bước 4: Xây dựng ứng dụng Server 
Bước 5: Xây dựng ứng dụng Client 
Bước 6: Quá trình truyền và nhận dữ liệu: 
Sau khi Client kết nối đến Server và đã được chấp nhận, 
Client và Server có thể bắt đầu quá trình truyền và 
nhận dữ liệu. Sử dụng hàm Send() và Receive() để 
thực hiện các công việc này. 
Bước 7: Đóng kết nối: 
Sau khi quá trình truyền và nhận dữ liệu kết thúc, 
Socket cần phải được đóng lại. Ta có thể sử dụng 
hàm Shutdown() để tạm dùng phiên làm việc và 
dùng hàm Close() để đóng phiên làm việc đó   Chương 5. 
Viết các đoạn code cơ bản như:  - 
gửi mail với giao thức SMTP - nhận mail với giao thức POP3